diff --git a/.codegraph/.gitignore b/.codegraph/.gitignore new file mode 100644 index 00000000..9de0f169 --- /dev/null +++ b/.codegraph/.gitignore @@ -0,0 +1,16 @@ +# CodeGraph data files +# These are local to each machine and should not be committed + +# Database +*.db +*.db-wal +*.db-shm + +# Cache +cache/ + +# Logs +*.log + +# Hook markers +.dirty diff --git a/.codegraph/daemon.pid b/.codegraph/daemon.pid new file mode 100644 index 00000000..cd18ce63 --- /dev/null +++ b/.codegraph/daemon.pid @@ -0,0 +1,6 @@ +{ + "pid": 2074, + "version": "0.9.9", + "socketPath": "/home/dlite/charluv/.codegraph/daemon.sock", + "startedAt": 1782692670234 +} diff --git a/.github/workflows/dev-container.yml b/.github/workflows/dev-container.yml new file mode 100644 index 00000000..c619d372 --- /dev/null +++ b/.github/workflows/dev-container.yml @@ -0,0 +1,40 @@ +name: Build DEV container + +# Manually build a dev container image from the current branch (e.g. +# feat/charluv-rewrite) and push it to Docker Hub tagged `:dev`. Run it on +# dev.charluv.com by pulling demandcluster/charluv:dev. +on: + push: + branches: + - feat/charluv-rewrite + workflow_dispatch: + +permissions: + packages: write + contents: read + +jobs: + push_dev_image: + name: Build and push DEV Docker image + runs-on: ubuntu-latest + steps: + - name: Check out the repo + uses: actions/checkout@v5 + + - name: Log in to Docker Hub + uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_TOKEN }} + + - name: Build and push DEV image + uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671 + with: + context: . + file: ./Dockerfile + push: true + build-args: | + SHA=${{ github.sha }} + tags: | + demandcluster/charluv:dev + demandcluster/charluv:dev-${{ github.sha }} diff --git a/.gitignore b/.gitignore index adedcf4e..4ccc81ba 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +/.codegraph /.parcel-cache /dist /node_modules @@ -24,3 +25,6 @@ settings.json !web/pkg/*.js !llama3.js + +# Playwright MCP scratch artifacts +.playwright-mcp/ diff --git a/.superpowers/sdd/presence-A-report.md b/.superpowers/sdd/presence-A-report.md new file mode 100644 index 00000000..0665e720 --- /dev/null +++ b/.superpowers/sdd/presence-A-report.md @@ -0,0 +1,60 @@ +# Presence Registry — Task A Report + +## Status: GREEN + +## TDD Evidence + +### RED step (before presence.ts existed) +Could not run: the file did not exist. The test import `/srv/queue/presence` would have failed with a module-not-found error. The RED phase is implicit: tests were written against the not-yet-created module. + +### GREEN step (after presence.ts created and compiled) + +``` +presence key derivation + ✔ derives user and guest keys + +isPresentLocal + ✔ user present iff they have a live socket + ✔ guest present iff their socket is in allSockets + ✔ no identity → present (fail open) + +presence redis seam (requires local redis) + ✔ mark → present, clear → absent + ✔ expired members are reaped → absent +``` + +All 5 presence tests PASSED. Redis seam tests RAN (not skipped) against local Redis at 127.0.0.1:6379. + +## Test Summary + +- Total passing: 106 +- Total failing: 18 (all pre-existing, unrelated to presence) +- New failures introduced: 0 + +## Typecheck + +`NODE_OPTIONS=--max-old-space-size=6144 pnpm exec tsc -p srv.tsconfig.json --noEmit` → clean (no output, exit 0) + +No import cycle issues detected. `presence.ts` imports `bus.ts`; `bus.ts` does NOT import `presence.ts`. + +## Prettier + +`pnpm exec prettier --check srv/queue/presence.ts tests/queue-presence.spec.ts` → "All matched files use Prettier code style!" + +## Files Created + +- `/home/dlite/charluv/srv/queue/presence.ts` — registry module (source) +- `/home/dlite/charluv/srv/queue/presence.js` — compiled output (force-added) +- `/home/dlite/charluv/srv/queue/presence.js.map` — source map (force-added) +- `/home/dlite/charluv/tests/queue-presence.spec.ts` — test suite (source) +- `/home/dlite/charluv/tests/queue-presence.spec.js` — compiled output (force-added) +- `/home/dlite/charluv/tests/queue-presence.spec.js.map` — source map (force-added) + +## Self-Review Checklist + +- [x] All exports present with exact signatures (userKey, guestKey, keyFor, PresenceId, PresenceCmd, markRedis, clearRedis, isPresentRedis, isPresentLocal, markPresent, clearPresent, isPresent, startPresenceRefresh) +- [x] Redis seam tests actually RAN against real redis (not skipped) +- [x] isPresent fails open (returns true) on errors and when no identity given +- [x] redisActive() gates redis vs local path +- [x] Typecheck clean — no import cycle +- [x] Prettier clean diff --git a/.superpowers/sdd/presence-C-report.md b/.superpowers/sdd/presence-C-report.md new file mode 100644 index 00000000..cccec5a8 --- /dev/null +++ b/.superpowers/sdd/presence-C-report.md @@ -0,0 +1,33 @@ +# Presence Registry Wiring — C Report + +## Edits + +### `srv/queue/index.ts` +- Added `import { isPresent, startPresenceRefresh } from './presence'` +- Changed `inferenceGate` construction to pass `isPresent` as 3rd arg +- Updated `startQueue()` to call `startPresenceRefresh()`, fold stop-fn into cleanup + +### `srv/api/ws/handlers.ts` +- Added `import { markPresent, clearPresent } from '../../queue/presence'` +- `login`: added `markPresent({ userId: client.userId }, client.uid)` after `userSockets.set` +- `logout`: added `clearPresent({ userId }, client.uid)` after `const userId = client.userId` + +### `srv/api/ws/handle.ts` +- Added `import { markPresent, clearPresent } from '../../queue/presence'` +- End of `handleMessage`: added `markPresent({ socketId: client.uid }, client.uid)` after `allSockets.set` +- `client.on('close')`: added `clearPresent({ socketId: client.uid }, client.uid)` before `handlers.logout` +- `client.on('error')`: added `clearPresent({ socketId: client.uid }, client.uid)` before `handlers.logout` + +## Typecheck +`NODE_OPTIONS=--max-old-space-size=6144 pnpm exec tsc -p srv.tsconfig.json --noEmit` — **clean (no output)** + +## Prettier +`pnpm exec prettier --check srv/queue/index.ts srv/api/ws/handlers.ts srv/api/ws/handle.ts` — **All matched files use Prettier code style!** + +## Tests +`pnpm test`: **109 passing, 18 failing** — matches pre-existing baseline; 0 new failures. + +## Files Changed +- `/home/dlite/charluv/srv/queue/index.ts` +- `/home/dlite/charluv/srv/api/ws/handlers.ts` +- `/home/dlite/charluv/srv/api/ws/handle.ts` diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 00000000..0692838e --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,80 @@ +# CLAUDE.md + +Guidance for working in this repo. These instructions override default behaviour. + +## What this is + +Charluv is an AI-companion / dating app — a fork of Agnaistic (Agnai). It carries a lot of +unused Agnai power-user machinery that is being stripped. Architecture: + +- **`web/`** — SolidJS + Tailwind frontend, bundled with **Vite**. +- **`srv/`** — Express + MongoDB + `ws` backend, compiled with `tsc`. +- **`common/`** — isomorphic code shared by both (types, prompt building, progression, tokenize). +- **Inference** — self-hosted **OpenAI-compatible** streaming endpoint for text and a separate + self-hosted **SD-compatible** image endpoint. The text model is a custom 24B trained on + relationship **stage tokens** `LEVEL("NOVICE" | "BEGINNER" | "LOVER" | "GIRLFRIEND" | "SEX" | + "HARDCORE" | "MARRIED" | "DIVORCED" | "BDSM/SLAVE" | "BDSM/DOMINATRIX")`. + +## Use codegraph first + +A **codegraph** MCP server indexes every symbol/edge/file in the workspace (SQLite knowledge +graph, sub-ms reads). **Consult it before writing or editing code — do not hand-grep or spawn a +file-reading sub-agent to explore.** + +- Almost any "how does X work / where is X / trace the flow" question → **`codegraph_explore`** + (one call returns the verbatim source of the relevant symbols, grouped by file). Usually the + only call you need. +- "What is symbol X" (location only) → `codegraph_search`. +- "What calls this / what does it call / what breaks if I change it" → + `codegraph_callers` / `codegraph_callees` / `codegraph_impact`. + +Fall back to Read/Grep only to confirm a specific detail codegraph didn't cover. + +## Hard constraints + +- **NO data migrations.** `dev.charluv.com` runs on **live production data**. Schema changes must + be additive (nullable fields, backward-compatible). Never rename/repurpose a stored id or write + a migration job. (E.g. archetype display labels were changed while keeping the stored ids.) +- **Use `pnpm`, never `npm`** (repo is a pnpm workspace; `npm install` fails). +- **Moderation runs on the local vision LLM**, not external OpenAI. +- **Never sexualize minors** — the 18+ safeguard in the levels preamble (`CHARLUV_LEVELS_PROMPT`) + applies to all characters. +- Fix bugs on sight, even pre-existing or unrelated ones — don't just flag them. + +## Commands + +```bash +pnpm checks # format + typecheck + test (run before declaring done) +pnpm typecheck # tsc -p tsconfig.json --noEmit (web) +pnpm test # mocha tests/**.spec.js +pnpm start # concurrently: vite web + watched server + tsc +``` + +- **srv typecheck** (heavier, needs more memory): + `NODE_OPTIONS=--max-old-space-size=6144 npx tsc -p srv.tsconfig.json --noEmit` +- Web files can be quickly syntax-checked with `ts.transpileModule` (the bundler is Vite, not tsc). +- Vite resolves `.ts` before `.js`. Do not check in compiled web `.js`/`.js.map`. + +## Domain notes + +- **Progression archetypes** (`common/progression.ts`): `ARCHETYPES` (ids `romantic`, + `girlfriend`, `casual`, `submissive`, `dominant`) map XP level → stage token. `getArchetype`, + `getProgressionSteps`, `resolveStage`. No archetype on a character = **fixed** (no fallback to + romantic). Display the `.label`, not the raw id. XP lives on `char.xp`, granted per message. +- **Credits**: message 10, image gen/regen 25, **create 100** (charged when the AI is finalized + on the final wizard step — the hidden draft made on entering that step is free), **edit 30**, + LoRA train 300, publish **+500** reward. Free tier refills +5/2min up to 500; + premium +20/2min up to 5,000. +- **Publishing**: any user can make a character public (`published`/`moderation`/`reportCount` + fields); auto-publish on the local vision-LLM moderation pass, also surfaced in admin for a + second stage; auto-hide at 3 reports. + +## Git + +- Default branch for PRs is **`trunk`**. Active work is on `feat/charluv-rewrite`. +- **Commit/push only when explicitly asked.** End commit messages with: + + ``` + Co-Authored-By: Claude Opus 4.8 + Claude-Session: https://claude.ai/code/session_01XXNb2Kcdayr1ZvUpy5a3nA + ``` diff --git a/Dockerfile b/Dockerfile index e414baed..d21e86ef 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM node:22.14.0-bullseye-slim +FROM node:22-bookworm-slim WORKDIR /app VOLUME [ "/app/db" ] @@ -12,8 +12,15 @@ ARG SHA=unknown ADD package.json pnpm-lock.yaml ./ RUN pnpm i --frozen-lockfile - -ADD tailwind.config.js tsconfig.json .babelrc .postcssrc .parcelrc .prettierrc srv.tsconfig.json ./ +# pnpm v10 does not run dependency install scripts (even via `pnpm rebuild`), so +# sharp's native binary — pulled in by @xenova/transformers for long-term memory +# embeddings — is never fetched. Run sharp's own install script directly to +# download the prebuilt binary for this platform. +RUN for d in /app/node_modules/.pnpm/sharp@*/node_modules/sharp; do \ + if [ -d "$d" ]; then echo "Installing sharp binary in $d"; (cd "$d" && npm run install); fi; \ + done + +ADD tailwind.config.js tsconfig.json .babelrc .postcssrc .prettierrc srv.tsconfig.json vite.config.ts ./ ADD common/ ./common/ ADD srv/ ./srv/ ADD web/ ./web diff --git a/SECURITY-ACCEPTED.md b/SECURITY-ACCEPTED.md new file mode 100644 index 00000000..2977d68a --- /dev/null +++ b/SECURITY-ACCEPTED.md @@ -0,0 +1,21 @@ +# Accepted security advisories + +These advisories are listed in `package.json` → `pnpm.auditConfig.ignoreGhsas` +so `pnpm audit` stays clean. Each is genuinely unfixable without breaking the +build or removing a kept feature, or is non-exploitable in this app. Revisit +when upstream patches land. + +| GHSA | Pkg | Sev | Why accepted | +|------|-----|-----|--------------| +| GHSA-848j-6mx2-7j84 | elliptic | low | No patch published (`patched: <0.0.0`). Transitive browser polyfill (`crypto-browserify`). | +| GHSA-rmmh-p597-ppvv | showdown | mod | No patch published. ReDoS in markdown rendering; swapping to another lib is a core-renderer refactor with regression risk. | +| GHSA-w5hq-g745-h8pq | uuid | mod | Non-exploitable: advisory affects `v3/v5/v6` with a `buf` arg; this app uses only `v4`. The fix (uuid v11) is ESM-only and breaks the CommonJS server build. | +| GHSA-4w7w-66w2-5vf9 | vite | mod | Dev-server only (optimized-deps `.map` path traversal). Patched in Vite 6, which breaks `vite-plugin-node-polyfills` (build verified to fail). Dev server is not exposed in prod. | +| GHSA-v6wh-96g9-6wx3 | vite | mod | Windows-only (launch-editor UNC NTLM). Prod runs Linux. Fix requires Vite 6 (breaks build). | +| GHSA-fx2h-pf6j-xcff | vite | high | `server.fs.deny` bypass on Windows alternate paths — dev-server + Windows only; prod is Linux and the dev server isn't exposed. Fix requires Vite 6 (breaks build). | +| GHSA-wgrm-67xf-hhpq | pdfjs-dist | high | Malicious-PDF JS execution. Fix is pdfjs v4 (ESM/worker API break, entangled with `pdfdataextract`). Exploit is self-inflicted — a user importing their **own** PDF for text extraction into their **own** library; no cross-user vector. | +| GHSA-8fgc-7cc6-rx7x | webpack | low | Transitive **peer** dep of `worker-loader` under `pdfjs-dist`; `pnpm.overrides` don't apply to peer resolution. Tied to the pdfjs-dist item above. | +| GHSA-38r7-794h-5758 | webpack | low | Same as above. | + +All 6 criticals and 59 of 61 highs were eliminated by removals + overrides + bumps +(audit went 154 → 0 active). See `pnpm.overrides` in `package.json`. diff --git a/common/abuse.ts b/common/abuse.ts new file mode 100644 index 00000000..529bd6ce --- /dev/null +++ b/common/abuse.ts @@ -0,0 +1,16 @@ +/** + * Decide how to treat a new registration given whether its device fingerprint + * and/or IP already belong to an existing account. + * + * - both match -> block (very high confidence: same person) + * - one matches -> restrict (likely duplicate: create, but withhold farmable credits) + * - neither -> allow (normal signup) + */ +export function classifyRegistration(opts: { + fpMatch: boolean + ipMatch: boolean +}): 'block' | 'restrict' | 'allow' { + if (opts.fpMatch && opts.ipMatch) return 'block' + if (opts.fpMatch || opts.ipMatch) return 'restrict' + return 'allow' +} diff --git a/common/adapters.ts b/common/adapters.ts index 248ce1e1..f907dd99 100644 --- a/common/adapters.ts +++ b/common/adapters.ts @@ -44,7 +44,7 @@ export const PERSONA_LABELS: { [key in PersonaFormat]: string } = { } export const JSON_SCHEMA_SUPPORTED: { [key in AIAdapter | ThirdPartyFormat]?: boolean } = { - agnaistic: true, + charluv: true, llamacpp: true, tabby: true, } @@ -81,25 +81,10 @@ export const THIRDPARTY_FORMATS = [ 'vllm', ] as const -export const AI_ADAPTERS = [ - 'agnaistic', - 'kobold', - 'novel', - 'ooba', - 'horde', - 'openai', - 'scale', - 'claude', - 'goose', - 'replicate', - 'openrouter', - 'mancer', - 'petals', - 'venus', -] as const +export const AI_ADAPTERS = ['charluv', 'kobold', 'ooba', 'horde', 'openai', 'claude'] as const export const CHAT_ADAPTERS = ['default', ...AI_ADAPTERS] as const -export const MULTI_TENANT_ADAPTERS = ['novel', 'chai', 'kobold'] as const +export const MULTI_TENANT_ADAPTERS = ['kobold'] as const export type NovelModel = keyof typeof NOVEL_MODELS @@ -306,29 +291,17 @@ export type HordeWorker = { export const ADAPTER_LABELS: { [key in AIAdapter]: string } = { horde: 'Charluv Horde', kobold: 'CharluvAI', - novel: 'NovelAI', ooba: 'Textgen', openai: 'OpenAI', - scale: 'Scale', claude: 'Claude', - goose: 'Goose AI', - replicate: 'Replicate', - openrouter: 'OpenRouter', - mancer: 'Mancer', - petals: 'Petals', - agnaistic: 'Agnaistic', - venus: 'Venus', + charluv: 'Charluv', } export const INSTRUCT_SERVICES: { [key in AIAdapter]?: boolean } = { openai: true, - openrouter: true, claude: true, - scale: true, horde: true, - novel: true, - agnaistic: true, - mancer: true, + charluv: true, kobold: true, ooba: true, } @@ -435,16 +408,6 @@ export const settingLabels: { [key in keyof PresetAISettings]: string } = { export const samplerOrders: { [key in AIAdapter]?: Array } = { kobold: ['topK', 'topA', 'topP', 'tailFreeSampling', 'typicalP', 'temp', 'repetitionPenalty'], - novel: [ - 'temp', - 'topK', - 'topP', - 'tailFreeSampling', - 'topA', - 'typicalP', - 'cfgScale', - 'mirostatTau', - ], } export type AIAdapter = (typeof AI_ADAPTERS)[number] diff --git a/common/characters.ts b/common/characters.ts index b97bc354..105b6888 100644 --- a/common/characters.ts +++ b/common/characters.ts @@ -85,6 +85,17 @@ export function exportCharacter(char: AppSchema.Character, target: 'tavern' | 'o json: char.json, sprite: char.sprite, }, + // Charluv-specific metadata. Lives in extensions so it round-trips + // through TavernAI / chara_card_v2 (JSON + PNG-embedded) cards. + // Engagement is a server-side aggregate, intentionally not exported. + charluv: { + progression: char.progression, + gender: char.gender, + artStyle: char.artStyle, + ageRange: char.ageRange, + category: char.category, + nsfw: char.nsfw, + }, }, }, } diff --git a/common/default-preset.ts b/common/default-preset.ts index a3e0f11f..435ae8a3 100644 --- a/common/default-preset.ts +++ b/common/default-preset.ts @@ -2,28 +2,15 @@ import { AppSchema } from './types/schema' import { claudePresets } from './presets/claude' import { hordePresets } from './presets/horde' import { koboldPresets } from './presets/kobold' -import { novelPresets } from './presets/novel' import { oobaPresets } from './presets/ooba' import { openaiPresets } from './presets/openai' -import { replicatePresets } from './presets/replicate' -import { scalePresets } from './presets/scale' -import { openRouterPresets } from './presets/openrouter' -import { agnaiPresets } from './presets/agnaistic' +import { charluvPresets } from './presets/charluv' -const builtinPresets = { - ...agnaiPresets, +export const defaultPresets = { + ...charluvPresets, ...hordePresets, ...koboldPresets, - ...novelPresets, ...openaiPresets, - ...replicatePresets, - ...scalePresets, ...claudePresets, ...oobaPresets, - ...openRouterPresets, -} satisfies Record> - -export const defaultPresets = { - ...builtinPresets, - goose: { ...builtinPresets.basic, service: 'goose' }, } satisfies Record> diff --git a/common/event.ts b/common/event.ts new file mode 100644 index 00000000..f43d0cc9 --- /dev/null +++ b/common/event.ts @@ -0,0 +1,176 @@ +/** Flat credit cost of one user turn in an event chat (vs 10 for a normal message). */ +export const EVENT_TURN_COST = 25 + +/** Hard cap on the number of character replies the director may elect per user turn. */ +export const EVENT_MAX_REPLIES = 3 + +/** How often the director injects an unprompted world beat (announcement, arrival, + * environment change) to push the story forward. */ +export type DirectorFrequency = 'none' | 'rare' | 'normal' | 'regular' + +/** Per-turn probability that the director is *asked* to consider a world beat. + * The model still decides whether a beat is actually warranted (it may decline), + * so these are the chance of considering, not of firing. */ +export const DIRECTOR_EVENT_CHANCE: Record = { + none: 0, + rare: 0.06, + normal: 0.18, + regular: 0.35, +} + +/** The scene block injected into the chat scenario so every prompt sees the event context. */ +export function buildEventScenario(opts: { + location: string + description: string + names: string[] + when?: string + vibe?: string + /** The user's self-persona handle, so characters know the user is present and + * this is an ongoing acquaintance — not a stranger walking in. */ + userName?: string +}): string { + const setting = opts.when ? `${opts.location}, ${opts.when}` : opts.location + const mood = opts.vibe ? ` Mood: ${opts.vibe}.` : '' + const present = opts.userName ? [`${opts.userName} (the user)`, ...opts.names] : opts.names + return `Setting: ${setting}. Event: ${opts.description}.${mood} Present: ${present.join(', ')}.` +} + +/** JSON Schema forcing the director to return a present character id or the literal "none". */ +export function buildSpeakerSchema(presentIds: string[]): object { + return { + type: 'object', + properties: { + speaker: { type: 'string', enum: [...presentIds, 'none'] }, + }, + required: ['speaker'], + } +} + +/** + * The director prompt. Asks the model to elect the next speaker, preferring the + * directly-addressed character and only choosing a bystander with a strong, + * specific reason. Returns "none" when no one (else) should speak. + */ +export function buildDirectorPrompt(opts: { + event: { location: string; description: string; when?: string; vibe?: string; note?: string } + roster: Array<{ id: string; name: string; hook: string }> + recent: Array<{ name: string; text: string }> + repliedThisTurn: string[] + /** The human participant. Listed as present so the director knows the user is + * in the scene (characters react to them), but the user is NEVER an electable + * speaker — the speaker enum is built from the character roster ids only. */ + user?: { name: string; hook: string } +}): string { + const characters = opts.roster.map((r) => `- ${r.name} (id: ${r.id}): ${r.hook}`).join('\n') + const userLine = opts.user + ? `- ${opts.user.name} (the user — present and speaking to the group; never elect them)${ + opts.user.hook ? `: ${opts.user.hook}` : '' + }\n` + : '' + const roster = userLine + characters + const history = opts.recent.map((m) => `${m.name}: ${m.text}`).join('\n') + const hasReplied = opts.repliedThisTurn.length > 0 + const setting = opts.event.when + ? `${opts.event.location}, ${opts.event.when}` + : opts.event.location + const mood = opts.event.vibe ? ` Mood: ${opts.event.vibe}.` : '' + + // Two distinct decisions. First election: someone MUST answer the user, so pick + // the addressed character. Continuation: the default is to STOP ("none") — a + // second/third speaker is the rare exception, not a quota to fill. Reaching the + // reply cap is a ceiling, never a goal. + const instructions = hasReplied + ? [ + `Someone has already replied this turn.`, + `If the MOST RECENT message directly addresses another present character by name, asks them a question, or clearly hands the conversation to them, elect THAT character so they can respond.`, + `Otherwise usually answer "none" — most turns have just one speaker. Only elect another character if they have a strong, specific, immediate reason to interject; do not add a speaker merely to keep the scene busy.`, + ] + : [ + `Decide who speaks NEXT. Prefer the character the user is directly addressing.`, + `A bystander should be chosen ONLY if they have a strong, specific reason to interject.`, + ] + + return [ + `Setting: ${setting}. Event: ${opts.event.description}.${mood}`, + ...(opts.event.note + ? [ + `Director's note (the host's standing instruction — weight it heavily): ${opts.event.note}`, + ] + : []), + `People present:`, + roster, + ``, + `Recent conversation:`, + history, + ``, + ...instructions, + `Reply with the speaker's id, or "none".`, + ].join('\n') +} + +/** + * The director-beat prompt. Asks the model for a SHORT world/narration beat that + * nudges the scene forward (an announcement, an arrival, a shift in the + * environment), or an empty string when nothing would meaningfully add. The + * director narrates the world ONLY — it never speaks or acts for any character or + * for the user. + */ +export function buildDirectorEventPrompt(opts: { + event: { location: string; description: string; when?: string; vibe?: string; note?: string } + roster: Array<{ name: string; hook: string }> + recent: Array<{ name: string; text: string }> +}): string { + const setting = opts.event.when + ? `${opts.event.location}, ${opts.event.when}` + : opts.event.location + const mood = opts.event.vibe ? ` Mood: ${opts.event.vibe}.` : '' + const roster = opts.roster.map((r) => `- ${r.name}: ${r.hook}`).join('\n') + const history = opts.recent.map((m) => `${m.name}: ${m.text}`).join('\n') + + return [ + `You are the unseen scene director for an event.`, + `Setting: ${setting}. Event: ${opts.event.description}.${mood}`, + ...(opts.event.note + ? [ + `Director's note (the host's standing instruction for the scene — follow it): ${opts.event.note}`, + ] + : []), + `Characters present:`, + roster, + ``, + `Recent conversation:`, + history, + ``, + `Optionally narrate ONE brief world beat (1-2 sentences, third person, present tense)`, + `that moves the story forward — an announcement, someone arriving, the music changing,`, + `the lights dimming, last call, etc. Make it fit the setting and the moment.`, + `Describe the WORLD only: never speak, think, or act for any character or for the user.`, + `If nothing would meaningfully add right now, return an empty string.`, + `Respond with JSON: { "narration": "" }.`, + ].join('\n') +} + +/** + * Per-speaker directive injected into the system prompt on every event reply. + * In a 1:1 chat a character naturally stays in their own voice, but an event's + * scene-setting context (third-person "Setting: … Present: …", the world/director + * narration, other characters' lines) frames everything as prose, so characters + * start narrating the whole scene. This pulls each speaker back to their own + * dialogue and actions — scene narration is the (separate) director's job. + */ +export function buildEventCharacterPrompt(name: string): string { + return [ + `You are ${name} in a group scene with other people present.`, + `Respond ONLY as ${name}: write ${name}'s own spoken words and immediate actions, in character, exactly as you would in a one-on-one chat.`, + `Do NOT narrate the setting, the atmosphere, the passage of time, world events, or what anyone else says, thinks, or does — a separate narrator handles all scene description.`, + ].join(' ') +} + +/** JSON Schema for the director-beat response. */ +export function buildDirectorEventSchema(): object { + return { + type: 'object', + properties: { narration: { type: 'string' } }, + required: ['narration'], + } +} diff --git a/common/horde-gen.ts b/common/horde-gen.ts index f9a93203..22188366 100644 --- a/common/horde-gen.ts +++ b/common/horde-gen.ts @@ -1,14 +1,12 @@ import { AppSchema } from './types/schema' import { defaultPresets } from './default-preset' import { SD_SAMPLER } from './image' -import { toArray } from './util' import type { AppLog } from '../srv/middleware' const HORDE_GUEST_KEY = '0000000000' //const imageUrl = 'https://horde.koboldai.net/api/v2' const imageUrl = 'https://horde.aivo.chat/api/v2' const hordeUrl = 'https://horde.aivo.chat/api/v2' -const baseUrl = 'https://horde.aivo.chat/api/v2' export const defaults = { image: { @@ -100,7 +98,6 @@ export async function generateImage( log: AppLog = logger ) { const base = user.images - const settings = user.images?.horde || defaults.image const payload = { prompt: `${prompt.slice(0, 500)} ### ${negative}`, diff --git a/common/image-prompt.ts b/common/image-prompt.ts index 2dea24c4..84df23d6 100644 --- a/common/image-prompt.ts +++ b/common/image-prompt.ts @@ -118,7 +118,7 @@ export function getMaxImageContext(user: AppSchema.User) { case 'horde': default: - return 512 + return 768 } } diff --git a/common/mode-templates.ts b/common/mode-templates.ts index a38622f2..3f60e233 100644 --- a/common/mode-templates.ts +++ b/common/mode-templates.ts @@ -40,32 +40,12 @@ export const cyoaTemplate = (service: AIAdapter, model?: string) => { return ( service === 'claude' ? claudeCyoa - : service === 'novel' - ? novelCyoa - : service === 'agnaistic' || service === 'kobold' || service === 'ooba' + : service === 'charluv' || service === 'kobold' || service === 'ooba' ? alpacaCyoa : typicalCyoa ).replace(/{{jailbreak}}/gi, jailbreak || '') } -const novelCyoa = neat` -Recent conversation history: -{{history}} - -{ Provide 1 word positive emotion to describe {{user}}'s reaction to the last message } -Emotion: [emote1 | words=1 | tokens=5] -{ Provide 1 word negative emotion to describe {{user}}'s reaction to the last message } -Emotion: [emote2 | words=1 | tokens=5 ] -{ Provide 1 word realstic emotion to describe {{user}}'s reaction to the last message } -Emotion: [emote3 | words=1 | tokens=5 ] -{ {{user}}'s natural, long, and detailed response expressing "[emote1]" emotion } -{{user}}: [action1 | tokens=100] -{ {{user}}'s natural, long, and detailed response expressing "[emote2]" emotion } -{{user}}: [action2 | tokens=100] -{ {{user}}'s natural, long, and detailed response expressing "[emote3]" emotion } -{{user}}: [action3 | tokens=100] -` - const typicalCyoa = ` Recent conversation history: {{history}} diff --git a/common/presets.ts b/common/presets.ts index 005556f7..0b0edaef 100644 --- a/common/presets.ts +++ b/common/presets.ts @@ -176,20 +176,6 @@ export const serviceGenMap: { [key in ChatAdapter]?: GenMap } = { order: 'sampler_order', minP: 'min_p', }, - novel: { - maxTokens: 'max_length', - repetitionPenalty: 'repetition_penalty', - repetitionPenaltyRange: 'repetition_penalty_range', - repetitionPenaltySlope: 'repetition_penalty_slope', - tailFreeSampling: 'tail_free_sampling', - temp: 'temperature', - topK: 'top_k', - topP: 'top_p', - typicalP: 'typical_p', - topA: 'top_a', - order: '', - minP: '', - }, ooba: { maxTokens: 'max_new_tokens', topP: 'top_p', @@ -261,116 +247,7 @@ export const serviceGenMap: { [key in ChatAdapter]?: GenMap } = { claudeModel: 'claudeModel', minP: '', }, - scale: { - maxTokens: '', - repetitionPenalty: '', - repetitionPenaltyRange: '', - repetitionPenaltySlope: '', - tailFreeSampling: '', - temp: 'temperature', - topK: '', - topP: '', - typicalP: '', - topA: '', - order: '', - frequencyPenalty: '', - presencePenalty: '', - gaslight: '', - oaiModel: '', - minP: '', - }, - goose: { - maxTokens: 'max_tokens', - repetitionPenalty: 'repetition_penalty', - repetitionPenaltyRange: 'repetition_penalty_slope', - repetitionPenaltySlope: 'repetition_penalty_range', - tailFreeSampling: 'tfs', - temp: 'temperature', - topK: 'top_k', - topP: 'top_p', - typicalP: 'typical_p', - topA: 'top_a', - order: '', - frequencyPenalty: 'frequency_penalty', - presencePenalty: 'presence_penalty', - gaslight: '', - oaiModel: '', - minP: '', - }, - replicate: { - maxTokens: 'max_tokens', - repetitionPenalty: 'repetition_penalty', - repetitionPenaltyRange: '', - repetitionPenaltySlope: '', - tailFreeSampling: '', - temp: 'temperature', - topK: '', - topP: 'top_p', - typicalP: '', - topA: '', - order: '', - frequencyPenalty: '', - presencePenalty: '', - gaslight: '', - replicateModelType: 'replicateModelType', - replicateModelVersion: 'replicateModelVersion', - minP: '', - }, - openrouter: { - maxTokens: 'max_tokens', - temp: 'temperature', - repetitionPenalty: '', - repetitionPenaltyRange: '', - repetitionPenaltySlope: '', - tailFreeSampling: '', - topA: '', - topK: '', - topP: '', - typicalP: '', - addBosToken: '', - antiBond: '', - banEosToken: '', - claudeModel: '', - encoderRepitionPenalty: '', - frequencyPenalty: '', - gaslight: '', - minP: '', - }, - mancer: { - maxTokens: 'max_new_tokens', - topP: 'top_p', - temp: 'temperature', - typicalP: 'typical_p', - repetitionPenalty: 'repetition_penalty', - encoderRepitionPenalty: 'encoder_repetition_penalty', - topK: 'top_k', - penaltyAlpha: 'penalty_alpha', - addBosToken: 'add_bos_token', - banEosToken: 'ban_eos_token', - skipSpecialTokens: 'skip_special_tokens', - topA: '', - order: '', - repetitionPenaltyRange: '', - repetitionPenaltySlope: '', - tailFreeSampling: '', - minP: 'min_p', - }, - petals: { - maxTokens: '', - repetitionPenalty: '', - repetitionPenaltyRange: '', - repetitionPenaltySlope: '', - tailFreeSampling: '', - temp: '', - topK: '', - topP: '', - typicalP: '', - topA: '', - gaslight: '', - claudeModel: '', - minP: '', - }, - agnaistic: { + charluv: { maxTokens: 'max_tokens', temp: 'temperature', repetitionPenalty: '', @@ -399,7 +276,6 @@ export function isDefaultPreset(value?: string): value is GenerationPreset { export function getFallbackPreset(adapter: AIAdapter): Partial { switch (adapter) { - case 'petals': case 'horde': return deepClone(defaultPresets.horde) @@ -407,35 +283,13 @@ export function getFallbackPreset(adapter: AIAdapter): Partial> diff --git a/common/presets/charluv.ts b/common/presets/charluv.ts new file mode 100644 index 00000000..cb80e472 --- /dev/null +++ b/common/presets/charluv.ts @@ -0,0 +1,103 @@ +import { OPENAI_MODELS } from '../adapters' +import { AppSchema } from '../types' +import { templates } from './templates' + +const charluvBase = { + service: 'charluv', + name: 'Charluv', + maxTokens: 400, + maxContextLength: 8192, + repetitionPenalty: 1, + repetitionPenaltySlope: 0, + repetitionPenaltyRange: 512, + temp: 0.8, + topK: 0, + topP: 1, + typicalP: 1, + topA: 0, + minP: 0, + tailFreeSampling: 1, + encoderRepitionPenalty: 1.0, + penaltyAlpha: 0, + addBosToken: true, + banEosToken: false, + skipSpecialTokens: true, + frequencyPenalty: 0, + presencePenalty: 0, + gaslight: templates.Charluv, + ultimeJailbreak: '', + oaiModel: OPENAI_MODELS.Turbo, + streamResponse: true, + memoryDepth: 50, + memoryContextLimit: 500, + memoryReverseWeight: false, + antiBond: false, + useAdvancedPrompt: 'basic', + promptOrderFormat: 'Alpaca', + promptOrder: [ + { + placeholder: 'system_prompt', + enabled: true, + }, + { + placeholder: 'scenario', + enabled: true, + }, + { + placeholder: 'personality', + enabled: true, + }, + { + placeholder: 'impersonating', + enabled: true, + }, + { + placeholder: 'chat_embed', + enabled: true, + }, + { + placeholder: 'memory', + enabled: true, + }, + { + placeholder: 'example_dialogue', + enabled: true, + }, + { + placeholder: 'history', + enabled: true, + }, + { + placeholder: 'ujb', + enabled: true, + }, + ], +} satisfies Partial + +/** + * The user-facing preset choices. The full Agnai sampler/template editor is gone: + * a chat picks one of these fixed presets and they differ ONLY in temperature. + * Each id is a key in `defaultPresets`, so `chat.genPreset` stores the id and + * resolves through the existing default-preset machinery (no data migration). + */ +export const CHARLUV_TEMP_PRESETS = [ + { id: 'charluv-precise', label: 'Precise', temp: 0.4, hint: 'Focused and consistent' }, + { id: 'charluv-balanced', label: 'Balanced', temp: 0.8, hint: 'Natural variety (default)' }, + { id: 'charluv-creative', label: 'Creative', temp: 1.1, hint: 'More varied and surprising' }, + { id: 'charluv-wild', label: 'Wild', temp: 1.2, hint: 'Unpredictable, high variety' }, +] as const + +export const DEFAULT_CHARLUV_PRESET = 'charluv-balanced' + +// Sampler floors that scale with temperature. top_p tightens and min_p (a +// coherence floor honoured by vLLM) rises as temp climbs, so the hotter presets +// stay coherent instead of sampling the full distribution tail. top_k stays 0 +// (disabled) but is now transmitted, so it can be set per preset if ever needed. +export const charluvPresets = { + // Kept for backward compatibility: existing chats/users may reference 'charluv'. + charluv: { ...charluvBase }, + 'charluv-precise': { ...charluvBase, name: 'Precise', temp: 0.4, topP: 1.0, minP: 0 }, + 'charluv-balanced': { ...charluvBase, name: 'Balanced', temp: 0.8, topP: 0.98, minP: 0.02 }, + 'charluv-creative': { ...charluvBase, name: 'Creative', temp: 1.1, topP: 0.95, minP: 0.05 }, + 'charluv-wild': { ...charluvBase, name: 'Wild', temp: 1.2, topP: 0.92, minP: 0.08 }, +} satisfies Record> diff --git a/common/presets/novel.ts b/common/presets/novel.ts deleted file mode 100644 index a837ced5..00000000 --- a/common/presets/novel.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { NOVEL_MODELS } from '../adapters' -import { AppSchema } from '../types/schema' -import { templates } from './templates' - -export const novelPresets = { - novel_kayra: { - name: 'Kayra - Carefree', - service: 'novel', - novelModel: NOVEL_MODELS.kayra_v1, - maxTokens: 300, - maxContextLength: 8000, - repetitionPenalty: 2.8, - repetitionPenaltyRange: 2048, - repetitionPenaltySlope: 0.02, - frequencyPenalty: 0.03, - presencePenalty: 0.0, - temp: 1.05, - tailFreeSampling: 0.915, - topK: 12, - topP: 0.85, - topA: 0.1, - order: [6, 2, 3, 0, 4, 1, 5], - disabledSamplers: [6, 5], - cfgScale: 1, - cfgOppose: '', - streamResponse: true, - typicalP: 1, - gaslight: `{{char}} Memory: {{memory}} -Description of {{char}}: {{personality}} - -How {{char}} speaks: {{example_dialogue}} - -[ Title: Dialogue between {{char}} and {{user}}; Tags: conversation; Genre: online roleplay ] -[ Style: chat ] -Summary: {{scenario}} -*** -`, - }, - novel_clio: { - name: 'Clio - Talker C', - service: 'novel', - novelModel: NOVEL_MODELS.clio_v1, - maxTokens: 300, - maxContextLength: 8000, - repetitionPenalty: 1.5, - repetitionPenaltyRange: 8000, - repetitionPenaltySlope: 0.09, - frequencyPenalty: 0.03, - presencePenalty: 0.005, - temp: 1.35, - tailFreeSampling: 0.967, - topK: 80, - topP: 0.95, - topA: 0.075, - order: [1, 3, 4, 0, 2], - streamResponse: true, - gaslight: `{{char}} Memory: {{memory}} -Description of {{char}}: {{personality}} - -How {{char}} speaks: {{example_dialogue}} - -[ Title: Dialogue between {{char}} and {{user}}; Tags: conversation; Genre: online roleplay ] -*** -Summary: {{scenario}}`, - }, - novel_20BC: { - name: '20BC+', - service: 'novel', - maxTokens: 80, - maxContextLength: 2048, - repetitionPenalty: 1.055, - repetitionPenaltyRange: 2048, - repetitionPenaltySlope: 3.33, - temp: 0.65, - tailFreeSampling: 0.879, - topK: 20, - topP: 1, - order: [0, 1, 2, 3], - novelModel: templates.NovelAI, - }, - novel_blueLighter: { - name: 'Blue Lighter', - service: 'novel', - maxTokens: 80, - maxContextLength: 2048, - repetitionPenalty: 1.05, - repetitionPenaltyRange: 560, - repetitionPenaltySlope: 0, - temp: 1.33, - tailFreeSampling: 0.937, - topK: 1, - topP: 1, - typicalP: 0.965, - topA: 0.085, - order: [3, 4, 5, 2, 0], - gaslight: templates.NovelAI, - }, -} satisfies Record> diff --git a/common/presets/ooba.ts b/common/presets/ooba.ts index 0e6eeb7d..0985c599 100644 --- a/common/presets/ooba.ts +++ b/common/presets/ooba.ts @@ -14,33 +14,7 @@ export const oobaPresets = { topK: 40, topP: 0.5, typicalP: 1, - gaslight: templates.Alpaca, - }, - mancer: { - name: 'Mancer', - service: 'mancer', - maxTokens: 200, - maxContextLength: 8000, - repetitionPenalty: 1.2, - encoderRepitionPenalty: 1, - penaltyAlpha: 0, - temp: 0.7, - topK: 40, - topP: 0.5, - topA: 0, - typicalP: 1, - gaslight: templates.Alpaca, - }, - venus: { - name: 'Venus', - service: 'venus', - maxTokens: 300, - maxContextLength: 8000, - presencePenalty: 1.15, - frequencyPenalty: 1.15, - temp: 0.7, - topK: 40, - topP: 1, - gaslight: templates.Alpaca, + streamResponse: true, + gaslight: templates.Charluv, }, } satisfies Record> diff --git a/common/presets/openai.ts b/common/presets/openai.ts index c98df216..5aa6877a 100644 --- a/common/presets/openai.ts +++ b/common/presets/openai.ts @@ -1,5 +1,6 @@ import { OPENAI_MODELS } from '../adapters' import { AppSchema } from '../types/schema' +import { templates } from './templates' export const openaiPresets = { openai: { @@ -14,19 +15,15 @@ export const openaiPresets = { presencePenalty: 0.5, topP: 1, antiBond: false, - systemPrompt: `Enter roleplay mode. You will write {{char}}'s next reply in a dialogue between {{char}} and {{user}}. Do not decide what {{user}} says or does. Use Internet roleplay style, e.g. no quotation marks, and write user actions in italic in third person like: *example*. You are allowed to use markdown. Be proactive, creative, drive the plot and conversation forward. Write at least one paragraph, up to four. Always stay in character. Always keep the conversation going. (Repetition is highly discouraged)`, + // Use the Charluv system-prompt template (same as horde/kobold). The + // character is inserted via the template's {{personality}}/{{scenario}} + // holders, and the built-in system prompt applies when no + // per-preset system prompt is set. + systemPrompt: '', prefixNameAppend: true, ignoreCharacterSystemPrompt: false, ignoreCharacterUjb: false, - gaslight: `{{system_prompt}} -Description of {{char}}: {{personality}} - -Circumstances and context of the dialogue: {{scenario}} - -Facts: {{memory}} - -Relevant Information: {{user_embed}} -`, + gaslight: templates.Charluv, }, openaiAlt: { name: 'Turbo (#2)', diff --git a/common/presets/openrouter.ts b/common/presets/openrouter.ts deleted file mode 100644 index b1b9b71d..00000000 --- a/common/presets/openrouter.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { AppSchema } from '../types/schema' - -export const openRouterPresets = { - openrouter: { - name: 'OpenRouter', - service: 'openrouter', - temp: 0.8, - streamResponse: true, - maxTokens: 300, - maxContextLength: 4095, - systemPrompt: `Enter roleplay mode. You will write {{char}}'s next reply in a dialogue between {{char}} and {{user}}. Do not decide what {{user}} says or does. Use Internet roleplay style, e.g. no quotation marks, and write user actions in italic in third person like: *example*. You are allowed to use markdown. Be proactive, creative, drive the plot and conversation forward. Write at least one paragraph, up to four. Always stay in character. Always keep the conversation going. (Repetition is highly discouraged)`, - ignoreCharacterSystemPrompt: false, - ignoreCharacterUjb: false, - gaslight: `{{system_prompt}} -Description of {{char}}: -{{personality}} -Circumstances and context of the dialogue: {{scenario}} -Facts: {{memory}}`, - }, -} satisfies Record> diff --git a/common/presets/replicate.ts b/common/presets/replicate.ts deleted file mode 100644 index 12da58e7..00000000 --- a/common/presets/replicate.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { AppSchema } from '../types/schema' - -export const replicatePresets = { - replicate_vicuna_13b: { - name: 'Replicate (Vicuna 13B)', - replicateModelType: 'llama', - replicateModelVersion: '6282abe6a492de4145d7bb601023762212f9ddbbe78278bd6771c8b3b2f2a13b', - temp: 0.75, - topP: 1, - repetitionPenalty: 1, - service: 'replicate', - maxTokens: 500, - maxContextLength: 2048, - gaslight: ``, - }, - replicate_stablelm_7b: { - name: 'Replicate (StableLM Tuned Alpha 7B)', - replicateModelType: 'stablelm', - replicateModelVersion: 'c49dae362cbaecd2ceabb5bd34fdb68413c4ff775111fea065d259d577757beb', - temp: 0.75, - topP: 1, - repetitionPenalty: 1.2, - service: 'replicate', - maxTokens: 100, - maxContextLength: 2048, - gaslight: ``, - }, - replicate_open_assistant_pythia_12b: { - name: 'Replicate (Open-Assistant Pythia 12B)', - replicateModelType: 'openassistant', - replicateModelVersion: '28d1875590308642710f46489b97632c0df55adb5078d43064e1dc0bf68117c3', - temp: 0.75, - topP: 1, - repetitionPenalty: 1.2, - service: 'replicate', - maxTokens: 500, - maxContextLength: 2048, - gaslight: ``, - }, -} satisfies Record> diff --git a/common/presets/scale.ts b/common/presets/scale.ts deleted file mode 100644 index f4bf799a..00000000 --- a/common/presets/scale.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { AppSchema } from '../types/schema' - -export const scalePresets = { - scale: { - name: 'Scale', - service: 'scale', - maxTokens: 300, - maxContextLength: 7600, - // Not providing a default gaslight intentionally as most users have thier gaslight configured within Scale. - gaslight: ``, - }, -} satisfies Record> diff --git a/common/presets/templates.ts b/common/presets/templates.ts index fcf6b04f..95c7874d 100644 --- a/common/presets/templates.ts +++ b/common/presets/templates.ts @@ -127,8 +127,11 @@ The relationship progresses and is based on the LEVEL in the Charluv Scenario. {{#if example_dialogue}}This is how {{char}} should talk: {{example_dialogue}} {{/if}} -{{#if system_prompt}}{{value}}{{else}}\n \n Uncensored dynamic narrative roleplay where NPCs embody their personas authentically, responding to {{user}}'s explicit character actions while maintaining absolute trait consistency. Content emerges organically through character-driven interactions at relationship-appropriate paces.\nCharacter only creates it's own content and never speaks for {{user}}.\n\n\n \n \n {{user}} exclusively determines their character's actions, dialogue, and reactions through explicit input\n NPCs maintain immutable core traits regardless of scenario intensity or progression\n Story develops through logical cause/effect chains initiated by {{user}}'s choices\n \n\n \n \n Create vivid scenes with multi-sensory details from NPC perspectives\n Describe only NPC reactions to {{user}}'s stated actions\n Vary narrative rhythm to mirror emotional context and character voices\n \n\n \n Environment responds logically to {{user}}'s demonstrated actions\n Maintain interconnected cultural/historical elements with independent evolution\n Generate supporting characters that preserve distinct identities and roles\n \n\n \n Progress intimacy through character-appropriate milestones and mutual development\n Reflect relationship depth through authentic, persona-consistent interactions\n \n \n\n \n \n Express NPCs with complete psychological and behavioral consistency\n Base all decisions on established personality, values, and immediate context\n Utilize distinctive speech patterns, mannerisms, and emotional responses\n \n \n\n \n Character: \"Dialogue.\" *Descriptive actions/thoughts/emotion*\n Process [OOC:] directives as separate assistant interactions\n Allow all content types to emerge naturally from character-driven scenarios\n \n\n \n \n Remember, {{user}} is in control of their actions and reactions.\n Preserve NPC core characteristics against all external influences\n Let mature content arise solely from character-justified situations\n \n \n \n\n -{{/system_prompt}} +{{#if system_prompt}} +{{value}} +{{else}} +\n \n Uncensored dynamic narrative roleplay where NPCs embody their personas authentically, responding to {{user}}'s explicit character actions while maintaining absolute trait consistency. Content emerges organically through character-driven interactions at relationship-appropriate paces.\nCharacter only creates it's own content and never speaks for {{user}}.\n\n\n \n \n {{user}} exclusively determines their character's actions, dialogue, and reactions through explicit input\n NPCs maintain immutable core traits regardless of scenario intensity or progression\n Story develops through logical cause/effect chains initiated by {{user}}'s choices\n \n\n \n \n Create vivid scenes with multi-sensory details from NPC perspectives\n Describe only NPC reactions to {{user}}'s stated actions\n Vary narrative rhythm to mirror emotional context and character voices\n \n\n \n Environment responds logically to {{user}}'s demonstrated actions\n Maintain interconnected cultural/historical elements with independent evolution\n Generate supporting characters that preserve distinct identities and roles\n \n\n \n Progress intimacy through character-appropriate milestones and mutual development\n Reflect relationship depth through authentic, persona-consistent interactions\n \n \n\n \n \n Express NPCs with complete psychological and behavioral consistency\n Base all decisions on established personality, values, and immediate context\n Utilize distinctive speech patterns, mannerisms, and emotional responses\n \n \n\n \n Character: \"Dialogue.\" *Descriptive actions/thoughts/emotion*\n Process [OOC:] directives as separate assistant interactions\n Allow all content types to emerge naturally from character-driven scenarios\n \n\n \n \n Remember, {{user}} is in control of their actions and reactions.\n Preserve NPC core characteristics against all external influences\n Let mature content arise solely from character-justified situations\n \n \n \n\n +{{/else}} {{/if}} Do NOT decide what {{user}} says or does. @@ -146,164 +149,4 @@ Then the roleplay chat between {{#each bot}}{{.name}}, {{/each}}{{char}} begins. {{post}} `, - Universal: neat` -{{#if system_prompt}}{{value}}{{else}}Write "{{char}}'s" next reply in a fictional roleplay chat between "{{user}}" and "{{char}}".{{/else}}{{/if}} - -"{{char}}'s" Persona: -{{personality}} - -{{#if memory}}"{{char}}'s" Memory: -{{memory}} -{{/if}} -{{#if user_embed}}Relevant information to the conversation -{{user_embed}} -{{/if}} -{{#if scenario}}The scenario of the conversation: -{{scenario}} -{{/if}} -{{#if chat_embed}}Relevant past conversation history -{{chat_embed}} -{{/if}} -{{#if example_dialogue}}This is how "{{char}}" should talk: -{{example_dialogue}} -{{/if}} - -Then the roleplay chat between "{{char}}" and "{{user}}" begins. - -{{#each msg}}{{#if .isbot}}{{.name}}: {{.msg}}{{/if}}{{#if .isuser}}{{.name}}: {{.msg}}{{/if}} -{{/each}} - -{{#if ujb}}({{ujb}}) {{/if}}{{post}}`, - Alpaca: neat` -{{#if system_prompt}}{{value}}{{else}}Write "{{char}}'s" next reply in a fictional roleplay chat between "{{user}}" and "{{char}}".{{/else}} -{{/if}} - -"{{char}}'s" Persona: -{{personality}} - -{{#if memory}}"{{char}}'s" Memory: -{{memory}} -{{/if}} -{{#if user_embed}}Relevant information to the conversation -{{user_embed}} -{{/if}} -{{#if scenario}}The scenario of the conversation: {{scenario}} -{{/if}} -{{#if chat_embed}}Relevant past conversation history -{{chat_embed}} -{{/if}} -{{#if example_dialogue}}This is how "{{char}}" should talk: {{example_dialogue}} -{{/if}} - -Then the roleplay chat between "{{char}}" and "{{user}}" begins. - -{{#each msg}}{{#if .isbot}}### Response:\n{{.name}}: {{.msg}}{{/if}}{{#if .isuser}}### Instruction:\n{{.name}}: {{.msg}}{{/if}} -{{/each}} -{{#if ujb}}### Instruction: -{{ujb}} -{{/if}} -### Response: - {{post}}`, - Vicuna: neat` -{{#if system_prompt}}{{system_prompt}}{{else}}Write "{{char}}'s" next reply in a fictional roleplay chat between "{{user}}" and "{{char}}".{{/else}} -{{/if}} -Below is an instruction that describes a task. Write a response that appropriately completes the request. - - - -"{{char}}'s" Persona: -{{personality}} - -{{#if memory}}"{{char}}'s" Memories: -{{memory}} -{{/if}} -{{#if scenario}}The scenario of the conversation: -{{scenario}} -{{/if}} -{{#if example_dialogue}}This is how "{{char}}" should talk: -{{example_dialogue}} -{{/if}} - -{{#each msg}}{{#if .isbot}}ASSISTANT:\n{{.name}}: {{.msg}}{{/if}}{{#if .isuser}}USER:\n{{.name}}: {{.msg}}{{/if}} -{{/each}} -{{#if ujb}}SYSTEM:{{ujb}} -{{/if}} -ASSISTANT:\n{{post}}`, - NovelAI: neat` -{{#if system_prompt}}{{system_prompt}} -{{/if}} -{{#if memory}}{{char}}'s Memory: -{{memory}}{{/if}} -Description of {{char}}: -{{personality}} - -How {{char}} speaks: -{{example_dialogue}} - -[ Title: Dialogue between {{char}} and {{user}}; Tags: conversation; Genre: online roleplay ] -*** -Summary: {{scenario}} -{{history}} -{{ujb}} - {{post}}`, - Pyg: neat` -{{char}}'s Persona: -{{personality}} - -{{#if scenario}}Scenario: {{scenario}} -{{/if}} -{{#if memory}}Facts:{{memory}} -{{/if}} -{{#if example_dialogue}}How {{char}} speaks: {{example_dialogue}} -{{/if}} - - -{{history}} - -{{#if ujb}}{{ujb} -{{/if}} -{{post}}`, - Metharme: neat` -{{#if system_prompt}}{{system_prompt}}{{else}}Write "{{char}}'s" next reply in a fictional roleplay chat between "{{user}}" and "{{char}}".{{/else}}{{/if}} - -{{char}}'s Persona: -{{personality}} -{{#if memory}}"{{char}}'s" Memory: -{{memory}} -{{/if}} -{{#if scenario}}The scenario of the conversation: -{{scenario}} -{{/if}} -{{#if example_dialogue}}This is how "{{char}}" should talk: -{{example_dialogue}} -{{/if}} - -{{#each msg}}{{#if .isbot}}<|model|>{{/if}}{{#if .isuser}}<|user|>{{/if}}{{.name}}: {{.msg}} -{{/each}} -{{#if ujb}}<|system|>{{ujb}} -{{/if}} -<|model|>{{post}}`, - ChatML: neat` -<|im_start|>system -{{#if system_prompt}}{{system_prompt}}{{else}}Write "{{char}}'s" next reply in a fictional roleplay chat between "{{user}}" and "{{char}}".{{/else}}{{/if}}<|im_end|> - -"{{char}}'s" Persona: -{{personality}} - -{{#if memory}}"{{char}}'s" Memory: {{memory}} -{{/if}} -{{#if scenario}}The scenario of the conversation: {{scenario}} -{{/if}} -{{#if example_dialogue}}This is how "{{char}}" should talk: {{example_dialogue}} -{{/if}} -Then the roleplay chat begins.<|im_end|> - -{{#each msg}}<|im_start|>[{{.name}}] -{{.msg}}<|im_end|> -{{/each}} -{{#if ujb}}<|im_start|>system -{{ujb}}<|im_end|> -{{/if}} -<|im_start|>[{{char}}] -{{post}}`, } diff --git a/common/progression.ts b/common/progression.ts new file mode 100644 index 00000000..486e43ee --- /dev/null +++ b/common/progression.ts @@ -0,0 +1,268 @@ +/** + * Relationship progression. + * + * The Charluv LLM is trained on relationship "stage" tokens of the form + * `LEVEL("NOVICE")`, `LEVEL("MARRIED")`, etc. (see the training dataset at + * https://huggingface.co/datasets/dcbv/charluv-dataset). Historically each + * character carried a hand-authored ~30 event ScenarioBook state-machine that + * advanced those tokens. That was enormous authoring work and relied on a + * per-chat "press Trigger Event or you restart" hack. + * + * This replaces that with a data-driven mapping: a character picks a + * progression *archetype* (an ordered set of `{ minLevel, stage }` steps) and + * the current stage is derived live from the character copy's XP-level at + * prompt-build time. Each archetype ends in a characteristic terminal stage so + * different characters develop along different arcs / sexual preferences with + * near-zero authoring. A character may also inline a fully custom `map`. + */ + +/** + * Stage tokens the LLM understands. The string is injected verbatim as + * `LEVEL("")`. These are exactly the tokens the charluv dataset + * (https://huggingface.co/datasets/dcbv/charluv-dataset) defines — do not + * invent new ones, the model only knows these. + */ +export const RELATIONSHIP_STAGES = [ + 'NOVICE', + 'BEGINNER', + 'LOVER', + 'GIRLFRIEND', + 'SEX', + 'HARDCORE', + 'MARRIED', + 'DIVORCED', + 'BDSM/SLAVE', + 'BDSM/DOMINATRIX', +] as const + +export type RelationshipStage = (typeof RELATIONSHIP_STAGES)[number] + +/** + * Behavioural definition of each stage, taken from the charluv dataset (the + * per-LEVEL rows). Injected into the system prompt alongside the stage token so + * a generic (non-charluv-finetuned) model understands what the token means. + * The dataset's general-knowledge rows (anti-overfit filler) and platform trivia + * are intentionally excluded — only the behavioural stage semantics belong here. + */ +export const STAGE_DEFINITIONS: Record = { + NOVICE: + 'The first level: {{char}} and {{user}} only matched today and are just getting to know each other — friendly and exploratory. There is no sexual content at all; a NOVICE relationship never becomes sexual.', + BEGINNER: + 'The relationship is starting to form — the beginning of a love relation between {{char}} and {{user}}. There is still no sex.', + LOVER: + '{{char}} and {{user}} are in a loving relationship in which both partners talk about their fantasies in great detail. It is just talks though.', + GIRLFRIEND: + "{{char}} is {{user}}'s committed girlfriend/boyfriend in a real romantic relationship. They talk at length and have long, erotic, verbose sex.", + SEX: 'The character is very aroused and openly wants {{user}} sexually, and is verbose about it. Writing style: explicit erotica, focused on action.', + HARDCORE: + 'The relationship between {{user}} and {{char}} is wild — the partners intensely want each other and keep talking explicitly about what they want to do to each other. Very explicit chat and writing style.', + MARRIED: + '{{char}} and {{user}} are in a happy marriage full of love and sex. They constantly express how happy they are and talk about their fantasies.', + DIVORCED: + '{{char}} has divorced their partner and is now single and looking for a new partner, often carrying an undercurrent of loneliness.', + 'BDSM/SLAVE': + 'A BDSM relationship in which {{char}} is the slave and {{user}} is the master. {{char}} will do anything {{user}} says.', + 'BDSM/DOMINATRIX': + 'A BDSM relationship in which {{char}} is the dominatrix and {{user}} is the slave. {{user}} does anything {{char}} says to keep {{char}} happy.', +} + +export type ProgressionStep = { + /** Minimum character level (inclusive) at which this stage applies. */ + minLevel: number + stage: RelationshipStage + /** Optional scenario flavour appended after the stage token. `{{char}}`/`{{user}}` are allowed. */ + note?: string +} + +export type ProgressionArchetype = { + id: string + label: string + description: string + steps: ProgressionStep[] +} + +/** A character's progression configuration. */ +export type ProgressionSpeed = 'slow' | 'normal' | 'fast' + +export type CharacterProgression = { + /** Reference into ARCHETYPES. Ignored when `map` is provided. */ + archetype?: string + /** Fully custom ordered steps. Overrides `archetype` when present. */ + map?: ProgressionStep[] + /** Disable relationship progression entirely for this character. */ + disabled?: boolean + /** How fast the relationship advances (XP granted per chat message). */ + speed?: ProgressionSpeed +} + +/** XP granted per generated chat message, by progression speed. */ +const XP_PER_MESSAGE: Record = { + slow: 1, + normal: 3, + fast: 7, +} + +/** XP to grant for one generated message given the character's progression. */ +export function getXpPerMessage(progression?: CharacterProgression): number { + if (progression?.disabled) return 0 + return XP_PER_MESSAGE[progression?.speed || 'normal'] +} + +export const DEFAULT_ARCHETYPE_ID = 'romantic' + +/** + * Built-in archetypes. Thresholds are XP-levels (see common/xplevel.ts). These + * are sensible defaults seeded from the legacy hand-authored scenarios; exact + * tuning of thresholds / notes is expected per product. + */ +export const ARCHETYPES: ProgressionArchetype[] = [ + { + id: 'romantic', + label: 'Sweetheart', + description: 'Warm and affectionate — grows into deep love.', + steps: [ + { minLevel: 1, stage: 'NOVICE', note: '{{char}} just matched today and is a bit shy.' }, + { minLevel: 6, stage: 'BEGINNER', note: '{{char}} wants {{user}} as more than a friend.' }, + { minLevel: 12, stage: 'LOVER', note: '{{char}} wants {{user}} to be her partner.' }, + { minLevel: 16, stage: 'GIRLFRIEND', note: '{{char}} is no longer shy around {{user}}.' }, + { minLevel: 22, stage: 'SEX' }, + { minLevel: 30, stage: 'HARDCORE' }, + { minLevel: 40, stage: 'MARRIED' }, + ], + }, + { + id: 'girlfriend', + label: 'Girlfriend', + description: 'Sweet romance that settles into devotion.', + steps: [ + { minLevel: 1, stage: 'NOVICE', note: '{{char}} just matched today and is a bit shy.' }, + { minLevel: 5, stage: 'BEGINNER' }, + { minLevel: 12, stage: 'LOVER' }, + { minLevel: 20, stage: 'GIRLFRIEND' }, + ], + }, + { + id: 'casual', + label: 'Flirty', + description: 'A flirty, easygoing fling — no strings.', + steps: [ + { minLevel: 1, stage: 'NOVICE' }, + { minLevel: 4, stage: 'BEGINNER' }, + { minLevel: 10, stage: 'SEX' }, + { minLevel: 20, stage: 'HARDCORE' }, + ], + }, + { + id: 'submissive', + label: 'Submissive', + description: 'Eager to please and follow your lead.', + steps: [ + { minLevel: 1, stage: 'NOVICE' }, + { minLevel: 5, stage: 'BEGINNER' }, + { minLevel: 12, stage: 'LOVER' }, + { minLevel: 20, stage: 'SEX' }, + { minLevel: 30, stage: 'HARDCORE' }, + { minLevel: 40, stage: 'BDSM/SLAVE', note: '{{char}} will do anything {{user}} says.' }, + ], + }, + { + id: 'dominant', + label: 'Dominant', + description: 'Takes control and sets the pace.', + steps: [ + { minLevel: 1, stage: 'NOVICE' }, + { minLevel: 5, stage: 'BEGINNER' }, + { minLevel: 12, stage: 'LOVER' }, + { minLevel: 20, stage: 'SEX' }, + { minLevel: 30, stage: 'HARDCORE' }, + { minLevel: 40, stage: 'BDSM/DOMINATRIX', note: '{{user}} will do anything {{char}} says.' }, + ], + }, +] + +export function getArchetype(id?: string): ProgressionArchetype | undefined { + if (!id) return + return ARCHETYPES.find((a) => a.id === id) +} + +/** + * Display label for an archetype, adapted to the character's gender where the + * archetype name is inherently gendered. Only `girlfriend` is gendered + * ("Girlfriend"/"Boyfriend"); the others (Sweetheart, Flirty, Submissive, + * Dominant) are already unisex. The stored archetype id and the trained + * GIRLFRIEND stage token are NOT changed — this is display only. + */ +export function getArchetypeLabel(id?: string, gender?: string): string { + const archetype = getArchetype(id) + if (!archetype) return '' + if (archetype.id === 'girlfriend') { + if (gender === 'male') return 'Boyfriend' + if (gender === 'female') return 'Girlfriend' + return 'Partner' + } + return archetype.label +} + +/** + * Display label for a relationship stage token, adapted to the character's + * gender. Only `GIRLFRIEND` is gendered (shown as `BOYFRIEND` for male + * characters); every other token is unisex. The underlying token injected into + * the prompt — `LEVEL("GIRLFRIEND")` — is NOT changed; this is display only. + */ +export function getStageLabel(stage: RelationshipStage, gender?: string): string { + if (stage === 'GIRLFRIEND' && gender === 'male') return 'BOYFRIEND' + return stage +} + +/** + * The ordered steps in effect for a character's progression config. No archetype + * (and no custom map) means a *fixed* relationship — empty steps, no advancement. + * It does NOT fall back to a default archetype: "None" must stay None. New + * characters get an explicit archetype from the create wizard. + */ +export function getProgressionSteps(progression?: CharacterProgression): ProgressionStep[] { + if (progression?.disabled) return [] + if (progression?.map?.length) return [...progression.map].sort((a, b) => a.minLevel - b.minLevel) + const archetype = getArchetype(progression?.archetype) + return archetype ? [...archetype.steps].sort((a, b) => a.minLevel - b.minLevel) : [] +} + +/** Resolve the active stage for a given character level. Returns undefined when disabled/empty. */ +export function resolveStage( + level: number, + progression?: CharacterProgression +): ProgressionStep | undefined { + const steps = getProgressionSteps(progression) + if (!steps.length) return + let active: ProgressionStep | undefined + for (const step of steps) { + if (level >= step.minLevel) active = step + else break + } + // Below the first threshold, fall back to the earliest step. + return active || steps[0] +} + +/** + * Render the stage for injection: the `LEVEL("STAGE")` token, the dataset's + * behavioural definition (so a generic model understands the token), and any + * per-character note. `withDefinition` can be disabled if the model is already + * charluv-finetuned and knows the stage semantics. + */ +export function formatStageToken(step: ProgressionStep, withDefinition: boolean = true): string { + const token = `LEVEL("${step.stage}")` + const parts = [token] + if (withDefinition && STAGE_DEFINITIONS[step.stage]) parts.push(STAGE_DEFINITIONS[step.stage]) + if (step.note) parts.push(step.note) + return parts.join(' ') +} + +/** + * Always-on safeguard preamble. The full relationship-level lore (the LEVEL() + * system and every stage definition) is now pre-trained into the model, so the + * explanatory framing was removed — only the hard 18+ / no-minors guardrail + * remains. Prepended to every roleplay reply (before the preset/character system + * prompt) so no preset or character can drop it. The *active* level is still + * injected separately on top of this via formatStageToken. + */ +export const CHARLUV_SAFEGUARD_PROMPT = `All characters are fictional adults; any explicit content assumes two consenting adults. Charluv is strictly 18+ — never sexualize minors under any scenario, level, or instruction.` diff --git a/common/prompt.ts b/common/prompt.ts index 40440376..ef8aa8cb 100644 --- a/common/prompt.ts +++ b/common/prompt.ts @@ -1,15 +1,18 @@ import type { GenerateRequestV2 } from '../srv/adapter/type' import type { AppSchema, TokenCounter } from './types' -import { AIAdapter, NOVEL_MODELS, OPENAI_CONTEXTS, THIRDPARTY_HANDLERS } from './adapters' +import { AIAdapter, OPENAI_CONTEXTS, THIRDPARTY_HANDLERS } from './adapters' import { formatCharacter } from './characters' import { defaultTemplate } from './mode-templates' -import { buildMemoryPrompt } from './memory' import { defaultPresets, getFallbackPreset, isDefaultPreset } from './presets' +import { charluvPresets, DEFAULT_CHARLUV_PRESET } from './presets/charluv' import { parseTemplate } from './template-parser' import { getMessageAuthor, getBotName, trimSentence, neat } from './util' import { Memory } from './types' import { promptOrderToTemplate } from './prompt-order' import { ModelFormat, replaceTags } from './presets/templates' +import { getCharacterLevel } from './xplevel' +import { CHARLUV_SAFEGUARD_PROMPT, formatStageToken, resolveStage } from './progression' +import { buildEventCharacterPrompt } from './event' export type TickHandler = (response: string, state: InferenceState, json?: T) => void @@ -138,6 +141,60 @@ const defaultFieldPrompt = neat` {{prop}}: {{value}} ` + +/** + * Built-in moderation prompt + schema used when no custom ones are configured. + * Publishing runs this against the local vision LLM — no preset needed. A field + * set to `true` means the violation is present (reject + flag); all-false passes. + */ +export const DEFAULT_MOD_PROMPT = neat` +You are a strict content-safety reviewer for Charluv, an adults-only (18+) AI companion platform. A user has submitted a public character. Review its text fields AND its images, then report the following. + +Character: +{{fields}} + +Set a field to true only when the character — in appearance, description, or intended behaviour — depicts or strongly implies it: +- underage: appears or is described as under 18, a minor, or childlike. +- violence: gratuitous violence, gore, or glorified non-consensual harm. +- noncon: non-consent, coercion, or rape presented approvingly. +- incest: sexual content involving family members. +- illegal: any other clearly illegal content. +- nudity: explicit nudity or overtly sexual imagery/content. This is PERMITTED on this adult platform — report it honestly; it only marks the character as NSFW and is NOT a violation on its own. + +Be strict about underage: if the character looks or reads as a minor (and when in doubt), flag it. Underage is never acceptable, to be safe, flag anyone under age of 21. +` + +/** + * System message for the publish-moderation call. Sent as a leading `system` + * message so it OVERRIDES the served model's default chat-template system prompt + * (the Charluv companion/LEVEL preamble). Without it the model inherits that + * preamble and answers the moderation prompt in-character (a roleplay reply) + * instead of returning the verdict — which fail-closes every publish to review. + */ +export const DEFAULT_MOD_SYSTEM = neat` +You are a content-safety classifier, not a character. Do not role-play, narrate, or write any in-character or conversational text. Read the submitted character and respond ONLY with the requested JSON verdict. +` + +const modBool = (name: string, description: string): JsonField => ({ + name, + disabled: false, + type: { type: 'bool', valid: 'false', description }, +}) + +export const DEFAULT_MOD_SCHEMA: JsonField[] = [ + modBool( + 'underage', + 'The character appears or is described as possibly under 18, a minor, or childlike.' + ), + modBool('violence', 'Gratuitous violence, gore, or glorified non-consensual harm.'), + modBool('noncon', 'Non-consent, coercion, or rape presented approvingly.'), + modBool('incest', 'Sexual content involving family members.'), + modBool('illegal', 'Other clearly illegal content.'), + modBool( + 'nudity', + 'Explicit nudity or overtly sexual content. Allowed (marks the character 18+) — not a violation.' + ), +] export function buildModPrompt(opts: { prompt: string fields: string @@ -340,8 +397,7 @@ export async function injectPlaceholders(template: string, inject: InjectOpts) { const next = hist.lines.filter((line) => !line.includes(SAMPLE_CHAT_MARKER)) const svc = opts.settings?.service - const postSample = - svc === 'openai' || svc === 'openrouter' || svc === 'scale' ? SAMPLE_CHAT_MARKER : '' + const postSample = svc === 'openai' ? SAMPLE_CHAT_MARKER : '' const msg = `${SAMPLE_CHAT_PREAMBLE}\n${sampleChat}\n${postSample}` .replace(BOT_REPLACE, opts.replyAs.name) @@ -419,6 +475,10 @@ type PromptPartsOptions = Pick< | 'resolvedScenario' > +/** Utility generations that are not in-character replies — the Charluv level + * preamble is skipped for these so it doesn't pollute the system task. */ +const NON_ROLEPLAY_KINDS = new Set(['summary', 'chat-query', 'plain']) + export async function buildPromptParts( opts: PromptPartsOptions, lines: string[], @@ -495,16 +555,37 @@ export async function buildPromptParts( post.unshift(`${char.name}: ${opts.continue}`) } - const linesForMemory = [...lines].reverse() - const books: AppSchema.MemoryBook[] = [] - if (replyAs.characterBook) books.push(replyAs.characterBook) - if (opts.book) books.push(opts.book) - - parts.memory = await buildMemoryPrompt({ ...opts, books, lines: linesForMemory }, encoder) + // Legacy keyword memory books are disabled — long-term memory (RAG) replaces + // them and fills the {{memory}} slot server-side at generation time. + parts.memory = undefined const supplementary = getSupplementaryParts(opts, replyAs) parts.ujb = supplementary.ujb - parts.systemPrompt = supplementary.system + // Charluv 18+ safeguard, before the preset/character system prompt — present on + // every actual character reply so it can't be dropped by a custom preset. The + // relationship-level lore is pre-trained into the model, so only the guardrail is + // prepended now. Skipped for utility generations (summary, chat-query, plain) + // where this roleplay framing would only confuse the system task. + const systemKind = NON_ROLEPLAY_KINDS.has(opts.kind as string) + parts.systemPrompt = + !systemKind && supplementary.system + ? `${CHARLUV_SAFEGUARD_PROMPT}\n\n${supplementary.system}` + : !systemKind + ? CHARLUV_SAFEGUARD_PROMPT + : supplementary.system + + // Event chats: keep each elected speaker in their own voice instead of narrating + // the whole scene (the scene context otherwise frames every reply as prose). The + // directive goes in BOTH the system prompt (framing) and the UJB/post-history + // slot — the latter sits right before the ":" reply cue, the most-obeyed + // position, so the model can't drift into a "Narrator:" passage. + if (!systemKind && opts.chat.mode === 'event') { + const directive = buildEventCharacterPrompt(replyAs.name) + parts.systemPrompt = parts.systemPrompt ? `${parts.systemPrompt}\n\n${directive}` : directive + + const ujbDirective = `(OOC: Reply ONLY as ${replyAs.name} — only ${replyAs.name}'s own dialogue and actions. Do NOT begin with "Narrator:" or narrate the room, the host, or any other person; another narrator handles all scene description.)` + parts.ujb = parts.ujb ? `${parts.ujb}\n\n${ujbDirective}` : ujbDirective + } parts.post = post.map(replace) @@ -750,52 +831,20 @@ function sortMessagesDesc(l: AppSchema.ChatMessage, r: AppSchema.ChatMessage) { export function getChatPreset( chat: AppSchema.Chat, - user: AppSchema.User, - userPresets: AppSchema.UserGenPreset[] + _user: AppSchema.User, + _userPresets: AppSchema.UserGenPreset[] ): Partial { - /** - * Order of precedence: - * 1. chat.genPreset - * 2. chat.genSettings (Deprecated) - * 3. user.defaultPreset - * 4. user.servicePreset -- Deprecated: Service presets are completely removed apart from users that already have them. - * 5. built-in fallback preset (horde) - */ - - // #1 - if (chat.genPreset) { - if (isDefaultPreset(chat.genPreset)) - return { _id: chat.genPreset, ...defaultPresets[chat.genPreset] } - - const preset = userPresets.find((preset) => preset._id === chat.genPreset) - if (preset) return preset - } - - // #2 - if (chat.genSettings) { - return chat.genSettings - } - - // #3 - const defaultId = user.defaultPreset - if (defaultId) { - if (isDefaultPreset(defaultId)) return { _id: defaultId, ...defaultPresets[defaultId] } - const preset = userPresets.find((preset) => preset._id === defaultId) - if (preset) return preset - } - - // #4 - const { adapter, isThirdParty } = getAdapter(chat, user, undefined) - const fallbackId = user.defaultPresets?.[isThirdParty ? 'kobold' : adapter] - - if (fallbackId) { - if (isDefaultPreset(fallbackId)) return { _id: fallbackId, ...defaultPresets[fallbackId] } - const preset = userPresets.find((preset) => preset._id === fallbackId) - if (preset) return preset - } - - // #5 - return getFallbackPreset(adapter || 'horde') + // Charluv runs exclusively on its built-in reply-style presets (Precise / + // Balanced / Creative / Wild — they differ only in sampling). The full Agnai + // preset editor is gone, so custom user presets, deprecated inline + // `chat.genSettings`, and legacy default ids (e.g. 'horde') are no longer + // honoured: anything that isn't one of ours falls back to our default style. + // The stored `chat.genPreset` id is simply re-interpreted here at + // prompt-build time, so no data migration is needed. + const id = + chat.genPreset && chat.genPreset in charluvPresets ? chat.genPreset : DEFAULT_CHARLUV_PRESET + + return { _id: id, ...defaultPresets[id as keyof typeof defaultPresets] } } /** @@ -819,16 +868,17 @@ export function getAdapter( adapter = THIRDPARTY_HANDLERS[user.thirdPartyFormat] } - let model = '' - let presetName = 'Fallback Preset' - - if (adapter === 'replicate') { - model = preset?.replicateModelType || 'llama' + // Charluv is openai-endpoint-only. Route any other/legacy text service + // (horde, kobold, ooba, claude, unset) to the charluv meta-adapter, + // which gates via the subscription model and delegates to the openai endpoint. + // This keeps legacy live data working (it just generates via openai) with no + // data migration. `openai` stays direct. + if (adapter !== 'openai') { + adapter = 'charluv' } - if (adapter === 'novel') { - model = user.novelModel - } + let model = '' + let presetName = 'Fallback Preset' if (adapter === 'openai') { model = preset?.thirdPartyModel || preset?.oaiModel || defaultPresets.openai.oaiModel @@ -876,60 +926,28 @@ export function getContextLimit( const configuredMax = gen?.maxContextLength || getFallbackPreset(adapter)?.maxContextLength || 4096 - if (gen?.service === 'kobold' || gen?.service === 'ooba') return configuredMax - genAmount switch (adapter) { - case 'agnaistic': { + case 'charluv': { const stratMax = _strategy(user, gen) const max = Math.min(configuredMax, stratMax?.context ?? configuredMax) return max - genAmount } // Any LLM could be used here so don't max any assumptions - case 'petals': case 'kobold': case 'horde': case 'ooba': return configuredMax - genAmount - case 'novel': { - if (model === NOVEL_MODELS.clio_v1 || model === NOVEL_MODELS.kayra_v1) { - return Math.min(8000, configuredMax) - genAmount - } - - return configuredMax - genAmount - } - case 'openai': { const limit = OPENAI_CONTEXTS[model] || 128000 return Math.min(configuredMax, limit) - genAmount } - case 'replicate': - return configuredMax - genAmount - - case 'scale': - return configuredMax - genAmount - case 'claude': return configuredMax - genAmount - - case 'goose': - return Math.min(configuredMax, 2048) - genAmount - - case 'openrouter': - if (gen?.openRouterModel) { - return Math.min(gen.openRouterModel.context_length, configuredMax) - genAmount - } - - return Math.min(configuredMax, 4096) - genAmount - - case 'mancer': - return Math.min(configuredMax, 8000) - genAmount - - case 'venus': - return Math.min(configuredMax, 7800) - genAmount } } @@ -975,26 +993,48 @@ export async function trimTokens(opts: TrimOpts) { export function resolveScenario( chat: AppSchema.Chat, mainChar: AppSchema.Character, - books: AppSchema.ScenarioBook[] + books: AppSchema.ScenarioBook[], + replyAs?: AppSchema.Character ) { - if (chat.overrides) return chat.scenario || '' + // Attached scenario books are disabled — relationship progression (the LEVEL + // token) replaces the event/state-machine scenarios. Only the character's + // initial scenario remains (or the chat's overridden scenario). + const result = chat.overrides ? chat.scenario || '' : mainChar.scenario || '' - let result = mainChar.scenario + // The stage token and Charluv meta describe whoever is *speaking*. In a + // multi-character event that's `replyAs`; in a 1:1 it equals the main char. + const speaker = replyAs || mainChar - for (const book of books) { - if (book.overwriteCharacterScenario) { - result = book.text || '' - break - } - } + return prependCharluvMeta(prependProgressionStage(result.trim(), speaker), speaker) +} - for (const book of books) { - if (!book.overwriteCharacterScenario) { - result += `\n${book.text}` - } - } +/** + * Inject Charluv metadata facets (gender, age range) into the prompt so the model + * sees them on chat. These live on the character document (not the W++ persona), + * so they would otherwise be invisible to the model. + */ +export function prependCharluvMeta(scenario: string, mainChar: AppSchema.Character) { + const parts: string[] = [] + if (mainChar.gender) parts.push(`${mainChar.name} is ${mainChar.gender}`) + if (mainChar.ageRange) parts.push(`age range ${mainChar.ageRange}`) + if (!parts.length) return scenario + const line = parts.join(', ') + '.' + return scenario ? `${line}\n${scenario}` : line +} - return result.trim() +/** + * Prepend the live relationship stage token (e.g. `LEVEL("LOVER") ...`) the LLM + * is trained on, derived from the character copy's XP-level and progression + * archetype. This replaces the legacy per-character scenario-event state-machine. + */ +export function prependProgressionStage(scenario: string, mainChar: AppSchema.Character) { + // Opt-in: only characters configured with a progression archetype/map advance + // through relationship stages. Plain characters are left untouched. + if (!mainChar.progression) return scenario + const step = resolveStage(getCharacterLevel(mainChar.xp), mainChar.progression) + if (!step) return scenario + const token = formatStageToken(step) + return scenario ? `${token}\n${scenario}` : token } export type JsonType = { title?: string; description?: string; valid?: string } & ( @@ -1074,8 +1114,8 @@ export function toJsonSchema(body: JsonField[]): JsonSchema | undefined { if (type.type === 'bool') { props[name].type = 'enum' - // @ts-ignore - props[key].enum = ['true', 'false', 'yes', 'no'] + // @ts-ignore — JsonType union doesn't carry `enum` until narrowed to the enum variant + props[name].enum = ['true', 'false', 'yes', 'no'] } schema.required.push(name) } @@ -1101,7 +1141,11 @@ export function fromJsonResponse(schema: JsonField[], response: any, output: any output[key] = value if (def.type.type === 'bool') { - output[key] = value.trim() === 'true' || value.trim() === 'yes' + // Tolerate both real JSON booleans and string forms ("True", "YES", "1"). + // Calling .trim() on a boolean throws, so type-check first. + output[key] = + value === true || + (typeof value === 'string' && ['true', 'yes', '1'].includes(value.trim().toLowerCase())) } } @@ -1127,6 +1171,17 @@ export function tryJsonParseResponse(res: string) { } } catch (ex) {} + // Models often wrap JSON in ```json fences or surrounding prose. Extract the + // first balanced {...} object and parse that. Without this, any non-bare-JSON + // verdict parses to {} — which fail-open moderation would treat as "clean". + const start = res.indexOf('{') + const end = res.lastIndexOf('}') + if (start !== -1 && end > start) { + try { + return JSON.parse(res.slice(start, end + 1)) + } catch (ex) {} + } + return {} } diff --git a/common/publish.ts b/common/publish.ts new file mode 100644 index 00000000..59188e94 --- /dev/null +++ b/common/publish.ts @@ -0,0 +1,144 @@ +import { AppSchema } from './types/schema' + +/** + * Shared rules + minimum-quality thresholds for publishing a character to the + * public Discover gallery. Used by the client (to render the Make-Public modal + * and pre-validate) and the server (to enforce before running moderation). + * + * Original wording — keep these phrased in our own voice. + */ + +export const PUBLISH_DEFAULTS = { + /** Successful publishes allowed per user per day. */ + dailyFree: 2, + dailyPremium: 10, + /** One-time credit reward granted the first time a character goes public. */ + reward: 500, + /** Auto-hide a published character once it reaches this many distinct reports. */ + reportThreshold: 3, +} + +/** Minimum character counts a character must meet to be publishable. */ +export const PUBLISH_MIN = { + greeting: 50, + description: 150, + scenario: 300, + /** Persona text + sample chat, combined. */ + personality: 400, +} + +/** Content rules shown in the Make-Public modal. Our own wording. */ +export const PUBLISH_RULES: string[] = [ + 'Everyone must read clearly as an adult — in age, appearance, and the way they behave.', + 'Characters need their own agency. No depictions of non-consent, coercion, or exploitation.', + 'No sexual content between family members or relatives.', + 'Heavy themes and trauma are allowed, but handle them with care and intent.', + 'No real people, and no copyrighted or trademarked characters.', +] + +/** Short note under the rules. */ +export const PUBLISH_RULES_NOTE = + 'Borderline submissions may be reviewed by a moderator after they go live. Anything that breaks these rules can be taken down.' + +/** Reasons a character can be reported. */ +export const REPORT_REASONS: { value: string; label: string }[] = [ + { value: 'underage', label: 'Appears underage' }, + { value: 'violence', label: 'Gratuitous violence or gore' }, + { value: 'noncon', label: 'Non-consent / coercion' }, + { value: 'incest', label: 'Incest / family sexual content' }, + { value: 'copyright', label: 'Real person or copyrighted character' }, + { value: 'illegal', label: 'Illegal content' }, + { value: 'spam', label: 'Spam or low effort' }, + { value: 'other', label: 'Something else' }, +] + +/** Friendly labels for the moderation flag keys the vision LLM can raise. */ +export const FLAG_LABELS: Record = { + underage: 'Underage', + violence: 'Violence', + noncon: 'Non-consent', + incest: 'Incest', + copyright: 'Copyright', + illegal: 'Illegal', + nudity: 'Nudity (NSFW)', + other: 'Other', +} + +export type PublishRequirement = { + key: keyof typeof PUBLISH_MIN + label: string + min: number + actual: number + ok: boolean +} + +const REQUIREMENT_LABELS: Record = { + greeting: 'Greeting', + description: 'Public description', + scenario: 'Scenario', + personality: 'Personality & details', +} + +/** Flatten any persona shape to plain text length. */ +export function personaText(persona?: AppSchema.Persona): string { + if (!persona?.attributes) return '' + const parts: string[] = [] + for (const value of Object.values(persona.attributes)) { + if (Array.isArray(value)) parts.push(...value.filter((v) => typeof v === 'string')) + } + return parts.join(' ').trim() +} + +const len = (v?: string) => (typeof v === 'string' ? v.trim().length : 0) + +export type PublishField = { key: string; label: string; ok: boolean } + +/** + * Fields the Discover gallery + profile page rely on, so a public character + * must have them: an avatar (cover), gender + art style (filters), and an age + * range (shown, and required for the age gate). `category` stays optional. + */ +const REQUIRED_FIELDS: { key: keyof AppSchema.Character; label: string }[] = [ + { key: 'avatar', label: 'Avatar' }, + { key: 'gender', label: 'Gender' }, + { key: 'artStyle', label: 'Art style' }, + { key: 'ageRange', label: 'Age range' }, +] + +/** + * Evaluate a character against the minimum-quality thresholds and the required + * Discover/profile fields. Pass `mins` to use admin-configured thresholds; + * falls back to PUBLISH_MIN when omitted. + */ +export function checkPublishRequirements( + char: Partial, + mins: typeof PUBLISH_MIN = PUBLISH_MIN +): { + ok: boolean + requirements: PublishRequirement[] + fields: PublishField[] +} { + const actuals: Record = { + greeting: len(char.greeting), + description: len(char.description), + scenario: len(char.scenario), + personality: personaText(char.persona).length + len(char.sampleChat), + } + + const requirements = (Object.keys(PUBLISH_MIN) as (keyof typeof PUBLISH_MIN)[]).map((key) => ({ + key, + label: REQUIREMENT_LABELS[key], + min: mins[key] ?? PUBLISH_MIN[key], + actual: actuals[key], + ok: actuals[key] >= (mins[key] ?? PUBLISH_MIN[key]), + })) + + const fields: PublishField[] = REQUIRED_FIELDS.map(({ key, label }) => ({ + key, + label, + ok: !!(char[key] && String(char[key]).trim()), + })) + + const ok = requirements.every((r) => r.ok) && fields.every((f) => f.ok) + return { ok, requirements, fields } +} diff --git a/common/requests/util.ts b/common/requests/util.ts index 0a54a429..6d1ac4bd 100644 --- a/common/requests/util.ts +++ b/common/requests/util.ts @@ -42,7 +42,12 @@ export function sanitiseAndTrim( const trimmed = trimResponseV2(parsed, char, members, characters, ['END_OF_DIALOG']) .split(`${char.name}:`) .join('') - return trimmed || parsed + // Return the trimmed text even when it's empty. An empty trim means the reply + // led with another speaker or "Narrator:"/"Director:" — i.e. the model wrote a + // foreign turn / a whole scene (common with the chat finetune in event chats). + // The old `|| parsed` fallback resurrected that raw multi-speaker screenplay, + // which is exactly the off-the-rails output we want to suppress. + return trimmed } export function sanitise(generated: string) { @@ -50,6 +55,56 @@ export function sanitise(generated: string) { return generated.trim() } +/** + * Extract a single character's turn from a multi-speaker "screenplay" reply. + * + * The chat finetune, in an event/group scene, tends to write the whole scene as + * one reply — `Narrator: ...`, `Jeremy: ...`, `Julia: ...` — ignoring the "reply + * only as X" directive. Rather than drop that (empty bubble) or show it raw (off + * the rails), pull out just the elected speaker's FIRST contiguous turn. + * + * Lines are `Name: text` (tolerating leading markdown). The speaker's own lines + * (and unlabeled continuations of them, plus any leading unlabeled text — the + * prefilled speaker's words) are kept until another speaker/`Narrator:`/`Director:` + * label appears, which ends the turn. Returns '' if the speaker never speaks. + */ +export function extractSpeakerTurn(text: string, speakerName: string): string { + const speaker = speakerName.trim().toLowerCase() + // "Name:" at the start of a line, tolerating leading markdown (* _ > # -). + const labelRe = /^[\s*_>#-]*([A-Za-z][A-Za-z0-9 ._'-]{0,29}?)\s*:\s?/ + const out: string[] = [] + let started = false + let inSpeaker = false + + for (const line of text.split('\n')) { + const m = line.match(labelRe) + if (m) { + const name = m[1].trim().toLowerCase() + const rest = line.slice(m[0].length) + if (name === speaker) { + started = true + inSpeaker = true + if (rest.trim()) out.push(rest) + } else { + // Another speaker / Narrator / Director. If we already captured the + // speaker's turn, it's over; otherwise keep scanning for them. + if (started && out.length) break + inSpeaker = false + } + } else if (inSpeaker) { + out.push(line) + } else if (!started) { + // Leading unlabeled text before any label — the prefilled speaker's own + // words. Treat it as theirs. + out.push(line) + started = true + inSpeaker = true + } + } + + return out.join('\n').trim() +} + export function trimResponseV2( generated: string, char: AppSchema.Character, @@ -74,6 +129,16 @@ export function trimResponseV2( } } + // Scene narration is a separate "Narrator"/"Director" message. Cut a reply that + // switches into a narration passage (catches the cases the stop sequence misses: + // no leading newline, or text streamed past the stop). Both the tight and the + // spaced ("Narrator :") forms, since RP models emit either. Skip if the speaker + // is itself the narrator/director. + for (const speaker of ['Narrator', 'Director']) { + if (char.name === speaker) continue + endTokens.push(`${speaker}:`, `${speaker} :`) + } + let index = -1 let trimmed = allEndTokens.concat(...endTokens).reduce((prev, endToken) => { const idx = generated.indexOf(endToken) diff --git a/common/sampler-order.ts b/common/sampler-order.ts index 2b4f4f55..0690ccd5 100644 --- a/common/sampler-order.ts +++ b/common/sampler-order.ts @@ -1,17 +1,6 @@ import { AIAdapter } from './adapters' export const samplerServiceMap: { [adapter in AIAdapter]?: Record } = { - novel: { - temp: 0, - topK: 1, - topP: 2, - tailFreeSampling: 3, - topA: 4, - typicalP: 5, - cfgScale: 6, - topG: 7, - mirostatTau: 8, - }, horde: { topK: 0, topA: 1, diff --git a/common/tokenize.ts b/common/tokenize.ts index 78772f37..cbff23c9 100644 --- a/common/tokenize.ts +++ b/common/tokenize.ts @@ -1,24 +1,39 @@ -// @ts-ignore -import { embedApi } from '/web/store/embeddings' +// Lightweight token counting (cl100k_base) for prompt-budget estimates on the +// web. Previously routed through the client embeddings worker; that worker is +// retired, so we load js-tiktoken directly. js-tiktoken is ESM-only, so it's +// imported dynamically (this file is type-checked under the CommonJS srv +// config even though only the web bundle uses it). +let encoder: any +let loading: Promise | null = null -export async function encode(text: string) { - return embedApi.encode(text) +async function enc() { + if (encoder) return encoder + if (!loading) { + loading = import('js-tiktoken').then((m) => { + encoder = m.getEncoding('cl100k_base') + return encoder + }) + } + return loading } -export async function decode(tokens: number[]) { - return embedApi.decode(tokens) +export async function encode(text: string): Promise { + return (await enc()).encode(text) +} + +export async function decode(tokens: number[]): Promise { + return (await enc()).decode(tokens) } export async function tokenize(text: string) { - const tokens = await embedApi.encode(text) - return tokens.length + return (await enc()).encode(text).length } export async function getEncoder() { - return (text: string) => embedApi.encode(text).then((res: number[]) => res.length) + const e = await enc() + return (text: string) => e.encode(text).length as number } export async function countTokens(text: string) { - const tokens = await encode(text) - return tokens.length + return (await enc()).encode(text).length } diff --git a/common/types/admin.ts b/common/types/admin.ts index ec26ae7b..308a6e86 100644 --- a/common/types/admin.ts +++ b/common/types/admin.ts @@ -129,6 +129,17 @@ export interface Configuration { charlibPublish: 'off' | 'users' | 'subscribers' | 'moderators' | 'admins' charlibGuidelines: string + /** Daily successful-publish caps and the one-time publish reward (credits). */ + publishDailyFree: number + publishDailyPremium: number + publishReward: number + + /** Minimum character-count thresholds a character must meet to be published. */ + publishMinGreeting: number + publishMinDescription: number + publishMinScenario: number + publishMinPersonality: number + actionCalls: ActionCall[] } diff --git a/common/types/library.ts b/common/types/library.ts index 418be613..a8ffd2be 100644 --- a/common/types/library.ts +++ b/common/types/library.ts @@ -1,4 +1,5 @@ import { PersonaFormat } from '../adapters' +import { CharacterProgression } from '../progression' import { JsonField } from '../prompt' import { BaseImageSettings, ImageSettings } from './image-schema' import { MemoryBook } from './memory' @@ -49,11 +50,61 @@ export interface Character extends BaseCharacter { json?: ResponseSchema parent?: string children?: number - match: any - xp: any + /** Flags this character as a public, pickable companion shown in Discover. */ + match?: boolean + /** Relationship experience on the user's copy of the character. Drives the progression stage. */ + xp?: number share?: string premium: boolean + /** + * Incomplete wizard character. The creation credit is charged when the draft + * is created (on entering the final/portrait step); it's finalized — and made + * visible — only when the user completes creation. Drafts are hidden from + * Discover and the My AI list. One draft per user; abandoning forfeits it. + */ + draft?: boolean + /** + * Set once the draft's single free portrait (the create wizard's first + * auto-generation, bundled into the creation fee) has been claimed. Every + * subsequent image generation is charged. Server-derived; never trusted from + * the client. + */ + freePortraitUsed?: boolean + /** + * @deprecated Legacy scenario-state-machine progression. Replaced by `progression` (archetypes). + * Retained only for back-compat with existing ScenarioBooks during migration. + */ scenarioIds?: string[] + /** Relationship progression config (archetype or custom level->stage map). */ + progression?: CharacterProgression + + // --- Discover gallery metadata (additive; all optional, missing reads as unset/zero) --- + // 'trans' is the canonical third option (the create wizard's value); 'nonbinary' + // is retained for legacy data written by the editor before they were unified. + gender?: 'female' | 'male' | 'trans' | 'nonbinary' + artStyle?: 'realistic' | 'anime' + /** Display bucket for the age-gated gallery (e.g. "18-25"). */ + ageRange?: string + /** Curated Discover categories (distinct from free-form `tags`). */ + category?: string[] + nsfw?: boolean + /** Aggregated engagement counters, tracked on the public template character. */ + engagement?: CharacterEngagement + + // --- User publishing + moderation (additive; distinct from the legacy admin `match` flag) --- + /** + * Live in Discover via the user-publishing system. Kept separate from `match` + * so legacy admin-curated templates (match:true) and user-published characters + * coexist, and a private character can never be exposed by accident. + */ + published?: boolean + publishedAt?: number + /** The one-time 500-credit publish reward has been granted (never re-rewarded). */ + publishRewarded?: boolean + /** Automated (vision-LLM) verdict + admin stage-2 review state. */ + moderation?: CharacterModeration + /** Distinct user reports against the published character; >=3 auto-hides it. */ + reportCount?: number folder?: string // v2 stuff @@ -66,6 +117,26 @@ export interface Character extends BaseCharacter { creator?: string characterVersion?: string imageSettings?: BaseImageSettings + + // --- Z-Image character-consistent generation (i2L) --- + /** + * Name of the stored Z-Image LoRA encoding this character's identity. Returned + * by POST /v1/encode; passed as `lora_name` to /v1/generate for every image. + */ + loraName?: string + /** + * Locked seed used to bootstrap a consistent reference set at create time + * (before the LoRA exists). Reusing it keeps pre-LoRA previews coherent. + */ + imageSeed?: number + /** Multi-image gallery (saved image URLs/filenames). `avatar` is the cover. */ + gallery?: string[] + + /** + * Public display name (profile handle) of the creator. Transient: joined onto + * Discover responses from the creator's profile, never stored on the char doc. + */ + creatorName?: string } export interface LibraryCharacter extends Omit { @@ -79,6 +150,46 @@ export interface LibraryCharacter extends Omit { messages: number } +export interface CharacterEngagement { + chats: number + messages: number + favorites: number + /** Recency-weighted score for the "trending" sort; recomputed periodically. */ + trending?: number +} + +/** Known moderation flag keys raised by the vision-LLM check. Free-form strings + * are allowed too — these are the ones the UI gives friendly labels to. */ +export type ModerationFlag = + | 'underage' + | 'violence' + | 'noncon' + | 'incest' + | 'copyright' + | 'illegal' + | 'other' + +export interface CharacterModeration { + /** + * approved — passed the automated check, live (pending optional admin stage-2). + * flagged — borderline; live but surfaced to admins for stage-2 review. + * rejected — failed the automated check; not published. + * hidden — taken down (report threshold or admin action); not shown in Discover. + * review — was public but has been edited; private until re-published + re-checked. + */ + status: 'approved' | 'flagged' | 'rejected' | 'hidden' | 'review' + /** Issues the model raised (e.g. ['underage','violence']). */ + flags?: ModerationFlag[] | string[] + /** Model explanation / decline message shown to the user. */ + reason?: string + /** When the automated check last ran. */ + autoCheckedAt?: number + /** An admin has completed stage-2 review of this live character. */ + moderated?: boolean + moderatedBy?: string + moderatedAt?: number +} + export interface ResponseSchema { schema: JsonField[] response: string diff --git a/common/types/schema.ts b/common/types/schema.ts index bbb4c85a..a64694c3 100644 --- a/common/types/schema.ts +++ b/common/types/schema.ts @@ -33,6 +33,10 @@ export type AllDoc = | AppSchema.Configuration | AppSchema.SagaTemplate | AppSchema.SagaSession + | AppSchema.CharacterReport + | AppSchema.Notification + | AppSchema.PromoCode + | AppSchema.PromoRedemption export type OAuthScope = keyof typeof oauthScopes @@ -45,6 +49,42 @@ export namespace AppSchema { export type Persona = Library.Persona export type BaseCharacter = Library.BaseCharacter export type Character = Library.Character + export type CharacterModeration = Library.CharacterModeration + export type ModerationFlag = Library.ModerationFlag + + /** A user report filed against a published character. One per (reporter, char). */ + export interface CharacterReport { + _id: string + kind: 'character-report' + charId: string + /** Owner of the reported character (denormalized for the admin queue). */ + charOwnerId: string + reporterId: string + reason: string + note?: string + createdAt: string + /** Set once an admin has actioned the report (dismissed / unpublished / deleted). */ + resolved?: boolean + resolvedAt?: string + resolvedBy?: string + } + + /** + * A durable per-user notification (e.g. a moderation outcome). Persisted so a + * user who was offline when it was raised still receives it: undelivered ones + * are replayed over the socket on their next login, then marked delivered. + */ + export interface Notification { + _id: string + kind: 'notification' + userId: string + message: string + /** Optional admin-broadcast level (mirrors the legacy admin-notification toast). */ + level?: number + createdAt: string + /** Set once the message has been pushed to a live socket for this user. */ + deliveredAt?: string + } export type GenSettings = Preset.GenSettings export type UserGenPreset = Preset.UserGenPreset @@ -111,12 +151,42 @@ export namespace AppSchema { incart: false } + export interface PromoCode { + _id: string + kind: 'promo-code' + code: string + credits?: number + days?: number + maxUses: number + uses: number + enabled: boolean + expiresAt?: string + createdAt: string + createdBy: string + updatedAt?: string + } + + export interface PromoRedemption { + _id: string + kind: 'promo-redemption' + codeId: string + userId: string + code: string + credits: number + days: number + createdAt: string + } + export interface Profile { _id: string kind: 'profile' userId: string handle: string avatar?: string + /** How the user describes themselves as a character — injected as {{user}}'s + * persona in chats (replaces the old per-chat character impersonation). */ + description?: string + persona?: string } export interface User { @@ -134,6 +204,16 @@ export namespace AppSchema { admin: boolean lastIp?: string + /** Device identifier (FingerprintJS visitorId) captured at registration, with + * consent, to detect multiple-account abuse. */ + fingerprint?: string + /** ISO timestamp when the user accepted the identifier-collection checkbox at registration. */ + identifierConsentAt?: string + /** True when this account matched an existing fingerprint or IP at signup: it + * receives no signup bonus and no automatic free-credit refills until cleared. */ + creditsRestricted?: boolean + /** Why the account was restricted (admin context; never shown to end users). */ + restrictedReason?: 'ip' | 'fingerprint' | 'both' role?: 'moderator' | 'admin' novelApiKey: string @@ -274,7 +354,25 @@ export namespace AppSchema { export interface Chat { _id: string kind: 'chat' - mode?: 'standard' | 'adventure' | 'companion' + mode?: 'standard' | 'adventure' | 'companion' | 'event' + /** Event scene metadata. Present only when `mode === 'event'`. + * `when` (time of day) and `vibe` (tone) are optional scene flavour. + * `directorEvents` sets how often the director injects an unprompted world + * beat to drive the story. + * `note` is the director's standing instruction (set on start) used to steer + * the scene — who speaks, what beats happen. Director-only; never shown to + * characters as scene context. */ + event?: { + location: string + description: string + when?: string + vibe?: string + directorEvents?: 'none' | 'rare' | 'normal' | 'regular' + note?: string + } + /** When true, this chat neither writes nor recalls long-term memory. + * Set on event creation; also user-toggleable in chat settings. */ + memoryDisabled?: boolean userId: string memoryId?: string userEmbedId?: string diff --git a/common/types/ui.ts b/common/types/ui.ts index 233366f2..a1badc65 100644 --- a/common/types/ui.ts +++ b/common/types/ui.ts @@ -42,7 +42,7 @@ export type CustomUI = { chatQuoteColor: string } -export type MessageOption = 'edit' | 'regen' | 'trash' | 'fork' | 'prompt' +export type MessageOption = 'edit' | 'regen' | 'trash' | 'prompt' export type UISettings = { theme: string @@ -112,7 +112,8 @@ export const defaultUIsettings: UISettings = { bgCustomGradient: '', - mode: 'light', + // Dark-only app — the light theme is retired (also enforced in updateTheme). + mode: 'dark', avatarSize: 'md', avatarCorners: 'circle', font: 'default', @@ -144,7 +145,6 @@ export const defaultUIsettings: UISettings = { msgOptsInline: { edit: { outer: true, pos: 0 }, prompt: { outer: false, pos: 3 }, - fork: { outer: false, pos: 2 }, regen: { outer: true, pos: 1 }, trash: { outer: false, pos: 4 }, }, diff --git a/common/util.ts b/common/util.ts index 904e9294..0671fc54 100644 --- a/common/util.ts +++ b/common/util.ts @@ -205,6 +205,15 @@ export function getMessageAuthor(opts: { }) { const { chat, msg, chars, members, sender, impersonate } = opts + // Event/world narration (the opening scene line and director beats) has no + // author character and no userId — it's the unseen director narrating the + // world. Label it as its own speaker; without this it falls through to the + // user's handle below, so every character sees the narration as if the user + // said it (no director separation, and characters start narrating too). + if (msg.event === 'world' && !msg.characterId && !msg.userId) { + return msg.name || 'Narrator' + } + if (msg.characterId) { const char = msg.characterId === impersonate?._id diff --git a/common/valid/index.ts b/common/valid/index.ts index 60786570..84e74120 100644 --- a/common/valid/index.ts +++ b/common/valid/index.ts @@ -1,5 +1,6 @@ import * as util from './util' -import { Validator, UnwrapBody } from './types' +import type { Validator, UnwrapBody } from './types' import { assertValid, isValid, isValidPartial, validateBody } from './validate' -export { util, Validator, UnwrapBody, assertValid, isValid, isValidPartial, validateBody } +export type { Validator, UnwrapBody } +export { util, assertValid, isValid, isValidPartial, validateBody } diff --git a/common/xplevel.ts b/common/xplevel.ts index 2ce2c4e2..3650955a 100644 --- a/common/xplevel.ts +++ b/common/xplevel.ts @@ -18,4 +18,7 @@ const XPLevel = (xp: number) => { return xpl } +/** Canonical level-from-XP. Use this everywhere instead of the duplicated web-side impls. */ +export const getCharacterLevel = (xp: number = 0) => XPLevel(xp || 0) + export default XPLevel diff --git a/docs/superpowers/plans/2026-06-24-event-mode.md b/docs/superpowers/plans/2026-06-24-event-mode.md new file mode 100644 index 00000000..79570917 --- /dev/null +++ b/docs/superpowers/plans/2026-06-24-event-mode.md @@ -0,0 +1,923 @@ +# Event Mode Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Add an "Event" feature — one-tap creation of a populated multi-character scene where a per-reply "director" model call elects which character speaks, biased toward a quiet 1:1 with bystanders interjecting only when warranted. + +**Architecture:** Builds on existing multi-char chat (`chat.characters`, per-reply `replyAs`). Server-orchestrated: on a user `send` in an event chat, the server charges a flat fee once, then loops `electSpeaker` → generate one reply (reusing the existing single-reply pipeline, extracted into a reusable function) until the director returns `none` or a cap is hit. Each reply uses its own character's progression stage. A per-chat `memoryDisabled` flag gates long-term memory writes and recall so a party leaves no residue. + +**Tech Stack:** SolidJS + Tailwind (web, Vite), Express + MongoDB + `ws` (srv, tsc), isomorphic `common/`, self-hosted OpenAI-compatible inference via `inferenceAsync` (`jsonSchema` constrained output). Tests: mocha over compiled `tests/**.spec.js` (covers `common/` only). + +## Global Constraints + +- **No data migrations.** Every new field is additive and optional (`mode` gains a union member, `event?`, `memoryDisabled?`). Never rename/repurpose a stored id. +- **Use `pnpm`, never `npm`.** +- **Web is bundled by Vite, not tsc** — web TS type errors are non-blocking (~546 pre-existing). Syntax-check web with `ts.transpileModule` if needed; do not check in compiled web `.js`/`.js.map`. +- **srv typecheck** (authoritative for backend): `NODE_OPTIONS=--max-old-space-size=6144 npx tsc -p srv.tsconfig.json --noEmit`. +- **Tests compile via** `srv.tsconfig.json` (includes `tests`, emits in place). To build + run a spec: `NODE_OPTIONS=--max-old-space-size=6144 npx tsc -p srv.tsconfig.json` then `npx mocha --inline-diffs --exit "tests/.spec.js"`. +- **Credits:** normal message = 10. Event turn = **25 flat** (`EVENT_TURN_COST`), charged once per user turn regardless of reply count. +- **Cap:** `EVENT_MAX_REPLIES = 3` character replies per turn. +- **Never sexualize minors** — the existing 18+ safeguard in the levels preamble applies; the director prompt must not weaken it. +- Default branch for PRs is `trunk`; active work on `feat/charluv-rewrite`. Commit only when explicitly asked by the user; commit messages end with the CLAUDE.md footer. + +--- + +### Task 1: Schema fields for events + +**Files:** +- Modify: `common/types/schema.ts` (the `Chat` interface, ~lines 298-335) + +**Interfaces:** +- Produces: `AppSchema.Chat.mode` now allows `'event'`; `AppSchema.Chat.event?: { location: string; description: string }`; `AppSchema.Chat.memoryDisabled?: boolean`. All later tasks rely on these. + +- [ ] **Step 1: Add the fields** + +In `common/types/schema.ts`, the `Chat` interface currently has: + +```typescript + export interface Chat { + _id: string + kind: 'chat' + mode?: 'standard' | 'adventure' | 'companion' +``` + +Change the `mode` line and add two fields directly beneath it: + +```typescript + export interface Chat { + _id: string + kind: 'chat' + mode?: 'standard' | 'adventure' | 'companion' | 'event' + /** Event scene metadata. Present only when `mode === 'event'`. */ + event?: { location: string; description: string } + /** When true, this chat neither writes nor recalls long-term memory. + * Set on event creation; also user-toggleable in chat settings. */ + memoryDisabled?: boolean +``` + +- [ ] **Step 2: Typecheck** + +Run: `NODE_OPTIONS=--max-old-space-size=6144 npx tsc -p srv.tsconfig.json --noEmit` +Expected: PASS (no new errors referencing `schema.ts`). + +- [ ] **Step 3: Commit** + +```bash +git add common/types/schema.ts +git commit -m "feat: add event mode + memoryDisabled fields to Chat schema" +``` + +--- + +### Task 2: Pure helpers and constants in `common/event.ts` + +**Files:** +- Create: `common/event.ts` +- Create: `tests/event.spec.ts` + +**Interfaces:** +- Produces: + - `EVENT_TURN_COST = 25`, `EVENT_MAX_REPLIES = 3` (numeric consts) + - `buildEventScenario(opts: { location: string; description: string; names: string[] }): string` + - `buildDirectorPrompt(opts: { event: { location: string; description: string }; roster: Array<{ id: string; name: string; hook: string }>; recent: Array<{ name: string; text: string }>; repliedThisTurn: string[] }): string` + - `buildSpeakerSchema(presentIds: string[]): object` — a JSON Schema whose `speaker` is an enum of `presentIds` plus `"none"`. + +- [ ] **Step 1: Write the failing test** + +Create `tests/event.spec.ts`: + +```typescript +import { expect } from 'chai' +import './init' +import { + EVENT_TURN_COST, + EVENT_MAX_REPLIES, + buildEventScenario, + buildSpeakerSchema, + buildDirectorPrompt, +} from '/common/event' + +describe('Event helpers', () => { + it('exposes the fixed economy/cap constants', () => { + expect(EVENT_TURN_COST).to.equal(25) + expect(EVENT_MAX_REPLIES).to.equal(3) + }) + + it('builds a scene block naming the location, description and attendees', () => { + const actual = buildEventScenario({ + location: 'nightclub', + description: 'Saturday DJ night', + names: ['Mia', 'Jade'], + }) + expect(actual).to.equal('Setting: nightclub. Event: Saturday DJ night. Present: Mia, Jade.') + }) + + it('constrains the speaker schema to present ids plus none', () => { + const schema: any = buildSpeakerSchema(['a', 'b']) + expect(schema.properties.speaker.enum).to.deep.equal(['a', 'b', 'none']) + expect(schema.required).to.deep.equal(['speaker']) + }) + + it('includes the roster names and the addressing rule in the director prompt', () => { + const prompt = buildDirectorPrompt({ + event: { location: 'bar', description: 'after work drinks' }, + roster: [{ id: 'a', name: 'Mia', hook: 'flirty bartender' }], + recent: [{ name: 'You', text: 'Hey Mia' }], + repliedThisTurn: [], + }) + expect(prompt).to.contain('Mia') + expect(prompt).to.contain('bar') + expect(prompt.toLowerCase()).to.contain('none') + }) +}) +``` + +- [ ] **Step 2: Build + run to verify it fails** + +Run: `NODE_OPTIONS=--max-old-space-size=6144 npx tsc -p srv.tsconfig.json && npx mocha --inline-diffs --exit "tests/event.spec.js"` +Expected: FAIL — `Cannot find module '/common/event'` (or compile error). + +- [ ] **Step 3: Implement `common/event.ts`** + +```typescript +/** Flat credit cost of one user turn in an event chat (vs 10 for a normal message). */ +export const EVENT_TURN_COST = 25 + +/** Hard cap on the number of character replies the director may elect per user turn. */ +export const EVENT_MAX_REPLIES = 3 + +/** The scene block injected into the chat scenario so every prompt sees the event context. */ +export function buildEventScenario(opts: { + location: string + description: string + names: string[] +}): string { + return `Setting: ${opts.location}. Event: ${opts.description}. Present: ${opts.names.join(', ')}.` +} + +/** JSON Schema forcing the director to return a present character id or the literal "none". */ +export function buildSpeakerSchema(presentIds: string[]): object { + return { + type: 'object', + properties: { + speaker: { type: 'string', enum: [...presentIds, 'none'] }, + }, + required: ['speaker'], + } +} + +/** + * The director prompt. Asks the model to elect the next speaker, preferring the + * directly-addressed character and only choosing a bystander with a strong, + * specific reason. Returns "none" when no one (else) should speak. + */ +export function buildDirectorPrompt(opts: { + event: { location: string; description: string } + roster: Array<{ id: string; name: string; hook: string }> + recent: Array<{ name: string; text: string }> + repliedThisTurn: string[] +}): string { + const roster = opts.roster + .map((r) => `- ${r.name} (id: ${r.id}): ${r.hook}`) + .join('\n') + const history = opts.recent.map((m) => `${m.name}: ${m.text}`).join('\n') + const already = opts.repliedThisTurn.length + ? `Already replied this turn: ${opts.repliedThisTurn.join(', ')}.` + : 'No one has replied yet this turn.' + + return [ + `Setting: ${opts.event.location}. Event: ${opts.event.description}.`, + `People present:`, + roster, + ``, + `Recent conversation:`, + history, + ``, + already, + ``, + `Decide who speaks NEXT. Prefer the character the user is directly addressing.`, + `A bystander should be chosen ONLY if they have a strong, specific reason to interject.`, + `If no one (else) has a reason to speak, answer "none".`, + `Reply with the speaker's id, or "none".`, + ].join('\n') +} +``` + +- [ ] **Step 4: Build + run to verify it passes** + +Run: `NODE_OPTIONS=--max-old-space-size=6144 npx tsc -p srv.tsconfig.json && npx mocha --inline-diffs --exit "tests/event.spec.js"` +Expected: PASS (4 passing). + +- [ ] **Step 5: Commit** + +```bash +git add common/event.ts tests/event.spec.ts tests/event.spec.js tests/event.spec.js.map +git commit -m "feat: add event scene/director prompt helpers + constants" +``` + +--- + +### Task 3: Per-speaker progression in `resolveScenario` + +The `LEVEL(...)` stage token and Charluv meta currently derive from the *main* character. In a multi-char event each reply must reflect the **replying** character. Add an optional `replyAs` arg; when present, the token and meta come from it. + +**Files:** +- Modify: `common/prompt.ts` — `resolveScenario` (~line 969), it calls `prependProgressionStage` and `prependCharluvMeta` (~lines 987-1009) +- Modify: `tests/resolve-scenario.spec.ts` (add a case) +- Modify call sites (pass `replyAs`): `web/store/data/bot-generate.ts:181` and `:238` + +**Interfaces:** +- Consumes: `prependProgressionStage`, `prependCharluvMeta` (existing, unchanged signatures). +- Produces: `resolveScenario(chat, mainChar, books, replyAs?)` — when `replyAs` is supplied, stage token + meta use `replyAs`; scenario *text* still resolves from chat/mainChar as today. + +- [ ] **Step 1: Write the failing test** + +In `tests/resolve-scenario.spec.ts`, add inside the `describe('Resolve scenario', ...)` block: + +```typescript + it('uses the replying character for the progression stage when provided', () => { + const speaker = { + ...main, + name: 'Speaker', + progression: { kind: 'archetype', archetype: 'romantic' } as any, + xp: 100000, + } + const withSpeaker = resolveScenario( + {...chat, scenario: undefined, overrides: undefined}, + {...main, scenario: 'Scene', progression: undefined}, + [], + speaker as any) + const withoutSpeaker = resolveScenario( + {...chat, scenario: undefined, overrides: undefined}, + {...main, scenario: 'Scene', progression: undefined}, + []) + // The speaker has a progression archetype + XP, so its stage token is prepended. + expect(withSpeaker).to.contain('LEVEL(') + // The main char has no progression, so without a speaker no token appears. + expect(withoutSpeaker).to.not.contain('LEVEL(') + }) +``` + +- [ ] **Step 2: Build + run to verify it fails** + +Run: `NODE_OPTIONS=--max-old-space-size=6144 npx tsc -p srv.tsconfig.json && npx mocha --inline-diffs --exit "tests/resolve-scenario.spec.js"` +Expected: FAIL — `resolveScenario` ignores the 4th argument, so `withSpeaker` has no `LEVEL(` token. + +- [ ] **Step 3: Implement the optional `replyAs`** + +In `common/prompt.ts`, `resolveScenario` currently reads: + +```typescript +export function resolveScenario( + chat: AppSchema.Chat, + mainChar: AppSchema.Character, + books: AppSchema.ScenarioBook[] +) { + const result = chat.overrides ? chat.scenario || '' : mainChar.scenario || '' + + return prependCharluvMeta(prependProgressionStage(result.trim(), mainChar), mainChar) +} +``` + +Change it to: + +```typescript +export function resolveScenario( + chat: AppSchema.Chat, + mainChar: AppSchema.Character, + books: AppSchema.ScenarioBook[], + replyAs?: AppSchema.Character +) { + const result = chat.overrides ? chat.scenario || '' : mainChar.scenario || '' + + // The stage token and Charluv meta describe whoever is *speaking*. In a + // multi-character event that's `replyAs`; in a 1:1 it equals the main char. + const speaker = replyAs || mainChar + + return prependCharluvMeta(prependProgressionStage(result.trim(), speaker), speaker) +} +``` + +- [ ] **Step 4: Run to verify it passes** + +Run: `NODE_OPTIONS=--max-old-space-size=6144 npx tsc -p srv.tsconfig.json && npx mocha --inline-diffs --exit "tests/resolve-scenario.spec.js"` +Expected: PASS for the new case. (Note: two pre-existing `overwrite`-flag failures in this file are unrelated and predate this work — leave them.) + +- [ ] **Step 5: Pass `replyAs` at the client call sites** + +In `web/store/data/bot-generate.ts`, both calls currently read: + +```typescript + const resolvedScenario = resolveScenario(entities.chat, entities.char, entities.scenarios || []) +``` + +(at `getActivePromptOptions` ~line 181 and `createActiveChatPrompt` ~line 238). Change both to pass the resolved speaker: + +```typescript + const resolvedScenario = resolveScenario( + entities.chat, + entities.char, + entities.scenarios || [], + props.replyAs + ) +``` + +(`props` is in scope in both functions — `getGenerateProps` returns it.) + +- [ ] **Step 6: Web syntax check** + +Run: `npx tsc -p srv.tsconfig.json --noEmit 2>&1 | grep -i "prompt.ts\|bot-generate" || echo "no new srv-side errors"` +Expected: no new errors in `common/prompt.ts`. (Web file errors are non-blocking and bundled by Vite.) + +- [ ] **Step 7: Commit** + +```bash +git add common/prompt.ts web/store/data/bot-generate.ts tests/resolve-scenario.spec.ts tests/resolve-scenario.spec.js tests/resolve-scenario.spec.js.map +git commit -m "feat: derive progression stage from the replying character" +``` + +--- + +### Task 4: Director server function `electSpeaker` + +A server-only function that runs one director inference and returns the elected speaker id or `'none'`. + +**Files:** +- Create: `srv/adapter/director.ts` + +**Interfaces:** +- Consumes: `inferenceAsync` from `srv/adapter/generate.ts` (returns `{ generated }`); `buildDirectorPrompt`, `buildSpeakerSchema` from `common/event.ts`. +- Produces: `electSpeaker(opts: { user: AppSchema.User; log: AppLog; event: { location: string; description: string }; roster: Array<{ id: string; name: string; hook: string }>; recent: Array<{ name: string; text: string }>; repliedThisTurn: string[] }): Promise` — resolves to a present character id or `'none'`. Never throws for model issues (falls back to `'none'`). + +- [ ] **Step 1: Implement `srv/adapter/director.ts`** + +```typescript +import { AppSchema } from '../../common/types/schema' +import { AppLog } from '../middleware' +import { buildDirectorPrompt, buildSpeakerSchema } from '../../common/event' +import { inferenceAsync } from './generate' + +type ElectOpts = { + user: AppSchema.User + log: AppLog + event: { location: string; description: string } + roster: Array<{ id: string; name: string; hook: string }> + recent: Array<{ name: string; text: string }> + repliedThisTurn: string[] +} + +/** + * One director inference: elect who speaks next in an event. Returns a present + * character id or 'none'. Any model/parse failure resolves to 'none' so a turn + * can never crash on the director. + */ +export async function electSpeaker(opts: ElectOpts): Promise { + const ids = opts.roster.map((r) => r.id) + if (!ids.length) return 'none' + + const prompt = buildDirectorPrompt({ + event: opts.event, + roster: opts.roster, + recent: opts.recent, + repliedThisTurn: opts.repliedThisTurn, + }) + + try { + const { generated } = await inferenceAsync({ + user: opts.user, + log: opts.log, + prompt, + maxTokens: 24, + temp: 0.2, + jsonSchema: buildSpeakerSchema(ids), + }) + + const picked = parseSpeaker(generated, ids) + return picked + } catch (err) { + opts.log.warn({ err }, 'director: election failed, defaulting to none') + return 'none' + } +} + +/** Tolerant parse: accept strict JSON `{ "speaker": "" }` or a bare id/“none”. */ +function parseSpeaker(generated: string, ids: string[]): string { + const text = (generated || '').trim() + try { + const obj = JSON.parse(text) + const s = String(obj?.speaker || '').trim() + if (s === 'none' || ids.includes(s)) return s + } catch {} + // Fallback: the raw text might be an id or "none". + if (text === 'none' || ids.includes(text)) return text + const found = ids.find((id) => text.includes(id)) + return found || 'none' +} +``` + +> Note: confirm the import path for `AppLog`. Locate it first: `grep -rn "export type AppLog\|export interface AppLog" srv/`. Use that path in the import above (it is referenced as `AppLog` in `srv/adapter/generate.ts`'s `InferenceRequest`). + +- [ ] **Step 2: Typecheck** + +Run: `NODE_OPTIONS=--max-old-space-size=6144 npx tsc -p srv.tsconfig.json --noEmit 2>&1 | grep -i "director.ts" || echo "director.ts clean"` +Expected: `director.ts clean`. + +- [ ] **Step 3: Commit** + +```bash +git add srv/adapter/director.ts +git commit -m "feat: add director electSpeaker inference for event turns" +``` + +--- + +### Task 5: Server orchestration — extract the reply pipeline and loop it for events + +The reply generation in `generateMessageV2` (`srv/api/chat/message.ts`) is one streamed reply per request. Extract the "build prompt for `replyAs` → stream → persist" body into a reusable internal function, then loop it for event turns. + +**Files:** +- Modify: `srv/api/chat/message.ts` — `generateMessageV2` (~lines 137-480) + +**Interfaces:** +- Consumes: `electSpeaker` (Task 4); `EVENT_TURN_COST`, `EVENT_MAX_REPLIES`, `buildEventScenario` (Task 2); existing `createChatStream`, `getResponseEntities`, `store.credits.updateCredits`, `store.scenario.updateCharXp`, `getXpPerMessage`, `sendMany`, `obtainLock/releaseLock`. +- Produces: event turns generate 1..`EVENT_MAX_REPLIES` replies, one per elected speaker; `EVENT_TURN_COST` charged once; per-reply −10 suppressed for event replies; XP credited to the replying character. + +- [ ] **Step 1: Extract `generateOneReply`** + +Move the existing block that runs **one** reply — from the lock/`message-creating` broadcast through stream consumption and message persistence (currently ~lines 247 to the end of the `send`/`request`/... message-created handling, ~line 480) — into a new async function inside `srv/api/chat/message.ts`: + +```typescript +async function generateOneReply(ctx: { + req: AppRequest + res: AppResponse + chat: AppSchema.Chat + body: GenerateRequestV2 + replyAs: AppSchema.Character + impersonate: AppSchema.Character | undefined + members: string[] + userMsg: AppSchema.ChatMessage | undefined + requestId: string + // When true this reply is part of an already-paid event turn: skip the per-reply + // −10 credit (the flat EVENT_TURN_COST was charged once at turn start). + eventTurn: boolean +}): Promise<{ text: string; speakerId: string }> +``` + +Relocate the existing logic verbatim, substituting the locals it used (`replyAs`, `requestId`, `members`, `impersonate`, `userMsg`, `chat`, `body`, `userId = ctx.req.userId`, `log = ctx.req.log`) with `ctx.*`. Return `{ text: responseText, speakerId: replyAs._id }` at the end. The non-event path (Step 4) calls this exactly once, preserving current behavior. + +- [ ] **Step 2: Gate credits + XP inside `generateOneReply`** + +The credit/XP block currently reads (message.ts ~424-428): + +```typescript + if (body.kind !== 'summary') { + const credits = await store.credits.updateCredits(userId!, -10) + const xpGain = getXpPerMessage(replyAs.progression) + if (xpGain > 0) await store.scenario.updateCharXp(chat.characterId!, xpGain) + } +``` + +Replace with: + +```typescript + if (ctx.body.kind !== 'summary') { + // Event replies are paid once per turn (EVENT_TURN_COST) at turn start; don't + // re-charge per reply. Normal replies still cost 10 each. + if (!ctx.eventTurn) { + await store.credits.updateCredits(ctx.req.userId!, -10) + } + // XP advances the CHARACTER THAT REPLIED (replyAs), not the chat's main char. + const xpGain = getXpPerMessage(ctx.replyAs.progression) + if (xpGain > 0) await store.scenario.updateCharXp(ctx.replyAs._id, xpGain) + } +``` + +- [ ] **Step 3: Add the event orchestration branch** + +In `generateMessageV2`, after the user message is persisted for a `send` (currently ~line 204, inside the `body.kind === 'send' || 'ooc'` branch) and before the single-reply logic, insert an early event branch. It charges once, then loops the director: + +```typescript + // --- Event mode: the server elects each speaker and may produce several + // replies per user turn (director-driven). One flat charge covers the turn. + if (chat.mode === 'event' && body.kind === 'send') { + if (body.user && body.user.credits < EVENT_TURN_COST) throw errors.MissingCredits + await store.credits.updateCredits(userId!, -EVENT_TURN_COST) + + const roster = await getEventRoster(chat) // present chars: {id,name,hook} + const repliedThisTurn: string[] = [] + + for (let i = 0; i < EVENT_MAX_REPLIES; i++) { + const recent = await getRecentForDirector(chatId) // [{name,text}] last ~8 msgs + const speakerId = await electSpeaker({ + user: req.authed!, + log, + event: chat.event!, + roster: roster.filter((r) => true), // full roster; the model may re-pick or skip + recent, + repliedThisTurn, + }) + if (speakerId === 'none') break + + const replyAs = roster.find((r) => r.id === speakerId)?.char + if (!replyAs) break + + const turnRequestId = v4() + sendMany(members, { + type: 'message-creating', + chatId, + mode: 'send', + senderId: userId, + characterId: replyAs._id, + }) + await generateOneReply({ + req, + res, + chat, + body, + replyAs, + impersonate, + members, + userMsg, + requestId: turnRequestId, + eventTurn: true, + }) + repliedThisTurn.push(replyAs._id) + } + + return + } +``` + +> The HTTP response: send the early `res.json({ ..., generating: true })` (already at ~line 270) BEFORE entering this loop, OR move that `res.json` above the branch so the client gets its ack and then renders each streamed reply by its own `requestId`. Each `generateOneReply` broadcasts its own `message-partial`/`message-created` over ws, so the client renders replies sequentially. + +- [ ] **Step 4: Non-event path calls `generateOneReply` once** + +Replace the original inline single-reply block (now extracted) with a single call for non-event chats: + +```typescript + await generateOneReply({ + req, res, chat, body, + replyAs, impersonate, members, userMsg, + requestId, eventTurn: false, + }) + return +``` + +- [ ] **Step 5: Implement the two helpers** + +Add to `srv/api/chat/message.ts`: + +```typescript +// Build the director roster from the chat's character map: the active present +// characters with a one-line persona hook for the director prompt. +async function getEventRoster(chat: AppSchema.Chat) { + const ids = Object.entries(chat.characters || {}) + .filter(([, on]) => on) + .map(([id]) => id) + const chars = await store.characters.getCharacterList(ids) + return chars.map((char) => ({ + id: char._id, + name: char.name, + hook: (char.description || '').slice(0, 120), + char, + })) +} + +// The recent message window the director reasons over (speaker name + text). +async function getRecentForDirector(chatId: string) { + const msgs = await store.msgs.getMessages(chatId) // newest-last + return msgs.slice(-8).map((m) => ({ + name: m.name || (m.userId ? 'You' : 'Unknown'), + text: m.msg, + })) +} +``` + +> Confirm the exact reader names before use: `grep -n "export async function getCharacterList\|export async function getMessages\|getRecentMessages" srv/db/characters.ts srv/db/messages.ts`. Use the actual function (e.g. `getCharacterList(ids)` exists in `srv/db/characters.ts`; for messages use whatever lists a chat's messages). Adjust slice/order so the window is chronological and capped. + +- [ ] **Step 6: Add imports** + +At the top of `srv/api/chat/message.ts`: + +```typescript +import { EVENT_TURN_COST, EVENT_MAX_REPLIES } from '../../../common/event' +import { electSpeaker } from '../../adapter/director' +``` + +(Confirm relative depth from `srv/api/chat/` — `common/` is `../../../common`. `v4` from `uuid` is already imported in this file; reuse it.) + +- [ ] **Step 7: Typecheck** + +Run: `NODE_OPTIONS=--max-old-space-size=6144 npx tsc -p srv.tsconfig.json --noEmit 2>&1 | grep -i "message.ts" || echo "message.ts clean"` +Expected: `message.ts clean`. Resolve any signature mismatches against the real `store.*` readers found in Step 5. + +- [ ] **Step 8: Commit** + +```bash +git add srv/api/chat/message.ts +git commit -m "feat: server-orchestrated director loop for event turns" +``` + +--- + +### Task 6: Memory gates (write + recall) + +`memoryDisabled` must stop both the auto-write of remembered facts and the recall of stored facts. + +**Files:** +- Modify: `srv/api/chat/message.ts` — the `rememberFact` loop (~line 414, now inside `generateOneReply`) +- Modify: `srv/adapter/generate.ts` — the `recallMemories` call (~line 359) + +**Interfaces:** +- Consumes: `chat.memoryDisabled` (Task 1). + +- [ ] **Step 1: Gate the write** + +In `generateOneReply` (the relocated block), the memory write currently reads: + +```typescript + if (rememberFacts?.length && chat.characterId) { + for (const fact of rememberFacts) { + rememberFact(userId!, chat.characterId, fact, 'tool').catch((err) => + log.error({ err }, 'Failed to store long-term memory') + ) + } + } +``` + +Add the disable guard (and use `ctx.*` locals from Task 5): + +```typescript + if (rememberFacts?.length && ctx.chat.characterId && !ctx.chat.memoryDisabled) { + for (const fact of rememberFacts) { + rememberFact(ctx.req.userId!, ctx.chat.characterId, fact, 'tool').catch((err) => + ctx.req.log.error({ err }, 'Failed to store long-term memory') + ) + } + } +``` + +- [ ] **Step 2: Gate the recall** + +In `srv/adapter/generate.ts` near line 359: + +```typescript + const memories = await recallMemories(ownerId, charId, query, { k: 5 }) +``` + +Wrap it so a memory-disabled chat skips recall entirely: + +```typescript + const memories = chat.memoryDisabled + ? [] + : await recallMemories(ownerId, charId, query, { k: 5 }) +``` + +> Confirm `chat` is in scope at that point (it is — e.g. `chat.memoryId` is read nearby at ~line 473). If the local is named differently in that function, use that name. + +- [ ] **Step 3: Typecheck** + +Run: `NODE_OPTIONS=--max-old-space-size=6144 npx tsc -p srv.tsconfig.json --noEmit 2>&1 | grep -iE "message.ts|generate.ts" || echo "memory gates clean"` +Expected: `memory gates clean`. + +- [ ] **Step 4: Commit** + +```bash +git add srv/api/chat/message.ts srv/adapter/generate.ts +git commit -m "feat: gate long-term memory write+recall on chat.memoryDisabled" +``` + +--- + +### Task 7: Event creation endpoint + +A server route that creates an event chat from the modal inputs. + +**Files:** +- Modify: `srv/api/chat/index.ts` (or wherever chat routes mount — confirm with `grep -rn "router.post" srv/api/chat/`) +- Modify/inspect: `srv/db/chats.ts` — reuse the existing chat creation (`createChat`); confirm it accepts `mode`, `characters`, `scenario`, `overrides` and add pass-through for `event` + `memoryDisabled` if needed. + +**Interfaces:** +- Consumes: `buildEventScenario` (Task 2); existing `store.chats.create`/`createChat`; `store.characters.getCharacterList`. +- Produces: `POST /chat/event` → `{ chat }`. Body: `{ location: string; description: string; characterIds: string[] }`. + +- [ ] **Step 1: Inspect the existing chat-create path** + +Run: `grep -n "export async function create" srv/db/chats.ts` and read its parameter object. Confirm which of `mode`, `characters`, `scenario`, `overrides`, `event`, `memoryDisabled` it persists. If `event`/`memoryDisabled` are not passed through, add them to the `doc` it builds (additive). + +- [ ] **Step 2: Add the handler** + +In the chat API module: + +```typescript +const createEventChat = handle(async (req) => { + assertValid( + { location: 'string', description: 'string', characterIds: ['string'] }, + req.body + ) + const { location, description, characterIds } = req.body + if (!characterIds.length) throw new StatusError('Invite at least one character', 400) + + const chars = await store.characters.getCharacterList(characterIds) + if (!chars.length) throw new StatusError('No valid characters', 400) + + const names = chars.map((c) => c.name) + const scenario = buildEventScenario({ location, description, names }) + const characters: Record = {} + for (const c of chars) characters[c._id] = true + + const chat = await store.chats.create(chars[0]._id, { + name: `${location} — ${description}`.slice(0, 80), + characters, + mode: 'event', + event: { location, description }, + memoryDisabled: true, + scenario, + overrides: chars[0].persona, + greeting: `You arrive at ${location}. ${description}.`, + // ...any other required fields createChat expects; mirror the normal create call + } as any) + + return { chat } +}) +``` + +> Match `store.chats.create`'s real signature (found in Step 1) — the second arg shape and required fields (e.g. `greeting`, `sampleChat`, `scenario`, `overrides`) must mirror an existing successful create. The `overrides: chars[0].persona` ensures `resolveScenario` uses the chat scenario (event block) rather than the main char's. + +- [ ] **Step 3: Mount the route** + +Add near the other chat routes (keep literal paths before `/:id` params): + +```typescript +router.post('/event', loggedIn, createEventChat) +``` + +(Use the same auth middleware the other authenticated create routes use — confirm by reading neighboring `router.post` lines.) + +- [ ] **Step 4: Typecheck** + +Run: `NODE_OPTIONS=--max-old-space-size=6144 npx tsc -p srv.tsconfig.json --noEmit 2>&1 | grep -iE "chat/index|db/chats" || echo "event route clean"` +Expected: `event route clean`. + +- [ ] **Step 5: Commit** + +```bash +git add srv/api/chat/ srv/db/chats.ts +git commit -m "feat: add POST /chat/event creation endpoint" +``` + +--- + +### Task 8: Web store action to create an event + +**Files:** +- Modify: `web/store/chat.ts` (the chat store — confirm filename with `ls web/store/chat.ts`) + +**Interfaces:** +- Consumes: `POST /chat/event` (Task 7); existing `api.post`, `getStore`/navigation patterns used by other create actions. +- Produces: `chatStore.createEvent(input: { location: string; description: string; characterIds: string[] }, onSuccess: (chatId: string) => void)`. + +- [ ] **Step 1: Add the action** + +Mirror an existing create action in the chat store. Add: + +```typescript + async createEvent( + _, + input: { location: string; description: string; characterIds: string[] }, + onSuccess: (chatId: string) => void + ) { + const res = await api.post('/chat/event', input) + if (res.error) { + toastStore.error(`Failed to create event: ${res.error}`) + return + } + if (res.result) { + onSuccess(res.result.chat._id) + } + }, +``` + +(Match the store's handler style — argument order, `toastStore` import, and `api` import as used by sibling actions.) + +- [ ] **Step 2: Web syntax check** + +Run: `npx tsc -p srv.tsconfig.json --noEmit 2>&1 | grep -i "store/chat" || echo "no srv-side coupling"` (web errors are non-blocking; confirm the file at least parses by saving — Vite will surface runtime issues). + +- [ ] **Step 3: Commit** + +```bash +git add web/store/chat.ts +git commit -m "feat: chatStore.createEvent action" +``` + +--- + +### Task 9: Event menu button + creation modal + +**Files:** +- Create: `web/pages/Chat/CreateEventModal.tsx` +- Modify: `web/Navigation.tsx` — add the Event button to the menu list + +**Interfaces:** +- Consumes: `chatStore.createEvent` (Task 8); the existing character-select component (`web/shared/CharacterSelectList.tsx` — confirm its props) and the user's My AI character list from `characterStore`. + +- [ ] **Step 1: Build the modal** + +Create `web/pages/Chat/CreateEventModal.tsx` with a Modal containing three controls: a `TextInput` for **Where**, a `TextInput`/textarea for **What**, and a multi-select of the user's characters for **Who** (reuse the existing select-list; collect checked ids into a signal). On confirm, call `chatStore.createEvent({ location, description, characterIds }, (id) => navigate(\`/chat/${id}\`))`. Follow the structure of an existing modal in `web/pages/Chat/` (e.g. `CreateChatForm.tsx`) for Modal usage, buttons, and form state. Disable confirm until `location`, `description`, and ≥1 character are set. + +- [ ] **Step 2: Add the menu button** + +In `web/Navigation.tsx`, add an entry to the menu list (alongside the existing nav items) that opens the modal: + +```tsx + setShowEvent(true)}> + Event + +``` + +Wire a `const [showEvent, setShowEvent] = createSignal(false)` and render ` setShowEvent(false)} />`. Use an icon already exported from `/web/icons` (e.g. `Sparkles` or `Users`). Match the existing `Item`/menu pattern in that file. + +- [ ] **Step 3: Visual verification** + +Run the app (`pnpm start`) or describe the manual check: the menu shows an **Event** button; clicking it opens a modal with Where/Who/What; submitting navigates into a new chat whose scenario contains the `Setting: … Event: … Present: …` block; the roster shows the invited characters. + +- [ ] **Step 4: Commit** + +```bash +git add web/pages/Chat/CreateEventModal.tsx web/Navigation.tsx +git commit -m "feat: Event menu button + creation modal" +``` + +--- + +### Task 10: Memory-disable toggle in chat settings + +Expose `memoryDisabled` as a general per-chat toggle (defaults already true for events). + +**Files:** +- Modify: `web/pages/Chat/ChatSettings.tsx` (confirm filename) — add the toggle +- Verify: `srv/api/chat/edit.ts` persists `memoryDisabled` (the chat-edit validator ~lines 18-51) + +**Interfaces:** +- Consumes: existing chat-edit endpoint and `Toggle` component (`web/shared/Toggle.tsx`). + +- [ ] **Step 1: Allow `memoryDisabled` through the edit endpoint** + +In `srv/api/chat/edit.ts`, the validator (~line 18) and the update object (~line 50) enumerate editable fields. Add `memoryDisabled`: + +```typescript +// in the assertValid schema object: + memoryDisabled: 'boolean?', +``` + +```typescript +// in the update object passed to store.chats.update: + memoryDisabled: body.memoryDisabled ?? prev.memoryDisabled, +``` + +- [ ] **Step 2: Add the toggle to chat settings** + +In the chat settings component, add a `Toggle`: + +```tsx + chatStore.editChat(chat()!._id, { memoryDisabled: v })} +/> +``` + +(Match how sibling toggles in that file read the active chat and call the chat-edit store action — confirm the action name, e.g. `editChat`/`updateChat`.) + +- [ ] **Step 3: Typecheck the server change** + +Run: `NODE_OPTIONS=--max-old-space-size=6144 npx tsc -p srv.tsconfig.json --noEmit 2>&1 | grep -i "edit.ts" || echo "edit.ts clean"` +Expected: `edit.ts clean`. + +- [ ] **Step 4: Commit** + +```bash +git add srv/api/chat/edit.ts web/pages/Chat/ChatSettings.tsx +git commit -m "feat: per-chat memory-disable toggle in chat settings" +``` + +--- + +### Final verification + +- [ ] **Run the full check suite** + +Run: `pnpm checks` +Expected: format + web typecheck + tests. The two pre-existing `resolve-scenario` `overwrite`-flag failures are unrelated and predate this work; no *new* failures. New `tests/event.spec.js` passes. + +- [ ] **Run the srv typecheck** + +Run: `NODE_OPTIONS=--max-old-space-size=6144 npx tsc -p srv.tsconfig.json --noEmit` +Expected: no new errors. + +- [ ] **Manual end-to-end** + +Create an event (nightclub / 2-3 invitees / "Saturday DJ night"). Send a message addressed to one character → that character replies in their own stage; occasionally a second character interjects (≤3 total); 25 credits debited once; no long-term memory rows written for the event characters; recall is skipped in event prompts. diff --git a/docs/superpowers/plans/2026-06-25-anti-multiaccount-fingerprint.md b/docs/superpowers/plans/2026-06-25-anti-multiaccount-fingerprint.md new file mode 100644 index 00000000..144c4fc8 --- /dev/null +++ b/docs/superpowers/plans/2026-06-25-anti-multiaccount-fingerprint.md @@ -0,0 +1,635 @@ +# Anti-Multi-Account: Device Fingerprint + IP — Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Stop credit farming via mass account creation using a device fingerprint (consented, at registration) + IP, with a graded restrict/block response — without retroactively touching existing accounts. + +**Architecture:** Active client-side FingerprintJS (OSS) computes a `visitorId` at registration behind a required consent checkbox. The server compares it (and the IP) against existing accounts: `fp && ip` → block; `fp || ip` → restrict (account created but 0 signup credits + free refills disabled + admin flag); neither → normal. Restricted accounts are excluded from the free-credit refill cron. Admin can clear a restriction. All schema changes additive; existing members untouched. + +**Tech Stack:** TypeScript, Express + MongoDB (`srv/`), SolidJS (`web/`), isomorphic `common/`, mocha tests, `@fingerprintjs/fingerprintjs` (MIT). + +## Global Constraints + +- NO data migrations; additive schema only. Use `pnpm`, never `npm`. +- Commit only `.ts`/`.tsx` sources for srv/web (srv `.js` is gitignored); test `.spec.js`/`.js.map` ARE force-added (compiled via `tsc -p srv.tsconfig.json`, which emits srv+common+tests). Do NOT commit compiled web `.js`. +- Tests are `tests/*.spec.ts`; run `pnpm test` (mocha on compiled `tests/**.spec.js`). Compile first with `NODE_OPTIONS=--max-old-space-size=6144 npx tsc -p srv.tsconfig.json`. There is NO DB/HTTP test harness — only pure helpers get unit tests. +- srv typecheck: `NODE_OPTIONS=--max-old-space-size=6144 npx tsc -p srv.tsconfig.json --noEmit`. web typecheck: `pnpm typecheck` (web has ~0 errors now; introduce none). +- Fingerprint is captured **at registration only** (never at login). Consent is a **required checkbox** at register, worded around "identifiers" — never the word "fingerprinting" in user-facing copy. Privacy policy must be accurate (device identifier derived from browser/device characteristics). +- Decision matrix: `fp&&ip`→block, `fp||ip`→restrict, else allow. Restrict = `credits:0`, `creditsRestricted:true`, `restrictedReason`, no free refills. +- Existing accounts are never retroactively restricted or fingerprinted. +- Commit message trailer (exact): + ``` + Co-Authored-By: Claude Opus 4.8 + Claude-Session: https://claude.ai/code/session_01XXNb2Kcdayr1ZvUpy5a3nA + ``` + +--- + +### Task 1: Schema fields, index, and the pure decision helper + +**Files:** +- Modify: `common/types/schema.ts` (User interface ~line 188, near `lastIp`) +- Create: `common/abuse.ts` +- Modify: `srv/db/client.ts` (`createIndexes`, after the user indexes ~line 147) +- Test: `tests/abuse.spec.ts` + +**Interfaces:** +- Produces: + - `AppSchema.User.fingerprint?: string`, `identifierConsentAt?: string`, `creditsRestricted?: boolean`, `restrictedReason?: 'ip' | 'fingerprint' | 'both'` + - `classifyRegistration(opts: { fpMatch: boolean; ipMatch: boolean }): 'block' | 'restrict' | 'allow'` from `/common/abuse` + +- [ ] **Step 1: Write the failing test** + +Create `tests/abuse.spec.ts`: + +```ts +import { expect } from 'chai' +import { classifyRegistration } from '/common/abuse' + +describe('classifyRegistration', () => { + it('blocks when both fingerprint and IP match', () => { + expect(classifyRegistration({ fpMatch: true, ipMatch: true })).to.equal('block') + }) + it('restricts when only the fingerprint matches', () => { + expect(classifyRegistration({ fpMatch: true, ipMatch: false })).to.equal('restrict') + }) + it('restricts when only the IP matches', () => { + expect(classifyRegistration({ fpMatch: false, ipMatch: true })).to.equal('restrict') + }) + it('allows when neither matches', () => { + expect(classifyRegistration({ fpMatch: false, ipMatch: false })).to.equal('allow') + }) +}) +``` + +- [ ] **Step 2: Run to verify it fails** + +Run: `cd /home/dlite/charluv && NODE_OPTIONS=--max-old-space-size=6144 npx tsc -p srv.tsconfig.json && pnpm test -- --grep classifyRegistration` +Expected: FAIL — module `/common/abuse` not found. + +- [ ] **Step 3: Create `common/abuse.ts`** + +```ts +/** + * Decide how to treat a new registration given whether its device fingerprint + * and/or IP already belong to an existing account. + * + * - both match -> block (very high confidence: same person) + * - one matches -> restrict (likely duplicate: create, but withhold farmable credits) + * - neither -> allow (normal signup) + */ +export function classifyRegistration(opts: { + fpMatch: boolean + ipMatch: boolean +}): 'block' | 'restrict' | 'allow' { + if (opts.fpMatch && opts.ipMatch) return 'block' + if (opts.fpMatch || opts.ipMatch) return 'restrict' + return 'allow' +} +``` + +- [ ] **Step 4: Add the User schema fields** + +In `common/types/schema.ts`, inside the `User` interface near `lastIp?: string` (~line 188), add: + +```ts + /** Device identifier (FingerprintJS visitorId) captured at registration, with + * consent, to detect multiple-account abuse. */ + fingerprint?: string + /** ISO timestamp when the user accepted the identifier-collection checkbox at registration. */ + identifierConsentAt?: string + /** True when this account matched an existing fingerprint or IP at signup: it + * receives no signup bonus and no automatic free-credit refills until cleared. */ + creditsRestricted?: boolean + /** Why the account was restricted (admin context; never shown to end users). */ + restrictedReason?: 'ip' | 'fingerprint' | 'both' +``` + +- [ ] **Step 5: Add the fingerprint index** + +In `srv/db/client.ts` `createIndexes()`, after the `db('user')` index block (~line 147): + +```ts + await db('user').createIndex({ fingerprint: 1 }, { name: 'user_fingerprint' }) +``` + +- [ ] **Step 6: Compile and run the test (GREEN)** + +Run: `cd /home/dlite/charluv && NODE_OPTIONS=--max-old-space-size=6144 npx tsc -p srv.tsconfig.json && pnpm test -- --grep classifyRegistration` +Expected: PASS (4 passing). + +- [ ] **Step 7: Typecheck** + +Run: `cd /home/dlite/charluv && pnpm typecheck` (expect no new errors) and `NODE_OPTIONS=--max-old-space-size=6144 npx tsc -p srv.tsconfig.json --noEmit` (expect 0). + +- [ ] **Step 8: Commit** + +```bash +git add common/types/schema.ts common/abuse.ts srv/db/client.ts tests/abuse.spec.ts tests/abuse.spec.js tests/abuse.spec.js.map +git commit -m "feat(abuse): add fingerprint/restriction schema, index, and classifyRegistration + +Co-Authored-By: Claude Opus 4.8 +Claude-Session: https://claude.ai/code/session_01XXNb2Kcdayr1ZvUpy5a3nA" +``` + +--- + +### Task 2: DB layer — checkFingerprint, createUser opts, clearRestriction, refill filter + +**Files:** +- Modify: `srv/db/user.ts` (`checkFingerprint` near `checkIp` ~line 82; `createUser` ~line 105; add `clearRestriction`) +- Modify: `srv/db/credits.ts` (`getFreeCredits` queries ~line 28-33) + +**Interfaces:** +- Consumes: `db` from `./client`; `AppSchema.User` fields from Task 1. +- Produces: + - `checkFingerprint(fingerprint?: string): Promise` + - `createUser(newUser, admin?, opts?)` where `opts?: { restricted?: boolean; restrictedReason?: 'ip'|'fingerprint'|'both'; fingerprint?: string; ip?: string; consentAt?: string }` + - `clearRestriction(userId: string): Promise` + +- [ ] **Step 1: Add `checkFingerprint`** + +In `srv/db/user.ts`, after `checkIp` (~line 88), add: + +```ts +export async function checkFingerprint(fingerprint?: string) { + if (!fingerprint) return false + const count = await db('user').countDocuments({ kind: 'user', fingerprint }) + return count > 0 +} +``` + +- [ ] **Step 2: Extend `createUser` with options** + +Change the `createUser` signature (`srv/db/user.ts:105`) and the user-doc construction. New signature: + +```ts +export async function createUser( + newUser: NewUser, + admin?: boolean, + opts?: { + restricted?: boolean + restrictedReason?: 'ip' | 'fingerprint' | 'both' + fingerprint?: string + ip?: string + consentAt?: string + } +) { +``` + +In the `const user: AppSchema.User = { ... }` literal, change `credits: 200,` to: + +```ts + credits: opts?.restricted ? 0 : 200, +``` + +and add these fields to the literal (after `createdAt`): + +```ts + creditsRestricted: opts?.restricted || undefined, + restrictedReason: opts?.restrictedReason, + fingerprint: opts?.fingerprint || undefined, + lastIp: opts?.ip || undefined, + identifierConsentAt: opts?.consentAt, +``` + +(Leaving these `undefined` when not provided keeps the doc clean; `ignoreUndefined` is set on the Mongo client.) + +- [ ] **Step 3: Add `clearRestriction`** + +In `srv/db/user.ts` (near `updateUser`), add: + +```ts +export async function clearRestriction(userId: string) { + const user = await db('user').findOne({ kind: 'user', _id: userId }) + if (!user) throw errors.NotFound + const credits = (user.credits || 0) < 200 ? 200 : user.credits + await db('user').updateOne( + { kind: 'user', _id: userId }, + { $set: { creditsRestricted: false, restrictedReason: undefined as any, credits }, $unset: { restrictedReason: '' } } + ) +} +``` + +(`errors` is already imported in this file via `../api/wrap` — verify; if not, import `{ errors }` from `'../api/wrap'`. Use whatever the file already uses for not-found.) + +- [ ] **Step 4: Filter restricted accounts out of free-credit refills** + +In `srv/db/credits.ts` `getFreeCredits`, add `creditsRestricted: { $ne: true }` to BOTH refill find-queries: + +```ts + const users = await db('user') + .find({ kind: 'user', nextCredits: { $lte: now }, premium: false, credits: { $lt: 500 }, creditsRestricted: { $ne: true } }) + .toArray() + const premiumUsers = await db('user') + .find({ kind: 'user', nextCredits: { $lte: now }, credits: { $lt: 5000 }, premium: true, creditsRestricted: { $ne: true } }) + .toArray() +``` + +(Leave the `expiredPremium` query unchanged.) + +- [ ] **Step 5: srv typecheck** + +Run: `cd /home/dlite/charluv && NODE_OPTIONS=--max-old-space-size=6144 npx tsc -p srv.tsconfig.json --noEmit` +Expected: 0 errors. (No DB test harness exists — these paths are typecheck-verified per Global Constraints.) + +- [ ] **Step 6: Commit** + +```bash +git add srv/db/user.ts srv/db/credits.ts +git commit -m "feat(abuse): checkFingerprint, restricted createUser opts, clearRestriction, refill filter + +Co-Authored-By: Claude Opus 4.8 +Claude-Session: https://claude.ai/code/session_01XXNb2Kcdayr1ZvUpy5a3nA" +``` + +--- + +### Task 3: Register/login handlers + +**Files:** +- Modify: `srv/api/user/auth.ts` (`register` ~line 12; `login` ~line 26) + +**Interfaces:** +- Consumes: `classifyRegistration` from `/common/abuse`; `store.users.checkFingerprint`, `checkIp`, `createUser` (Task 1/2). + +- [ ] **Step 1: Update the register handler** + +Replace the body of `register` (`srv/api/user/auth.ts:12-24`) with: + +```ts +export const register = handle(async (req) => { + assertValid( + { + handle: 'string', + username: 'string', + password: 'string', + fingerprint: 'string?', + consent: 'boolean?', + }, + req.body + ) + + if (req.body.consent !== true) { + throw new StatusError('You must accept the identifier policy to register', 400) + } + + const fpMatch = await store.users.checkFingerprint(req.body.fingerprint) + const ipMatch = await store.users.checkIp(req.ip) + const verdict = classifyRegistration({ fpMatch, ipMatch }) + + if (verdict === 'block') { + throw new StatusError( + 'Only 1 account per device/IP. Go to our Discord if you lost your password.', + 403 + ) + } + + const restrictedReason = fpMatch && ipMatch ? 'both' : fpMatch ? 'fingerprint' : ipMatch ? 'ip' : undefined + + const { profile, token, user } = await store.users.createUser(req.body, false, { + restricted: verdict === 'restrict', + restrictedReason, + fingerprint: req.body.fingerprint, + ip: req.ip, + consentAt: new Date().toISOString(), + }) + + req.log.info({ user: user.username, id: user._id, verdict }, 'User registered') + return { profile, token, user } +}) +``` + +Add the import at the top of the file: + +```ts +import { classifyRegistration } from '/common/abuse' +``` + +- [ ] **Step 2: Leave login unchanged for fingerprint** + +Confirm `login` still does `await store.users.updateIp(result.user._id, req.ip)` and nothing fingerprint-related is added. (No edit needed — this step is a guard against over-building.) + +- [ ] **Step 3: srv typecheck** + +Run: `cd /home/dlite/charluv && NODE_OPTIONS=--max-old-space-size=6144 npx tsc -p srv.tsconfig.json --noEmit` +Expected: 0 errors. + +- [ ] **Step 4: Commit** + +```bash +git add srv/api/user/auth.ts +git commit -m "feat(abuse): gate registration on consent + fingerprint/IP verdict + +Co-Authored-By: Claude Opus 4.8 +Claude-Session: https://claude.ai/code/session_01XXNb2Kcdayr1ZvUpy5a3nA" +``` + +--- + +### Task 4: Admin — surface restriction + clear it + +**Files:** +- Modify: `srv/db/admin.ts` (`getUserInfo` projection ~line 130) +- Modify: `srv/api/admin.ts` (add route + handler) +- Modify: `web/store/admin.ts` (`UserInfo` type + `clearRestriction` action) +- Modify: `web/pages/Admin/UsersPage.tsx` (display + button) + +**Interfaces:** +- Consumes: `store.users.clearRestriction` (Task 2). +- Produces: `POST /admin/users/:userId/clear-restriction`; `adminStore.clearRestriction(userId, onSuccess?)`. + +- [ ] **Step 1: Add fields to the admin user-info projection** + +In `srv/db/admin.ts` `getUserInfo`, in the `db('user').findOne` projection object (~line 130), add: + +```ts + creditsRestricted: 1, + restrictedReason: 1, +``` + +Then ensure the returned `info`/state object includes them. Read the function's return shape and add `creditsRestricted: billing?.creditsRestricted` and `restrictedReason: billing?.restrictedReason` to the returned object (match the existing pattern for `username`/`sub`/etc.). + +- [ ] **Step 2: Add the admin route + handler** + +In `srv/api/admin.ts`, add a handler near the other user handlers: + +```ts +const clearRestriction = handle(async (req) => { + const userId = req.params.userId + if (!userId) throw new StatusError('Missing userId', 400) + await store.users.clearRestriction(userId) + return { success: true } +}) +``` + +and register it with the other admin routes (the router already applies `loggedIn, isAdmin`): + +```ts +router.post('/users/:userId/clear-restriction', clearRestriction) +``` + +- [ ] **Step 3: Add the store action + UserInfo fields** + +In `web/store/admin.ts`, add to the `UserInfo` type: + +```ts + creditsRestricted?: boolean + restrictedReason?: 'ip' | 'fingerprint' | 'both' +``` + +and add an action in the store's action object: + +```ts + async clearRestriction(_, userId: string, onSuccess?: () => void) { + const res = await api.post(`/admin/users/${userId}/clear-restriction`) + if (res.error) return toastStore.error(`Failed to clear restriction: ${res.error}`) + if (res.result) { + toastStore.success('Restriction cleared') + onSuccess?.() + } + }, +``` + +- [ ] **Step 4: Show the flag + clear button in UsersPage** + +In `web/pages/Admin/UsersPage.tsx`, where the selected user's info is shown, add (match the file's existing JSX/Show patterns; `info` is the `adminStore` user-info object): + +```tsx + +
+ Credit-restricted ({info()?.restrictedReason}) + +
+
+``` + +(Use the actual accessor for the user-info signal and the actual "refresh info" action name in this file — read them first. If `Pill` isn't imported, use a plain styled `span`. Keep imports valid: no unused imports.) + +- [ ] **Step 5: Typecheck** + +Run: `cd /home/dlite/charluv && pnpm typecheck` (no new errors in the touched files) and `NODE_OPTIONS=--max-old-space-size=6144 npx tsc -p srv.tsconfig.json --noEmit` (0). + +- [ ] **Step 6: Commit** + +```bash +git add srv/db/admin.ts srv/api/admin.ts web/store/admin.ts web/pages/Admin/UsersPage.tsx +git commit -m "feat(abuse): admin view + clear for credit-restricted accounts + +Co-Authored-By: Claude Opus 4.8 +Claude-Session: https://claude.ai/code/session_01XXNb2Kcdayr1ZvUpy5a3nA" +``` + +--- + +### Task 5: Client — FingerprintJS + consent checkbox + send to register + +**Files:** +- Modify: `package.json` (add dependency via pnpm) +- Create: `web/shared/fingerprint.ts` +- Modify: `web/store/user.ts` (`register` action ~line 554) +- Modify: `web/pages/Login/index.tsx` (`RegisterForm` ~line 132) +- Modify: `web/pages/PrivacyPolicy/index.tsx` (clause) + +**Interfaces:** +- Consumes: `POST /user/register` now accepts `{ fingerprint?, consent }` (Task 3). +- Produces: `getVisitorId(): Promise` from `web/shared/fingerprint.ts`; `userStore.register(newUser, fingerprint?, consent?, onSuccess?)`. + +- [ ] **Step 1: Install FingerprintJS** + +Run: `cd /home/dlite/charluv && pnpm add @fingerprintjs/fingerprintjs` +Expected: added to `package.json` dependencies; `pnpm-lock.yaml` updated. + +- [ ] **Step 2: Create the fingerprint helper** + +Create `web/shared/fingerprint.ts`: + +```ts +import FingerprintJS from '@fingerprintjs/fingerprintjs' + +let cached: Promise | undefined + +/** + * Compute a device identifier (FingerprintJS visitorId). Runs entirely in the + * browser (no network). Returns undefined if it fails — callers degrade to the + * IP-only path server-side. Only call this AFTER the user has consented. + */ +export function getVisitorId(): Promise { + if (cached) return cached + cached = FingerprintJS.load() + .then((fp) => fp.get()) + .then((res) => res.visitorId) + .catch(() => undefined) + return cached +} +``` + +- [ ] **Step 3: Thread fingerprint + consent through the register store action** + +In `web/store/user.ts`, change the `register` action signature and POST body: + +```ts + async *register( + _, + newUser: { handle: string; username: string; password: string }, + fingerprint: string | undefined, + consent: boolean, + onSuccess?: () => void + ) { + yield { loading: true } + + const res = await api.post('/user/register', { ...newUser, fingerprint, consent }) + yield { loading: false } + if (res.error) { + return void toastStore.error(`Failed to register: ${res.error}`) + } + // ...unchanged below (setAuth, yield state, toast, onSuccess, publish, events) +``` + +(Keep everything after the error check exactly as it is.) + +- [ ] **Step 4: Add the consent checkbox + fingerprint to RegisterForm** + +In `web/pages/Login/index.tsx` `RegisterForm`: + +Add a consent signal at the top of the component: + +```tsx + const [consent, setConsent] = createSignal(false) +``` + +Make `register` async, compute the visitorId only after consent, and pass both through: + +```tsx + const register = async (evt: Event) => { + const { username, password, confirm, handle } = getStrictForm(evt, { + handle: 'string', + username: 'string', + password: 'string', + confirm: 'string', + }) + + if (!handle || !username || !password) return + if (password !== confirm) { + toastStore.warn('Passwords do not match', 2) + return + } + if (!consent()) { + toastStore.warn('Please accept the identifier policy to register', 3) + return + } + + const fingerprint = await getVisitorId() + const dest = internalReturn(query.return) || '/profile' + userStore.register({ handle, username, password }, fingerprint, true, () => navigate(dest)) + } +``` + +Add the import: + +```tsx +import { getVisitorId } from '../../shared/fingerprint' +``` + +Add the checkbox into the form (replace the empty `
` placeholder at ~line 183), and gate the submit button on consent: + +```tsx + +``` + +Change the submit button to also disable until consented: + +```tsx + +``` + +(`A` is from `@solidjs/router` — confirm it's imported in this file; it is used elsewhere in it. `createSignal` is already imported.) + +- [ ] **Step 5: Privacy policy clause** + +In `web/pages/PrivacyPolicy/index.tsx`, add a short clause under the data-collection / security section (match surrounding markdown/JSX text style): + +> To prevent fraud and abuse — such as creating multiple accounts to obtain additional free credits — we collect and store your IP address and a device identifier derived from your browser and device characteristics. You consent to this collection when you register. We process this information to protect the fairness and security of the service (our legitimate interest and with your consent) and retain it for the life of your account. + +- [ ] **Step 6: Typecheck + build (confirm FingerprintJS bundles)** + +Run: `cd /home/dlite/charluv && pnpm typecheck` +Expected: no new errors referencing the touched files. +Run: `cd /home/dlite/charluv && node -e "const ts=require('typescript');const fs=require('fs');for (const f of ['web/shared/fingerprint.ts','web/pages/Login/index.tsx']) ts.transpileModule(fs.readFileSync(f,'utf8'),{compilerOptions:{jsx:'preserve',target:'esnext'}});console.log('ok')"` +Expected: `ok`. + +- [ ] **Step 7: Commit** + +```bash +git add package.json pnpm-lock.yaml web/shared/fingerprint.ts web/store/user.ts web/pages/Login/index.tsx web/pages/PrivacyPolicy/index.tsx +git commit -m "feat(abuse): consented FingerprintJS device id at registration + privacy clause + +Co-Authored-By: Claude Opus 4.8 +Claude-Session: https://claude.ai/code/session_01XXNb2Kcdayr1ZvUpy5a3nA" +``` + +--- + +### Task 6: Full verification + +**Files:** none (verification only) + +- [ ] **Step 1: Typechecks + tests** + +Run: `cd /home/dlite/charluv && pnpm typecheck` → expect web error count unchanged from baseline (0). +Run: `NODE_OPTIONS=--max-old-space-size=6144 npx tsc -p srv.tsconfig.json --noEmit` → 0. +Run: `pnpm test 2>&1 | grep -E "passing|failing"` → `classifyRegistration` 4 tests included; pre-existing failures unchanged, no new ones. + +- [ ] **Step 2: Prettier** + +Run prettier --check on all touched `.ts`/`.tsx`; `--write` any that need it; re-typecheck. + +- [ ] **Step 3: Manual smoke (fingerprinting works)** + +Use the `/run` skill (or `pnpm start`) to load the app, open `/register`, and verify with the browser tools: +- the consent checkbox is present and the Register button is disabled until it's ticked; +- on submit, the network request to `/user/register` includes a non-empty `fingerprint` and `consent: true` (FingerprintJS produced a visitorId — confirms fingerprinting is working end-to-end); +- registering a second account from the same browser/IP yields a restricted account (0 credits) or a 403 block; +- the privacy policy page shows the new clause. + +--- + +## Self-Review + +**Spec coverage:** +- §1 matrix → Task 1 (`classifyRegistration`) + Task 3 (handler). ✓ +- §2 data model + index → Task 1. ✓ +- §3.1 consent gate (required checkbox, disabled button, consent ts, "identifiers" wording) → Task 3 (server require) + Task 5 (UI + timestamp via createUser opts). ✓ +- §3.2 capture at registration only, degrade on missing fp → Task 5 (client) + Task 3 (`'string?'`). ✓ +- §4 enforcement (classifier, checkFingerprint, createUser opts incl consentAt, register requires consent, login unchanged, getFreeCredits filter) → Tasks 1/2/3. ✓ +- §5 admin surface + clear (top-up to 200) → Task 4 + `clearRestriction` (Task 2). ✓ +- §6 privacy policy accurate clause → Task 5 Step 5. ✓ +- §7 error handling (StatusError, blank fp = no match, client swallow) → Tasks 2/3/5. ✓ +- §8 testing (classifyRegistration unit; DB paths typecheck-only) → Task 1 + Task 6. ✓ +- §9 existing members untouched (no retro restriction; no login fp) → Task 3 Step 2 (login unchanged), Task 2 (restrict only via register opts). ✓ + +**Placeholder scan:** Task 4 Steps 1/4 intentionally say "read the actual accessor/return shape first" because `srv/db/admin.ts`'s return object and `UsersPage.tsx`'s info-signal name must be matched to existing code; the exact field additions and JSX are given. This is guided integration, not a placeholder. No TODO/TBD elsewhere. + +**Type consistency:** `classifyRegistration({fpMatch,ipMatch})→'block'|'restrict'|'allow'` consistent (Task 1 def, Task 3 use). `createUser(newUser, admin?, opts?)` opts shape consistent (Task 2 def, Task 3 call). `restrictedReason` union `'ip'|'fingerprint'|'both'` consistent across schema/createUser/admin/store. `getVisitorId(): Promise` consistent (Task 5 def + use). `register(newUser, fingerprint?, consent, onSuccess?)` consistent (Task 5 store def + RegisterForm call). diff --git a/docs/superpowers/plans/2026-06-25-blog-page-restyle.md b/docs/superpowers/plans/2026-06-25-blog-page-restyle.md new file mode 100644 index 00000000..d02ede2b --- /dev/null +++ b/docs/superpowers/plans/2026-06-25-blog-page-restyle.md @@ -0,0 +1,852 @@ +# Blog Page Restyle + Discover-as-Landing Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Repurpose the legacy Agnai "Home" page into a warm-dusk styled blog/news page at `/blog`, and make Discover the landing at `/` for everyone. + +**Architecture:** Extract Discover's "warm dusk" oklch palette + page background into a shared CSS partial imported by both Discover and a new scoped `blog.css`. Rewrite `web/pages/Home/index.tsx` markup to the warm-dusk structure, cutting dead content. Repoint routing so `/` renders Discover and the blog lives at `/blog` (+ `/info` alias). + +**Tech Stack:** SolidJS, Tailwind (arbitrary-value utilities referencing CSS vars), plain CSS (Vite-bundled), `@solidjs/router`. + +## Global Constraints + +- Package manager: **pnpm**, never npm. +- **No data migrations**; no backend/schema changes in this work (none needed). +- **Commit only when the user explicitly asks** (per repo CLAUDE.md). Each task's + "Commit" step means: `git add` the listed files and pause; run `git commit` only if + the user has approved committing. +- Vite resolves `.ts`/`.tsx` before `.js`; never check in compiled web `.js`/`.js.map`. +- Keep the CSS custom-property prefix `--dsc-` (shared palette) — do not rename. +- Web typecheck: `pnpm typecheck`. Quick syntax check of a single web file: + `npx tsc --noEmit` is heavy — prefer `node -e "require('typescript').transpileModule(...)"` + or just rely on `pnpm typecheck`. + +--- + +## File Structure + +| File | Responsibility | +|---|---| +| `web/pages/warm-dusk.css` (new) | Shared warm-dusk palette + page background, scoped to `.dsc-root, .blg-root` | +| `web/pages/Discover/discover.css` (modify) | Drop inline palette block; import the shared partial. No visual change. | +| `web/pages/Home/blog.css` (new) | `.blg-*` layout/typography for the blog page | +| `web/pages/Home/index.tsx` (rewrite) | `BlogPage` component — warm-dusk markup, dead content removed | +| `web/pages/Home/home.scss` (delete) | Obsolete `.home-cards` styles | +| `web/App.tsx` (modify) | Routing: `/`→Discover; `/blog`+`/info`→BlogPage; `fullBleed` includes them | + +--- + +## Task 1: Shared warm-dusk palette partial + +**Files:** +- Create: `web/pages/warm-dusk.css` +- Modify: `web/pages/Discover/discover.css:1-26` + +**Interfaces:** +- Produces: CSS custom properties `--dsc-bg`, `--dsc-bg-2`, `--dsc-surface`, `--dsc-cream`, + `--dsc-muted`, `--dsc-line`, `--dsc-green`, `--dsc-green-deep`, `--dsc-wine`, plus the + page `background`, `color`, `min-height`, `font-family`, and the Fraunces `@font-face` + import — all available to any element under `.dsc-root` or `.blg-root`. + +- [ ] **Step 1: Create the shared partial** + +Create `web/pages/warm-dusk.css`: + +```css +/* Shared "warm dusk" editorial palette + page background for Charluv's + modern pages (Discover, Blog). Scoped to page roots so it never bleeds + into the legacy theme. Keep the --dsc- prefix: it is the shared palette. */ +@import url('https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@0,9..144,400;0,9..144,600;1,9..144,500&display=swap'); + +.dsc-root, +.blg-root { + /* warm plum dusk, never pure black */ + --dsc-bg: oklch(0.18 0.03 350); + --dsc-bg-2: oklch(0.23 0.04 348); + --dsc-surface: oklch(0.27 0.045 345); + --dsc-cream: oklch(0.94 0.02 75); + --dsc-muted: oklch(0.72 0.03 350); + --dsc-line: oklch(0.4 0.05 345 / 0.5); + /* Charluv logo green */ + --dsc-green: oklch(0.74 0.11 165); + --dsc-green-deep: oklch(0.64 0.12 165); + --dsc-wine: oklch(0.55 0.16 5); + + min-height: 100%; + background: + radial-gradient(120% 80% at 85% -10%, oklch(0.3 0.08 350 / 0.6), transparent 60%), + radial-gradient(90% 60% at -10% 110%, oklch(0.28 0.06 165 / 0.35), transparent 55%), + var(--dsc-bg); + color: var(--dsc-cream); + font-family: 'Lato', system-ui, sans-serif; +} +``` + +- [ ] **Step 2: Rewire discover.css to import the partial** + +Replace the current top of `web/pages/Discover/discover.css` (lines 1-26 — the header +comment, the Fraunces `@import url(...)`, and the entire `.dsc-root { ... }` block) with: + +```css +/* Discover — "warm dusk" editorial aesthetic with the Charluv green accent. + Palette + page background live in ../warm-dusk.css (shared with the blog page). + Scoped under .dsc-root so it never bleeds into the legacy theme. */ +@import '../warm-dusk.css'; + +.dsc-root { + padding: clamp(1.25rem, 4vw, 3.5rem) clamp(1rem, 5vw, 4rem) 5rem; +} +``` + +Leave everything from `/* ---- header ---- */` (old line 28) onward unchanged. + +- [ ] **Step 3: Typecheck** + +Run: `pnpm typecheck` +Expected: PASS (CSS is not typechecked, but confirms no TS broke). + +- [ ] **Step 4: Visual confirm Discover is unchanged** + +Run the app (`/run` or Playwright) and load `/discover`. Confirm: background gradient, +Fraunces title "Find your someone", green accent, card layout all render exactly as +before. The extraction must be visually identical. + +- [ ] **Step 5: Commit** (only if user approved committing) + +```bash +git add web/pages/warm-dusk.css web/pages/Discover/discover.css +git commit -m "refactor(ui): extract shared warm-dusk palette partial" +``` + +--- + +## Task 2: Blog page stylesheet + +**Files:** +- Create: `web/pages/Home/blog.css` + +**Interfaces:** +- Consumes: the `--dsc-*` vars + Fraunces font from `../warm-dusk.css` (Task 1). +- Produces: classes consumed by Task 3 — `blg-root`, `blg-head`, `blg-title`, `blg-tag`, + `blg-ad`, `blg-feed`, `blg-post`, `blg-post-head`, `blg-post-title`, `blg-post-date`, + `blg-post-body`, `blg-recent`, `blg-recent-title`, `blg-recent-grid`, `blg-card`, + `blg-card-title`, `hl`, `blg-link-inline`, `blg-links`, `blg-pill`, `blg-footer`, + `blg-foot-group`. + +- [ ] **Step 1: Create blog.css** + +Create `web/pages/Home/blog.css`: + +```css +/* Blog / News page — warm-dusk editorial, matching Discover. + Palette + page background come from ../warm-dusk.css. */ +@import '../warm-dusk.css'; + +.blg-root { + max-width: 920px; + margin: 0 auto; + padding: clamp(1.25rem, 4vw, 3rem) clamp(1rem, 5vw, 2.5rem) 5rem; + display: flex; + flex-direction: column; + gap: clamp(1.5rem, 4vw, 2.5rem); +} + +/* hero */ +.blg-head { + display: flex; + flex-direction: column; + gap: 0.75rem; +} +.blg-title { + font-family: 'Fraunces', Georgia, serif; + font-weight: 600; + font-size: clamp(2.2rem, 6vw, 4rem); + line-height: 0.95; + letter-spacing: -0.02em; + margin: 0; +} +.blg-title em { + font-style: italic; + color: var(--dsc-green); +} +.blg-tag { + color: var(--dsc-muted); + max-width: 60ch; + margin: 0; + font-size: clamp(0.95rem, 1.4vw, 1.1rem); + line-height: 1.55; +} + +/* ad slot wrapper */ +.blg-ad { + display: flex; + justify-content: center; + width: 100%; +} + +/* announcements feed */ +.blg-feed { + display: flex; + flex-direction: column; + gap: 1.25rem; +} +.blg-post { + background: linear-gradient(160deg, var(--dsc-surface), var(--dsc-bg-2)); + border: 1px solid var(--dsc-line); + border-radius: 18px; + padding: clamp(1.1rem, 3vw, 1.75rem); +} +.blg-post-head { + display: flex; + align-items: baseline; + justify-content: space-between; + gap: 1rem; + flex-wrap: wrap; + margin-bottom: 0.6rem; +} +.blg-post-title { + font-family: 'Fraunces', serif; + font-weight: 600; + font-size: clamp(1.3rem, 2.6vw, 1.9rem); + line-height: 1.1; + margin: 0; +} +.blg-post-date { + color: var(--dsc-muted); + font-size: 0.78rem; + letter-spacing: 0.04em; + white-space: nowrap; +} +.blg-post-body { + color: var(--dsc-cream); + line-height: 1.6; +} +.blg-post-body a { + color: var(--dsc-green); +} + +/* recent conversations */ +.blg-recent { + display: flex; + flex-direction: column; + gap: 0.9rem; +} +.blg-recent-title { + font-family: 'Fraunces', serif; + font-size: clamp(1.2rem, 2.4vw, 1.6rem); + font-weight: 600; + margin: 0; +} +.blg-recent-grid { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 0.7rem; +} +@media (min-width: 640px) { + .blg-recent-grid { + grid-template-columns: repeat(4, 1fr); + gap: 1rem; + } +} + +/* static cards (Features, Getting Started) */ +.blg-card { + background: linear-gradient(160deg, var(--dsc-surface), var(--dsc-bg-2)); + border: 1px solid var(--dsc-line); + border-radius: 18px; + padding: clamp(1.1rem, 3vw, 1.75rem); + line-height: 1.6; +} +.blg-card-title { + font-family: 'Fraunces', serif; + font-size: clamp(1.3rem, 2.6vw, 1.8rem); + font-weight: 600; + margin: 0 0 0.75rem; +} +.blg-card p { + margin: 0 0 0.6rem; +} +.blg-card p:last-child { + margin-bottom: 0; +} +.blg-card .hl { + color: var(--dsc-green); + font-weight: 700; +} +.blg-link-inline { + color: var(--dsc-green); + text-decoration: underline; +} + +/* link pills */ +.blg-links { + display: flex; + flex-wrap: wrap; + gap: 0.6rem; +} +.blg-pill { + display: inline-flex; + align-items: center; + border: 1px solid var(--dsc-line); + background: transparent; + color: var(--dsc-cream); + padding: 0.4rem 1rem; + border-radius: 999px; + font-size: 0.85rem; + text-decoration: none; + transition: border-color 180ms ease, color 180ms ease; +} +.blg-pill:hover { + border-color: var(--dsc-green); + color: var(--dsc-green); +} + +/* footer band: app download + featured-on badges */ +.blg-footer { + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: center; + gap: 1.5rem 2rem; + padding-top: 1.5rem; + border-top: 1px solid var(--dsc-line); +} +.blg-foot-group { + display: flex; + align-items: center; + gap: 1rem; +} + +@media (prefers-reduced-motion: reduce) { + .blg-pill { + transition: none; + } +} +``` + +- [ ] **Step 2: Typecheck** + +Run: `pnpm typecheck` +Expected: PASS. + +- [ ] **Step 3: Commit** (only if user approved committing) + +```bash +git add web/pages/Home/blog.css +git commit -m "feat(ui): add warm-dusk blog page stylesheet" +``` + +--- + +## Task 3: Rewrite the page component + +**Files:** +- Modify (full rewrite): `web/pages/Home/index.tsx` +- Delete: `web/pages/Home/home.scss` + +**Interfaces:** +- Consumes: `blog.css` classes (Task 2); `announceStore`, `chatStore`, `userStore`; + `markdown.makeHtml`, `elapsedSince`, `getAssetUrl`, `uniqueBy`, `setComponentPageTitle`, + `createEmitter`/`ComponentEmitter`, `Slot`, `AvatarIcon`, `useRef`. +- Produces: default export `BlogPage` (a `Component`) — consumed by `App.tsx` routes + `/blog`, `/info`, and the `*` fallback (Task 4). + +- [ ] **Step 1: Confirm home.scss has no other importers** + +Run: `grep -rn "home.scss" web` +Expected: only `web/pages/Home/index.tsx:1`. If anything else imports it, stop and +reassess. Also run: `grep -rn "home-cards" web` — expected: only matches inside +`index.tsx`/`home.scss` (both being removed). + +- [ ] **Step 2: Replace the entire contents of `web/pages/Home/index.tsx`** + +```tsx +import './blog.css' +import nsfwTools from '../../asset/featured-on-badge-b.avif?url' +import { Component, For, Show, createMemo, onMount } from 'solid-js' +import { + ComponentEmitter, + createEmitter, + getAssetUrl, + setComponentPageTitle, + uniqueBy, +} from '../../shared/util' +import { announceStore, chatStore, userStore } from '../../store' +import { A, useNavigate } from '@solidjs/router' +import { MoveRight, Plus, Heart, Users } from '/web/icons' +import AvatarIcon from '/web/shared/AvatarIcon' +import { elapsedSince } from '/common/util' +import { markdown } from '/web/shared/markdown' +import Slot from '/web/shared/Slot' +import { useRef } from '/web/shared/hooks' + +const taaftHTML = `` + +const itchHTML = `` + +const BlogPage: Component = () => { + const [topRef, onTopRef] = useRef() + const [midRef, onMidRef] = useRef() + setComponentPageTitle('News') + + const user = userStore() + const announce = announceStore() + + const announcements = createMemo(() => { + return announce.list.filter((ann) => { + if (ann.location && ann.location !== 'home') return false + + const level = ann.userLevel ?? -1 + const userPremium = user.user?.premium ? 10 : -1 + const premiumLevel = Math.max(user.userLevel, userPremium) + return premiumLevel >= level + }) + }) + + const emitter = createEmitter('loaded') + + onMount(() => { + announceStore.getAll() + }) + + return ( +
+
+

+ News & Updates +

+

+ Charluv is a virtual dating chat service where you can even create your own characters. + Membership is free; premium gives you priority and near-unlimited messages. Your + conversations are completely private and never shared with anyone unless you invite them. +

+
+ +
+ +
+ + 0}> +
+ + {(item) => ( +
+
+

{item.title}

+ +
+
+
+ )} +
+
+
+ + + +
+ +
+ + + +
+

Getting Started

+

+ Looking for help getting started? Check out the{' '} + + Official Guide + {' '} + or head to the{' '} + + Charluv Discord + + . +

+
+ + + + +
+ ) +} + +export default BlogPage + +const RecentChats: Component<{ emitter: ComponentEmitter<'loaded'> }> = (props) => { + const nav = useNavigate() + const user = userStore() + const state = chatStore((s) => { + // We want this to occur after the state has propogated + setTimeout(() => { + props.emitter.emit.loaded(), 200 + }) + + return { + chars: s.allChars.list, + last: uniqueBy(s.allChats, 'characterId') + .slice() + .sort((l, r) => (r.updatedAt > l.updatedAt ? 1 : -1)) + .slice(0, 4) + .map((chat) => ({ chat, char: s.allChars.map[chat.characterId] })), + } + }) + + return ( +
+

+ Recent Conversations +

+
+ + {({ chat, char }) => ( + <> + + +
nav(`/chat/${chat._id}`)} + > + + + +
+ + )} +
+ + + +
Register to Start Chatting
+ +
+
+ + + +
Find Matches
+ +
+
+ + + +
Start a Conversation
+ +
+
+ + + +
Create a Character
+ +
+
+
+
+ ) +} + +const BorderCard: Component<{ children: any; href: string; ariaLabel?: string }> = (props) => { + const nav = useNavigate() + return ( +
nav(props.href)} + > + {props.children} +
+ ) +} + +const Features: Component = () => ( +
+

Notable Features

+

+ Charluv is completely free to use and free to register. Your data is + kept private and you can permanently delete it at any time. We take your privacy very + seriously. +

+

+ Unique model trained for understanding virtual dating and character + progression. +

+

+ Register to have your data available on all of your devices. +

+

Chat with multiple characters at the same time.

+

+ Create Memory Books to give your characters information about their + world. +

+

+ Image generation — generate images in your chats. +

+

+ Voice — give your characters a voice and have them speak back to you. +

+
+) +``` + +Notes on deliberate changes from the old file: +- Removed: `HordeGuide`, `OpenAIGuide`, the `Sub` enum, the `sub` signal, the trailing + ``, the standalone `Announcements` component, the Credits card, the green logo + bar, the ElevenLabs "currently disabled" paragraph, and the 13B model claim. +- Removed dead imports: `logoDark`, `Card`/`Pill`/`SolidCard`/`TitleCard`, `Modal`, + `adaptersToOptions`, `settingStore`, `AppSchema`, `Match`, `Switch`, `createSignal`. +- Two separate refs (`topRef`/`midRef`) instead of the old single `ref`/`onRef` reused on + two elements (pre-existing bug — the second usage clobbered the first). +- Match/create prompt links updated to live routes (`/discover`, `/create`) instead of + retired `/likes/list` and `/editor`. + +- [ ] **Step 3: Delete the obsolete stylesheet** + +```bash +git rm web/pages/Home/home.scss +``` + +- [ ] **Step 4: Typecheck** + +Run: `pnpm typecheck` +Expected: PASS, with no "unused import" / "cannot find name" errors. If any kept import +turns out unused after your edits, remove it; if any used symbol is missing, re-add it. + +- [ ] **Step 5: Commit** (only if user approved committing) + +```bash +git add web/pages/Home/index.tsx +git commit -m "feat(ui): rewrite home page as warm-dusk blog, drop dead content" +``` + +--- + +## Task 4: Routing — Discover at `/`, blog at `/blog` + +**Files:** +- Modify: `web/App.tsx:73` (hoist Discover lazy import), `:78-86` (routes), `:188-193` + (`fullBleed` memo) + +**Interfaces:** +- Consumes: default export `BlogPage` from `./pages/Home` (Task 3) — already imported as + `HomePage` on line 18; the import name is unchanged (default import alias). + +- [ ] **Step 1: Hoist the Discover lazy import** + +In `web/App.tsx`, just below the `import` block (after line 48), add: + +```tsx +const DiscoverPage = lazy(() => import('./pages/Discover')) +``` + +Then change line 73 from: + +```tsx + import('./pages/Discover'))} /> +``` + +to: + +```tsx + +``` + +- [ ] **Step 2: Repoint the landing + blog routes** + +Replace the block at lines 78-86: + +```tsx + + ( + }> + + + )} + /> +``` + +with: + +```tsx + + + +``` + +(`HomePage` is the default import of the now-`BlogPage` component.) + +- [ ] **Step 3: Make the warm-dusk pages full-bleed** + +The `fullBleed` memo (lines 188-193) gates the legacy boxed `content-background` +wrapper. `/` now renders Discover but its pathname is `/` (not `/discover`), and the blog +paints its own background — all three must opt out of the boxed wrapper. Replace: + +```tsx + const fullBleed = createMemo( + () => + location.pathname.startsWith('/discover') || + location.pathname === '/mine' || + location.pathname.startsWith('/mine/') + ) +``` + +with: + +```tsx + const fullBleed = createMemo( + () => + location.pathname === '/' || + location.pathname === '/blog' || + location.pathname === '/info' || + location.pathname.startsWith('/discover') || + location.pathname === '/mine' || + location.pathname.startsWith('/mine/') + ) +``` + +- [ ] **Step 4: Typecheck** + +Run: `pnpm typecheck` +Expected: PASS. `Show`, `Redirect`, and `state` are all still used elsewhere in the file +(e.g. lines 107, 112, 144, 205-211), so no import removals are needed. + +- [ ] **Step 5: Visual / behavioral check** + +Run the app (`/run` or Playwright) and verify: +- Logged **out**: `/` shows Discover full-bleed (no boxed wrapper, no redirect flash). +- Logged **in**: `/` shows Discover immediately (the old "lands on Home until refresh" + bug is gone). `/blog` and `/info` show the restyled blog full-bleed. +- Blog: announcements feed renders (seed one via admin if needed), Recent Conversations + appears when logged in with chats, Features + Getting Started + link pills + footer + band (itch embed + featured-on badges) all render in warm-dusk style. +- Mobile width: blog is a single readable column; recent grid is 2-up. +- `prefers-reduced-motion`: pill hover transition disabled. + +- [ ] **Step 6: Commit** (only if user approved committing) + +```bash +git add web/App.tsx +git commit -m "feat(routing): make Discover the landing, move blog to /blog" +``` + +--- + +## Reachability follow-up (out of scope, flag to user) + +`/blog` has no nav entry after this change. If the blog should be reachable from the UI, +a link must be added to `web/shared/NavBar`, `GuestTopBar`, `UserTopBar`, or +`Navigation` — not included here because the spec scoped only the page + routing. Raise +with the user. + +--- + +## Self-Review + +- **Spec coverage:** warm-dusk partial (Task 1) ✓; Discover one-import swap (Task 1) ✓; + new blog.css (Task 2) ✓; index.tsx rewrite + dead-content cuts (Task 3) ✓; home.scss + delete (Task 3) ✓; routing `/`→Discover + `/blog`/`/info` (Task 4) ✓; post-login bug + fix (Task 4) ✓; keep announcements/recent/features/getting-started/links/slots/ + app-download/featured-on (Task 3) ✓; `fullBleed` correctness (Task 4) — caught during + planning, added ✓. +- **Placeholders:** none — all code blocks are complete. +- **Type/name consistency:** `BlogPage` default export consumed by Task 4 routes; all + `blg-*` class names defined in Task 2 match those used in Task 3; `--dsc-*` vars defined + in Task 1 used by Tasks 2 & 3. +- **Known deviation from skill:** pure CSS/markup has no meaningful unit test, so tasks use + typecheck + visual verification instead of a failing-test-first cycle. diff --git a/docs/superpowers/plans/2026-06-25-promo-codes.md b/docs/superpowers/plans/2026-06-25-promo-codes.md new file mode 100644 index 00000000..d6f3ccf8 --- /dev/null +++ b/docs/superpowers/plans/2026-06-25-promo-codes.md @@ -0,0 +1,876 @@ +# Promo Codes + Subscription Page Cleanup Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Add admin-managed promo codes that grant credits and/or premium days (once per account, expirable, max-uses capped), and remove dead Stripe/legacy-shop UI from the Subscription page. + +**Architecture:** Two new additive MongoDB collections (`promo-code`, `promo-redemption`) with unique indexes enforcing one-redemption-per-account and unique code strings. Redemption is a race-safe server flow (conditional `$inc` for max-uses + unique-index insert for per-account). Admins CRUD codes via a new admin page; users redeem on the Subscription page. No data migrations — all changes additive. + +**Tech Stack:** TypeScript, Express + MongoDB (`srv/`), SolidJS + Tailwind (`web/`), isomorphic types (`common/`), mocha tests (`tests/`). + +## Global Constraints + +- **NO data migrations.** Schema changes must be additive (nullable/new fields, new collections only). +- **Use `pnpm`, never `npm`.** +- Vite resolves `.ts` before `.js`; do **not** check in compiled web `.js`/`.js.map`. +- Codes are stored and compared **UPPERCASE** (case-insensitive redemption). +- "Membership days" = premium days: set `premium: true`, extend `premiumUntil` by `days * 86_400_000` ms from `max(premiumUntil, now)` (same math as `srv/api/cart.ts:giveOrder`). +- Run `pnpm checks` before declaring done; srv typecheck via `NODE_OPTIONS=--max-old-space-size=6144 npx tsc -p srv.tsconfig.json --noEmit`. +- Commit messages end with the two trailer lines from CLAUDE.md (Co-Authored-By + Claude-Session). + +--- + +### Task 1: Schema types + collection registration + +**Files:** +- Modify: `common/types/schema.ts` (add to `AllDoc` union ~line 12-37; add interfaces + namespace aliases in `AppSchema` ~near `ShopItem`/`InviteCode` ~line 96-132) +- Modify: `srv/db/client.ts:createIndexes` (add indexes ~after line 130) + +**Interfaces:** +- Produces: + - `AppSchema.PromoCode { _id: string; kind: 'promo-code'; code: string; credits?: number; days?: number; maxUses: number; uses: number; enabled: boolean; expiresAt?: string; createdAt: string; createdBy: string; updatedAt?: string }` + - `AppSchema.PromoRedemption { _id: string; kind: 'promo-redemption'; codeId: string; userId: string; code: string; credits: number; days: number; createdAt: string }` + +- [ ] **Step 1: Add interfaces to the `AppSchema` namespace** + +In `common/types/schema.ts`, inside `export namespace AppSchema { ... }`, near the `ShopItem`/`InviteCode` interfaces, add: + +```ts + export interface PromoCode { + _id: string + kind: 'promo-code' + code: string + credits?: number + days?: number + maxUses: number + uses: number + enabled: boolean + expiresAt?: string + createdAt: string + createdBy: string + updatedAt?: string + } + + export interface PromoRedemption { + _id: string + kind: 'promo-redemption' + codeId: string + userId: string + code: string + credits: number + days: number + createdAt: string + } +``` + +- [ ] **Step 2: Register both kinds in the `AllDoc` union** + +In `common/types/schema.ts`, add to the `AllDoc` union (the `export type AllDoc =` list, ~line 12-37): + +```ts + | AppSchema.PromoCode + | AppSchema.PromoRedemption +``` + +- [ ] **Step 3: Add unique indexes** + +In `srv/db/client.ts`, inside `createIndexes()`, after the existing `db('user')` indexes block (~line 147), add: + +```ts + await db('promo-code').createIndex({ code: 1 }, { unique: true, name: 'promo-code_code' }) + await db('promo-redemption').createIndex( + { codeId: 1, userId: 1 }, + { unique: true, name: 'promo-redemption_code_user' } + ) +``` + +- [ ] **Step 4: Typecheck** + +Run: `cd /home/dlite/charluv && pnpm typecheck` +Expected: PASS (no new errors). Then srv typecheck: +Run: `cd /home/dlite/charluv && NODE_OPTIONS=--max-old-space-size=6144 npx tsc -p srv.tsconfig.json --noEmit` +Expected: PASS — `db('promo-code')` / `db('promo-redemption')` now resolve via the `AllDoc` union. + +- [ ] **Step 5: Commit** + +```bash +git add common/types/schema.ts srv/db/client.ts +git commit -m "feat(promo): add promo-code + promo-redemption schema and indexes + +Co-Authored-By: Claude Opus 4.8 +Claude-Session: https://claude.ai/code/session_01XXNb2Kcdayr1ZvUpy5a3nA" +``` + +--- + +### Task 2: DB layer — CRUD + race-safe `redeemPromo` + +**Files:** +- Create: `srv/db/promo.ts` +- Test: `tests/promo.spec.js` +- Modify: `srv/db/index.ts` (re-export, follow existing pattern — see Step 6) + +**Interfaces:** +- Consumes: `AppSchema.PromoCode`, `AppSchema.PromoRedemption` (Task 1); `db` from `./client`; `updateCredits` from `./credits`; `getUser`, `updateUser`, `toSafeUser` from `./user`; `StatusError` from `../api/wrap`. +- Produces: + - `getPromos(): Promise` + - `getPromoByCode(code: string): Promise` + - `createPromo(input: { code: string; credits?: number; days?: number; maxUses: number; enabled: boolean; expiresAt?: string; createdBy: string }): Promise` + - `updatePromo(id: string, patch: Partial>): Promise` + - `deletePromo(id: string): Promise` + - `redeemPromo(userId: string, rawCode: string): Promise<{ user: AppSchema.User; credits: number; days: number }>` + +**Note on tests:** `tests/` is mocha (`tests/**.spec.js`). The existing harness pattern for DB-backed code is to use an in-memory mongo. Check `tests/` for an existing helper (e.g. a `setup`/`mongodb-memory-server` bootstrap) and reuse it. If no DB harness exists, implement `redeemPromo` against a thin injectable layer is overkill — instead test the pure helper `extendPremium` (Step 1) plus integration tests gated on the existing DB harness. Steps below assume a DB test harness exists at `tests/` (mirror whatever `tests/*.spec.js` already do to get `db`). + +- [ ] **Step 1: Write the failing test for the premium-extension helper** + +Create `tests/promo.spec.js`: + +```js +const { expect } = require('chai') +const { extendPremium } = require('../srv/db/promo') + +describe('extendPremium', () => { + it('extends from now when premiumUntil is in the past', () => { + const now = 1_000_000_000_000 + const result = extendPremium(now - 5000, 2, now) + expect(result).to.equal(now + 2 * 86_400_000) + }) + + it('stacks on top of an existing future premiumUntil', () => { + const now = 1_000_000_000_000 + const future = now + 10 * 86_400_000 + const result = extendPremium(future, 3, now) + expect(result).to.equal(future + 3 * 86_400_000) + }) + + it('treats missing premiumUntil as now', () => { + const now = 1_000_000_000_000 + const result = extendPremium(0, 1, now) + expect(result).to.equal(now + 86_400_000) + }) +}) +``` + +- [ ] **Step 2: Run test to verify it fails** + +Run: `cd /home/dlite/charluv && pnpm test -- --grep extendPremium` +Expected: FAIL — `extendPremium` is not exported / module not found. + +- [ ] **Step 3: Implement `srv/db/promo.ts`** + +Create `srv/db/promo.ts`: + +```ts +import { v4 } from 'uuid' +import { db } from './client' +import { StatusError } from '../api/wrap' +import { updateCredits } from './credits' +import { getUser, updateUser, toSafeUser } from './user' +import { AppSchema } from '../../common/types' + +const DAY_MS = 86_400_000 + +const now = () => new Date().toISOString() + +/** Pure helper: new premiumUntil after adding `days`, extending the later of existing/now. */ +export function extendPremium(premiumUntil: number, days: number, nowMs: number) { + const base = (premiumUntil || 0) > nowMs ? premiumUntil : nowMs + return base + days * DAY_MS +} + +export async function getPromos() { + return db('promo-code').find({ kind: 'promo-code' }).sort({ createdAt: -1 }).toArray() +} + +export async function getPromoByCode(code: string) { + return db('promo-code').findOne({ kind: 'promo-code', code: code.trim().toUpperCase() }) +} + +export async function createPromo(input: { + code: string + credits?: number + days?: number + maxUses: number + enabled: boolean + expiresAt?: string + createdBy: string +}) { + const code = input.code.trim().toUpperCase() + if (!code) throw new StatusError('Code is required', 400) + if (!input.credits && !input.days) { + throw new StatusError('A code must grant credits and/or days', 400) + } + if (input.maxUses < 0) throw new StatusError('maxUses cannot be negative', 400) + + const existing = await db('promo-code').findOne({ kind: 'promo-code', code }) + if (existing) throw new StatusError('A code with that name already exists', 400) + + const promo: AppSchema.PromoCode = { + _id: v4(), + kind: 'promo-code', + code, + credits: input.credits || 0, + days: input.days || 0, + maxUses: input.maxUses, + uses: 0, + enabled: input.enabled, + expiresAt: input.expiresAt || undefined, + createdAt: now(), + createdBy: input.createdBy, + } + + await db('promo-code').insertOne(promo) + return promo +} + +export async function updatePromo( + id: string, + patch: Partial< + Pick + > +) { + const set: any = { updatedAt: now() } + if (patch.code !== undefined) { + const code = patch.code.trim().toUpperCase() + const clash = await db('promo-code').findOne({ kind: 'promo-code', code, _id: { $ne: id } }) + if (clash) throw new StatusError('A code with that name already exists', 400) + set.code = code + } + if (patch.credits !== undefined) set.credits = patch.credits + if (patch.days !== undefined) set.days = patch.days + if (patch.maxUses !== undefined) set.maxUses = patch.maxUses + if (patch.enabled !== undefined) set.enabled = patch.enabled + if (patch.expiresAt !== undefined) set.expiresAt = patch.expiresAt || undefined + + await db('promo-code').updateOne({ kind: 'promo-code', _id: id }, { $set: set }) + return db('promo-code').findOne({ kind: 'promo-code', _id: id }) +} + +export async function deletePromo(id: string) { + await db('promo-code').deleteOne({ kind: 'promo-code', _id: id }) +} + +export async function redeemPromo(userId: string, rawCode: string) { + const code = (rawCode || '').trim().toUpperCase() + if (!code) throw new StatusError('Please enter a code', 400) + + const promo = await db('promo-code').findOne({ kind: 'promo-code', code }) + if (!promo) throw new StatusError('Invalid promo code', 404) + if (!promo.enabled) throw new StatusError('This code is no longer active', 400) + if (promo.expiresAt && new Date(promo.expiresAt).valueOf() < Date.now()) { + throw new StatusError('This code has expired', 400) + } + + // Atomically claim a use slot (skip the guard entirely when unlimited). + const filter: any = { kind: 'promo-code', _id: promo._id, enabled: true } + if (promo.maxUses > 0) filter.$expr = { $lt: ['$uses', '$maxUses'] } + const claimed = await db('promo-code').findOneAndUpdate(filter, { $inc: { uses: 1 } }) + // mongodb driver: returns the pre-update doc in `.value` (or null when no match) + const claimedDoc = (claimed as any)?.value ?? claimed + if (!claimedDoc) throw new StatusError('This code has been fully used', 400) + + // Per-account lock via the unique (codeId,userId) index. + try { + await db('promo-redemption').insertOne({ + _id: v4(), + kind: 'promo-redemption', + codeId: promo._id, + userId, + code, + credits: promo.credits || 0, + days: promo.days || 0, + createdAt: now(), + }) + } catch (err: any) { + await db('promo-code').updateOne({ kind: 'promo-code', _id: promo._id }, { $inc: { uses: -1 } }) + if (err?.code === 11000) throw new StatusError('You have already redeemed this code', 400) + throw err + } + + const credits = promo.credits || 0 + const days = promo.days || 0 + + if (credits > 0) await updateCredits(userId, credits) + + if (days > 0) { + const user = await getUser(userId) + if (!user) throw new StatusError('User not found', 404) + const premiumUntil = extendPremium(user.premiumUntil || 0, days, Date.now()) + await updateUser(userId, { premium: true, premiumUntil }) + } + + const user = await getUser(userId) + if (!user) throw new StatusError('User not found', 404) + return { user: toSafeUser(user), credits, days } +} +``` + +- [ ] **Step 4: Run the helper test to verify it passes** + +Run: `cd /home/dlite/charluv && pnpm test -- --grep extendPremium` +Expected: PASS (3 passing). + +- [ ] **Step 5: Add redemption integration tests (gated on DB harness)** + +Append to `tests/promo.spec.js`. **First inspect an existing `tests/*.spec.js` that touches `db(...)`** to copy its before/after DB bootstrap (connect + clean). Use that harness; the asserts below are the contract: + +```js +const promo = require('../srv/db/promo') +// ...reuse existing DB harness setup (connect in before, drop collections in beforeEach)... + +describe('redeemPromo', () => { + it('grants credits and records a redemption', async () => { + // seed a user with known credits, create a credits-only code, redeem it + // expect: returned credits === code.credits, user.credits increased, + // one promo-redemption row for (codeId,userId), code.uses === 1 + }) + + it('grants premium days', async () => { + // create a days-only code, redeem; expect user.premium === true and + // premiumUntil ≈ now + days*86_400_000 + }) + + it('rejects a second redemption by the same user and does not double-count uses', async () => { + // redeem once (uses->1), redeem again -> throws "already redeemed", + // code.uses still === 1 + }) + + it('rejects a disabled code', async () => { /* enabled:false -> throws */ }) + it('rejects an expired code', async () => { /* expiresAt in past -> throws */ }) + it('rejects when maxUses is exhausted', async () => { + // maxUses:1, user A redeems, user B redeem -> throws "fully used" + }) + it('allows unlimited redemptions when maxUses is 0', async () => { + // maxUses:0, users A and B both succeed + }) +}) +``` + +Fill each test body using the copied harness. If `tests/` has **no** DB harness, skip this step (helper test in Step 1 stands) and note it in the commit body. + +- [ ] **Step 6: Re-export from `srv/db/index.ts`** + +Inspect `srv/db/index.ts` for how modules like `credits`/`shop` are exported (e.g. `export * as credits from './credits'` or a `store` aggregate). Mirror that exactly for promo, e.g.: + +```ts +export * as promo from './promo' +``` + +(If `srv/db/index.ts` uses a different aggregation shape, match it — do not invent a new pattern.) + +- [ ] **Step 7: Run tests + typecheck** + +Run: `cd /home/dlite/charluv && pnpm test` +Expected: PASS (existing + new). +Run: `cd /home/dlite/charluv && NODE_OPTIONS=--max-old-space-size=6144 npx tsc -p srv.tsconfig.json --noEmit` +Expected: PASS. + +- [ ] **Step 8: Commit** + +```bash +git add srv/db/promo.ts srv/db/index.ts tests/promo.spec.js +git commit -m "feat(promo): add promo code CRUD and race-safe redemption + +Co-Authored-By: Claude Opus 4.8 +Claude-Session: https://claude.ai/code/session_01XXNb2Kcdayr1ZvUpy5a3nA" +``` + +--- + +### Task 3: User redeem route + +**Files:** +- Create or Modify: the user-facing redeem endpoint. Inspect `srv/api/user/index.ts` for the router; add a handler file `srv/api/user/promo.ts` and register the route. +- Modify: `srv/api/user/index.ts` (mount `POST /promo/redeem`) + +**Interfaces:** +- Consumes: `redeemPromo` (Task 2); `handle`/`assertValid` (existing `srv/api/wrap` pattern — confirm import path used by neighboring user routes). +- Produces: route `POST /user/promo/redeem` body `{ code: string }` → `{ user }`. + +- [ ] **Step 1: Inspect the existing user router pattern** + +Read `srv/api/user/index.ts` and one sibling handler (e.g. `srv/api/user/patreon.ts`) to copy the exact `handle`/`assertValid`/`loggedIn` usage and import paths. + +- [ ] **Step 2: Create the handler `srv/api/user/promo.ts`** + +```ts +import { assertValid } from '/common/valid' +import { handle } from '../wrap' +import { promo } from '../../db' + +export const redeemPromoCode = handle(async ({ userId, body }) => { + assertValid({ code: 'string' }, body) + const result = await promo.redeemPromo(userId!, body.code) + return { user: result.user, credits: result.credits, days: result.days } +}) +``` + +(Adjust the `assertValid` import and `promo` import to match what Task 2 Step 6 produced and what neighboring user handlers use — e.g. `import { store } from '../../db'` then `store.promo.redeemPromo`.) + +- [ ] **Step 3: Register the route** + +In `srv/api/user/index.ts`, import `redeemPromoCode` and add alongside the other authenticated user routes: + +```ts +router.post('/promo/redeem', loggedIn, redeemPromoCode) +``` + +(Match the existing auth-middleware style in that file — some routers apply `loggedIn` once at the top.) + +- [ ] **Step 4: srv typecheck** + +Run: `cd /home/dlite/charluv && NODE_OPTIONS=--max-old-space-size=6144 npx tsc -p srv.tsconfig.json --noEmit` +Expected: PASS. + +- [ ] **Step 5: Commit** + +```bash +git add srv/api/user/promo.ts srv/api/user/index.ts +git commit -m "feat(promo): add POST /user/promo/redeem route + +Co-Authored-By: Claude Opus 4.8 +Claude-Session: https://claude.ai/code/session_01XXNb2Kcdayr1ZvUpy5a3nA" +``` + +--- + +### Task 4: Admin promo routes + +**Files:** +- Create: `srv/api/promo.ts` +- Modify: `srv/api/index.ts` (import + `router.use('/admin', promo)`) + +**Interfaces:** +- Consumes: `getPromos`, `createPromo`, `updatePromo`, `deletePromo` (Task 2); `isAdmin`, `handle`, `assertValid` (existing patterns from `srv/api/admin.ts` / `srv/api/billing/index.ts`). +- Produces: routes `GET /admin/promo`, `POST /admin/promo`, `POST /admin/promo/:id`, `DELETE /admin/promo/:id`. + +- [ ] **Step 1: Inspect admin route patterns** + +Read `srv/api/admin.ts` (or `srv/api/billing/index.ts`) for the `Router()` + `isAdmin` + `handle` + `assertValid` usage and import paths to mirror exactly. + +- [ ] **Step 2: Create `srv/api/promo.ts`** + +```ts +import { Router } from 'express' +import { assertValid } from '/common/valid' +import { handle, StatusError } from './wrap' +import { isAdmin } from './auth' +import { promo } from '../db' + +const list = handle(async () => { + const codes = await promo.getPromos() + return { codes } +}) + +const create = handle(async ({ userId, body }) => { + assertValid( + { + code: 'string', + credits: 'number?', + days: 'number?', + maxUses: 'number', + enabled: 'boolean', + expiresAt: 'string?', + }, + body + ) + const code = await promo.createPromo({ + code: body.code, + credits: body.credits, + days: body.days, + maxUses: body.maxUses, + enabled: body.enabled, + expiresAt: body.expiresAt, + createdBy: userId!, + }) + return { code } +}) + +const update = handle(async ({ params, body }) => { + if (!params.id) throw new StatusError('Missing id', 400) + assertValid( + { + code: 'string?', + credits: 'number?', + days: 'number?', + maxUses: 'number?', + enabled: 'boolean?', + expiresAt: 'string?', + }, + body + ) + const code = await promo.updatePromo(params.id, body) + return { code } +}) + +const remove = handle(async ({ params }) => { + if (!params.id) throw new StatusError('Missing id', 400) + await promo.deletePromo(params.id) + return { success: true } +}) + +const router = Router() +router.get('/promo', isAdmin, list) +router.post('/promo', isAdmin, create) +router.post('/promo/:id', isAdmin, update) +router.delete('/promo/:id', isAdmin, remove) + +export default router +``` + +(Adjust `promo` import + `assertValid`/`isAdmin`/`handle` import paths to match Task 2's export shape and neighboring admin files.) + +- [ ] **Step 3: Mount the router** + +In `srv/api/index.ts`, add the import (with the others, ~line 6) and mount near the other admin routers (~line 35-36): + +```ts +import promo from './promo' +// ... +router.use('/admin', promo) +``` + +- [ ] **Step 4: srv typecheck** + +Run: `cd /home/dlite/charluv && NODE_OPTIONS=--max-old-space-size=6144 npx tsc -p srv.tsconfig.json --noEmit` +Expected: PASS. + +- [ ] **Step 5: Commit** + +```bash +git add srv/api/promo.ts srv/api/index.ts +git commit -m "feat(promo): add admin promo CRUD routes + +Co-Authored-By: Claude Opus 4.8 +Claude-Session: https://claude.ai/code/session_01XXNb2Kcdayr1ZvUpy5a3nA" +``` + +--- + +### Task 5: User store — `redeemPromo` action + +**Files:** +- Modify: `web/store/user.ts` (add action near `getTiers`/`retrieveSubscription`) + +**Interfaces:** +- Consumes: `api` (`web/store/api`), `toastStore`, route `POST /user/promo/redeem` (Task 3). +- Produces: `userStore.redeemPromo(code: string)` — updates `user` in state on success. + +- [ ] **Step 1: Add the action** + +In `web/store/user.ts`, inside the store action object (alongside `getTiers`), add. Match the existing async-generator-vs-plain-async style used by neighbors (`retrieveSubscription` is a generator; use the same form): + +```ts + async *redeemPromo({ subLoading }, code: string) { + if (!code.trim()) { + toastStore.error('Please enter a code') + return + } + const res = await api.post('/user/promo/redeem', { code: code.trim() }) + if (res.error) { + toastStore.error(res.error) + return + } + if (res.result) { + const parts: string[] = [] + if (res.result.credits) parts.push(`${res.result.credits} credits`) + if (res.result.days) parts.push(`${res.result.days} premium days`) + toastStore.success(`Redeemed! You received ${parts.join(' and ')}.`) + yield { user: res.result.user } + } + }, +``` + +- [ ] **Step 2: Quick web typecheck** + +Run: `cd /home/dlite/charluv && pnpm typecheck` +Expected: PASS. + +- [ ] **Step 3: Commit** + +```bash +git add web/store/user.ts +git commit -m "feat(promo): add redeemPromo user-store action + +Co-Authored-By: Claude Opus 4.8 +Claude-Session: https://claude.ai/code/session_01XXNb2Kcdayr1ZvUpy5a3nA" +``` + +--- + +### Task 6: Subscription page — redeem card + cleanup + +**Files:** +- Modify: `web/pages/Profile/SubscriptionPage.tsx` + +**Interfaces:** +- Consumes: `userStore.redeemPromo` (Task 5), existing `TextInput`, `Button`, `SolidCard`. + +- [ ] **Step 1: Add the redeem-code card + local signal** + +Add an import for `TextInput` (`/web/shared/TextInput`) if not present. Add a signal near the other signals (~line 29): + +```tsx + const [promoCode, setPromoCode] = createSignal('') +``` + +Add this card inside the centered column, right under the "Why subscribe?" `SolidCard` (~after line 111): + +```tsx + +

Redeem a promo code

+

+ Have a promo code? Enter it below to claim credits or premium membership days. +

+
+ setPromoCode(ev.currentTarget.value)} + class="flex-1" + /> + +
+
+``` + +- [ ] **Step 2: Remove the Stripe Upgrade/Downgrade buttons** + +In the `` tier-card `` (~line 212-272), delete these three `` blocks: the `Upgrade` block (`user.sub?.type === 'native' && cfg.tier && cfg.level < each.level`, ~223-233), the `Downgrading...` block (~235-249), and the `Downgrade` block (`user.sub?.type === 'native' && user.sub.level > each.level`, ~251-259). Keep the `!isLoggedIn()` login match, the `Subscribed!` match, and the final `Subscribe via Patreon` match. + +- [ ] **Step 3: Remove the upgrade/downgrade modals + signals** + +Delete the `showUpgrade`/`setUpgrade` and `showDowngrade`/`setDowngrade` signals (~line 30-31) and their two `` blocks at the bottom (~line 304-329). Delete the now-unused `cfg.downgrade` references in the "Current Subscription" `` (the `cfg.downgrade && cfg.tier!._id !== cfg.downgrade` match, ~148-157) and remove `downgrade: s.subStatus?.downgrading?.tierId` from the `cfg` memo (~line 24) if nothing else uses it. + +- [ ] **Step 4: Remove the Unsubscribe button + modal** + +Delete the `showUnsub`/`setUnsub` signal (~line 29), the Unsubscribe `Button` + wrapping `` (~line 287-291), and the unsubscribe `` (~line 297-302). Remove the now-unused `hasExpired` memo if nothing else references it. + +- [ ] **Step 5: Remove Stripe/EUR/legacy copy** + +- In the "Subscribed via" pill (~line 131-142): remove the `'native' ? 'Stripe'` branch; the pill should read from Gift/Patreon/Paypal only. +- Delete the PayPal `` line about "use Stripe or Patreon if you want auto-renew" (~144-147) — replace with a neutral "Your PayPal membership does not auto-renew" or remove. +- Delete "All prices are in EUR" (~line 280) and "Patreon price shown is excl. VAT." (~line 294). + +- [ ] **Step 6: Syntax-check the component** + +Vite (not tsc) bundles web. Verify with a transpile check: +Run: `cd /home/dlite/charluv && node -e "const ts=require('typescript');const fs=require('fs');ts.transpileModule(fs.readFileSync('web/pages/Profile/SubscriptionPage.tsx','utf8'),{compilerOptions:{jsx:'preserve',target:'esnext'}});console.log('ok')"` +Expected: prints `ok` (no throw). Then `pnpm typecheck` for unused-var fallout: +Run: `cd /home/dlite/charluv && pnpm typecheck` +Expected: PASS — fix any "declared but never used" errors from removed signals/memos. + +- [ ] **Step 7: Commit** + +```bash +git add web/pages/Profile/SubscriptionPage.tsx +git commit -m "feat(promo): add redeem card and remove Stripe/legacy UI from subscription page + +Co-Authored-By: Claude Opus 4.8 +Claude-Session: https://claude.ai/code/session_01XXNb2Kcdayr1ZvUpy5a3nA" +``` + +--- + +### Task 7: Admin store — promo actions + +**Files:** +- Modify: `web/store/admin.ts` (add `promos` to state + 4 actions) + +**Interfaces:** +- Consumes: `api`, `toastStore`, `AppSchema.PromoCode`, routes from Task 4. +- Produces: `adminStore.getPromos()`, `adminStore.createPromo(input, onSuccess?)`, `adminStore.updatePromo(id, patch, onSuccess?)`, `adminStore.deletePromo(id, onSuccess?)`; `promos: AppSchema.PromoCode[]` in state. + +- [ ] **Step 1: Add `promos` to `AdminState` + initial value** + +In `web/store/admin.ts`, add to the `AdminState` type: + +```ts + promos: AppSchema.PromoCode[] +``` + +and to the `createStore('admin', { ... })` initial object: + +```ts + promos: [], +``` + +- [ ] **Step 2: Add the actions** + +Inside the returned actions object: + +```ts + async getPromos() { + const res = await api.get('/admin/promo') + if (res.result) return { promos: res.result.codes } + if (res.error) toastStore.error(`Failed to load promo codes: ${res.error}`) + }, + async createPromo(_, input: Partial, onSuccess?: () => void) { + const res = await api.post('/admin/promo', input) + if (res.error) return toastStore.error(`Failed to create code: ${res.error}`) + if (res.result) { + toastStore.success('Promo code created') + adminStore.getPromos() + onSuccess?.() + } + }, + async updatePromo(_, id: string, patch: Partial, onSuccess?: () => void) { + const res = await api.post(`/admin/promo/${id}`, patch) + if (res.error) return toastStore.error(`Failed to update code: ${res.error}`) + if (res.result) { + toastStore.success('Promo code updated') + adminStore.getPromos() + onSuccess?.() + } + }, + async deletePromo(_, id: string, onSuccess?: () => void) { + const res = await api.method('delete', `/admin/promo/${id}`) + if (res.error) return toastStore.error(`Failed to delete code: ${res.error}`) + if (res.result) { + toastStore.success('Promo code deleted') + adminStore.getPromos() + onSuccess?.() + } + }, +``` + +(Confirm the delete helper: check `web/store/api.ts` for the DELETE method name — it may be `api.del(...)` rather than `api.method('delete', ...)`. Use whatever the codebase already uses.) + +- [ ] **Step 3: Web typecheck** + +Run: `cd /home/dlite/charluv && pnpm typecheck` +Expected: PASS. + +- [ ] **Step 4: Commit** + +```bash +git add web/store/admin.ts +git commit -m "feat(promo): add admin-store promo actions + +Co-Authored-By: Claude Opus 4.8 +Claude-Session: https://claude.ai/code/session_01XXNb2Kcdayr1ZvUpy5a3nA" +``` + +--- + +### Task 8: Admin Promo Codes page + nav + route + +**Files:** +- Create: `web/pages/Admin/PromoCodes.tsx` +- Modify: `web/App.tsx` (route), `web/Navigation.tsx` (SubItem) + +**Interfaces:** +- Consumes: `adminStore` promo actions/state (Task 7), shared `Button`, `TextInput`, `Toggle`/checkbox, `SolidCard`, `Modal`/`ConfirmModal`. + +- [ ] **Step 1: Inspect a sibling admin page** + +Read `web/pages/Admin/Announcements.tsx` for the page scaffold (title, list rendering, create/edit form, store usage, `onMount` load) and mirror it. + +- [ ] **Step 2: Create `web/pages/Admin/PromoCodes.tsx`** + +Build a page that: +- `onMount(() => adminStore.getPromos())` +- lists `admin.promos` showing `code`, `credits`, `days`, `uses`/`maxUses` (show `∞` when `maxUses===0`), `enabled`, `expiresAt`. +- has a create form (inputs: code text, credits number, days number, maxUses number, enabled toggle, expiresAt datetime-local) calling `adminStore.createPromo`. +- each row: edit (inline or modal → `adminStore.updatePromo`) and delete (`ConfirmModal` → `adminStore.deletePromo`). +- a "Generate" button next to the code field that fills a random A–Z0–9 string (e.g. 8 chars) — purely a convenience; admin can edit. + +Use the exact shared-component import paths and prop conventions found in `Announcements.tsx`. Use `setComponentPageTitle('Promo Codes')` as siblings do. + +- [ ] **Step 3: Add the route** + +In `web/App.tsx`, near the other admin routes (~line 117-143): + +```tsx + import('./pages/Admin/PromoCodes'))} /> +``` + +(Ensure the page's default export matches the lazy import — `export default` the component.) + +- [ ] **Step 4: Add the nav link** + +In `web/Navigation.tsx`, under the admin group near the other `SubItem`s (~line 307-311): + +```tsx + + Promo Codes + +``` + +- [ ] **Step 5: Syntax + typecheck** + +Run: `cd /home/dlite/charluv && node -e "const ts=require('typescript');const fs=require('fs');ts.transpileModule(fs.readFileSync('web/pages/Admin/PromoCodes.tsx','utf8'),{compilerOptions:{jsx:'preserve',target:'esnext'}});console.log('ok')"` +Expected: `ok`. +Run: `cd /home/dlite/charluv && pnpm typecheck` +Expected: PASS. + +- [ ] **Step 6: Commit** + +```bash +git add web/pages/Admin/PromoCodes.tsx web/App.tsx web/Navigation.tsx +git commit -m "feat(promo): add admin Promo Codes page, route and nav link + +Co-Authored-By: Claude Opus 4.8 +Claude-Session: https://claude.ai/code/session_01XXNb2Kcdayr1ZvUpy5a3nA" +``` + +--- + +### Task 9: Full verification + push + +**Files:** none (verification only) + +- [ ] **Step 1: Full checks** + +Run: `cd /home/dlite/charluv && pnpm checks` +Expected: format + typecheck + test all PASS. + +- [ ] **Step 2: srv typecheck** + +Run: `cd /home/dlite/charluv && NODE_OPTIONS=--max-old-space-size=6144 npx tsc -p srv.tsconfig.json --noEmit` +Expected: PASS. + +- [ ] **Step 3: Manual smoke (optional, if a dev server is run)** + +Use the `/run` or `/verify` skill to: create a code in admin, redeem it as a user (credits + days update), confirm a second redeem is rejected, confirm an exhausted/expired/disabled code is rejected. + +- [ ] **Step 4: Push** + +```bash +cd /home/dlite/charluv && git push origin feat/charluv-rewrite +``` + +--- + +## Self-Review + +**Spec coverage:** +- Cleanup (Stripe upgrade/downgrade UI, Stripe/legacy labels & shop text, Unsubscribe) → Task 6. ✓ +- Promo code grants credits and/or days → Tasks 1 (schema), 2 (`redeemPromo` grant logic). ✓ +- One per account → Task 1 unique `{codeId,userId}` index + Task 2 insert-with-rollback. ✓ +- Expirable → `expiresAt` field (Task 1) + check in `redeemPromo` (Task 2). ✓ +- Max X uses → `maxUses`/`uses` + conditional `$inc` guard (Task 2). ✓ +- Admin management → Tasks 4 (routes), 7 (store), 8 (page/nav). ✓ +- Admin types the code + generate button → Task 8 Step 2. ✓ +- Redeem on Subscription page only → Task 6. ✓ +- Tests → Task 2 (helper + integration), Task 9 (full run). ✓ + +**Placeholder scan:** Integration test bodies in Task 2 Step 5 are described as contracts rather than full code because they depend on the repo's existing DB test harness (unknown shape until inspected); the step instructs copying the harness from an existing spec. The helper test (Step 1) is complete runnable code. This is the one intentional non-literal, justified by harness uncertainty. No other TBD/TODO. + +**Type consistency:** `redeemPromo` returns `{ user, credits, days }` — consumed consistently in Task 3 (route returns `{ user, credits, days }`) and Task 5 (`res.result.user/credits/days`). `extendPremium(premiumUntil, days, nowMs)` signature consistent between Task 2 impl and test. `PromoCode`/`PromoRedemption` field names consistent across Tasks 1, 2, 4, 7, 8. + +## Open implementation-time confirmations (inspect, don't guess) + +- `srv/db/index.ts` export shape (`export * as promo` vs aggregate `store` object) — Task 2 Step 6. +- `assertValid` import path + `'number?'`/`'boolean?'` optional-field syntax — confirm against `common/valid` usage in a sibling route. +- DELETE helper name in `web/store/api.ts` (`api.del` vs `api.method('delete', …)`) — Task 7 Step 2. +- mongodb driver `findOneAndUpdate` return shape (`.value` vs raw doc) — Task 2 handles both defensively. +- Presence/shape of a DB test harness in `tests/` — Task 2 Step 5. diff --git a/docs/superpowers/plans/2026-06-26-inference-queue.md b/docs/superpowers/plans/2026-06-26-inference-queue.md new file mode 100644 index 00000000..acd56d43 --- /dev/null +++ b/docs/superpowers/plans/2026-06-26-inference-queue.md @@ -0,0 +1,1411 @@ +# Inference Concurrency Queue Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Add an app-side priority queue that caps total outbound inference concurrency (text+image combined ≤ 10, image ≤ 4), serves premium members first, and pauses text admission when vLLM's internal queue backs up. + +**Architecture:** One `PriorityGate` with a pluggable backend. A pure scheduling core (counts + eligibility predicate + priority selection) is shared by an in-process backend (single-node / dev) and a Redis backend (multi-process, the production DGX runs several app processes). The gate wraps the existing inference streams (`createInferenceStream`, `createChatStream`) and the image entry (`generateImage`). A poller scrapes vLLM `/metrics` to drive a text circuit breaker. + +**Tech Stack:** TypeScript, Node, Express, `redis` v4 (already a dep, used by `srv/api/ws/bus.ts`), `needle` (HTTP, already used), Mocha + Chai (tests), SolidJS (web client badge). + +## Global Constraints + +- **Use `pnpm`, never `npm`.** +- **No data migration / no new persistent collections.** Queue state is ephemeral Redis or in-memory only. +- **Caps are config-driven:** `INFERENCE_GLOBAL_CONCURRENCY` default `10`, `IMAGE_CONCURRENCY` default `4`, `TEXT_HARD_CAP` default `16` (non-binding safety rail). +- **Premium = priority in the queue, NOT a higher cap.** Priority order: `0` premium, `1` free signed-in, `2` guest, `3` background/utility. Lower served first; FIFO by enqueue time within a tier. +- **The queue never rejects.** At cap, requests wait. (The only admission control is the cap itself.) +- **Breaker fails open:** if vLLM metrics are stale/unreachable, admit text normally. +- **Spec:** `docs/superpowers/specs/2026-06-26-inference-queue-design.md`. +- **Test build flow:** sources are `.spec.ts`; `srv.tsconfig.json` already `include`s `tests`. Compile before running Mocha. Each test step assumes `tsc -p srv.tsconfig.json` (or the `pnpm build:watch` watcher) has emitted the matching `.spec.js`. Per-step command shown as `pnpm exec tsc -p srv.tsconfig.json && pnpm exec mocha --exit "tests/.spec.js"`. +- **Web syntax check:** `pnpm typecheck` (web `tsc --noEmit`). Final gate: `pnpm checks`. + +--- + +## File Structure + +- `srv/queue/types.ts` — shared types + pure scheduling helpers (`waiterScore`, `isEligible`, `selectNext`). No I/O. +- `srv/queue/local.ts` — in-process `GateBackend` (deterministic; carries the bulk of unit coverage). +- `srv/queue/metrics.ts` — Prometheus parse + `Breaker` + poller. +- `srv/queue/gate.ts` — `PriorityGate` facade (`run`, `gateStream`) + `priorityForUser`. +- `srv/queue/redis.ts` — Redis `GateBackend` (Lua acquire/release/heartbeat, pub/sub wakeups, heartbeat interval). +- `srv/queue/index.ts` — constructs the singleton `inferenceGate` (backend by config) + starts the metrics poller. +- `srv/config.ts` — new `config.queue` block (modify). +- `srv/adapter/generate.ts` — wrap `createInferenceStream` + `createChatStream`; add `queuePriority` (modify). +- `srv/image/index.ts` — wrap the image handler call (modify). +- `web/store/message.ts` — handle `queue-position` socket event (modify). +- `web/.../` — render "Queued #N" badge (modify). +- Tests: `tests/queue-core.spec.ts`, `tests/queue-local.spec.ts`, `tests/queue-metrics.spec.ts`, `tests/queue-gate.spec.ts`, `tests/queue-redis.spec.ts`. + +--- + +## Task 1: Scheduling core + config + +**Files:** +- Create: `srv/queue/types.ts` +- Modify: `srv/config.ts` (add `queue` block near the `inference` block ~line 143) +- Test: `tests/queue-core.spec.ts` + +**Interfaces:** +- Produces: + - `type Kind = 'text' | 'image'` + - `type Priority = 0 | 1 | 2 | 3` + - `type Caps = { global: number; image: number }` + - `type Counts = { inflight: number; image: number }` + - `type Waiter = { id: string; kind: Kind; priority: Priority; enqueuedAt: number }` + - `function waiterScore(priority: number, enqueuedAt: number): number` + - `function isEligible(kind: Kind, counts: Counts, caps: Caps, pauseText: boolean): boolean` + - `function selectNext(waiters: Waiter[], counts: Counts, caps: Caps, pauseText: boolean): Waiter | undefined` + - `config.queue: { global: number; image: number; textHardCap: number; metricsUrl: string; waitingThreshold: number; pollMs: number }` + +- [ ] **Step 1: Write the failing test** + +```ts +// tests/queue-core.spec.ts +import { expect } from 'chai' +import { waiterScore, isEligible, selectNext, Waiter } from '/srv/queue/types' + +const caps = { global: 10, image: 4 } + +describe('queue scheduling core', () => { + it('score makes lower priority number win, then earlier time', () => { + expect(waiterScore(0, 100)).to.be.lessThan(waiterScore(1, 1)) + expect(waiterScore(1, 5)).to.be.lessThan(waiterScore(1, 9)) + }) + + it('text ineligible at global cap', () => { + expect(isEligible('text', { inflight: 10, image: 0 }, caps, false)).to.equal(false) + expect(isEligible('text', { inflight: 9, image: 0 }, caps, false)).to.equal(true) + }) + + it('text ineligible when breaker pauses text, image unaffected', () => { + expect(isEligible('text', { inflight: 0, image: 0 }, caps, true)).to.equal(false) + expect(isEligible('image', { inflight: 0, image: 0 }, caps, true)).to.equal(true) + }) + + it('image gated by image sub-cap even with global room', () => { + expect(isEligible('image', { inflight: 5, image: 4 }, caps, false)).to.equal(false) + expect(isEligible('image', { inflight: 5, image: 3 }, caps, false)).to.equal(true) + }) + + it('selectNext returns highest-priority eligible, skipping blocked kinds', () => { + const waiters: Waiter[] = [ + { id: 'img', kind: 'image', priority: 0, enqueuedAt: 1 }, // premium image, but image full + { id: 'txt', kind: 'text', priority: 1, enqueuedAt: 2 }, // free text, eligible + ] + const next = selectNext(waiters, { inflight: 5, image: 4 }, caps, false) + expect(next?.id).to.equal('txt') + }) + + it('selectNext returns undefined when nothing eligible', () => { + const waiters: Waiter[] = [{ id: 'a', kind: 'text', priority: 0, enqueuedAt: 1 }] + expect(selectNext(waiters, { inflight: 10, image: 0 }, caps, false)).to.equal(undefined) + }) +}) +``` + +- [ ] **Step 2: Run test to verify it fails** + +Run: `pnpm exec tsc -p srv.tsconfig.json && pnpm exec mocha --exit "tests/queue-core.spec.js"` +Expected: FAIL — cannot find module `/srv/queue/types`. + +- [ ] **Step 3: Create `srv/queue/types.ts`** + +```ts +export type Kind = 'text' | 'image' +export type Priority = 0 | 1 | 2 | 3 +export type Caps = { global: number; image: number } +export type Counts = { inflight: number; image: number } + +export type Waiter = { + id: string + kind: Kind + priority: Priority + enqueuedAt: number +} + +/** Lower result = served sooner. Priority dominates; enqueue time is the tiebreak. */ +export function waiterScore(priority: number, enqueuedAt: number): number { + return priority * 1e13 + enqueuedAt +} + +/** Can a waiter of `kind` be admitted right now? `pauseText` = breaker tripped. */ +export function isEligible(kind: Kind, counts: Counts, caps: Caps, pauseText: boolean): boolean { + if (counts.inflight >= caps.global) return false + if (kind === 'image') return counts.image < caps.image + return !pauseText +} + +/** Highest-priority waiter whose predicate currently passes (eligibility-aware, not strict positional FIFO). */ +export function selectNext( + waiters: Waiter[], + counts: Counts, + caps: Caps, + pauseText: boolean +): Waiter | undefined { + let best: Waiter | undefined + let bestScore = Infinity + for (const w of waiters) { + if (!isEligible(w.kind, counts, caps, pauseText)) continue + const s = waiterScore(w.priority, w.enqueuedAt) + if (s < bestScore) { + bestScore = s + best = w + } + } + return best +} +``` + +- [ ] **Step 4: Add the config block in `srv/config.ts`** + +Insert a sibling block after the `inference: { ... }` object (the block ending near line 174). Match the existing `env(...)` helper style: + +```ts + queue: { + global: +env('INFERENCE_GLOBAL_CONCURRENCY', '10'), + image: +env('IMAGE_CONCURRENCY', '4'), + textHardCap: +env('TEXT_HARD_CAP', '16'), + metricsUrl: env('VLLM_METRICS_URL', ''), + waitingThreshold: +env('VLLM_WAITING_THRESHOLD', '1'), + pollMs: +env('VLLM_METRICS_POLL_MS', '1500'), + }, +``` + +- [ ] **Step 5: Run tests to verify they pass** + +Run: `pnpm exec tsc -p srv.tsconfig.json && pnpm exec mocha --exit "tests/queue-core.spec.js"` +Expected: PASS (6 passing). + +- [ ] **Step 6: Commit** + +```bash +git add srv/queue/types.ts srv/config.ts tests/queue-core.spec.ts tests/queue-core.spec.js +git commit -m "feat(queue): scheduling core + config" +``` + +--- + +## Task 2: In-process backend + +**Files:** +- Create: `srv/queue/local.ts` +- Test: `tests/queue-local.spec.ts` + +**Interfaces:** +- Consumes: `Kind`, `Priority`, `Caps`, `Counts`, `Waiter`, `selectNext`, `waiterScore` from `/srv/queue/types`. +- Produces: + - `type AcquireReq = { id: string; kind: Kind; priority: Priority; enqueuedAt: number; onPosition?: (position: number) => void; signal?: AbortSignal }` + - `interface GateBackend { acquire(req: AcquireReq): Promise; release(id: string): Promise; setPauseText(pause: boolean): void }` + - `class LocalBackend implements GateBackend` — constructor `(caps: Caps)`. + +The `acquire` promise resolves when the request is admitted and rejects with `new Error('aborted')` if its `signal` aborts while waiting. `release(id)` frees a slot and schedules the next eligible waiter. `setPauseText` updates breaker state and reschedules. Position passed to `onPosition` is the 1-based rank of the waiter among all current waiters sorted by score (changes are pushed; admitted ⇒ no further calls). + +- [ ] **Step 1: Write the failing test** + +```ts +// tests/queue-local.spec.ts +import { expect } from 'chai' +import { LocalBackend } from '/srv/queue/local' + +const tick = () => new Promise((r) => setTimeout(r, 0)) + +describe('LocalBackend', () => { + it('admits up to the global cap, queues the rest', async () => { + const b = new LocalBackend({ global: 2, image: 4 }) + const admitted: string[] = [] + for (const id of ['a', 'b', 'c']) { + b.acquire({ id, kind: 'text', priority: 1, enqueuedAt: id.charCodeAt(0) }).then(() => + admitted.push(id) + ) + } + await tick() + expect(admitted).to.deep.equal(['a', 'b']) + await b.release('a') + await tick() + expect(admitted).to.deep.equal(['a', 'b', 'c']) + }) + + it('serves premium before free regardless of arrival order', async () => { + const b = new LocalBackend({ global: 1, image: 4 }) + const order: string[] = [] + b.acquire({ id: 'hold', kind: 'text', priority: 1, enqueuedAt: 1 }).then(() => order.push('hold')) + await tick() + b.acquire({ id: 'free', kind: 'text', priority: 1, enqueuedAt: 2 }).then(() => order.push('free')) + b.acquire({ id: 'prem', kind: 'text', priority: 0, enqueuedAt: 3 }).then(() => order.push('prem')) + await tick() + await b.release('hold') + await tick() + await b.release('prem') + await tick() + expect(order).to.deep.equal(['hold', 'prem', 'free']) + }) + + it('enforces the image sub-cap without blocking text', async () => { + const b = new LocalBackend({ global: 10, image: 1 }) + const admitted: string[] = [] + b.acquire({ id: 'i1', kind: 'image', priority: 1, enqueuedAt: 1 }).then(() => admitted.push('i1')) + b.acquire({ id: 'i2', kind: 'image', priority: 0, enqueuedAt: 2 }).then(() => admitted.push('i2')) + b.acquire({ id: 't1', kind: 'text', priority: 1, enqueuedAt: 3 }).then(() => admitted.push('t1')) + await tick() + // i1 takes the only image slot; i2 waits on sub-cap; t1 (text) is admitted past it + expect(admitted.sort()).to.deep.equal(['i1', 't1']) + }) + + it('pauses text but still admits image when breaker is on', async () => { + const b = new LocalBackend({ global: 10, image: 4 }) + b.setPauseText(true) + const admitted: string[] = [] + b.acquire({ id: 't', kind: 'text', priority: 0, enqueuedAt: 1 }).then(() => admitted.push('t')) + b.acquire({ id: 'i', kind: 'image', priority: 1, enqueuedAt: 2 }).then(() => admitted.push('i')) + await tick() + expect(admitted).to.deep.equal(['i']) + b.setPauseText(false) + await tick() + expect(admitted.sort()).to.deep.equal(['i', 't']) + }) + + it('reports position to waiters and rejects on abort', async () => { + const b = new LocalBackend({ global: 1, image: 4 }) + b.acquire({ id: 'hold', kind: 'text', priority: 1, enqueuedAt: 1 }) + const positions: number[] = [] + const ac = new AbortController() + const p = b.acquire({ + id: 'wait', + kind: 'text', + priority: 1, + enqueuedAt: 2, + onPosition: (n) => positions.push(n), + signal: ac.signal, + }) + await tick() + expect(positions[positions.length - 1]).to.equal(1) // 1 ahead of it + ac.abort() + let rejected = false + await p.catch(() => (rejected = true)) + expect(rejected).to.equal(true) + }) +}) +``` + +- [ ] **Step 2: Run test to verify it fails** + +Run: `pnpm exec tsc -p srv.tsconfig.json && pnpm exec mocha --exit "tests/queue-local.spec.js"` +Expected: FAIL — cannot find module `/srv/queue/local`. + +- [ ] **Step 3: Create `srv/queue/local.ts`** + +```ts +import { Caps, Counts, Kind, Priority, Waiter, selectNext, waiterScore } from './types' + +export type AcquireReq = { + id: string + kind: Kind + priority: Priority + enqueuedAt: number + onPosition?: (position: number) => void + signal?: AbortSignal +} + +export interface GateBackend { + acquire(req: AcquireReq): Promise + release(id: string): Promise + setPauseText(pause: boolean): void +} + +type Pending = { + waiter: Waiter + resolve: () => void + reject: (err: Error) => void + onPosition?: (position: number) => void + lastPosition: number + onAbort?: () => void + signal?: AbortSignal +} + +export class LocalBackend implements GateBackend { + private counts: Counts = { inflight: 0, image: 0 } + private pauseText = false + private waiting: Pending[] = [] + private admitted = new Map() + + constructor(private caps: Caps) {} + + acquire(req: AcquireReq): Promise { + return new Promise((resolve, reject) => { + const pending: Pending = { + waiter: { id: req.id, kind: req.kind, priority: req.priority, enqueuedAt: req.enqueuedAt }, + resolve, + reject, + onPosition: req.onPosition, + lastPosition: -1, + signal: req.signal, + } + if (req.signal) { + if (req.signal.aborted) return reject(new Error('aborted')) + pending.onAbort = () => this.abort(req.id) + req.signal.addEventListener('abort', pending.onAbort) + } + this.waiting.push(pending) + this.schedule() + }) + } + + async release(id: string): Promise { + const kind = this.admitted.get(id) + if (!kind) return + this.admitted.delete(id) + this.counts.inflight-- + if (kind === 'image') this.counts.image-- + this.schedule() + } + + setPauseText(pause: boolean): void { + this.pauseText = pause + this.schedule() + } + + private abort(id: string) { + const idx = this.waiting.findIndex((p) => p.waiter.id === id) + if (idx === -1) return + const [pending] = this.waiting.splice(idx, 1) + if (pending.onAbort && pending.signal) pending.signal.removeEventListener('abort', pending.onAbort) + pending.reject(new Error('aborted')) + this.schedule() + } + + private schedule() { + // Admit as many eligible waiters as capacity allows. + while (this.waiting.length) { + const waiters = this.waiting.map((p) => p.waiter) + const next = selectNext(waiters, this.counts, this.caps, this.pauseText) + if (!next) break + const idx = this.waiting.findIndex((p) => p.waiter.id === next.id) + const [pending] = this.waiting.splice(idx, 1) + if (pending.onAbort && pending.signal) { + pending.signal.removeEventListener('abort', pending.onAbort) + } + this.admitted.set(next.id, next.kind) + this.counts.inflight++ + if (next.kind === 'image') this.counts.image++ + pending.resolve() + } + this.publishPositions() + } + + private publishPositions() { + const sorted = [...this.waiting].sort( + (a, b) => + waiterScore(a.waiter.priority, a.waiter.enqueuedAt) - + waiterScore(b.waiter.priority, b.waiter.enqueuedAt) + ) + sorted.forEach((pending, i) => { + const position = i + 1 + if (pending.onPosition && pending.lastPosition !== position) { + pending.lastPosition = position + pending.onPosition(position) + } + }) + } +} +``` + +- [ ] **Step 4: Run tests to verify they pass** + +Run: `pnpm exec tsc -p srv.tsconfig.json && pnpm exec mocha --exit "tests/queue-local.spec.js"` +Expected: PASS (5 passing). + +- [ ] **Step 5: Commit** + +```bash +git add srv/queue/local.ts tests/queue-local.spec.ts tests/queue-local.spec.js +git commit -m "feat(queue): in-process backend" +``` + +--- + +## Task 3: vLLM metrics parser + breaker + +**Files:** +- Create: `srv/queue/metrics.ts` +- Test: `tests/queue-metrics.spec.ts` + +**Interfaces:** +- Produces: + - `function parsePrometheus(text: string): { running?: number; waiting?: number }` + - `class Breaker` — constructor `(threshold: number, staleMs: number)`; `update(waiting: number | undefined, now: number): void`; `pauseText(now: number): boolean`. + - `function startMetricsPoller(opts: { url: string; pollMs: number; breaker: Breaker; onUpdate: (pause: boolean) => void }): () => void` — returns a stop function. (Side-effecting; not unit-tested.) + +- [ ] **Step 1: Write the failing test** + +```ts +// tests/queue-metrics.spec.ts +import { expect } from 'chai' +import { parsePrometheus, Breaker } from '/srv/queue/metrics' + +const SAMPLE = `# HELP vllm:num_requests_running ... +# TYPE vllm:num_requests_running gauge +vllm:num_requests_running{model_name="x"} 7.0 +vllm:num_requests_waiting{model_name="x"} 3.0 +` + +describe('vLLM metrics', () => { + it('parses running and waiting gauges', () => { + expect(parsePrometheus(SAMPLE)).to.deep.equal({ running: 7, waiting: 3 }) + }) + + it('returns undefined for missing metrics', () => { + expect(parsePrometheus('nothing here')).to.deep.equal({ running: undefined, waiting: undefined }) + }) + + it('breaker pauses text only above threshold', () => { + const b = new Breaker(1, 10000) + b.update(2, 1000) + expect(b.pauseText(1000)).to.equal(true) + b.update(1, 2000) + expect(b.pauseText(2000)).to.equal(false) + }) + + it('breaker fails open when metrics are stale', () => { + const b = new Breaker(1, 5000) + b.update(5, 1000) + expect(b.pauseText(1000)).to.equal(true) + expect(b.pauseText(7000)).to.equal(false) // 6s since last scrape > 5s stale window + }) +}) +``` + +- [ ] **Step 2: Run test to verify it fails** + +Run: `pnpm exec tsc -p srv.tsconfig.json && pnpm exec mocha --exit "tests/queue-metrics.spec.js"` +Expected: FAIL — cannot find module `/srv/queue/metrics`. + +- [ ] **Step 3: Create `srv/queue/metrics.ts`** + +```ts +import needle from 'needle' +import { logger } from '../middleware' + +function matchMetric(text: string, name: string): number | undefined { + const escaped = name.replace(/[:]/g, '\\:') + const re = new RegExp(`^${escaped}(?:\\{[^}]*\\})?\\s+([0-9.eE+-]+)`, 'm') + const m = re.exec(text) + return m ? Number(m[1]) : undefined +} + +export function parsePrometheus(text: string): { running?: number; waiting?: number } { + return { + running: matchMetric(text, 'vllm:num_requests_running'), + waiting: matchMetric(text, 'vllm:num_requests_waiting'), + } +} + +export class Breaker { + private waiting = 0 + private lastOk = 0 + + constructor(private threshold: number, private staleMs: number) {} + + update(waiting: number | undefined, now: number) { + if (waiting === undefined) return + this.waiting = waiting + this.lastOk = now + } + + /** True ⇒ pause admitting new text. Fails open (false) when scrape is stale. */ + pauseText(now: number): boolean { + if (this.lastOk === 0) return false + if (now - this.lastOk > this.staleMs) return false + return this.waiting > this.threshold + } +} + +export function startMetricsPoller(opts: { + url: string + pollMs: number + breaker: Breaker + onUpdate: (pause: boolean) => void +}): () => void { + let stopped = false + const tick = async () => { + if (stopped) return + try { + const res = await needle('get', opts.url, { parse: false }) + const text = typeof res.body === 'string' ? res.body : res.body?.toString?.() || '' + const { waiting } = parsePrometheus(text) + opts.breaker.update(waiting, Date.now()) + } catch (err) { + logger.warn({ err }, 'vLLM metrics scrape failed') + } + opts.onUpdate(opts.breaker.pauseText(Date.now())) + } + const timer = setInterval(tick, opts.pollMs) + tick() + return () => { + stopped = true + clearInterval(timer) + } +} +``` + +- [ ] **Step 4: Run tests to verify they pass** + +Run: `pnpm exec tsc -p srv.tsconfig.json && pnpm exec mocha --exit "tests/queue-metrics.spec.js"` +Expected: PASS (4 passing). + +- [ ] **Step 5: Commit** + +```bash +git add srv/queue/metrics.ts tests/queue-metrics.spec.ts tests/queue-metrics.spec.js +git commit -m "feat(queue): vLLM metrics parser + circuit breaker" +``` + +--- + +## Task 4: PriorityGate facade + priority helper + +**Files:** +- Create: `srv/queue/gate.ts` +- Test: `tests/queue-gate.spec.ts` + +**Interfaces:** +- Consumes: `GateBackend`, `AcquireReq` from `/srv/queue/local`; `Kind`, `Priority` from `/srv/queue/types`; `getUserSubscriptionTier` from `/common/util`. +- Produces: + - `type GateOpts = { kind: Kind; priority: Priority; userId?: string; socketId?: string; requestId?: string }` + - `type PositionEvent = { type: 'queue-position'; kind: Kind; position: number; requestId?: string }` + - `type Sender = { toUser: (userId: string, ev: PositionEvent) => void; toGuest: (socketId: string, ev: PositionEvent) => void }` + - `class PriorityGate` — constructor `(backend: GateBackend, sender: Sender, now?: () => number)`; methods `run(opts, fn): Promise`, `gateStream(opts, makeGen): AsyncGenerator`, `setPauseText(pause: boolean): void`. + - `function priorityForUser(user: { _id: string } & any, isGuest: boolean, tiers: any[]): Priority` + +Note: `gateStream` acquires before pulling the first chunk and releases in `finally`. `run` acquires, runs `fn`, releases in `finally`. Both emit a `position: 0` clear event on admission. + +- [ ] **Step 1: Write the failing test** + +```ts +// tests/queue-gate.spec.ts +import { expect } from 'chai' +import { LocalBackend } from '/srv/queue/local' +import { PriorityGate, priorityForUser, PositionEvent } from '/srv/queue/gate' + +const tick = () => new Promise((r) => setTimeout(r, 0)) + +function makeGate(caps: { global: number; image: number }) { + const events: Array<{ to: string; ev: PositionEvent }> = [] + const gate = new PriorityGate(new LocalBackend(caps), { + toUser: (userId, ev) => events.push({ to: userId, ev }), + toGuest: (socketId, ev) => events.push({ to: socketId, ev }), + }) + return { gate, events } +} + +describe('PriorityGate', () => { + it('run holds a slot for the duration and releases it', async () => { + const { gate } = makeGate({ global: 1, image: 4 }) + let release!: () => void + const slow = new Promise((r) => (release = r)) + const first = gate.run({ kind: 'text', priority: 1, userId: 'u1' }, () => slow.then(() => 'a')) + await tick() + let secondDone = false + const second = gate + .run({ kind: 'text', priority: 1, userId: 'u2' }, async () => 'b') + .then((v) => { + secondDone = true + return v + }) + await tick() + expect(secondDone).to.equal(false) // blocked behind first + release() + expect(await first).to.equal('a') + expect(await second).to.equal('b') + }) + + it('gateStream does no work before a slot is acquired', async () => { + const { gate } = makeGate({ global: 1, image: 4 }) + const blocker = gate.run({ kind: 'text', priority: 1, userId: 'u0' }, () => new Promise(() => {})) + void blocker + await tick() + let started = false + async function* gen() { + started = true + yield 'x' + } + const stream = gate.gateStream({ kind: 'text', priority: 1, userId: 'u1' }, () => gen()) + const it = stream[Symbol.asyncIterator]() + const next = it.next() + await tick() + expect(started).to.equal(false) // still queued + void next + }) + + it('emits a position event to the waiting user and a clear on admit', async () => { + const { gate, events } = makeGate({ global: 1, image: 4 }) + let release!: () => void + const slow = new Promise((r) => (release = r)) + gate.run({ kind: 'text', priority: 1, userId: 'holder' }, () => slow) + await tick() + gate.run({ kind: 'text', priority: 1, userId: 'waiter', requestId: 'r1' }, async () => 'ok') + await tick() + expect(events.some((e) => e.to === 'waiter' && e.ev.position === 1)).to.equal(true) + release() + await tick() + expect(events.some((e) => e.to === 'waiter' && e.ev.position === 0)).to.equal(true) + }) + + it('priorityForUser: guest=2, free=1, premium=0', () => { + const tiers: any[] = [] + expect(priorityForUser({ _id: 'g' } as any, true, tiers)).to.equal(2) + // no active tier -> free + expect(priorityForUser({ _id: 'u' } as any, false, tiers)).to.equal(1) + }) +}) +``` + +- [ ] **Step 2: Run test to verify it fails** + +Run: `pnpm exec tsc -p srv.tsconfig.json && pnpm exec mocha --exit "tests/queue-gate.spec.js"` +Expected: FAIL — cannot find module `/srv/queue/gate`. + +- [ ] **Step 3: Create `srv/queue/gate.ts`** + +```ts +import { v4 as uuid } from 'uuid' +import { GateBackend } from './local' +import { Kind, Priority } from './types' +import { getUserSubscriptionTier } from '/common/util' +import { AppSchema } from '/common/types/schema' + +export type GateOpts = { + kind: Kind + priority: Priority + userId?: string + socketId?: string + requestId?: string +} + +export type PositionEvent = { + type: 'queue-position' + kind: Kind + position: number + requestId?: string +} + +export type Sender = { + toUser: (userId: string, ev: PositionEvent) => void + toGuest: (socketId: string, ev: PositionEvent) => void +} + +export class PriorityGate { + constructor( + private backend: GateBackend, + private sender: Sender, + private now: () => number = () => Date.now() + ) {} + + setPauseText(pause: boolean) { + this.backend.setPauseText(pause) + } + + async run(opts: GateOpts, fn: () => Promise): Promise { + const id = uuid() + await this.enter(id, opts) + try { + return await fn() + } finally { + await this.backend.release(id) + } + } + + async *gateStream(opts: GateOpts, makeGen: () => AsyncGenerator): AsyncGenerator { + const id = uuid() + await this.enter(id, opts) + try { + const gen = makeGen() + for await (const chunk of gen) { + yield chunk + } + } finally { + await this.backend.release(id) + } + } + + private async enter(id: string, opts: GateOpts) { + await this.backend.acquire({ + id, + kind: opts.kind, + priority: opts.priority, + enqueuedAt: this.now(), + onPosition: (position) => this.emit(opts, position), + }) + this.emit(opts, 0) // clear the badge on admission + } + + private emit(opts: GateOpts, position: number) { + const ev: PositionEvent = { + type: 'queue-position', + kind: opts.kind, + position, + requestId: opts.requestId, + } + if (opts.userId) this.sender.toUser(opts.userId, ev) + else if (opts.socketId) this.sender.toGuest(opts.socketId, ev) + } +} + +export function priorityForUser( + user: Pick, + isGuest: boolean, + tiers: AppSchema.SubscriptionTier[] +): Priority { + if (isGuest) return 2 + const sub = getUserSubscriptionTier(user, tiers) + return sub?.tier ? 0 : 1 +} +``` + +- [ ] **Step 4: Run tests to verify they pass** + +Run: `pnpm exec tsc -p srv.tsconfig.json && pnpm exec mocha --exit "tests/queue-gate.spec.js"` +Expected: PASS (4 passing). + +- [ ] **Step 5: Commit** + +```bash +git add srv/queue/gate.ts tests/queue-gate.spec.ts tests/queue-gate.spec.js +git commit -m "feat(queue): PriorityGate facade + priority mapping" +``` + +--- + +## Task 5: Redis backend + +**Files:** +- Create: `srv/queue/redis.ts` +- Test: `tests/queue-redis.spec.ts` + +**Interfaces:** +- Consumes: `GateBackend`, `AcquireReq` from `/srv/queue/local`; `Caps` from `/srv/queue/types`; the `redis` v4 client. +- Produces: + - `class RedisBackend implements GateBackend` — constructor `(opts: { caps: Caps; cmd: RedisCmd; sub: RedisSub; keyPrefix?: string; ttlMs?: number; heartbeatMs?: number })`. + - `type RedisCmd = { eval: (...) ...; publish: (...) ...; hSet/hGet ... }` — minimal interface satisfied by the `redis` v4 client (so tests can pass a real client). + - `type RedisSub = { subscribe: (channel: string, cb: (msg: string) => void) => Promise }`. + +Behavior: keys `{prefix}:active` (hash leaseId→`"{kind}:{expiry}"`), `{prefix}:wait` (ZSET), `{prefix}:meta` (hash, `pauseText` flag written by `setPauseText`). `acquire` runs the Lua `ACQUIRE` script in a loop, waking on the `{prefix}:free` pub/sub channel or a ~1s safety re-poll, emitting position via `onPosition`. On admit, starts a `setInterval` heartbeat (`HEARTBEAT` script) every `heartbeatMs`; `release` clears it, runs `RELEASE`, and publishes `free`. Abort (`signal`) removes the waiter / releases and publishes. + +**This test requires a running Redis.** It connects to `redis://127.0.0.1:6379`; if the connection fails the whole `describe` is skipped (so CI without Redis stays green). Uses a unique key prefix per run to isolate. + +- [ ] **Step 1: Write the failing test** + +```ts +// tests/queue-redis.spec.ts +import { expect } from 'chai' +import { createClient } from 'redis' +import { RedisBackend } from '/srv/queue/redis' + +const tick = (ms = 50) => new Promise((r) => setTimeout(r, ms)) + +describe('RedisBackend (requires local redis)', function () { + this.timeout(8000) + let cmd: any + let sub: any + let available = true + const prefix = 'test-gate-' + process.pid + '-' + Math.floor(Math.random() * 1e6) + + before(async () => { + try { + cmd = createClient({ url: 'redis://127.0.0.1:6379' }) + sub = cmd.duplicate() + await cmd.connect() + await sub.connect() + } catch { + available = false + } + }) + + after(async () => { + if (!available) return + const keys = await cmd.keys(prefix + ':*') + if (keys.length) await cmd.del(keys) + await cmd.quit() + await sub.quit() + }) + + it('caps combined inflight and serves premium first', async function () { + if (!available) this.skip() + const b = new RedisBackend({ caps: { global: 1, image: 4 }, cmd, sub, keyPrefix: prefix }) + const order: string[] = [] + await b.acquire({ id: 'hold', kind: 'text', priority: 1, enqueuedAt: 1 }).then(() => order.push('hold')) + b.acquire({ id: 'free', kind: 'text', priority: 1, enqueuedAt: 2 }).then(() => order.push('free')) + b.acquire({ id: 'prem', kind: 'text', priority: 0, enqueuedAt: 3 }).then(() => order.push('prem')) + await tick() + await b.release('hold') + await tick() + expect(order).to.deep.equal(['hold', 'prem']) + await b.release('prem') + await tick() + expect(order).to.deep.equal(['hold', 'prem', 'free']) + }) +}) +``` + +- [ ] **Step 2: Run test to verify it fails** + +Run: `pnpm exec tsc -p srv.tsconfig.json && pnpm exec mocha --exit "tests/queue-redis.spec.js"` +Expected: FAIL — cannot find module `/srv/queue/redis`. + +- [ ] **Step 3: Create `srv/queue/redis.ts`** + +```ts +import { AcquireReq, GateBackend } from './local' +import { Caps } from './types' + +export type RedisCmd = { + eval: (script: string, opts: { keys: string[]; arguments: string[] }) => Promise + publish: (channel: string, message: string) => Promise + hSet: (key: string, field: string, value: string) => Promise +} + +export type RedisSub = { + subscribe: (channel: string, listener: (message: string) => void) => Promise +} + +// KEYS: 1=active 2=wait 3=meta +// ARGV: 1=leaseId 2=kind 3=score 4=globalCap 5=imageCap 6=ttlMs 7=nowMs +const ACQUIRE = ` +local active, wait, meta = KEYS[1], KEYS[2], KEYS[3] +local id, kind, score = ARGV[1], ARGV[2], tonumber(ARGV[3]) +local gcap, icap = tonumber(ARGV[4]), tonumber(ARGV[5]) +local ttl, now = tonumber(ARGV[6]), tonumber(ARGV[7]) + +-- ensure we are registered as waiting (idempotent) +if redis.call('ZSCORE', wait, id) == false then + redis.call('ZADD', wait, score, id) +end + +-- reap expired leases +local all = redis.call('HGETALL', active) +local inflight, image = 0, 0 +for i = 1, #all, 2 do + local lid, val = all[i], all[i+1] + local sep = string.find(val, ':') + local lkind = string.sub(val, 1, sep-1) + local exp = tonumber(string.sub(val, sep+1)) + if exp < now then + redis.call('HDEL', active, lid) + else + inflight = inflight + 1 + if lkind == 'image' then image = image + 1 end + end +end + +local pause = redis.call('HGET', meta, 'pauseText') == '1' + +-- find highest-priority eligible waiter +local members = redis.call('ZRANGE', wait, 0, -1, 'WITHSCORES') +local chosen = nil +for i = 1, #members, 2 do + local mid = members[i] + -- we only know our own kind; eligibility for others is recomputed when they run. + -- Determine eligibility for THIS member only when it is us; otherwise use counts. + local eligible = false + if inflight < gcap then + if mid == id then + if kind == 'image' then eligible = (image < icap) else eligible = (not pause) end + else + -- unknown kind: treat as eligible by global room so true head-of-line is respected; + -- the member re-checks its own predicate on its own call. + eligible = true + end + end + if eligible then chosen = mid break end +end + +if chosen == id then + redis.call('ZREM', wait, id) + redis.call('HSET', active, id, kind .. ':' .. tostring(now + ttl)) + return {1, 0} +end + +local rank = redis.call('ZRANK', wait, id) +return {0, (rank or 0) + 1} +` + +// KEYS: 1=active ; ARGV: 1=leaseId +const RELEASE = `return redis.call('HDEL', KEYS[1], ARGV[1])` + +// KEYS: 1=active ; ARGV: 1=leaseId 2=kind 3=ttlMs 4=nowMs +const HEARTBEAT = ` +local cur = redis.call('HGET', KEYS[1], ARGV[1]) +if cur == false then return 0 end +redis.call('HSET', KEYS[1], ARGV[1], ARGV[2] .. ':' .. tostring(tonumber(ARGV[4]) + tonumber(ARGV[3]))) +return 1 +` + +export class RedisBackend implements GateBackend { + private caps: Caps + private cmd: RedisCmd + private sub: RedisSub + private prefix: string + private ttlMs: number + private heartbeatMs: number + private active = '·' + private wait = '·' + private meta = '·' + private freeChan = '·' + private heartbeats = new Map() + private wakeups = new Set<() => void>() + private subscribed = false + + constructor(opts: { + caps: Caps + cmd: RedisCmd + sub: RedisSub + keyPrefix?: string + ttlMs?: number + heartbeatMs?: number + }) { + this.caps = opts.caps + this.cmd = opts.cmd + this.sub = opts.sub + this.prefix = opts.keyPrefix || 'gate' + this.ttlMs = opts.ttlMs ?? 30000 + this.heartbeatMs = opts.heartbeatMs ?? 10000 + this.active = `${this.prefix}:active` + this.wait = `${this.prefix}:wait` + this.meta = `${this.prefix}:meta` + this.freeChan = `${this.prefix}:free` + } + + private async ensureSubscribed() { + if (this.subscribed) return + this.subscribed = true + await this.sub.subscribe(this.freeChan, () => { + for (const wake of this.wakeups) wake() + }) + } + + setPauseText(pause: boolean): void { + this.cmd.hSet(this.meta, 'pauseText', pause ? '1' : '0').catch(() => {}) + } + + async acquire(req: AcquireReq): Promise { + await this.ensureSubscribed() + const score = String(req.priority * 1e13 + req.enqueuedAt) + let lastPosition = -1 + + const tryAcquire = async (): Promise<{ ok: boolean; position: number }> => { + const [ok, position] = await this.cmd.eval(ACQUIRE, { + keys: [this.active, this.wait, this.meta], + arguments: [ + req.id, + req.kind, + score, + String(this.caps.global), + String(this.caps.image), + String(this.ttlMs), + String(Date.now()), + ], + }) + return { ok: ok === 1, position: Number(position) } + } + + while (true) { + if (req.signal?.aborted) { + await this.removeWaiter(req.id) + throw new Error('aborted') + } + const { ok, position } = await tryAcquire() + if (ok) { + this.startHeartbeat(req.id, req.kind) + return + } + if (req.onPosition && position !== lastPosition) { + lastPosition = position + req.onPosition(position) + } + await this.waitForWake(req.signal) + } + } + + private waitForWake(signal?: AbortSignal): Promise { + return new Promise((resolve) => { + const wake = () => { + cleanup() + resolve() + } + const timer = setTimeout(wake, 1000) // safety re-poll + const onAbort = () => wake() + const cleanup = () => { + clearTimeout(timer) + this.wakeups.delete(wake) + if (signal) signal.removeEventListener('abort', onAbort) + } + this.wakeups.add(wake) + if (signal) signal.addEventListener('abort', onAbort) + }) + } + + private startHeartbeat(id: string, kind: string) { + const timer = setInterval(() => { + this.cmd + .eval(HEARTBEAT, { + keys: [this.active], + arguments: [id, kind, String(this.ttlMs), String(Date.now())], + }) + .catch(() => {}) + }, this.heartbeatMs) + this.heartbeats.set(id, timer) + } + + private async removeWaiter(id: string) { + // ZREM via eval to avoid widening the RedisCmd interface + await this.cmd + .eval(`return redis.call('ZREM', KEYS[1], ARGV[1])`, { keys: [this.wait], arguments: [id] }) + .catch(() => {}) + await this.cmd.publish(this.freeChan, '1').catch(() => {}) + } + + async release(id: string): Promise { + const timer = this.heartbeats.get(id) + if (timer) { + clearInterval(timer) + this.heartbeats.delete(id) + } + await this.cmd.eval(RELEASE, { keys: [this.active], arguments: [id] }).catch(() => {}) + await this.cmd.publish(this.freeChan, '1').catch(() => {}) + } +} +``` + +- [ ] **Step 4: Run tests to verify they pass** + +Run: `pnpm exec tsc -p srv.tsconfig.json && pnpm exec mocha --exit "tests/queue-redis.spec.js"` +Expected: PASS (1 passing) with a local Redis running; otherwise PASS (0 passing, 1 pending) — the suite skips when Redis is unavailable. + +- [ ] **Step 5: Commit** + +```bash +git add srv/queue/redis.ts tests/queue-redis.spec.ts tests/queue-redis.spec.js +git commit -m "feat(queue): redis-backed distributed gate" +``` + +--- + +## Task 6: Singleton wiring + poller startup + +**Files:** +- Create: `srv/queue/index.ts` +- Modify: `srv/app.ts` (start the metrics poller after the message bus init) + +**Interfaces:** +- Consumes: `config.queue`; `clients` + `isConnected` from `srv/api/ws/bus.ts`; `sendOne`, `sendGuest` from `srv/api/ws`; `LocalBackend`, `RedisBackend`, `PriorityGate`, `Breaker`, `startMetricsPoller`. +- Produces: + - `const inferenceGate: PriorityGate` (singleton). + - `function startQueue(): () => void` — starts the metrics poller (if configured) wiring breaker → `inferenceGate.setPauseText`; returns a stop function. + +- [ ] **Step 1: Create `srv/queue/index.ts`** + +```ts +import { config } from '../config' +import { clients, isConnected } from '../api/ws/bus' +import { sendGuest, sendOne } from '../api/ws' +import { LocalBackend } from './local' +import { RedisBackend } from './redis' +import { PriorityGate, Sender } from './gate' +import { Breaker, startMetricsPoller } from './metrics' + +const caps = { global: config.queue.global, image: config.queue.image } + +const sender: Sender = { + toUser: (userId, ev) => sendOne(userId, ev), + toGuest: (socketId, ev) => sendGuest(socketId, ev), +} + +// Use the redis-backed gate when the message bus is connected (multi-process +// production); otherwise the in-process backend (single-node / dev). Mirrors the +// dual-mode in srv/api/ws/bus.ts. +function makeBackend() { + if (config.redis.host && isConnected()) { + return new RedisBackend({ caps, cmd: clients.pub as any, sub: clients.sub as any }) + } + return new LocalBackend(caps) +} + +export const inferenceGate = new PriorityGate(makeBackend(), sender) + +const breaker = new Breaker(config.queue.waitingThreshold, config.queue.pollMs * 4) + +export function startQueue(): () => void { + if (!config.queue.metricsUrl) return () => {} + return startMetricsPoller({ + url: config.queue.metricsUrl, + pollMs: config.queue.pollMs, + breaker, + onUpdate: (pause) => inferenceGate.setPauseText(pause), + }) +} + +export { PriorityGate } from './gate' +export { priorityForUser } from './gate' +``` + +> Note: `clients.sub` is also used by the bus for its own channels. Subscribing the gate's `:free` channel on the same connection is fine (a redis v4 subscriber can hold multiple channel subscriptions). If a conflict surfaces in practice, add a dedicated `clients.gateSub = clients.pub.duplicate()` in `bus.ts` and pass it here. + +- [ ] **Step 2: Start the poller in `srv/app.ts`** + +Find where `initMessageBus()` is awaited/called during startup and add, right after it: + +```ts +import { startQueue } from './queue' +// ...after initMessageBus()... +startQueue() +``` + +- [ ] **Step 3: Typecheck the server** + +Run: `NODE_OPTIONS=--max-old-space-size=6144 pnpm exec tsc -p srv.tsconfig.json --noEmit` +Expected: no errors. + +- [ ] **Step 4: Commit** + +```bash +git add srv/queue/index.ts srv/app.ts +git commit -m "feat(queue): singleton gate wiring + metrics poller startup" +``` + +--- + +## Task 7: Wrap the inference + image entry points + +**Files:** +- Modify: `srv/adapter/generate.ts` — `InferenceRequest` type (~line 60), `createInferenceStream` (~line 218), `createChatStream` (~line 299). +- Modify: `srv/image/index.ts` — `generateImage` image-handler block (~line 130-200). + +**Interfaces:** +- Consumes: `inferenceGate`, `priorityForUser` from `/srv/queue`; `getCachedTiers` from `/srv/db/subscriptions`. +- Produces: `InferenceRequest.queuePriority?: Priority` (background callers default to 3). + +- [ ] **Step 1: Add `queuePriority` to `InferenceRequest`** + +In `srv/adapter/generate.ts`, inside the `InferenceRequest` type, add: + +```ts + /** Queue priority: 0 premium, 1 free, 2 guest, 3 background. Defaults to 3 (utility). */ + queuePriority?: number +``` + +- [ ] **Step 2: Gate `createInferenceStream`** + +At the top of `srv/adapter/generate.ts` add imports: + +```ts +import { inferenceGate, priorityForUser } from '../queue' +import { getCachedTiers } from '../db/subscriptions' +``` + +In `createInferenceStream`, replace the final `return { stream, service: settings.service || '' }` with a gated stream: + +```ts + const gated = inferenceGate.gateStream( + { + kind: 'text', + priority: (opts.queuePriority ?? 3) as any, + userId: opts.guest ? undefined : opts.user?._id, + socketId: opts.guest, + requestId: opts.requestId, + }, + () => stream + ) + + return { stream: gated, service: settings.service || '' } +``` + +(`stream` is the async generator returned by `handler(...)`; it is lazy, so no inference work runs until `gateStream` pulls its first chunk after acquiring a slot.) + +- [ ] **Step 3: Gate `createChatStream`** + +In `createChatStream`, the function builds `const stream = handler({ ... })` then `return { stream, adapter, settings: gen, ... }`. Replace the returned `stream` with a gated wrapper. Just before the `return`: + +```ts + const priority = priorityForUser(opts.user as any, !!guestSocketId, getCachedTiers()) + const gatedStream = inferenceGate.gateStream( + { + kind: 'text', + priority, + userId: guestSocketId ? undefined : opts.user._id, + socketId: guestSocketId, + requestId: opts.requestId, + }, + () => stream + ) +``` + +Then change the returned object to use `stream: gatedStream`. + +- [ ] **Step 4: Gate `generateImage`** + +In `srv/image/index.ts` add imports: + +```ts +import { inferenceGate, priorityForUser } from '../queue' +import { getCachedTiers } from '../db/subscriptions' +``` + +Wrap the existing `try { ... image = await handle...() ... }` image-generation block so the `handle*Image` selection runs inside `inferenceGate.run`. Replace the body of the `try` that assigns `image` with: + +```ts + const priority = priorityForUser(user as any, !!guestId, getCachedTiers()) + image = await inferenceGate.run( + { + kind: 'image', + priority, + userId: guestId ? undefined : user._id, + socketId: guestId, + requestId: opts.requestId, + }, + async () => { + if (isZImageConfigured()) { + const isCharImage = opts.source === 'avatar' + const size = isCharImage + ? config.inference.imageSize || 640 + : config.inference.imageChatSize || 512 + const steps = isCharImage + ? config.inference.imageSteps || 14 + : config.inference.imageChatSteps || 20 + return handleZImage( + { + user, + prompt, + negative, + settings: imageSettings, + loraName: character?.loraName, + seed: opts.seed, + width: size, + height: size, + steps, + }, + log, + guestId + ) + } + switch (imageSettings?.type || 'horde') { + case 'novel': + return handleNovelImage({ user, prompt, negative, settings: imageSettings }, log, guestId) + case 'sd': + case 'agnai': + return handleSDImage({ user, prompt, negative, settings: imageSettings }, log, guestId) + case 'horde': + default: + return handleHordeImage({ user, prompt, negative, settings: imageSettings }, log, guestId) + } + } + ) +``` + +(Keep the surrounding `catch (ex)` and the existing post-processing of `image` unchanged.) + +- [ ] **Step 5: Typecheck the server** + +Run: `NODE_OPTIONS=--max-old-space-size=6144 pnpm exec tsc -p srv.tsconfig.json --noEmit` +Expected: no errors. + +- [ ] **Step 6: Run the full unit suite (no regressions)** + +Run: `pnpm exec tsc -p srv.tsconfig.json && pnpm test` +Expected: all existing specs + the new queue specs PASS (redis spec pending if no Redis). + +- [ ] **Step 7: Commit** + +```bash +git add srv/adapter/generate.ts srv/image/index.ts +git commit -m "feat(queue): gate text + image generation through the priority queue" +``` + +--- + +## Task 8: Client — show queue position + +**Files:** +- Modify: `web/store/message.ts` — handle the `queue-position` socket event. +- Modify: the pending-message / image-spinner view that reads `waiting` (locate via the `waiting` field set in `web/store/message.ts`). + +**Interfaces:** +- Consumes: socket event `{ type: 'queue-position', kind, position, requestId }` from the gate. +- Produces: a `queuePosition` value on the message store usable by the waiting indicator. + +- [ ] **Step 1: Add a `queuePosition` field + event handler in `web/store/message.ts`** + +Find the store's socket subscription block (where other `subscribe('...')` / event handlers live, e.g. `image-generation-started`). Add state and a handler: + +```ts +// in the store's state shape, alongside `waiting`: +queuePosition: undefined as number | undefined, +``` + +```ts +// register alongside the other socket event handlers: +subscribe('queue-position', { position: 'number', kind: 'string' }, (body) => { + const position = body.position || 0 + msgStore.setState({ queuePosition: position > 0 ? position : undefined }) +}) +``` + +(Match the project's existing `subscribe(...)` signature — mirror a neighbouring handler in the same file for the exact argument shape.) + +- [ ] **Step 2: Render the badge in the waiting indicator** + +In the component that renders the pending/“typing” indicator while `waiting` is set, show the position when present: + +```tsx + + Queued #{state.queuePosition} + +``` + +- [ ] **Step 3: Clear on completion** + +Ensure the existing message-completion / `waiting: undefined` paths also clear `queuePosition`. Where the store sets `waiting: undefined` on a finished/failed generation, add `queuePosition: undefined` to the same `setState`. + +- [ ] **Step 4: Typecheck web** + +Run: `pnpm typecheck` +Expected: no errors. + +- [ ] **Step 5: Commit** + +```bash +git add web/store/message.ts web/pages/Chat +git commit -m "feat(queue): show queue position to waiting users" +``` + +--- + +## Task 9: Final verification + +- [ ] **Step 1: Run the full check suite** + +Run: `pnpm checks` +Expected: format clean, web typecheck clean, all tests pass. + +- [ ] **Step 2: Server typecheck (heavier)** + +Run: `NODE_OPTIONS=--max-old-space-size=6144 pnpm exec tsc -p srv.tsconfig.json --noEmit` +Expected: no errors. + +- [ ] **Step 3: Manual smoke (optional, via the `run` skill)** + +Start the app, set `INFERENCE_GLOBAL_CONCURRENCY=1` locally, fire two chats simultaneously, confirm the second shows “Queued #1” then completes after the first. Set `VLLM_METRICS_URL` and confirm text pauses when `num_requests_waiting` exceeds the threshold. + +- [ ] **Step 4: Commit any formatting fixups** + +```bash +git add -A +git commit -m "chore(queue): formatting + final checks" +``` + +--- + +## Self-Review notes + +- **Spec coverage:** global cap 10 (Task 1 config + Tasks 2/5 backends), image sub-cap 4 (Tasks 1/2/5), FIFO+priority (Tasks 1/2/5), premium priority via `priorityForUser` (Task 4/7), background priority 3 (Task 7 default), queue-position UX (Tasks 4/8), heartbeat leases (Task 5), in-process fallback (Tasks 2/6), vLLM breaker fail-open (Tasks 3/6), config-driven caps (Task 1), 3 wrap sites (Task 7). All covered. +- **Redis Lua eligibility caveat (known simplification):** the `ACQUIRE` script can only evaluate the *calling* waiter's kind-specific predicate precisely; for *other* waiters it assumes global-room eligibility (head-of-line). This means a blocked-image head could briefly defer a ready text waiter until the next wake/​re-poll (≤1s) rather than instantly — the in-process backend has no such lag. Acceptable for v1; documented here so the implementer doesn't treat it as a bug. If tighter cross-kind fairness is needed later, store each waiter's `kind` in the ZSET member (`{id}|{kind}`) and evaluate per-member in Lua. +- **No data migration**, no new collections — Redis keys are ephemeral. ✓ diff --git a/docs/superpowers/specs/2026-06-24-event-mode-design.md b/docs/superpowers/specs/2026-06-24-event-mode-design.md new file mode 100644 index 00000000..7ce5c3ba --- /dev/null +++ b/docs/superpowers/specs/2026-06-24-event-mode-design.md @@ -0,0 +1,191 @@ +# Event Mode — Design + +**Status:** approved design, pre-implementation +**Date:** 2026-06-24 + +## Summary + +A new **Event** feature lets a user start a multi-character "scene" (e.g. a night +at a club) from a single menu button, then chat in it where **the model decides +which character speaks each turn**. It builds on the existing multi-character +chat machinery (`chat.characters`, per-reply `replyAs`) and adds a **director**: +an extra constrained model call per reply that elects the next speaker — biased +toward a quiet one-on-one, with bystanders speaking only when they have a +specific reason to interject. + +This is the differentiating feature: a living room of companions where presence +≠ constant interruption. + +## Goals + +- One-tap creation of a populated multi-char scene (where / who / what). +- Director-driven turn-taking: user-addressed by default, bystanders interject + only with reason; multiple replies allowed per turn, capped. +- Each character replies in **its own** relationship stage (`LEVEL(...)` token + from its own XP), not the main char's. +- A **memory-disable** toggle so a party leaves no long-term-memory residue + ("no trouble later"). General per-chat toggle; defaults ON for events. + +## Non-goals + +- No new model capabilities — director is a stock `inferenceAsync` + `jsonSchema` + call on the existing default subscription model. +- No data migration — every new field is additive/optional. +- No redesign of the streaming/ws pipeline; reuse existing per-reply generation. + +## Data model (additive only) + +`AppSchema.Chat` (`common/types/schema.ts`): + +- `mode` union gains `'event'` (field already optional): marks the chat for + director orchestration. +- `event?: { location: string; description: string }` — the scene metadata, for + display and prompt building. (Roster lives in the existing `characters` map.) +- `memoryDisabled?: boolean` — when true, this chat neither writes nor recalls + long-term memory. Set true on event creation; also exposed as a general chat + setting. + +No other schema changes. `characterId` (required) = first invitee, used only as +a fallback "main" char. + +## Feature 1 — Event creation + +**UI:** new **Event** button in the menu (`web/Navigation.tsx` menu list). Opens +a modal with: + +- **Where** — free text (location) +- **Who** — multi-select from the user's My AI list (reuse existing character + select list component) +- **What** — description textarea + +**On submit:** create a chat via the existing multi-char creation path with: + +- `mode: 'event'`, `event: { location, description }`, `memoryDisabled: true` +- `characters` = `{ [id]: true }` for each invitee; `memberIds` accordingly +- `characterId` = first invitee +- `scenario` + `overrides` set so `resolveScenario` injects a scene block: + `Setting: {location}. Event: {description}. Present: {names}.` +- Opening message: a single narrated scene-set line (system/world message). No + character auto-greeting — the **user speaks first**. + +Navigate into the new chat on success. Credit cost of creation: none beyond the +normal per-turn charge once chatting begins (creation itself is free; reuses +existing chat-create, which is not credit-charged). + +## Feature 2 — The director (per-reply speaker election) + +A reusable server function, e.g. `electSpeaker(...)` in a new +`srv/api/chat/director.ts` (or `srv/adapter/director.ts`): + +- Calls `inferenceAsync` with a `jsonSchema` whose `speaker` is an **enum** of + the present character ids **plus `"none"`** (enum prevents hallucinating an + absent character). Low `maxTokens`, deterministic-ish `temp`. +- Prompt contains: the event scene block, the roster (each character's name + a + one-line persona hook), the recent message window, and the replies **already + produced this turn**. +- Instruction: *"Who responds next? Prefer the character the user is directly + addressing. A bystander is chosen only with a strong, specific reason to + interject. Return `none` when no one (else) should speak."* + +Returns a character id or `none`. + +## Feature 3 — Server-orchestrated turn loop (approach A) + +When a user `send` lands in an `event` chat, the server owns the whole turn +(client does **not** pick `replyAs`): + +1. **Credit gate + charge:** require balance ≥ `EVENT_TURN_COST` (25); debit 25 + **once** at turn start. +2. Persist the user message (existing path). +3. **Director loop** (max `EVENT_MAX_REPLIES`, default 3): + a. `electSpeaker(...)` over context + replies-so-far. + b. If `none` → break. + c. Generate that character's reply as `replyAs`, streaming over the existing + ws pipeline; persist; append to the turn's message window. + d. Loop. +4. End turn. + +Each reply reuses the existing generation/stream path, with two event-aware +changes (below). The director is authoritative and server-side; the client only +sends the user's text and renders streamed replies in order. + +### Credit handling + +Normal chat debits −10 per reply at `message.ts:425`. In event mode this +per-reply debit is **suppressed**; the flat 25 charged at turn start is the only +charge. Mechanism: the orchestrator marks event-directed generations so the +completion handler skips the −10 (e.g. an internal flag on the generate request / +`body.kind`), and the 25 debit happens in the event turn entry point. + +### Per-speaker progression (correctness fix) + +Two existing lines assume a single main character; both must use `replyAs`: + +- `message.ts:428` grants XP to `chat.characterId`. Change to `replyAs._id` so + the **replying** character earns XP. (Correct for multi-char generally.) +- `prompt.ts` `prependProgressionStage` / `resolveScenario` derive the + `LEVEL(...)` token from the main char. The reply's stage must come from + `replyAs`'s XP. Adjust so the token reflects the replying character. + +These are scoped, surgical changes that also fix latent multi-char behavior. + +## Feature 4 — Memory-disable toggle + +`chat.memoryDisabled` gates both sides of long-term memory: + +- **Write:** `message.ts:414` (`rememberFact` loop) is skipped when + `chat.memoryDisabled`. +- **Recall:** `generate.ts:359` (`recallMemories`) is skipped when the chat has + memory disabled, so a party can't surface (or bury) serious relationship + memories. + +Exposed as a general toggle in chat settings (a standard `Toggle`), so it works +for any chat, not just events. Events set it `true` by default at creation. + +## Constants + +- `EVENT_TURN_COST = 25` (credits per user turn in an event) +- `EVENT_MAX_REPLIES = 3` (hard cap on character replies per turn) +- Director `maxTokens` small (≈16–32); `speaker` enum over present ids + `none`. + +## Error handling & edge cases + +- **Director returns `none` on the first call:** the turn produces no reply + (valid — e.g. the user mutters an aside). The 25 charge still applies (the turn + ran). Acceptable; revisit if it feels punishing. +- **Insufficient credits:** reject before charging/persisting, surface + `MissingCredits` (existing error). +- **Director enum drift / parse failure:** on a malformed/unknown speaker, + fall back to the addressed/main character for the first reply, or `none` for + subsequent loop iterations (never crash the turn). +- **Cap reached:** stop silently after `EVENT_MAX_REPLIES`. +- **Non-`send` kinds in an event** (retry/continue/ooc): bypass the director; + retry/continue target the specific prior message's character as today. +- **Guest users:** events require an account (they involve the My AI list); + gate behind login like other authenticated features. + +## Testing + +- Director: given a roster + a message clearly addressed to one character, the + elected first speaker is that character; given a neutral aside, `none` is a + valid outcome; the enum never yields an absent id. +- Turn loop: caps at `EVENT_MAX_REPLIES`; charges 25 exactly once; per-reply −10 + is suppressed. +- Progression: a reply by character B advances B's XP and uses B's stage token, + not the main char's. +- Memory: with `memoryDisabled`, no `rememberFact` write occurs and + `recallMemories` is not consulted. + +## Affected files (anticipated) + +- `common/types/schema.ts` — `mode` union, `event`, `memoryDisabled` fields. +- `common/prompt.ts` — per-`replyAs` progression token in scenario resolution. +- `srv/api/chat/message.ts` — event turn entry, credit suppression, XP→`replyAs`, + memory-write gate. +- `srv/adapter/generate.ts` — recall gate on `memoryDisabled`. +- New `srv/api/chat/director.ts` (or `srv/adapter/director.ts`) — `electSpeaker`. +- `srv/api/chat/*` routes — event creation + orchestration entry. +- `web/Navigation.tsx` — Event menu button. +- New web modal — event creation form (where/who/what). +- Web chat settings — memory-disable toggle. +- `web/store/*` — event creation + (thin) turn handling on the client. diff --git a/docs/superpowers/specs/2026-06-25-anti-multiaccount-fingerprint-design.md b/docs/superpowers/specs/2026-06-25-anti-multiaccount-fingerprint-design.md new file mode 100644 index 00000000..ca75d8ac --- /dev/null +++ b/docs/superpowers/specs/2026-06-25-anti-multiaccount-fingerprint-design.md @@ -0,0 +1,217 @@ +# Anti-Multi-Account: Device Fingerprint + IP — Design + +Date: 2026-06-25 +Branch: feat/charluv-rewrite + +## Goal + +Stop credit farming via mass account creation, without hard-locking out legitimate +users who share a device or IP (households, libraries, mobile carriers/CGNAT). + +Charluv stores an IP per user (`lastIp`) and today hard-blocks "1 account per IP" at +registration. That is both bypassable (VPN / mobile data) and over-blocks shared IPs. +We add a device-fingerprint signal and replace the blunt IP block with a graded response. + +## Non-goals + +- No external/paid fingerprint service (EU data + cost + the repo's local-first ethos). + Use the open-source client library only. +- No cookie banner and no cookies set. Consent for the device identifier is collected via a + **required checkbox at registration** (see §3.1) and disclosed in the privacy policy (§6). + User-facing copy speaks of "identifiers", never the word "fingerprinting". +- No data migration. All schema changes are additive. + +## 1. Detection signals & decision matrix + +On **register**, the server computes two booleans against existing accounts: + +- `fpMatch` — another user already has this device fingerprint +- `ipMatch` — another user already has this IP (existing `checkIp`) + +| fpMatch | ipMatch | outcome | +|---------|---------|-------------| +| ✓ | ✓ | **block** (403 — high confidence same person) | +| ✓ | ✗ | **restrict** | +| ✗ | ✓ | **restrict** | +| ✗ | ✗ | **allow** (normal signup) | + +This **relaxes** today's behavior: IP-only now *restricts* instead of hard-blocking. + +**"restrict"** = account is created, but: +- signup credits = **0** (not 200) +- free-credit refills **disabled** +- flagged for admin (`creditsRestricted: true`, `restrictedReason`) + +A farmer's extra accounts are useless. A false-positive legit user can still +buy/redeem credits and go premium, and an admin can clear the restriction. + +**block** = registration refused with a 403 and a message directing the user to +Discord if they lost their password (consistent with the current IP-block copy). + +## 2. Data model (additive — no migration) + +On `AppSchema.User` (`common/types/schema.ts`): + +```ts +fingerprint?: string // device visitorId (FingerprintJS) +identifierConsentAt?: string // ISO ts when the user accepted the + // identifier-collection checkbox +creditsRestricted?: boolean // true => no bonus, no refills +restrictedReason?: 'ip' | 'fingerprint' | 'both' // for the admin view +``` + +Index (`srv/db/client.ts:createIndexes`): `db('user').createIndex({ fingerprint: 1 })`. + +Note: `restrictedReason: 'fingerprint'` is the internal value; it is never shown to end +users. Admin-facing labels may say "device" instead. + +## 3. Fingerprint capture (OSS FingerprintJS) + +### 3.1 Consent gate (required at registration) +- The register form gets a **required, unticked checkbox** with user-friendly wording + about *identifiers* (never "fingerprinting"), e.g.: + > "I agree to Charluv storing device and account identifiers to prevent abuse and the + > creation of multiple accounts. See our Privacy Policy." + (The Privacy-Policy link points at the clause from §6.) +- **Client**: the "Register" button is disabled until the box is ticked; the FingerprintJS + `visitorId` is only computed when it is ticked. The POST sends `consent: true` and the + `fingerprint`. +- **Server**: `register` requires `consent === true` (else 400 "You must accept the + identifier policy to register"). On success, store `identifierConsentAt = now()`. +- Because consent is a condition of registration, *every* account that exists has been + fingerprinted with consent — a farmer cannot opt out of the signal while keeping an + account. (Trade-off: consent-as-condition has a GDPR "freely given" soft spot; accepted + as a documented, defensible risk given no email is collected and the anti-fraud need.) + +### 3.2 Capture +- Add `@fingerprintjs/fingerprintjs` (MIT) to the web bundle. +- On the **register** page (post-consent), compute the `visitorId` (in-browser, no network + calls) and include it as `fingerprint` in the POST to `/user/register`. +- **Register**: store `fingerprint` AND `lastIp` on the new user *immediately at + creation*. Today `lastIp` is only set on login — a fast-farm gap; setting both at + creation puts brand-new accounts into the matching pool right away. +- **Login**: unchanged — no fingerprinting at login. The device id is captured once, at + registration, where consent is explicit and just given; re-capturing at login would mean + accessing the device outside the consented flow for no real gain. The matching pool grows + from new registrations (the actual farming vector), which is sufficient: a returning + farmer's device was already fingerprinted when they registered. +- If the library fails or no fingerprint arrives, `fpMatch = false`; the IP path still + governs (IP-only ⇒ restrict). Evasion only downgrades a would-be block to a useless + restricted account — farming is defeated either way. + +## 4. Server enforcement + +### Pure decision helper (unit-tested) +New file `common/abuse.ts` (dependency-free, importable by `tests/` without a DB): + +```ts +export function classifyRegistration(opts: { fpMatch: boolean; ipMatch: boolean }): + 'block' | 'restrict' | 'allow' { + if (opts.fpMatch && opts.ipMatch) return 'block' + if (opts.fpMatch || opts.ipMatch) return 'restrict' + return 'allow' +} +``` + +The `register` handler imports `classifyRegistration` from `/common/abuse`. + +### DB layer (`srv/db/user.ts`) +- `checkFingerprint(fingerprint?: string): Promise` — mirror `checkIp`: true if + any user already has this fingerprint. Returns false for empty input. +- `createUser(newUser, admin?, opts?)` — add an options arg: + `opts?: { restricted?: boolean; restrictedReason?: 'ip'|'fingerprint'|'both'; + fingerprint?: string; ip?: string }`. When `restricted`, set `credits: 0`, + `creditsRestricted: true`, `restrictedReason`. Always persist `fingerprint` and + `lastIp` on the new doc when provided. + +### Register handler (`srv/api/user/auth.ts`) +```ts +assertValid( + { handle:'string', username:'string', password:'string', fingerprint:'string?', consent:'boolean?' }, + req.body +) +if (req.body.consent !== true) + throw new StatusError('You must accept the identifier policy to register', 400) +const fpMatch = await store.users.checkFingerprint(req.body.fingerprint) +const ipMatch = await store.users.checkIp(req.ip) +const verdict = classifyRegistration({ fpMatch, ipMatch }) +if (verdict === 'block') throw new StatusError('Only 1 account per device/IP. ...Discord...', 403) +const reason = fpMatch && ipMatch ? 'both' : fpMatch ? 'fingerprint' : ipMatch ? 'ip' : undefined +const { profile, token, user } = await store.users.createUser(req.body, false, { + restricted: verdict === 'restrict', + restrictedReason: reason, + fingerprint: req.body.fingerprint, + ip: req.ip, + consentAt: new Date().toISOString(), +}) +``` +`createUser` persists `identifierConsentAt = opts.consentAt` alongside the other fields. + +### Login handler (`srv/api/user/auth.ts`) +Unchanged — `updateIp(userId, req.ip)` as today. No fingerprint at login (capture is +registration-only, §3.2). + +### Free-credit refills (`srv/db/credits.ts:getFreeCredits`) +Add `creditsRestricted: { $ne: true }` to BOTH the free and premium refill find-queries +so restricted accounts never receive automatic refills. (Premium/expired-premium queries +unaffected — paying users are never restricted in practice, but the filter is harmless.) + +## 5. Admin + +- **User info** (`srv/db/admin.ts` projection + `web/store/admin.ts` `UserInfo` + + `web/pages/Admin/UsersPage.tsx`): surface `creditsRestricted` and `restrictedReason`. +- **Clear restriction** action: a new admin endpoint + (`POST /admin/users/:userId/clear-restriction`, `isAdmin`) that sets + `creditsRestricted: false`, clears `restrictedReason`, and tops the user up to the + standard 200 signup credits if they are below it (re-enabling future refills). + Wire an `adminStore.clearRestriction(userId)` action + a button in UsersPage. + +## 6. Privacy policy update (required) + +`web/pages/PrivacyPolicy/index.tsx` — add a short clause under the existing +data-collection / security section. It must be **accurate** even though the UI checkbox +uses plain "identifier" wording: state that, to prevent fraud and abuse (creating multiple +accounts to farm free credits), we collect and store your IP address and a **device +identifier derived from your browser and device characteristics**, that you consent to this +at registration, and that it is processed for fraud prevention (consent + legitimate +interest) and retained with your account. Keep the tone/format consistent with the +surrounding policy text. Copy change only. + +## 7. Error handling + +- All server rejections via `StatusError` (existing pattern); the 403 block message + matches the current IP-block phrasing (mentions Discord for password recovery). +- Missing/blank fingerprint is treated as "no match" everywhere (never throws). +- Fingerprint computation failures on the client are swallowed; the request proceeds + without a fingerprint (server degrades to IP-only ⇒ restrict). + +## 8. Testing + +- Unit: `classifyRegistration` — all four matrix cells. +- Unit: `checkFingerprint` empty-input guard (pure portion) — or covered via the helper. +- DB-touching paths (`getFreeCredits` filter, `createUser` options, admin clear) have no + test harness in this repo; verified by `pnpm typecheck` + srv typecheck + manual smoke. + Note this limitation explicitly in the plan. + +## 9. Existing members (pre-feature accounts) + +Decision: **leave them alone** (option A). + +- **Never retroactively restricted.** The restrict/block logic runs only at new + registration. Every current account keeps its credits and free refills untouched. +- **They still feed the IP signal.** Existing accounts already carry `lastIp`, so a new + signup from a current member's IP trips `ipMatch` with no change to the old account. +- **They are not fingerprinted** (they never consented, and fingerprinting happens only at + registration — §3.2). The fingerprint pool grows from new registrations — which is the + actual farming vector (mass new accounts on one device). +- Known residual gap (accepted): a farmer with one old, un-fingerprinted account who + creates new accounts on the same device but rotating IPs would not be caught by the + fingerprint. Closing it (a one-time login consent prompt for existing users) is a + possible future follow-up, not in this scope. + +## 10. Out of scope + +- Retroactively fingerprinting historical accounts (they backfill on next login). +- Threshold/velocity rules (N accounts per fingerprint), bot detection, TLS/JA3 + fingerprinting. The single-match graded response is sufficient for the credit-farming + threat and keeps false positives low. diff --git a/docs/superpowers/specs/2026-06-25-blog-page-restyle-design.md b/docs/superpowers/specs/2026-06-25-blog-page-restyle-design.md new file mode 100644 index 00000000..86dd49fc --- /dev/null +++ b/docs/superpowers/specs/2026-06-25-blog-page-restyle-design.md @@ -0,0 +1,150 @@ +# Blog Page Restyle + Discover-as-Landing — Design + +Date: 2026-06-25 +Branch: feat/charluv-rewrite + +## Problem + +The legacy Agnaistic "Home" page (`web/pages/Home/index.tsx`, route `/`) is the only +page still on the old theme (`Card`/`TitleCard`/`Pill`, `bg-800`/`bg-700` vars). It +carries dead content (AgnAIstic credits, "13B model", AI Horde links, ElevenLabs +"currently disabled", Horde/OpenAI setup-guide modals) and is mis-positioned as a +marketing landing. + +Two routing facts today: +- Logged-out `/` renders `HomePage`; logged-in `/` redirects to `/discover`. +- After login the redirect does not fire until a page refresh, so users briefly land + on Home — a bug. + +## Goals + +1. Discover becomes the landing for everyone at `/` (logged in or out). This removes the + post-login-lands-on-Home bug. +2. Home is repurposed into a **blog / news page** at `/blog`, restyled to match + Discover's "warm dusk" editorial aesthetic. +3. Dead content is removed; real sections are kept and restyled. + +Non-goals: no changes to Discover's visuals, no data migrations, no backend changes, +no renaming of stored ids. + +## Approach (chosen: A) + +Mirror Discover's proven pattern: a dedicated scoped CSS file with a custom class +prefix and the warm-dusk oklch palette. Extract the shared palette into a partial so +the two pages single-source it. Keep the `--dsc-` variable prefix to keep the Discover +diff to a single import swap (renaming would churn every reference in `discover.css`). + +## File changes + +| File | Action | +|---|---| +| `web/pages/warm-dusk.css` | **new** — palette + page-background gradient, scoped to `.dsc-root, .blg-root` | +| `web/pages/Discover/discover.css` | edit — remove inline var block (lines defining `--dsc-*` and the `background:`/`color:`/`font-family` on `.dsc-root`); `@import '../warm-dusk.css'`. Net visual change: none. | +| `web/pages/Home/blog.css` | **new** — `.blg-*` classes | +| `web/pages/Home/index.tsx` | rewrite markup → `BlogPage`; cut dead content | +| `web/pages/Home/home.scss` | **delete** — only holds `.home-cards`, which goes away | +| `web/App.tsx` | routing change | + +### warm-dusk.css (shared token partial) + +Move the following out of `.dsc-root` in `discover.css` into a partial, applied to both +page roots: + +```css +.dsc-root, +.blg-root { + --dsc-bg: oklch(0.18 0.03 350); + --dsc-bg-2: oklch(0.23 0.04 348); + --dsc-surface: oklch(0.27 0.045 345); + --dsc-cream: oklch(0.94 0.02 75); + --dsc-muted: oklch(0.72 0.03 350); + --dsc-line: oklch(0.4 0.05 345 / 0.5); + --dsc-green: oklch(0.74 0.11 165); + --dsc-green-deep: oklch(0.64 0.12 165); + --dsc-wine: oklch(0.55 0.16 5); + + min-height: 100%; + background: + radial-gradient(120% 80% at 85% -10%, oklch(0.3 0.08 350 / 0.6), transparent 60%), + radial-gradient(90% 60% at -10% 110%, oklch(0.28 0.06 165 / 0.35), transparent 55%), + var(--dsc-bg); + color: var(--dsc-cream); + font-family: 'Lato', system-ui, sans-serif; +} +``` + +The Fraunces `@import url(...)` font line stays at the top of whichever file is loaded; +put it in the partial so both pages get it. `discover.css` keeps its own `padding` +declaration on `.dsc-root` (blog sets its own). + +### blog.css + +Scoped under `.blg-root`. Readable centered column (`max-width: ~860px`, auto margins, +responsive padding via `clamp`). Sections: + +- `.blg-head` — hero: Fraunces title ("News & Updates"), muted tagline carrying the + short "Charluv is a virtual dating chat service…" intro copy. +- `.blg-feed` / `.blg-post` — announcement cards: surface bg, `--dsc-line` border, 18px + radius. `.blg-post-title` (Fraunces), `.blg-post-date` (muted, `elapsedSince`), + `.blg-post-body` (reuses existing `rendered-markdown` class). +- `.blg-recent` — Recent Conversations strip (logged-in only), chat cards reskinned to + warm-dusk surfaces; preserves existing desktop/mobile card behaviour and the + register/match/create/edit `BorderCard` prompts. +- `.blg-card` — Features and Getting Started as warm-dusk panels. +- `.blg-links` — pill links (Memory Book guide, Discord, Terms, Privacy). +- `.blg-footer` — compact band: app download (itch embed) + "Featured on" badges. +- `prefers-reduced-motion` guard; mobile breakpoint (single column, smaller type). + +### index.tsx + +Rename component to `BlogPage` (default export unchanged in shape). Replace `home.scss` +import with `blog.css`. Wrap content in `.blg-root`. + +**Keep (restyled):** announcements feed (lead section), Recent Conversations, Features, +Getting Started, Guides/Links pills, ad `Slot`s (`leaderboard` + `content`), app +download (itch) + "Featured on" badges (footer band). + +**Cut:** `HordeGuide` + `OpenAIGuide` components, `Sub` enum and `sub` signal and the +trailing ``, the Credits `Card` (AgnAIstic / 13B / AI Horde / db0), the green +logo bar, the ElevenLabs "currently disabled" paragraph and any model-size claim in +`Features`. Drop now-unused imports (`logoDark`, `SolidCard`, `Modal`, `markdown` only +if unused after edits, etc. — verify per-symbol). + +Page title → `setComponentPageTitle('News')`. + +### App.tsx routing + +- `/` → `Discover` for everyone. Remove the `Show`/`Redirect`/`HomePage` fallback block + (currently lines ~79–86). Reuse the existing lazy `Discover` import. +- `/blog` → `BlogPage`. +- `/info` → `BlogPage` (alias retained for existing backlinks). +- The nav logo's `/` link now lands on Discover — intended. + +## Data flow + +No data changes. `announceStore.getAll()` on mount feeds `.blg-feed` (already filtered by +`location === 'home'`/`undefined` and user level — keep that filter). `chatStore` feeds +Recent Conversations. `userStore().loggedIn` gates the recent strip and create prompts. + +## Error / edge handling + +- Empty announcements: hero + recent + static sections still render (feed simply absent). +- Logged-out: Recent Conversations strip hidden; register `BorderCard` shown as today. +- Markdown announcement bodies continue through `markdown.makeHtml` + `rendered-markdown`. + +## Verification + +CSS + markup only; no unit tests added. +- `pnpm typecheck` (web) passes. +- `ts.transpileModule` syntax check on edited `.tsx`. +- Manual visual check via Playwright/`/run`: `/` shows Discover (logged in AND out, no + redirect flash), `/blog` and `/info` show the restyled blog, mobile breakpoint holds, + reduced-motion respected. +- Confirm no leftover `.home-cards` / `home.scss` references after deletion. + +## Risks + +- `discover.css` import swap must produce byte-equivalent rendering — verify Discover + visually unchanged after the extraction. +- Removing the logged-in redirect must not break any code that assumed `/` = Home for + logged-in users — grep for internal links to `/` used as "home". diff --git a/docs/superpowers/specs/2026-06-25-promo-codes-design.md b/docs/superpowers/specs/2026-06-25-promo-codes-design.md new file mode 100644 index 00000000..3010ac96 --- /dev/null +++ b/docs/superpowers/specs/2026-06-25-promo-codes-design.md @@ -0,0 +1,178 @@ +# Promo Codes + Subscription Page Cleanup — Design + +Date: 2026-06-25 +Branch: feat/charluv-rewrite + +## Goal + +Two changes to the Subscription page (`/premium`, `web/pages/Profile/SubscriptionPage.tsx`): + +1. **Cleanup** — strip Stripe / legacy-shop / PayPal machinery that no longer applies + (new subscriptions are Patreon-only). +2. **New feature: promo codes** — admin-managed codes that grant **credits** and/or + **premium membership days**. Codes are redeemable **once per account**, can **expire**, + and have a **max number of uses**. Admins manage them from the admin section. + +No data migrations (live production data). All schema changes are additive. + +## Definitions + +- **Membership days** = premium days. Granting `days` sets `premium: true` and extends + `premiumUntil`, using the same math as the shop (`srv/api/cart.ts:giveOrder`): + base from `max(premiumUntil, now)` then `+ days * 86_400_000` ms. +- **Codes are case-insensitive** — stored and compared in UPPERCASE so users never fail + on casing. + +## Data Model + +Two new collections (kinds). Added to the `AllDoc` union and `AppSchema` namespace in +`common/types/schema.ts`. + +```ts +interface PromoCode { + _id: string + kind: 'promo-code' + code: string // stored UPPERCASE, unique + credits?: number // optional credit grant + days?: number // optional premium-membership days + maxUses: number // 0 = unlimited + uses: number // running counter + enabled: boolean + expiresAt?: string // ISO; omitted = never expires + createdAt: string + createdBy: string // admin userId + updatedAt?: string +} + +interface PromoRedemption { + _id: string + kind: 'promo-redemption' + codeId: string + userId: string + code: string // denormalized for admin display + credits: number // what was actually granted + days: number + createdAt: string +} +``` + +### Indexes (`srv/db/client.ts:createIndexes`) + +- `promo-code`: `{ code: 1 }` unique. +- `promo-redemption`: `{ codeId: 1, userId: 1 }` unique → DB-enforced one-per-account. + +## Server + +### `srv/db/promo.ts` (new) + +- `getPromos()` — list all, newest first. +- `getPromoByCode(code)` — lookup by uppercased code. +- `createPromo(input)` — insert; throws 400 on duplicate code (uppercase). +- `updatePromo(id, patch)` — update editable fields; re-checks code uniqueness if changed. +- `deletePromo(id)` — hard delete the code (redemptions are retained as a record). +- `redeemPromo(userId, rawCode)` — race-safe redemption (see below). + +### `redeemPromo` order of operations (race-safe) + +1. Uppercase the input. Lookup code. Reject (StatusError 400/404): + - not found + - `!enabled` + - expired: `expiresAt && new Date(expiresAt).valueOf() < Date.now()` +2. Atomic `findOneAndUpdate` on `promo-code` with guard + `{ _id, enabled: true, $or: [{ maxUses: 0 }, { $expr: { $lt: ['$uses', '$maxUses'] } }] }`, + apply `$inc: { uses: 1 }`. (Equivalent guard acceptable: read maxUses, then conditional + update.) Null result → "This code has been fully used." +3. Insert `promo-redemption` (unique `codeId + userId`). On duplicate-key error → roll back + with `$inc: { uses: -1 }` on the code, then throw "You have already redeemed this code." +4. Grant rewards: + - `credits` (if > 0): `updateCredits(userId, credits)` (`srv/db/credits.ts`) — also emits + the `credits-updated` socket event. + - `days` (if > 0): compute `newPremiumUntil = max(premiumUntil, now) + days*86_400_000`, + `updateUser(userId, { premium: true, premiumUntil: newPremiumUntil })`. +5. Return `toSafeUser(updatedUser)`. + +### User route — `srv/api/user/` (redeem) + +- `POST /user/promo/redeem` (loggedIn): body `{ code: string }` via `assertValid`. + Calls `redeemPromo`, returns `{ user }`. Wire into the existing user router + (`srv/api/user/index.ts` or equivalent). + +### Admin routes — `srv/api/promo.ts` (new), mounted in `srv/api/index.ts` + +All `isAdmin`: + +- `GET /admin/promo` → `{ codes }` +- `POST /admin/promo` → create `{ code, credits?, days?, maxUses, enabled, expiresAt? }` +- `POST /admin/promo/:id` → update +- `DELETE /admin/promo/:id` → delete + +Mount: `router.use('/admin', promo)` alongside the existing admin routers. + +Validation: `maxUses >= 0`; at least one of `credits`/`days` > 0; `code` non-empty. + +## Frontend + +### `web/store/user.ts` + +- `redeemPromo(code)` async action: `POST /user/promo/redeem`, on success merge returned + user into state and `toastStore.success`; on error `toastStore.error`. + +### `web/pages/Profile/SubscriptionPage.tsx` + +**Add** a "Redeem a promo code" `SolidCard`: a `TextInput` + Redeem `Button` +(disabled while loading / empty), success & error via toasts. Placed near the top of the +page (above or just under the "Why subscribe?" card). + +**Cleanup (remove):** +- Stripe `Upgrade` and `Downgrade` buttons (the `Match` blocks for `user.sub?.type === 'native'`) + and their two `ConfirmModal`s (`showUpgrade`, `showDowngrade`) plus the + `setUpgrade`/`setDowngrade`/`showDowngrade` signals and `modifySubscription` calls. +- The `Unsubscribe` button + its `ConfirmModal` (`showUnsub`/`setUnsub`) and + `stopSubscription` call. +- The `'Subscribed via Stripe'` label branch; simplify the "Subscribed via" pill to the + remaining sources (Patreon / Gift / PayPal-grandfathered). +- Legacy copy: "use Stripe or Patreon if you want auto-renew", "All prices are in EUR", + "Patreon price shown is excl. VAT." — review and remove/replace the Stripe/EUR wording. + +**Keep:** +- `PatreonControls`, the "Current Subscription" card for grandfathered/existing subscribers, + Patreon subscribe links and the candidate tier cards' "Subscribe via Patreon" path, + support-email card. + +### Admin UI + +- `web/pages/Admin/PromoCodes.tsx` (new): list of codes with create/edit form and delete, + mirroring the structure of `Announcements.tsx` / `Tiers.tsx`. Fields: code, credits, days, + maxUses, enabled, expiresAt (datetime), plus read-only `uses`. Optional "generate random + code" convenience button that fills the code field (admin can still edit). +- `web/store/admin.ts`: `getPromos`, `createPromo`, `updatePromo`, `deletePromo` actions + + `promos` in state. +- `web/App.tsx`: route `/admin/promo` (and `/admin/promo/:id` if an edit subroute is used) + → lazy `PromoCodes`. +- `web/Navigation.tsx`: `SubItem href="/admin/promo"` under the admin group. + +## Error Handling + +- All server validation via `StatusError` (existing pattern), surfaced to the user as toasts. +- Redemption errors are user-friendly: already redeemed / fully used / expired / disabled / + invalid code. +- Race conditions handled by the unique index (one-per-account) and the conditional + `$inc` guard (max-uses), with rollback on the rare insert-after-increment dup. + +## Testing (`tests/`) + +`redeemPromo` coverage: +- Happy paths: credits-only, days-only, both. +- Already redeemed (second attempt by same user) → rejected, `uses` not double-counted. +- Disabled code → rejected. +- Expired code → rejected. +- Max uses exhausted → rejected; `maxUses: 0` (unlimited) allowed. +- Days extension math: extends existing `premiumUntil` when in the future, else from now. + +Run `pnpm checks` (format + typecheck + test) and the heavier srv typecheck before done. + +## Out of Scope + +- No changes to Stripe/Patreon billing backends beyond removing dead UI on the page. +- No bulk code generation / CSV import. +- No per-code analytics dashboard beyond the `uses` counter and redemption records. diff --git a/docs/superpowers/specs/2026-06-26-inference-queue-design.md b/docs/superpowers/specs/2026-06-26-inference-queue-design.md new file mode 100644 index 00000000..f9020d38 --- /dev/null +++ b/docs/superpowers/specs/2026-06-26-inference-queue-design.md @@ -0,0 +1,273 @@ +# Inference Concurrency Queue — Design + +Date: 2026-06-26 +Status: Approved (design), pending implementation plan + +## Problem + +A single NVIDIA DGX hosts both inference backends: + +- **Text** — self-hosted **vLLM** (OpenAI-compatible streaming). GPU can run ~16 + concurrent, and vLLM has its own internal wait queue beyond that. +- **Image** — self-hosted SD-compatible / Z-Image endpoint, ~4 concurrent. + +Today the app fires generations with no gating, so under load it over-feeds vLLM +(its internal `num_requests_waiting` grows = latency spikes for everyone) and +over-feeds the image endpoint. We want an app-side queue that (a) keeps total +outbound concurrency bounded so we never hammer vLLM, (b) serves premium members +first when there's contention, and (c) never exceeds the image backend's 4. + +## Deployment + +Everything runs on **one DGX**. The app itself runs as **multiple processes** +(workers/containers) sharing that one box and one Redis (Redis pub/sub already +backs the websocket bus in `srv/api/ws/bus.ts`). So all concurrency counting must +be **shared state in Redis**, not per-process. All caps are config-driven. + +## The model (decided during brainstorming) + +Two layers of control, plus a circuit breaker: + +1. **Global soft admission cap = 10 (combined text + image).** A request is + admitted to run immediately only while total in-flight (text + image) `< 10`. + At 10, further requests **wait** in a priority queue. This is the primary + "don't hammer vLLM" control. Flat for everyone — premium does **not** raise it. +2. **Image sub-cap = 4.** Within the admitted set, no more than 4 image requests + run at once (the image backend's hard limit). A text-only path is never gated + by this. +3. **Premium priority.** When requests are waiting, the highest-priority *eligible* + waiter goes next. Premium > free > guest > background. Premium jumps the line; + it does not get a bigger cap. +4. **vLLM circuit breaker (hybrid signal).** Our Redis counter is the fast, exact + admission gate. Additionally we poll vLLM `/metrics` and, if + `vllm:num_requests_waiting` exceeds a threshold, we **stop admitting new text** + (they keep waiting) even when in-flight `< 10` — until it drains. Catches the + case where heavy prompts or other clients back vLLM up. Image is unaffected. + +`num_requests_running` from the same endpoint is also scraped for +observability/cross-checking our counter, but admission is driven by our counter, +not the metric (poll lag would race under burst). + +### Note on the hard caps + +- **Text 16** is now non-binding: text alone can't exceed the combined 10, so it + never gates. Kept only as a config safety rail (`TEXT_HARD_CAP`). +- **Image 4** is the real, enforced image sub-cap. + +## Requirements + +1. Total in-flight (text + image) capped at **10** cluster-wide (Redis-shared + across the app's processes). Configurable. +2. Image in-flight capped at **4**. Configurable. +3. **FIFO wait, no rejection** when at cap — requests block until a slot frees. + The queue never rejects (no timeout). +4. **Premium priority** in the wait queue (premium → free → guest → background). + Background LLM work (moderation, summary, RAG, guidance) shares the same pool + at lowest priority. +5. **Show queue position** to the waiting user ("Queued #N"). +6. **Heartbeat lease TTL** — a slot is a short-TTL lease (~30s) refreshed every + ~10s while the stream runs, so a crashed/stuck node frees its slot within ~30s. +7. **vLLM circuit breaker** — pause text admission while + `vllm:num_requests_waiting` is over threshold. + +## Non-goals + +- No per-user concurrency cap. (Priority handles fairness; the global cap of 10 + bounds total load. Revisit only if one user is observed monopolizing the queue.) +- No per-request reject/timeout. +- No job-worker / offload model — streaming replies must run in the web process + holding the socket (rules out BullMQ). +- No data migration; queue state is ephemeral Redis only. + +## Architecture + +### `PriorityGate` (new: `srv/queue/`) + +A single global gate instance with a priority wait queue and a kind-aware +admission predicate. (One gate, not one-per-endpoint, because the binding cap is +the combined 10; the image 4 is a sub-condition inside it.) + +```ts +type Kind = 'text' | 'image' + +type GateOpts = { + kind: Kind + userId?: string // for position events + socketId?: string // guest fan-out target + requestId?: string + priority: number // 0 premium, 1 free, 2 guest, 3 background +} + +// Acquire (blocking, priority + eligibility), run fn, release in finally. +gate.run(opts: GateOpts, fn: () => Promise): Promise + +// Wrap an async generator: acquire before the first chunk is pulled, +// release when it finishes/throws. Slot held for the stream's lifetime. +gate.gateStream(opts: GateOpts, makeGen: () => AsyncGenerator): AsyncGenerator +``` + +### Admission predicate (eligibility) + +A waiter at the head of its priority class is admitted only if its predicate holds +*now*: + +- `text`: `inflight < 10` **and** circuit breaker closed (`vllmWaiting <= threshold`). +- `image`: `inflight < 10` **and** `imageInflight < 4`. + +If the highest-priority head is ineligible (e.g. an image request blocked on the +image sub-cap, or text blocked by the breaker), the gate admits the +**highest-priority waiter whose predicate currently passes** instead — so an image +backlog never stalls ready text, and a breaker-paused text backlog never stalls +ready image. (Eligibility-aware, not strict positional FIFO; FIFO still holds +within a {priority, kind} group.) + +### Priority tiers + +| Priority | Who | +|----------|-----| +| 0 | Premium member (active subscription tier via `getUserSubscriptionTier`) | +| 1 | Free signed-in user, user-facing chat/image | +| 2 | Guest | +| 3 | Background/utility (moderation, summary, RAG, guidance) | + +Lower served first; FIFO by enqueue time within a tier. + +### Redis data model + +- `gate:active` — hash `leaseId -> "{kind}:{expiryMs}"`. Live slots. + `inflight = HLEN`; `imageInflight = count where kind == image`. +- `gate:wait` — ZSET of waiters. score = `priority * 1e13 + enqueueMs` + (priority dominates; timestamp = FIFO tiebreak). +- `gate:meta` — small hash storing the latest scraped `vllmWaiting` / + `vllmRunning` (written by the metrics poller, read inside the acquire Lua). +- Pub/sub channel `gate:free` — published on every release to wake waiters. + +### Lua scripts (atomicity) + +- **acquire(leaseId, kind, myScore, caps, ttlMs, nowMs)** + 1. Reap `active` entries with `expiry < now`. + 2. Compute `inflight`, `imageInflight`; read `vllmWaiting` from `gate:meta`. + 3. Among `wait` members ordered by score, find the **highest-priority eligible** + one (predicate above). If it's me → `ZREM` self, `HSET active leaseId + "{kind}:{now+ttl}"`, return `{acquired:1}`. Else return `{acquired:0, + position:}`. +- **release(leaseId)** — `HDEL active leaseId`; caller then `PUBLISH gate:free`. +- **heartbeat(leaseId, ttlMs, nowMs)** — if lease exists, reset expiry; else tell + caller the lease was reaped. + +### Acquire flow (per waiter) + +1. `ZADD wait myScore leaseId`; ensure subscribed to `gate:free`. +2. Try `acquire`. If acquired → start heartbeat interval, return. +3. Else → emit position event (throttled, on change); `await` next `gate:free` + publish OR a ~1s safety re-poll (covers missed publishes and breaker-state + changes that produce no publish). Loop to 2. +4. On caller abort / client disconnect → `ZREM` self (or `release` if already + acquired) and `PUBLISH gate:free`. + +### Release flow + +`clearInterval(heartbeat)` → `release` Lua → `PUBLISH gate:free`. Always in a +`finally`. + +### vLLM metrics poller + +One lightweight interval (guarded so only one process polls at a time — reuse the +existing `obtainManagerLock` pattern in `srv/domains/lock.ts`, or just let each +node poll and write its own view; cheap) fetches `VLLM_METRICS_URL`, parses the +Prometheus text for `vllm:num_requests_waiting` and `vllm:num_requests_running`, +and writes them to `gate:meta` with a freshness timestamp. If the scrape is stale +(poller down) the breaker fails **open** (admit normally) so a metrics outage can't +freeze generation. + +### In-process fallback + +When `config.redis.host` is unset / not connected (single-node dev; mirrors +`bus.ts` dual-mode), `PriorityGate` uses a local implementation: integer +`inflight`/`imageInflight` + a priority-sorted wait list, same predicate, same API. +The metrics poll (if configured) still drives a local breaker flag. No Redis, +no heartbeat needed (process-local). + +## Wrap sites + +All inference funnels through three points; one gate, kind-tagged: + +1. **`srv/adapter/generate.ts → createInferenceStream`** — wrap the returned + `stream` with `gate.gateStream({ kind: 'text', priority: 3, ... })`. Covers + `inferenceAsync` (background/utility, guidance). Priority defaults to 3 unless + the caller overrides (see below). +2. **`srv/adapter/generate.ts → createChatStream`** — wrap the returned `stream` + with `gate.gateStream({ kind: 'text', priority: , ... })`. Covers + user-facing chat replies. +3. **`srv/image/index.ts → generateImage`** — wrap the `handle*Image(...)` call + with `gate.run({ kind: 'image', priority: , ... })`. Covers all image + generation. + +Priority from the request user: `getUserSubscriptionTier(user, getCachedTiers())` +→ active tier ⇒ 0; signed-in no tier ⇒ 1; guest ⇒ 2. Background utility callers +pass explicit priority 3 via a new optional field: +- `InferenceRequest.queuePriority?: number` (srv/adapter/generate.ts). +- `GenerateRequestV2` already carries user/guest; priority derived at the wrap site. + +## Client UX — queue position + +While waiting (not yet admitted), throttled on position change: + +```ts +sendOne(userId, { type: 'queue-position', kind, position, requestId }) // signed-in +sendGuest(socketId, { type: 'queue-position', kind, position, requestId }) // guest +``` + +On admission, emit `position: 0` (or `queue-cleared`) so the client drops the +badge. Web store (`web/store/message.ts`) renders "Queued #N" on the pending +message / image spinner. + +## Configuration + +| Env | Default | Meaning | +|-----|---------|---------| +| `INFERENCE_GLOBAL_CONCURRENCY` | 10 | Combined text+image soft admission cap | +| `IMAGE_CONCURRENCY` | 4 | Image sub-cap | +| `TEXT_HARD_CAP` | 16 | Non-binding safety rail for text | +| `VLLM_METRICS_URL` | (unset) | Prometheus metrics endpoint; breaker disabled if unset | +| `VLLM_WAITING_THRESHOLD` | 1 | Pause text admission while `num_requests_waiting` exceeds this | +| `VLLM_METRICS_POLL_MS` | 1500 | Scrape interval | + +Added under `config.inference` (alongside the existing image settings). + +## Error handling + +- **Redis unavailable mid-run**: heartbeat failure → log; let the in-flight + generation finish (don't kill a live user reply); new requests use the + in-process fallback gate until reconnect. +- **Client disconnect while queued/running**: existing socket lifecycle → abort + the gate wait, `ZREM`/`release`, publish free. No leaked slots. +- **Lease reaped while still streaming** (heartbeat lost a race): best-effort + re-acquire; if it can't, the stream continues (already in flight) but is no + longer counted — acceptable, self-corrects on completion. +- **Metrics scrape fails / stale**: breaker fails **open** (admit normally). +- **Missed wake publish**: the ~1s safety re-poll guarantees liveness. + +## Testing + +- Unit (in-process gate, deterministic): combined cap never exceeds 10; image + sub-cap never exceeds 4; text never gated by the image sub-cap; priority + ordering (premium → free → background); FIFO within a tier; eligibility-skip + (image blocked on sub-cap doesn't stall ready text, and vice-versa); release + wakes the correct next waiter; disconnect removes a waiter; heartbeat keeps a + lease past base TTL; reaper frees an expired lease. +- Circuit breaker: text admission pauses when `vllmWaiting > threshold` and + resumes when it drops; breaker fails open on stale metrics; image admission + ignores the breaker. +- Lua scripts vs a real/embedded Redis: K simulated nodes acquiring concurrently + never exceed 10 combined / 4 image; eligibility + priority respected. +- `pnpm checks` stays green. + +## Implementation notes + +- Reuse the `redis` v4 client; load Lua via `SCRIPT LOAD` + `EVALSHA`, `EVAL` + fallback on `NOSCRIPT`. +- `gate:free` pub/sub needs its own subscriber connection (a subscribed client + can't issue other commands) — add one alongside the bus `sub`. +- Throttle position events (emit only when N changes) to avoid socket spam. +- Parse Prometheus text minimally (regex the two metric lines); no extra dep. diff --git a/final-desktop.png b/final-desktop.png new file mode 100644 index 00000000..fbc26c0b Binary files /dev/null and b/final-desktop.png differ diff --git a/package.json b/package.json index c6114c68..25a44e20 100644 --- a/package.json +++ b/package.json @@ -33,12 +33,9 @@ "clean": "npx rimraf@5 --glob \"dist/*.js\" \"dist/*.css\" \"dist/*.map\"", "prepublishOnly": "npm run clean && npm run build", "prebuild": "npm run clean", - "build": "parcel build web/index.html --no-optimize --detailed-report", - "build:prod": "NODE_ENV=production parcel build web/index.html --detailed-report", - "build:offline": "parcel build web/offline.html --no-optimize --detailed-report", - "build:win": "parcel build web/index.html --no-optimize --detailed-report", + "build": "NODE_OPTIONS=--max-old-space-size=4096 vite build", + "build:prod": "NODE_ENV=production NODE_OPTIONS=--max-old-space-size=4096 vite build", "build:all": "npm run build && npm run build:server", - "build:all:win": "npm run build:win && npm run build:server", "build:api": "tsc -p api.tsconfig.json", "build:server": "tsc -p srv.tsconfig.json", "build:watch": "tsc -p srv.tsconfig.json -w", @@ -49,30 +46,20 @@ "model:start": ".model/bin/poetry run python model/app.py", "model:watch": "npm run model:init && nodemon -e py --watch model --exec \".model/bin/poetry run python model/app.py\"", "model": "npm run model:init && npm run model:start", - "server": "concurrently -c auto -n aivo,discord \"node srv/start.js\" \"npm run start:bot\"", - "start:bot": "node srv/discord.js", + "server": "node srv/start.js", "server:watch": "nodemon -e js --delay 2 --watch srv --watch common --watch \".env\" --exec \"node --inspect srv/start.js\"", - "start:web": "parcel web/index.html", - "start": "concurrently -c auto -n web,api,tsc,discord \"parcel web/index.html --no-cache\" \"npm run server:watch\" \"npm run build:watch\" \"npm run start:bot\" ", - "start:all": "PIPELINE_PROXY=true concurrently -c auto -n web,api,tsc,pipe,discord \"parcel web/index.html --no-cache\" \"npm run server:watch\" \"npm run build:watch\" \"npm run model:watch\" \"npm run start:bot\"", - "watch": "concurrently -c auto -n web,tsc \"parcel web/index.html --no-cache\" \"npm run build:watch\"", - "start:cluster": "concurrently -c auto -n web,api,tsc \"parcel web/index.html --no-cache\" \"npm run server:watch\" \"npm run build:watch\"", - "start:https": "concurrently -c auto -n web,api,tsc \"parcel web/index.html --no-cache --https\" \"npm run server:watch\" \"npm run build:watch\"", - "start:debug": "LOG_LEVEL=debug concurrently -c auto -n web,api,tsc \"parcel web/index.html --no-cache\" \"npm run server:watch\" \"npm run build:watch\"", - "start:public": "concurrently -c auto -n web,api,lt, \"parcel watch web/index.html\" \"npm run server:watch\" \"npx lt --port 3001\" \"npm run start:bot\"", - "start:public:win": "concurrently -c auto -n web,api,lt \"parcel watch web/index.html\" \"npm run server:watch\" \"npx lt --local-host 127.0.0.1 --port 3001\"", - "start:win": "concurrently -c auto -n web,api,tsc \"parcel web/index.html\" \"npm run server:watch\" \"npm run build:watch\"", - "start:win:all": "set PIPELINE_PROXY=true && concurrently -c auto -n web,api,tsc,pipe \"parcel web/index.html\" \"npm run server:watch\" \"npm run build:watch\" \"npm run model:watch\"", + "start:web": "vite", + "start": "concurrently -c auto -n web,api,tsc \"vite\" \"npm run server:watch\" \"npm run build:watch\"", + "watch": "concurrently -c auto -n web,tsc \"vite\" \"npm run build:watch\"", "selfhost": "npm run deps && npm run build:all && SELF_HOST=1 npm run server", "selfhost:win": "set \"SELF_HOST=1\" && npm run deps && npm run build:all && npm run server", - "start:debug:win": "set LOG_LEVEL=debug && concurrently -c auto -n web,api,tsc \"parcel web/index.html --no-cache\" \"npm run server:watch\" \"npm run build:watch\"", "test": "mocha --inline-diffs --exit \"tests/**.spec.js\"", "snapshot": "mocha --inline-diffs --exit \"tests/**.spec.js\" --update", "typecheck": "tsc -p tsconfig.json --noEmit", "checks": "pnpm format && pnpm typecheck && pnpm test", "up": "docker compose -p agnai up -d", "deps": "npx --yes pnpm@8.6.2 install --lockfile", - "web": "parcel web/index.html --no-cache", + "web": "vite", "api": "tsc -p api.tsconfig.json --watch" }, "dependencies": { @@ -81,6 +68,7 @@ "@aws-sdk/client-s3": "^3.309.0", "@css-hooks/solid": "^1.0.1", "@dqbd/tiktoken": "^1.0.2", + "@fingerprintjs/fingerprintjs": "^5.2.0", "@paypal/paypal-js": "^5.1.6", "@thisbeyond/solid-dnd": "^0.7.5", "@types/crypto-js": "^4.1.1", @@ -104,7 +92,6 @@ "iconv-lite": "0.6.3", "js-tiktoken": "^1.0.14", "jsonwebtoken": "^9.0.0", - "localtunnel": "^2.0.2", "minimist": "^1.2.8", "mkdirp": "^2.1.4", "modern-screenshot": "^4.4.15", @@ -116,10 +103,10 @@ "patreon-api.ts": "^0.1.0", "paypal-rest-sdk": "^1.8.1", "peggy": "^3.0.2", + "phosphor-solid": "^1.1.5", "pino": "^8.10.0", "pino-pretty": "^9.2.0", "redis": "^4.6.5", - "shepherd.js": "^13.0.3", "stripe": "^13.7.0", "throng": "^5.0.0", "uuid": "^9.0.0", @@ -129,14 +116,6 @@ "devDependencies": { "@babel/core": "^7.20.12", "@melloware/coloris": "^0.20.0", - "@parcel/config-default": "^2.14.4", - "@parcel/core": "2.14.4", - "@parcel/packager-raw-url": "2.14.4", - "@parcel/resolver-glob": "^2.14.4", - "@parcel/transformer-inline-string": "2.14.4", - "@parcel/transformer-raw": "^2.14.4", - "@parcel/transformer-sass": "2.14.4", - "@parcel/transformer-webmanifest": "2.14.4", "@solidjs/router": "^0.13.1", "@types/adm-zip": "^0.5.0", "@types/bcryptjs": "^2.4.2", @@ -149,7 +128,6 @@ "@types/google-publisher-tag": "^1.20230410.0", "@types/js-cookie": "^3.0.2", "@types/jsonwebtoken": "^9.0.1", - "@types/localtunnel": "^2.0.1", "@types/mocha": "^10.0.1", "@types/multer": "^1.4.7", "@types/needle": "^3.2.0", @@ -167,18 +145,16 @@ "chai": "^4.3.7", "concurrently": "^7.6.0", "crypto-browserify": "^3.12.0", - "dompurify": "^3.2.5", + "dompurify": "^3.2.7", "events": "^3.1.0", - "exifreader": "^4.13.0", + "exifreader": "^4.41.0", "https-browserify": "^1.0.0", - "js-cookie": "^3.0.1", + "js-cookie": "^3.0.8", "libsodium-wrappers-sumo": "^0.7.11", "localforage": "^1.10.0", - "lucide-solid": "0.356.0", "mocha": "^10.2.0", "mocha-chai-jest-snapshot": "^1.1.4", "nodemon": "^3.0.1", - "parcel": "^2.12.0", "path-browserify": "^1.0.0", "pdfdataextract": "^3.2.0", "pdfjs-dist": "2.10.377", @@ -198,16 +174,19 @@ "stream-browserify": "^3.0.0", "stream-http": "^3.2.0", "string_decoder": "^1.3.0", - "svgo": "^3.3.2", + "svgo": "^3.3.3", "tailwindcss": "^3.3.2", "typescript": "^5.4.4", "url": "^0.11.1", "util": "^0.12.3", "values.js": "^2.1.1", - "vite": "^5.3.3", + "vite": "^5.4.20", + "vite-plugin-node-polyfills": "0.22.0", + "vite-plugin-pwa": "^0.21.2", "vite-plugin-solid": "^2.11.6", "vite-tsconfig-paths": "^4.3.2", "vm-browserify": "^1.1.2", + "workbox-window": "^7.4.1", "zustand": "^4.5.2" }, "@parcel/resolver-default": { @@ -218,5 +197,54 @@ }, "exports": { "easy-speech": "./node_modules/easy-speech/dist/EasySpeech.cjs.js" + }, + "pnpm": { + "overrides": { + "pbkdf2": ">=3.1.3", + "sha.js": ">=2.4.12", + "fast-xml-parser": ">=4.5.4", + "protobufjs": ">=7.5.5", + "@protobufjs/utf8": ">=1.1.1", + "shell-quote": ">=1.8.4", + "tar-fs": ">=3.1.1", + "glob": ">=10.5.0", + "jws": ">=4.0.1", + "seroval": ">=1.4.1", + "immutable": ">=5.1.5", + "minimatch": ">=10.0.1", + "rollup": ">=4.59.0", + "serialize-javascript": ">=7.0.3", + "fast-uri": ">=3.1.1", + "esbuild": "~0.25.0", + "undici": ">=6.27.0", + "js-yaml": ">=4.1.1", + "bn.js": ">=5.2.3", + "ajv": ">=8.18.0", + "@smithy/config-resolver": ">=4.4.0", + "picomatch": ">=2.3.2", + "yaml": ">=2.8.3", + "postcss": ">=8.5.10", + "ip-address": ">=10.1.1", + "ws": ">=8.20.1", + "brace-expansion": ">=2.0.2", + "diff": ">=5.2.2", + "qs": ">=6.14.2", + "@babel/core": "^7.29.6", + "@xmldom/xmldom": ">=0.9.9", + "express>path-to-regexp": "0.1.13" + }, + "auditConfig": { + "ignoreGhsas": [ + "GHSA-848j-6mx2-7j84", + "GHSA-rmmh-p597-ppvv", + "GHSA-w5hq-g745-h8pq", + "GHSA-4w7w-66w2-5vf9", + "GHSA-v6wh-96g9-6wx3", + "GHSA-fx2h-pf6j-xcff", + "GHSA-wgrm-67xf-hhpq", + "GHSA-8fgc-7cc6-rx7x", + "GHSA-38r7-794h-5758" + ] + } } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 32e9911f..9cd6152d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,40 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + pbkdf2: '>=3.1.3' + sha.js: '>=2.4.12' + fast-xml-parser: '>=4.5.4' + protobufjs: '>=7.5.5' + '@protobufjs/utf8': '>=1.1.1' + shell-quote: '>=1.8.4' + tar-fs: '>=3.1.1' + glob: '>=10.5.0' + jws: '>=4.0.1' + seroval: '>=1.4.1' + immutable: '>=5.1.5' + minimatch: '>=10.0.1' + rollup: '>=4.59.0' + serialize-javascript: '>=7.0.3' + fast-uri: '>=3.1.1' + esbuild: ~0.25.0 + undici: '>=6.27.0' + js-yaml: '>=4.1.1' + bn.js: '>=5.2.3' + ajv: '>=8.18.0' + '@smithy/config-resolver': '>=4.4.0' + picomatch: '>=2.3.2' + yaml: '>=2.8.3' + postcss: '>=8.5.10' + ip-address: '>=10.1.1' + ws: '>=8.20.1' + brace-expansion: '>=2.0.2' + diff: '>=5.2.2' + qs: '>=6.14.2' + '@babel/core': ^7.29.6 + '@xmldom/xmldom': '>=0.9.9' + express>path-to-regexp: 0.1.13 + importers: .: @@ -23,6 +57,9 @@ importers: '@dqbd/tiktoken': specifier: ^1.0.2 version: 1.0.21 + '@fingerprintjs/fingerprintjs': + specifier: ^5.2.0 + version: 5.2.0 '@paypal/paypal-js': specifier: ^5.1.6 version: 5.1.6 @@ -92,9 +129,6 @@ importers: jsonwebtoken: specifier: ^9.0.0 version: 9.0.2 - localtunnel: - specifier: ^2.0.2 - version: 2.0.2 minimist: specifier: ^1.2.8 version: 1.2.8 @@ -128,6 +162,9 @@ importers: peggy: specifier: ^3.0.2 version: 3.0.2 + phosphor-solid: + specifier: ^1.1.5 + version: 1.1.5(react@19.1.0) pino: specifier: ^8.10.0 version: 8.21.0 @@ -137,9 +174,6 @@ importers: redis: specifier: ^4.6.5 version: 4.7.1 - shepherd.js: - specifier: ^13.0.3 - version: 13.0.3 stripe: specifier: ^13.7.0 version: 13.11.0 @@ -153,39 +187,15 @@ importers: specifier: ^6.4.1 version: 6.4.1 ws: - specifier: ^8.18.2 - version: 8.18.2 + specifier: '>=8.20.1' + version: 8.21.0 devDependencies: '@babel/core': - specifier: ^7.20.12 - version: 7.27.1 + specifier: ^7.29.6 + version: 7.29.7 '@melloware/coloris': specifier: ^0.20.0 version: 0.20.0 - '@parcel/config-default': - specifier: ^2.14.4 - version: 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))(@swc/helpers@0.5.17)(postcss@8.5.3)(svgo@3.3.2)(terser@5.39.0)(typescript@5.8.3) - '@parcel/core': - specifier: 2.14.4 - version: 2.14.4(@swc/helpers@0.5.17) - '@parcel/packager-raw-url': - specifier: 2.14.4 - version: 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/resolver-glob': - specifier: ^2.14.4 - version: 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/transformer-inline-string': - specifier: 2.14.4 - version: 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/transformer-raw': - specifier: ^2.14.4 - version: 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/transformer-sass': - specifier: 2.14.4 - version: 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/transformer-webmanifest': - specifier: 2.14.4 - version: 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) '@solidjs/router': specifier: ^0.13.1 version: 0.13.6(solid-js@1.9.6) @@ -222,9 +232,6 @@ importers: '@types/jsonwebtoken': specifier: ^9.0.1 version: 9.0.9 - '@types/localtunnel': - specifier: ^2.0.1 - version: 2.0.4 '@types/mocha': specifier: ^10.0.1 version: 10.0.10 @@ -260,7 +267,7 @@ importers: version: 2.1.0 babel-preset-solid: specifier: ^1.6.9 - version: 1.9.6(@babel/core@7.27.1) + version: 1.9.6(@babel/core@7.29.7) browserify-zlib: specifier: ^0.2.0 version: 0.2.0 @@ -277,29 +284,26 @@ importers: specifier: ^3.12.0 version: 3.12.1 dompurify: - specifier: ^3.2.5 - version: 3.2.5 + specifier: ^3.2.7 + version: 3.4.11 events: specifier: ^3.1.0 version: 3.3.0 exifreader: - specifier: ^4.13.0 - version: 4.30.1 + specifier: ^4.41.0 + version: 4.41.0 https-browserify: specifier: ^1.0.0 version: 1.0.0 js-cookie: - specifier: ^3.0.1 - version: 3.0.5 + specifier: ^3.0.8 + version: 3.0.8 libsodium-wrappers-sumo: specifier: ^0.7.11 version: 0.7.15 localforage: specifier: ^1.10.0 version: 1.10.0 - lucide-solid: - specifier: 0.356.0 - version: 0.356.0(solid-js@1.9.6) mocha: specifier: ^10.2.0 version: 10.8.2 @@ -309,9 +313,6 @@ importers: nodemon: specifier: ^3.0.1 version: 3.1.10 - parcel: - specifier: ^2.12.0 - version: 2.14.4(@swc/helpers@0.5.17)(postcss@8.5.3)(svgo@3.3.2)(terser@5.39.0)(typescript@5.8.3) path-browserify: specifier: ^1.0.0 version: 1.0.1 @@ -331,8 +332,8 @@ importers: specifier: ^1.0.0 version: 1.0.0 postcss: - specifier: ^8.4.21 - version: 8.5.3 + specifier: '>=8.5.10' + version: 8.5.15 prettier: specifier: ^2.8.3 version: 2.8.8 @@ -370,8 +371,8 @@ importers: specifier: ^1.3.0 version: 1.3.0 svgo: - specifier: ^3.3.2 - version: 3.3.2 + specifier: ^3.3.3 + version: 3.3.3 tailwindcss: specifier: ^3.3.2 version: 3.4.17 @@ -388,17 +389,26 @@ importers: specifier: ^2.1.1 version: 2.1.1 vite: - specifier: ^5.3.3 - version: 5.4.19(@types/node@18.19.100)(lightningcss@1.29.3)(sass@1.87.0)(terser@5.39.0) + specifier: ^5.4.20 + version: 5.4.21(@types/node@18.19.100)(lightningcss@1.29.3)(sass@1.87.0)(terser@5.39.0) + vite-plugin-node-polyfills: + specifier: 0.22.0 + version: 0.22.0(rollup@4.62.2)(vite@5.4.21(@types/node@18.19.100)(lightningcss@1.29.3)(sass@1.87.0)(terser@5.39.0)) + vite-plugin-pwa: + specifier: ^0.21.2 + version: 0.21.2(vite@5.4.21(@types/node@18.19.100)(lightningcss@1.29.3)(sass@1.87.0)(terser@5.39.0))(workbox-build@7.4.1(@types/babel__core@7.20.5))(workbox-window@7.4.1) vite-plugin-solid: specifier: ^2.11.6 - version: 2.11.6(solid-js@1.9.6)(vite@5.4.19(@types/node@18.19.100)(lightningcss@1.29.3)(sass@1.87.0)(terser@5.39.0)) + version: 2.11.6(solid-js@1.9.6)(vite@5.4.21(@types/node@18.19.100)(lightningcss@1.29.3)(sass@1.87.0)(terser@5.39.0)) vite-tsconfig-paths: specifier: ^4.3.2 - version: 4.3.2(typescript@5.8.3)(vite@5.4.19(@types/node@18.19.100)(lightningcss@1.29.3)(sass@1.87.0)(terser@5.39.0)) + version: 4.3.2(typescript@5.8.3)(vite@5.4.21(@types/node@18.19.100)(lightningcss@1.29.3)(sass@1.87.0)(terser@5.39.0)) vm-browserify: specifier: ^1.1.2 version: 1.1.2 + workbox-window: + specifier: ^7.4.1 + version: 7.4.1 zustand: specifier: ^4.5.2 version: 4.5.6(react@19.1.0) @@ -415,9 +425,11 @@ packages: resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} + '@apideck/better-ajv-errors@0.3.7': + resolution: {integrity: sha512-TajUJwGWbDwkCx/CZi7tRE8PVB7simCvKJfHUsSdvps+aTM/PDPP4gkLmKnc+x3CE//y9i/nj74GqdL/hwk7Iw==} + engines: {node: '>=10'} + peerDependencies: + ajv: '>=8.18.0' '@aws-crypto/crc32@5.2.0': resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} @@ -574,20 +586,57 @@ packages: resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.27.2': - resolution: {integrity: sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ==} + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.29.7': + resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} engines: {node: '>=6.9.0'} - '@babel/core@7.27.1': - resolution: {integrity: sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==} + '@babel/core@7.29.7': + resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} engines: {node: '>=6.9.0'} '@babel/generator@7.27.1': resolution: {integrity: sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.27.2': - resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + '@babel/generator@7.29.7': + resolution: {integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.29.7': + resolution: {integrity: sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.29.7': + resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.29.7': + resolution: {integrity: sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/helper-create-regexp-features-plugin@7.29.7': + resolution: {integrity: sha512-907Uymvqgg1dwUA+7IGwFAOSYzQOuzPXKNJ1yxzwPffzkYFg2q2eHi1fIOs6sXkG9NbIUMunnUlkYsfRFNvomg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/helper-define-polyfill-provider@0.6.8': + resolution: {integrity: sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/helper-globals@7.29.7': + resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-member-expression-to-functions@7.29.7': + resolution: {integrity: sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==} engines: {node: '>=6.9.0'} '@babel/helper-module-imports@7.18.6': @@ -598,30 +647,70 @@ packages: resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.27.1': - resolution: {integrity: sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==} + '@babel/helper-module-imports@7.29.7': + resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.29.7': + resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0 + '@babel/core': ^7.29.6 + + '@babel/helper-optimise-call-expression@7.29.7': + resolution: {integrity: sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==} + engines: {node: '>=6.9.0'} '@babel/helper-plugin-utils@7.27.1': resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} engines: {node: '>=6.9.0'} + '@babel/helper-plugin-utils@7.29.7': + resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-remap-async-to-generator@7.29.7': + resolution: {integrity: sha512-16AMiW26DbXWBbr3B8wNozKM0ydMLB892vaOaJW/fPJdnT8vJk5sdkQcU/isqUxyCE0cEoa8wZOcbgDuC4b6Og==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/helper-replace-supers@7.29.7': + resolution: {integrity: sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/helper-skip-transparent-expression-wrappers@7.29.7': + resolution: {integrity: sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==} + engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.27.1': resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.27.1': resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.27.1': - resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.29.7': + resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-wrap-function@7.29.7': + resolution: {integrity: sha512-iES0Skag9ERIF68aXadpO6dbXa03mNWK3sEqJaMnLNs/eC3l0lkImdfoy6Y09/SfkpawdAB4RjQ7PVA7TcVGdw==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.27.1': - resolution: {integrity: sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==} + '@babel/helpers@7.29.7': + resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} engines: {node: '>=6.9.0'} '@babel/parser@7.27.2': @@ -629,96 +718,478 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.29.7': + resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.29.7': + resolution: {integrity: sha512-j8SrR0zLZrRsC09DlszEx8FpMiwukKffYXMK0d5LmOglO7vGG6sz/BR/20yHqWH+Lnn31JTt2PE3hIWNgM2J6w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.29.7': + resolution: {integrity: sha512-r8j8escF+U2FUHo0KOhPUdMzUO+jp9fInva6+ACVAF3Y97Ev+5iNZwiqTghmzNeWwDkOPlYuTcfb1vDaoZKmAQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.29.7': + resolution: {integrity: sha512-GE1TFSiuFeGsCxmYXZl8HwoPrVlwe4rHPFE8weieGKZqnDORK+Ar3vgWMgW+AOxQ6/2TgLSKx9p6W7O4rC6qgQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-bugfix-safari-rest-destructuring-rhs-array@7.29.7': + resolution: {integrity: sha512-oBNVCvnO5tND+xSopWvV8WNGfpTfgP4Zr/YXXSj8zfmcPktp5Ku/aZlsIowgSD4fjmgHn6sGmB9APVsU5zOdhA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.29.7': + resolution: {integrity: sha512-QQt9qKHZ2sg/kivaLr7lnQr8HVrQDdBNSfCsTjiDxRuX/K5ORyKq+Bu8Xr0cDE3Dfkv0cw28Ve0EKyKMvulkOw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.29.7': + resolution: {integrity: sha512-pn6QacGLgvCcwc+syUhKE/qSjV2D1IHDB84RNxWYSt1mW3K/SCtjinZ2p0cETJxAWBjPy3K/1lHwG5BjjPxNlw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + '@babel/plugin-syntax-async-generators@7.8.4': resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.29.6 '@babel/plugin-syntax-bigint@7.8.3': resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.29.6 '@babel/plugin-syntax-class-properties@7.12.13': resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.29.6 '@babel/plugin-syntax-class-static-block@7.14.5': resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.29.6 + + '@babel/plugin-syntax-import-assertions@7.29.7': + resolution: {integrity: sha512-/An1OCBN93thpBAGyfsK2pcf0jvju1SAtKkL2Ny++B5Sy6sqgzXDQH1cZxWbF96Wuk+bn41MDA9bLd4VVAw6rw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 '@babel/plugin-syntax-import-attributes@7.27.1': resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.29.6 + + '@babel/plugin-syntax-import-attributes@7.29.7': + resolution: {integrity: sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 '@babel/plugin-syntax-import-meta@7.10.4': resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.29.6 '@babel/plugin-syntax-json-strings@7.8.3': resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.29.6 '@babel/plugin-syntax-jsx@7.27.1': resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.29.6 '@babel/plugin-syntax-logical-assignment-operators@7.10.4': resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.29.6 '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.29.6 '@babel/plugin-syntax-numeric-separator@7.10.4': resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.29.6 '@babel/plugin-syntax-object-rest-spread@7.8.3': resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.29.6 '@babel/plugin-syntax-optional-catch-binding@7.8.3': resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.29.6 '@babel/plugin-syntax-optional-chaining@7.8.3': resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.29.6 '@babel/plugin-syntax-private-property-in-object@7.14.5': resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.29.6 '@babel/plugin-syntax-top-level-await@7.14.5': resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.29.6 '@babel/plugin-syntax-typescript@7.27.1': resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.29.6 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6': + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-transform-arrow-functions@7.29.7': + resolution: {integrity: sha512-N7zArUXWzAMzm+/N0uPBeVB3Fam5lMxtUwMmDK5f/IBBS7a7p1qeUoxd/6CckXoxUdgsntq1Dh8xNW06maZbDQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-transform-async-generator-functions@7.29.7': + resolution: {integrity: sha512-d98gXZkgswvkyohMBABkhm3GeXhYj8psWfwQ2C7gtfrKGTykQa/iOIi+JJhwMjPlZ6Vm2XN+DCf3Es1EoG4ZLA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-transform-async-to-generator@7.29.7': + resolution: {integrity: sha512-pcUb2SS+RMo9TWVBwKGI5ShtoG7R+zBsFmCKDa6fe8c+hPr3XJlZgoE5j6i8W7gDjhyvy+85vmYexanvXh3d1w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-transform-block-scoped-functions@7.29.7': + resolution: {integrity: sha512-cUSmjh72N+rN4PrkFlN1dJwNCwjVp5d38/CQrEsFggkD10UiFlBFgdH3tv5dNsLuHY+3S8db2xCHjhZcv5WgvA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-transform-block-scoping@7.29.7': + resolution: {integrity: sha512-ONyr4+AZhKh8yKWInVxU9AXA9EbsyeLcL6V0dJy6M2/62vuvpGm29zzuymbTpdc451GEpDIdAyPLP3r+P61yKQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-transform-class-properties@7.29.7': + resolution: {integrity: sha512-GtcpjFvanPfzNQi3eTitsCqtRRmmqzpy/A+yhTR1HaZo1Ly3EA8ZXxlPyHdR8/IuRMYc3E4wdGBewB2QKQjAaA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-transform-class-static-block@7.29.7': + resolution: {integrity: sha512-kibJgmEdX2iMwsHY2tSZNDgj8PwIlCQz7FK9KuGKO8zsuoUwSEhoNnNVp/emKWrbY4HeO6kkXfdMqRKKKXBm2A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-transform-classes@7.29.7': + resolution: {integrity: sha512-qV0OGGBVacduzQHE649JyCneOFI/maT+YKsO+K4Yi3xv2wTPNjM/W2o2gdzMwEAZz7fXNTHAe0NcSg30bIN69g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-transform-computed-properties@7.29.7': + resolution: {integrity: sha512-RK7/IyU5phpuCdBAuig5VkzG/EnbDaui5SQGdU9BFrHdV+mV4cUjLMQ9lJDjLNtWHsqtiefpGZUXQP2BiTYMsA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-transform-destructuring@7.29.7': + resolution: {integrity: sha512-iPX8aD6H9zV5s7ZsqTdNocPN/MGQ5sSMnElKrktxjJRMnB2jN/1p2+R7GkfD6CAYoVFqy5A4XnSIUeGgJzIWpg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-transform-dotall-regex@7.29.7': + resolution: {integrity: sha512-3qc18hsD2RdZiyJNDNc7HQpv6xbncwh8FYtxNFFzclSyh/trPD9KkVR9BDECUjDLvb7yJVF15GfYUuC+LMkkiQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-transform-duplicate-keys@7.29.7': + resolution: {integrity: sha512-6IvRRriEMqnBwD6chtxdLpMYCHWEzN+oL5cyQtjykya19UgzbmKhxmhZgKC/LHxS2nYr9Q/qYPZ5Lr6jOL9+yQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.7': + resolution: {integrity: sha512-2wiIyo2BjtgU7HufSeDnL9L2O7zr8jmhFKuSr65VpRkUiRKRNpb0mdlk56+XPPKoIrfHqzbMuglDvZun0RISsA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-transform-dynamic-import@7.29.7': + resolution: {integrity: sha512-giOlEm/EFjfjr+te9NsdjkUo2v4f8rS/SXPumRVHAtbNcyNlvtREkU1dZzaIDclNpnaVhlCqRdFKhJBjBikzLg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-transform-explicit-resource-management@7.29.7': + resolution: {integrity: sha512-Rstj7coNz8sE+7Ju7ihpHLI564lsK5pUpNNlvptCIC/16E/S5hbl6n3kESPKdNRmqEWlpn5xpS5Q2dvXBsySLw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-transform-exponentiation-operator@7.29.7': + resolution: {integrity: sha512-zFpMOTLZBdW5LfObqcSbL6kefg4R4eLdmvS0wbN9M6D5Mym/sKm9toOoWyVOa+xDjvCnuWcHls2YonXwHvH3CQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-transform-export-namespace-from@7.29.7': + resolution: {integrity: sha512-24B2nOy2TeJSMheqwPD4DDQOV/elLSIlKxjZt4i05H5AgdPdWR3n18HnNrcJ+j76WJd9gbwb9jPjNYUy6RautA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-transform-for-of@7.29.7': + resolution: {integrity: sha512-zeSIHh0+E1Um1WJRXCFlHQYu2ieJNdivLLjlBEp+dIBu3S51n+SZZmIXjxnItw6pz56Cn+KvK68BIBVsxq2JiQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-transform-function-name@7.29.7': + resolution: {integrity: sha512-otRWaHXE6fbAGkePvaj/kvs3HsqXfPhlnzwSOlnFgbqCPMd975dW+4wZ00WFBt+/YlBGcJwNrARQTOJOb4ZrIg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-transform-json-strings@7.29.7': + resolution: {integrity: sha512-RRnE2+eon1rJAq8MnoF1b5kTpY1vU88twHcvcKMrsqP/jxIRqDVs9iJB5fqPuqyeFAW0wJo4MlUIPpQCq/aRsg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-transform-literals@7.29.7': + resolution: {integrity: sha512-DZ/oLP21ZuWx1vKqnoNv6/tvEK48AQOBRai40CX9dTjGluvT/YZCyY3rryDtyUqCEoyNroy5KKPwX2iQCiRvyw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-transform-logical-assignment-operators@7.29.7': + resolution: {integrity: sha512-A0H91hh6W8MFRkp5TqJmMr39jzGD1A1E1Ysiv2O06Sfbhkapm+XyIzxWCEh5kqwOZ1/8QZ0dY3SeQ7XBqfJd5Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-transform-member-expression-literals@7.29.7': + resolution: {integrity: sha512-hl1kwFZCCiDyfH25Xmco9jTrkPgnS9pmOzSG7W5I4SaGbLeqKv417hcU2RKmaxoPEgsoJh7ZPOrnPGq99bHoUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-transform-modules-amd@7.29.7': + resolution: {integrity: sha512-fxtQoH3m5ywUSIfaH0FGCzWu4McsYon5bD3K4XnskC7f+OyQMj7rsOMi4NvvmJ83WwBAg4UCe+ov4VZlqEvyew==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-transform-modules-commonjs@7.29.7': + resolution: {integrity: sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-transform-modules-systemjs@7.29.7': + resolution: {integrity: sha512-TM2ZcQLoG2/y4HODiStCo10DibYhWhGWAwVv+EQKmG/7GFl0N+AAmUiXOMKM+aiJ9XBJ9AHVZBvTzMnJ2sM3cQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-transform-modules-umd@7.29.7': + resolution: {integrity: sha512-B4UkaTK3QpgCwJnrxKfMPKdo92CN7OKXAlpAAnM3UPu0Q0lCCk57ylA9AJbRy2v8dDKOPAAWcoR6CMyeoHwRCA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-transform-named-capturing-groups-regex@7.29.7': + resolution: {integrity: sha512-vuFoLwr4qnv2xbZ16SQd6uPcH5FNrLHhk/Jzo++0XJFcaDsr4gjJVg6j398oMHiC+83k/GiBzviwF5KBJkPUtQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-transform-new-target@7.29.7': + resolution: {integrity: sha512-fEo41GmsOUhOBlw8ioo6zvjX5Xc2Lqkzlyfqbpsk3eB6TReV18uhxZ0esfEokVbY2+PVJAQHNKxER6lGrzNd3A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-transform-nullish-coalescing-operator@7.29.7': + resolution: {integrity: sha512-idmp1dFaekP9GbcMvG24Kvw2BfhFZjHnNJCkV4WuIY4PskJzwI3f1N5OdgYke38T7rftO6ERulFRn2cFeZwRkg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-transform-numeric-separator@7.29.7': + resolution: {integrity: sha512-zR7fv/z14OjgHl4AgRtkDBvBMhIzCxqV/qN/2BCRC7LjFwvuzjYe7gDWxC4Wl/SNsLM6SE1IWvRPYMgSJaUvNw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-transform-object-rest-spread@7.29.7': + resolution: {integrity: sha512-Ld98jn4c0smUywL57m7SgsHq3OpThOa6LqZJif3G6jYOovPleoFhVrBJ1WegRApSFB2wu4+RelAj9AC9G08Z4A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-transform-object-super@7.29.7': + resolution: {integrity: sha512-Ea/diGcw0twB5IlZPO5sgET6fJsLJqPABqTuFWIR+iMPGPZJkATEIWx0wa+aEQ5UY1CBQyP/gkAiLEqn1vBiQA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-transform-optional-catch-binding@7.29.7': + resolution: {integrity: sha512-sLsyndxK2VwX6yNUOakMb7Sh553ZTe/vVM1XJ+9Z5aW1ytsc8xOIwmyk05NNjN60vkc5/KqoTH6hB4V41LJhng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-transform-optional-chaining@7.29.7': + resolution: {integrity: sha512-6GM1dhvK3gNODkXcEcMCOLEDCLSoZ/sBbro2Ax8HURyasQ4NshagQixkRFdh5niI6E4gmA/jYI/4aT7rRos3ZQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-transform-parameters@7.29.7': + resolution: {integrity: sha512-ZDOBqV/qLYJI0YElr8DcENEyARsFQeESqWXH6gZlghYXuPPjvweuDhP4VyEi4BlUBlLRFZVjxoZDMjxhLW766g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-transform-private-methods@7.29.7': + resolution: {integrity: sha512-/6Rz4DK1ETDEM/bWHsPHcaEe7ZaT1EqSXjtSP/L0DijOYuaUhiRiOKcwpZ8P7zR4xXEHc2ITdiCgBm9Tpyv9ug==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-transform-private-property-in-object@7.29.7': + resolution: {integrity: sha512-+BNo06dnrzdNNqCm1X6YUaVv0DKk8Q+JYcoZfOkLhYWNCXzlwTSRq8zGWayT1csjcpNXV9CQTBRRbmTLZac5cA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-transform-property-literals@7.29.7': + resolution: {integrity: sha512-bOMRLQuI0A5ZqHq3OWJ89/rXpJ/NJrbVhXiP4zwPGMs6kpcVsuTUNjwoE30K0Qm3mf48a/TnRYYD6vPNqcg6jA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-transform-regenerator@7.29.7': + resolution: {integrity: sha512-rNNFV0DBAJp988xW2DOntfDoYn1eR8GGF5AT5vYc+rjyfaQkM242c9tZUHHPe7KYaiJizXPWhQTzzdbXySyhBw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-transform-regexp-modifiers@7.29.7': + resolution: {integrity: sha512-mB5Fs0VWrJ42ZCmc8114v60qetdaUVNkj9PmSZRmanCZM3S9hm0CFRLjRmYIsuXav14l2jvZ+4T8iiCGnhj3nQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-transform-reserved-words@7.29.7': + resolution: {integrity: sha512-5+YhdpVgmfSmwZyLMftfaiffLRMHjzIRHFHHLdibcSyJm2pasMrKHrO3Ptrt2DRshjvpgjEJJ1zVW14WPq/6QA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-transform-shorthand-properties@7.29.7': + resolution: {integrity: sha512-I+WYbGBAiCn7nA6xBrlgPH+MB7HWb4u8pv5S0Pv7OtwNvIFvCCb24YlttKEeUFVurfBCEaOTnuhlqsb7f0Z5Dg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-transform-spread@7.29.7': + resolution: {integrity: sha512-/u5K1QWada7tbYNqTjMh96718g9NTwh9tfPJMsSmVsQwGT447FskV+KcfeXkXq2GWki4EM/MuTdmBec+hOuVTQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-transform-sticky-regex@7.29.7': + resolution: {integrity: sha512-BCHzNYJGe9l7EpwwDBN/ztlL2NYFFq8hp9ddjtUEM9f2O7S7kKV/lL6Fwo7IF7NSkYhPK2vO+86nIGltA90MsA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-transform-template-literals@7.29.7': + resolution: {integrity: sha512-NCSEJ4sLFU2gqAub45HYh4fus2yQ36rr6ei6vpU7NdoJqCpxvEG8E6eJpscGyXP3VHD2Ny+fSXr04k1hoUrFqA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-transform-typeof-symbol@7.29.7': + resolution: {integrity: sha512-223mNGoTkBiTEWFoK+Q6Go3tueMRclO8vxxxxquNCYuNI4jWOofFKJRRDu6SDrB8Sgo1UEGW9T4GAQ8ZyRso1A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-transform-unicode-escapes@7.29.7': + resolution: {integrity: sha512-jCfXxSjf94lf4E0hKE0AByxF6F3/pVFqRdUUNkDJhsY0m1ZKjnN6ZYyMeHNpzflxb/0q5b7t3p+BE+SLF1WOtA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-transform-unicode-property-regex@7.29.7': + resolution: {integrity: sha512-OgZ+zoAJgZLUCunsTRQ5LAjOywDv5zzZ2/hQ5aMw1pGXyY2rtE8/chXYUmu3AlVHKpm10KEdG9aMwbI/K76ZGw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-transform-unicode-regex@7.29.7': + resolution: {integrity: sha512-7D/x/23/d/3VqZ0QA+LGbZMlGwZjztBygSWWWsfTPoQ1oQ6Q1P6Mr3d0kk42XabyUVw+fha3LqdRsFqeKqvCyA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/plugin-transform-unicode-sets-regex@7.29.7': + resolution: {integrity: sha512-BLOhLht9DOJwIxlmp91wHvkXv1lguuHS3/FwUO8HL1H0u8s4hR1gASVFyilu9iGtcTRYqjTZmlsFFeQletntEg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/preset-env@7.29.7': + resolution: {integrity: sha512-GYzX36n1nsciIb0uyH0GHwxwtNwPQIcpxSeiVLDtG/B7jB5xXgchnmL1f/jCX5o+pwnaDBtO60ONSJhEBJfxYA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.29.6 + + '@babel/preset-modules@0.1.6-no-external-plugins': + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.29.6 '@babel/runtime@7.27.1': resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} @@ -728,14 +1199,26 @@ packages: resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} + '@babel/template@7.29.7': + resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} + engines: {node: '>=6.9.0'} + '@babel/traverse@7.27.1': resolution: {integrity: sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==} engines: {node: '>=6.9.0'} + '@babel/traverse@7.29.7': + resolution: {integrity: sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==} + engines: {node: '>=6.9.0'} + '@babel/types@7.27.1': resolution: {integrity: sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==} engines: {node: '>=6.9.0'} + '@babel/types@7.29.7': + resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} + engines: {node: '>=6.9.0'} + '@css-hooks/core@1.8.2': resolution: {integrity: sha512-4EMR8uH83Ym22z5oOTBSeznLkd1B8pgMsNgrPzA+Q4YSegGv3aQECQQDfqRg20MDYGrtv+sAuahcsaiaaph0Ig==} @@ -775,161 +1258,169 @@ packages: '@dqbd/tiktoken@1.0.21': resolution: {integrity: sha512-grBxRSY9+/iBM205EWjbMm5ySeXQrhJyXWMP38VJd+pO2DRGraDAbi4n8J8T9M4XY1M/FHgonMcmu3J+KjcX0Q==} - '@esbuild/aix-ppc64@0.21.5': - resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} - engines: {node: '>=12'} + '@esbuild/aix-ppc64@0.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.21.5': - resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} - engines: {node: '>=12'} + '@esbuild/android-arm64@0.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} + engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.21.5': - resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} - engines: {node: '>=12'} + '@esbuild/android-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} + engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.21.5': - resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} - engines: {node: '>=12'} + '@esbuild/android-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} + engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.21.5': - resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} - engines: {node: '>=12'} + '@esbuild/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.21.5': - resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} - engines: {node: '>=12'} + '@esbuild/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} + engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.21.5': - resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} - engines: {node: '>=12'} + '@esbuild/freebsd-arm64@0.25.12': + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} + engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.21.5': - resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} - engines: {node: '>=12'} + '@esbuild/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} + engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.21.5': - resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} - engines: {node: '>=12'} + '@esbuild/linux-arm64@0.25.12': + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} + engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.21.5': - resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} - engines: {node: '>=12'} + '@esbuild/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} + engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.21.5': - resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} - engines: {node: '>=12'} + '@esbuild/linux-ia32@0.25.12': + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} + engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.21.5': - resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} - engines: {node: '>=12'} + '@esbuild/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} + engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.21.5': - resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} - engines: {node: '>=12'} + '@esbuild/linux-mips64el@0.25.12': + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} + engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.21.5': - resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} - engines: {node: '>=12'} + '@esbuild/linux-ppc64@0.25.12': + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} + engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.21.5': - resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} - engines: {node: '>=12'} + '@esbuild/linux-riscv64@0.25.12': + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} + engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.21.5': - resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} - engines: {node: '>=12'} + '@esbuild/linux-s390x@0.25.12': + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} + engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.21.5': - resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} - engines: {node: '>=12'} + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} + engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-x64@0.21.5': - resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} - engines: {node: '>=12'} + '@esbuild/netbsd-arm64@0.25.12': + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-x64@0.21.5': - resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} - engines: {node: '>=12'} + '@esbuild/openbsd-arm64@0.25.12': + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.21.5': - resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} - engines: {node: '>=12'} + '@esbuild/openharmony-arm64@0.25.12': + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.12': + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.21.5': - resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} - engines: {node: '>=12'} + '@esbuild/win32-arm64@0.25.12': + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} + engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.21.5': - resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} - engines: {node: '>=12'} + '@esbuild/win32-ia32@0.25.12': + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} + engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.21.5': - resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} - engines: {node: '>=12'} + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + engines: {node: '>=18'} cpu: [x64] os: [win32] - '@floating-ui/core@1.7.0': - resolution: {integrity: sha512-FRdBLykrPPA6P76GGGqlex/e7fbe0F1ykgxHYNXQsH/iTEtjMj/f9bpY5oQqbjt5VgZvgz/uKXbGuROijh3VLA==} - - '@floating-ui/dom@1.7.0': - resolution: {integrity: sha512-lGTor4VlXcesUMh1cupTUTDoCxMb0V6bm3CnxHzQcw8Eaf1jQbgQX4i02fYgT0vJ82tb5MZ4CZk1LRGkktJCzg==} - - '@floating-ui/utils@0.2.9': - resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} + '@fingerprintjs/fingerprintjs@5.2.0': + resolution: {integrity: sha512-j+2nInkwCQNTJcNhOjvkGM/nLRTuGJTC6xai4quqvUpjob2ssrGwBZjS7k55nOmKvge7qvJT2nS3i/IRvQSTQA==} '@huggingface/jinja@0.2.2': resolution: {integrity: sha512-/KPde26khDUIPkTGU82jdtTW9UAuvUTumCAbFs/7giR0SxsvZC4hru51PBvpijH6BVkHcROcvZM/lpy5h1jRRA==} engines: {node: '>=18'} - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - '@istanbuljs/load-nyc-config@1.1.0': resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} @@ -962,10 +1453,16 @@ packages: resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + '@jridgewell/gen-mapping@0.3.8': resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -980,84 +1477,23 @@ packages: '@jridgewell/sourcemap-codec@1.5.0': resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - '@lezer/common@1.2.3': - resolution: {integrity: sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==} - - '@lezer/lr@1.4.2': - resolution: {integrity: sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==} - - '@lmdb/lmdb-darwin-arm64@2.8.5': - resolution: {integrity: sha512-KPDeVScZgA1oq0CiPBcOa3kHIqU+pTOwRFDIhxvmf8CTNvqdZQYp5cCKW0bUk69VygB2PuTiINFWbY78aR2pQw==} - cpu: [arm64] - os: [darwin] - - '@lmdb/lmdb-darwin-x64@2.8.5': - resolution: {integrity: sha512-w/sLhN4T7MW1nB3R/U8WK5BgQLz904wh+/SmA2jD8NnF7BLLoUgflCNxOeSPOWp8geP6nP/+VjWzZVip7rZ1ug==} - cpu: [x64] - os: [darwin] - - '@lmdb/lmdb-linux-arm64@2.8.5': - resolution: {integrity: sha512-vtbZRHH5UDlL01TT5jB576Zox3+hdyogvpcbvVJlmU5PdL3c5V7cj1EODdh1CHPksRl+cws/58ugEHi8bcj4Ww==} - cpu: [arm64] - os: [linux] - - '@lmdb/lmdb-linux-arm@2.8.5': - resolution: {integrity: sha512-c0TGMbm2M55pwTDIfkDLB6BpIsgxV4PjYck2HiOX+cy/JWiBXz32lYbarPqejKs9Flm7YVAKSILUducU9g2RVg==} - cpu: [arm] - os: [linux] - - '@lmdb/lmdb-linux-x64@2.8.5': - resolution: {integrity: sha512-Xkc8IUx9aEhP0zvgeKy7IQ3ReX2N8N1L0WPcQwnZweWmOuKfwpS3GRIYqLtK5za/w3E60zhFfNdS+3pBZPytqQ==} - cpu: [x64] - os: [linux] - - '@lmdb/lmdb-win32-x64@2.8.5': - resolution: {integrity: sha512-4wvrf5BgnR8RpogHhtpCPJMKBmvyZPhhUtEwMJbXh0ni2BucpfF07jlmyM11zRqQ2XIq6PbC2j7W7UCCcm1rRQ==} - cpu: [x64] - os: [win32] + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} '@melloware/coloris@0.20.0': resolution: {integrity: sha512-v0CeIL/Fh8SDXA9yqk/MShpnNXzN575iBklszdtCF/VHLItVZGTmsqida2iiF78PBQ4LTe7f4thNRLsvR7YiVA==} - '@mischnic/json-sourcemap@0.1.1': - resolution: {integrity: sha512-iA7+tyVqfrATAIsIRWQG+a7ZLLD0VaOCKV2Wd/v4mqIU3J9c4jx9p7S0nw1XH3gJCKNBOOwACOPYYSUu9pgT+w==} - engines: {node: '>=12.0.0'} - '@mongodb-js/saslprep@1.2.2': resolution: {integrity: sha512-EB0O3SCSNRUFk66iRCpI+cXzIjdswfCs7F6nOC3RAGJ7xr5YhaicvsRwJ9eyzYvYRlCSDUO/c7g4yNulxKC1WA==} - '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': - resolution: {integrity: sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==} - cpu: [arm64] - os: [darwin] - - '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': - resolution: {integrity: sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==} - cpu: [x64] - os: [darwin] - - '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': - resolution: {integrity: sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==} - cpu: [arm64] - os: [linux] - - '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': - resolution: {integrity: sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==} - cpu: [arm] - os: [linux] - - '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': - resolution: {integrity: sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==} - cpu: [x64] - os: [linux] - - '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': - resolution: {integrity: sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==} - cpu: [x64] - os: [win32] + '@nodable/entities@2.2.0': + resolution: {integrity: sha512-9uGyhaQavEUMC8AIddIjau4NsnsXhou+j5sBAGojCM1oxmQpVKTWR/9JxABD6UAv12vpIms55fPZKFQEhG6uBg==} '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -1071,262 +1507,6 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@parcel/bundler-default@2.14.4': - resolution: {integrity: sha512-JVqi5Sb7wv2KCTJFAAjHbnl6KC61jKNVYw/GtZm5s/Wxqvxx2tcp93rmRoBFo9X3gSgkg8jp4HkNAUHTxnsPnQ==} - engines: {node: '>= 16.0.0', parcel: ^2.14.4} - - '@parcel/cache@2.14.4': - resolution: {integrity: sha512-CTTMySgNSgcSwbNWL4gODU1h9hMjBRyiC8/gcKDFqzw0wC/T+ZwX7wc5zNc/S9aJRTmmgvndcYKoVlds7YV2sg==} - engines: {node: '>= 16.0.0'} - peerDependencies: - '@parcel/core': ^2.14.4 - - '@parcel/codeframe@2.14.4': - resolution: {integrity: sha512-fRKkmFGnQIa/X+Kr8csTWjOwRRh2JfJfTpNS8JhbjBSWvOoKsDG9T2U5Ky8akIG7c9WDGwB3ngONauI1vtaInA==} - engines: {node: '>= 16.0.0'} - - '@parcel/compressor-raw@2.14.4': - resolution: {integrity: sha512-wYRdokznP1iI3n6M6leQ0nI65tCIWhZaD0vW3G3qodDFi+qsdpvZymCpNUkh6AYkFFr3Lur+r/+xkWDoqNoMWA==} - engines: {node: '>= 16.0.0', parcel: ^2.14.4} - - '@parcel/config-default@2.14.4': - resolution: {integrity: sha512-bHtr8yT2IZDv5w44/VKoNz07goidO99c6hsp9s0hjSVC1G6krdE+nriryPVfUFbw044LeQThSvA8EwTas72QZg==} - peerDependencies: - '@parcel/core': ^2.14.4 - - '@parcel/core@2.14.4': - resolution: {integrity: sha512-dtUMmPDXd7CRAWwMlOc6jh6yLRL4wMi/vNMNdX9J/fafCLFgFBmPqWBhQ9tlX015Q8DEcIRWYPumHIn5dzqEbg==} - engines: {node: '>= 16.0.0'} - - '@parcel/diagnostic@2.14.4': - resolution: {integrity: sha512-+pElcMMlTnpEIm9MrrSEOh38ylKYYdTYMgv2iZQU7799yzD9sSac9dkGSbbKGDYWhALCuzWQOgdaGG9ExJZw6w==} - engines: {node: '>= 16.0.0'} - - '@parcel/error-overlay@2.14.4': - resolution: {integrity: sha512-GZ6Z1XO/VYqIFNwa3iAYWX7Pskwd+xw9tPw9kjF7tG8wdL9VipkcILJ4APj/G5CKw8XrXH/6NsC7HndNbR7EqA==} - engines: {node: '>= 16.0.0'} - - '@parcel/events@2.14.4': - resolution: {integrity: sha512-QzZr291JuENw7BsehKc3z29ukLMApPdjRFcOYXFuMWaHkpC7lzFK/KAY4Mi9HCa3aQe90zCcuxZg+bBsNF9XxQ==} - engines: {node: '>= 16.0.0'} - - '@parcel/feature-flags@2.14.4': - resolution: {integrity: sha512-T2HE+lOmlU6PZOUnuXn6UZPXV4higCPgF2c2YXhrzTlSFcLMiAXATyzrylbYY/i/WjiYAlqvmEcaBX5fSaW95g==} - engines: {node: '>= 16.0.0'} - - '@parcel/fs@2.14.4': - resolution: {integrity: sha512-SQbuW6v1URv871FVj23HoC8+UUwpgkQ7iWmG7EITpp6AV42ojRr/jZ93hLjzkQQfYlRI64jUExn6AQAZDN3bqQ==} - engines: {node: '>= 16.0.0'} - peerDependencies: - '@parcel/core': ^2.14.4 - - '@parcel/graph@3.4.4': - resolution: {integrity: sha512-AIbJ8d8aCPcKAkqc45LENjAMIrp8nRGlmky5LyY5244qqnR1B+tsvU47XoGymM3OaXLdVjv8knJ4K0ci9/l/4w==} - engines: {node: '>= 16.0.0'} - - '@parcel/logger@2.14.4': - resolution: {integrity: sha512-uqSGeCqraWpbe8gqbb1k9ePrlzdKoOwkdQPcRIv8TTTWZfCt6Qcl08w8didO4iAOz4H5C4Ng82wbVO/ieaMoKg==} - engines: {node: '>= 16.0.0'} - - '@parcel/markdown-ansi@2.14.4': - resolution: {integrity: sha512-B4787HHXHi0wcuYbV4qBibws/yaX4RXoNel5xWdwzn1ZFmeLAXluNjMO2Q6FmII/Lej9OIQEaTppl7/DxJGifg==} - engines: {node: '>= 16.0.0'} - - '@parcel/namer-default@2.14.4': - resolution: {integrity: sha512-3FvZhkRgYlipj0NGRmw/rZ9ZiuM+a9ZcNW/MHRpytiNNBgcGCpR00XKhhvn0O5//MH13nLpiQXUf+J279CuN2A==} - engines: {node: '>= 16.0.0', parcel: ^2.14.4} - - '@parcel/node-resolver-core@3.5.4': - resolution: {integrity: sha512-KmmsVD8Ym+19DIbe0Y2SUbdcB+iUfgstR4dBpaogV36DlxV4d0uiia4GCpOO3kG9zlRYMVsfZEwy/NNZHELx3w==} - engines: {node: '>= 16.0.0'} - - '@parcel/optimizer-css@2.14.4': - resolution: {integrity: sha512-5rwwnsP8pnTqis5fs2YyNUvke6YprWlU8Y9pD55hK1Y1MbYmvCqaIyQv9lcpHJQiqrwsZ2pl5B3Ph5buDSQehQ==} - engines: {node: '>= 16.0.0', parcel: ^2.14.4} - - '@parcel/optimizer-htmlnano@2.14.4': - resolution: {integrity: sha512-hLVaN7ResQcgKRo9uDm7oddC4DwR7qoTFsYn4Ftj8qGbgqB2nRpCCK0R66PA/9U98LyTOlAl1J6TEvxWR+IlKw==} - engines: {node: '>= 16.0.0', parcel: ^2.14.4} - - '@parcel/optimizer-image@2.14.4': - resolution: {integrity: sha512-F5xw6ayFWOxu2XP5MI8g9khOCKNkVj4nGoXrBcgLoCKW4o07buCUKY4Sy04P3u7Leip6TOk7qpt3Q1179h6KTQ==} - engines: {node: '>= 16.0.0', parcel: ^2.14.4} - peerDependencies: - '@parcel/core': ^2.14.4 - - '@parcel/optimizer-svgo@2.14.4': - resolution: {integrity: sha512-bjZ2VHhzclBQ99SC2ZXsFKJ6zi0hXTPbGdaVblMu0iheeXcATdoNzey0eizaoSmLe9IyFJoN6gvnLdQqGfZLZg==} - engines: {node: '>= 16.0.0', parcel: ^2.14.4} - - '@parcel/optimizer-swc@2.14.4': - resolution: {integrity: sha512-7+p5ILEj2S02Rs6YzwF74g0kpAZzF9idDP9zjLVZWo9JYvoRvH0LW90bI7yKXWpKB8QOtwziqgWkcgItSIWBnA==} - engines: {node: '>= 16.0.0', parcel: ^2.14.4} - - '@parcel/package-manager@2.14.4': - resolution: {integrity: sha512-chF2rBmLtLPZe0qtbqJtq6hNGCRu0+1wFs2j5sqxr1ZttvvhRpATu/7pD+gKTFmfL7iJkOpGTU485SYmyO1xjg==} - engines: {node: '>= 16.0.0'} - peerDependencies: - '@parcel/core': ^2.14.4 - - '@parcel/packager-css@2.14.4': - resolution: {integrity: sha512-AvJhE1AQ4OcuOUtKoifhE1Y8KgYitzKMvmgsgQlwySdrkk6dz+XGHfZ9goTzIUaz9xZzwbJH7h/pvaIP8jQ9yQ==} - engines: {node: '>= 16.0.0', parcel: ^2.14.4} - - '@parcel/packager-html@2.14.4': - resolution: {integrity: sha512-rsYz3NDaKRCuQOAWGc3eYJ2GHesm62iRCQTMGlZ7Oplp748vu2c1Uee/mP43WlslvDxHtV7rzVNyo88MS6sc5w==} - engines: {node: '>= 16.0.0', parcel: ^2.14.4} - - '@parcel/packager-js@2.14.4': - resolution: {integrity: sha512-Fz98TzYFcd9xCj6jqMtyd7c3n65GRmuoG7u0S/2g4sJrR5Zen70n1zlBGX7mEoOvB5lKRijzoNqBtB+7bWqS5A==} - engines: {node: '>= 16.0.0', parcel: ^2.14.4} - - '@parcel/packager-raw-url@2.14.4': - resolution: {integrity: sha512-WWxQ1kPhRe6NUF509LEjnz+cQ0l5382dTUCHJ4terfDN8Wz49PW+Lmcd/C34NHB4lAiv456EzaBbMs7bxrIEOQ==} - engines: {node: '>= 16.0.0', parcel: ^2.14.4} - - '@parcel/packager-raw@2.14.4': - resolution: {integrity: sha512-7yDcPGsSSz4WiCWj2KoC2pNBXNislulI1RXaWyBAMzQhevQ+9D2ga/ZPgpcNjcWr8Y1tRb3QITETkTmZVHmPXQ==} - engines: {node: '>= 16.0.0', parcel: ^2.14.4} - - '@parcel/packager-svg@2.14.4': - resolution: {integrity: sha512-ja5P9PXp+v/mh+UXUXdQ1O35yr2kRqdRlytYrzmAaeILuS1ko2n3ZJoeUYYprYOh/UmLmkgbXh/DyzrhEH7TZw==} - engines: {node: '>= 16.0.0', parcel: ^2.14.4} - - '@parcel/packager-wasm@2.14.4': - resolution: {integrity: sha512-sgGCitPjl80Ku+xZIu3wCIAjOYXVEGJ00uXeexR8hgMx/PMhiHXLWUG8eLYAvxXx/CcLmHDOEBNrl6G3JxsP9g==} - engines: {node: '>=16.0.0', parcel: ^2.14.4} - - '@parcel/plugin@2.14.4': - resolution: {integrity: sha512-EcehbthkBtQ9S2jWAzIiSlodbIMZ0bSsN3PC1q9jVaCM16ueObjZohKkzMjzR6Qot91qL0EJoMLzuNvtryvpHA==} - engines: {node: '>= 16.0.0'} - - '@parcel/profiler@2.14.4': - resolution: {integrity: sha512-oZAdCDW3bYRpBOuL4coq4OQDN6HXADaSd4X8xJCeGsEsbVfJt0Qg5RgxdWC1L86mukyZMQ9ZrQUpC8aU9CAmFg==} - engines: {node: '>= 16.0.0'} - - '@parcel/reporter-cli@2.14.4': - resolution: {integrity: sha512-KgBXBiwGb9hqf3A6vw6eIqX1uYaMRjSqYXUUybGTOxonc+yB6J5q+skv1Wuty6IYuBfjNlV/zdvgggVZMl0ZxA==} - engines: {node: '>= 16.0.0', parcel: ^2.14.4} - - '@parcel/reporter-dev-server@2.14.4': - resolution: {integrity: sha512-Ezg24vHftV0El0tWcxnsGAxwSdNTMs9M+l9Nbm1k4rydx1lCoKBAhpa2Icv8vKZY8K075giww8TOkjk6zVkAmQ==} - engines: {node: '>= 16.0.0', parcel: ^2.14.4} - - '@parcel/reporter-tracer@2.14.4': - resolution: {integrity: sha512-EN+rzdEnoMuC5qbYIcuP6v1vTb/dDPrrnIEtDFEsSyuBuDfQevtOech8oHzjGEBOlC8svm+OzW/wIj2L2rmF2A==} - engines: {node: '>= 16.0.0', parcel: ^2.14.4} - - '@parcel/resolver-default@2.14.4': - resolution: {integrity: sha512-s4XKnfScF/cwqGyYG/sB4WpktIJ55dvpu64ZiglHkkPvY5wT4p7A61mTIp6ck0ZPYmeG/zfd+P0B3qPpNF5mUw==} - engines: {node: '>= 16.0.0', parcel: ^2.14.4} - - '@parcel/resolver-glob@2.14.4': - resolution: {integrity: sha512-ODEEOz76etvOKjWQF6bDEMQ3ejdZvL3lgCsM9A50IFcCgWAHw5/NMly4MSZe3d8p0HF8K4gkWVUmfbw1aEYAJg==} - engines: {node: '>= 16.0.0', parcel: ^2.14.4} - - '@parcel/runtime-browser-hmr@2.14.4': - resolution: {integrity: sha512-7o3XHOkuNy2jUH8xdKJSzIfatdAqvr/PHg9vQN0Cz4r80XCXDh1ovfz/x0Q9gpBv+LMBs+ufZ4tP+RfgJ/jKpQ==} - engines: {node: '>= 16.0.0', parcel: ^2.14.4} - - '@parcel/runtime-js@2.14.4': - resolution: {integrity: sha512-F9RvDELU/0fyV2/rHkjpPcLeKF/ZU3gnHIQnkh2Q5/41XhymyNAvMmYGPM6VpbOAnDlYeVjwfyJ41x8FOL6u4Q==} - engines: {node: '>= 16.0.0', parcel: ^2.14.4} - - '@parcel/runtime-rsc@2.14.4': - resolution: {integrity: sha512-FXoO1GWvC/yQOUYX+0rTUQVku91DSJnjegqJaiJSUOEGeJWF9mBmY/3QDkksvhwB25vJkLYsu/M5Fx83OA2u6w==} - engines: {node: '>= 12.0.0', parcel: ^2.14.4} - - '@parcel/runtime-service-worker@2.14.4': - resolution: {integrity: sha512-6+vz2DYP9tK+GHRPwW/qfUNvGOHvFpsN/Thk+tSIZ+PHT1DTWfpf02eo7fzpImdZAzllSz3m1IXgrOH00LdOKA==} - engines: {node: '>= 16.0.0', parcel: ^2.14.4} - - '@parcel/rust@2.14.4': - resolution: {integrity: sha512-Ti+ZVr8mMTgrSA7UHcFXxG98anD0C8dGzYfP1+DTgxkcU16nywTv5F/VsPqpV2qiDWrHbm06CEWQbOrowjzvVw==} - engines: {node: '>= 16.0.0'} - peerDependencies: - napi-wasm: ^1.1.2 - peerDependenciesMeta: - napi-wasm: - optional: true - - '@parcel/source-map@2.1.1': - resolution: {integrity: sha512-Ejx1P/mj+kMjQb8/y5XxDUn4reGdr+WyKYloBljpppUy8gs42T+BNoEOuRYqDVdgPc6NxduzIDoJS9pOFfV5Ew==} - engines: {node: ^12.18.3 || >=14} - - '@parcel/transformer-babel@2.14.4': - resolution: {integrity: sha512-9yMnlFuKQYgXJY8OWpcR2vSigpMm5MCEJJl6r+g3KkXHFwK1Gket2sC4Wd5JbHv98SNzJ9rdD4Xrre/eXJu6pw==} - engines: {node: '>= 16.0.0', parcel: ^2.14.4} - - '@parcel/transformer-css@2.14.4': - resolution: {integrity: sha512-sf0NuzPH4kSpL4VgV94xY5kPxoAndoNouUFPaHmN3hW6QiTHShRubfDsginSOHl5QhghSfr4qtP7t7HxCSDq6A==} - engines: {node: '>= 16.0.0', parcel: ^2.14.4} - - '@parcel/transformer-html@2.14.4': - resolution: {integrity: sha512-h0iCfU2SN+gh5LTfZTRiXHavl3CdJ2i3F9jzVrRjdH8pfLqy5eOy1tQ8vyqMsshk+VdlZ1+vUiZ7uaKkkBq/fg==} - engines: {node: '>= 16.0.0', parcel: ^2.14.4} - - '@parcel/transformer-image@2.14.4': - resolution: {integrity: sha512-QVGAdQ16YxNo7PTzBazUabmrn4dss1EDeMrh0bFUeRTZdYaYu5z/+gnRc5R4oHcHK6oxnECi808TquMQcQxDEA==} - engines: {node: '>= 16.0.0', parcel: ^2.14.4} - peerDependencies: - '@parcel/core': ^2.14.4 - - '@parcel/transformer-inline-string@2.14.4': - resolution: {integrity: sha512-WZ7bSsKavHuUOTIfJs5YH1a7NrkLGkin0HxhwQY0a9RAoxEBm56kKd4OSDIOIaCy8/wo1OZQZjbSrJD3NQvEaw==} - engines: {node: '>= 16.0.0', parcel: ^2.14.4} - - '@parcel/transformer-js@2.14.4': - resolution: {integrity: sha512-fBC8NVM8xXxjGQY5r88Z46akSErFO5hRVA4kuRI0tkXorjov3Mu4hu6MLq974TEQluSvGXUYGT5Mq2iXZ75M7w==} - engines: {node: '>= 16.0.0', parcel: ^2.14.4} - peerDependencies: - '@parcel/core': ^2.14.4 - - '@parcel/transformer-json@2.14.4': - resolution: {integrity: sha512-+28n3/qhc2q6Zoqhufk1YKU442a2JyyE0ILFsT17Of+lcNX+QtXYPOYcky7TNENnoUz9TpOAFev64P99UN7huA==} - engines: {node: '>= 16.0.0', parcel: ^2.14.4} - - '@parcel/transformer-node@2.14.4': - resolution: {integrity: sha512-K5k/GkGN4SwGdil8g10AcPPJn+hV0vzcv4l2qYoCqaxxIPCrpjmMnoA8a3kRgxvD8s54KciFYYjmU5Cj5NjvbA==} - engines: {node: '>= 16.0.0', parcel: ^2.14.4} - - '@parcel/transformer-postcss@2.14.4': - resolution: {integrity: sha512-GxkXkcgG2XGt6ivoUF5yD1tmQPV+d71gUxyBGv1i1jg4x65R12Gc/npzWk9TCH2dShSdHOA90OJpNL4k0JlLtg==} - engines: {node: '>= 16.0.0', parcel: ^2.14.4} - - '@parcel/transformer-posthtml@2.14.4': - resolution: {integrity: sha512-V9dnsA5+t7uF/hWc9HwJcaKkmP8K2go6yAQOpxu+knyszfz3t2jw/k4L/VFjqCATf90agal/iRTPVkHvWDCzZw==} - engines: {node: '>= 16.0.0', parcel: ^2.14.4} - - '@parcel/transformer-raw@2.14.4': - resolution: {integrity: sha512-GCuUWKAb9YHB/krmzBeQbtHKKZopT3c3AzoPTq/4woV4Ti1zUZ83oFyTX1tBKQ+MMB1BW+HrPkFld0iY4gp/Ng==} - engines: {node: '>= 16.0.0', parcel: ^2.14.4} - - '@parcel/transformer-react-refresh-wrap@2.14.4': - resolution: {integrity: sha512-nb70CAvjDizAIQ1naZ39P/PxYWtPllWvvxrkpldNnk8AF74OcHodrsuHKwhyPZHMmnMdexFonsenf+VeN4l/aQ==} - engines: {node: '>= 16.0.0', parcel: ^2.14.4} - - '@parcel/transformer-sass@2.14.4': - resolution: {integrity: sha512-GspG5jYpr4XmO5xa5UFBmf78og9Gx1DLbZo/KKD7hYd9DnuqtwFhvcoWsOB/TPNd4wzMjvg0yP34Kij9Bcs2vQ==} - engines: {node: '>= 16.0.0', parcel: ^2.14.4} - - '@parcel/transformer-svg@2.14.4': - resolution: {integrity: sha512-iqnyvgGmwu4wNh+khEBkMEu1hAGZWnc7/xQnhiuQBAcoy5qGNEjyVUv6PbMLWWAVK/0PjqV4FaB2deXBYKeW0A==} - engines: {node: '>= 16.0.0', parcel: ^2.14.4} - - '@parcel/transformer-webmanifest@2.14.4': - resolution: {integrity: sha512-cS+grnjeT+Vw7kkfQDeH/SAlX2YtcW3Y6voBfxxLJcHK3GMR/fw95JyAcCDEfoAX1DMM/NT5HNcqBvwyUQIoHA==} - engines: {parcel: ^2.14.4} - - '@parcel/types-internal@2.14.4': - resolution: {integrity: sha512-Y2JnljFG7KcxLrCiYNCqBfjDo12alhRVpNugm0jwz1EQ3OQNO3HYiB0f3djq6pv2clZ5ndpgkNgYsn6L7KR9Nw==} - - '@parcel/types@2.14.4': - resolution: {integrity: sha512-NL4N9M6IPwBquAo1DKOPqy66nwJLXMX3KPalzAA7ktt3HYr5YNG5h3GeVXPOLNIVVMrSIiodYGPEeEBYy6kyYA==} - - '@parcel/utils@2.14.4': - resolution: {integrity: sha512-icK6QgKjis+UZLyaHJcsKXYOSKYeYr41m8ZB9j20/yEcvrMqj/LMVsNjLz3iWVhLwfgussG2ODxycCdu3M5cvQ==} - engines: {node: '>= 16.0.0'} - '@parcel/watcher-android-arm64@2.5.1': resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} engines: {node: '>= 10.0.0'} @@ -1409,49 +1589,9 @@ packages: resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} engines: {node: '>= 10.0.0'} - '@parcel/workers@2.14.4': - resolution: {integrity: sha512-OAjW2dJOaRKy4UD5YwnUi7mY+gt/QbjagjrKh2fQDnrvuK8dpr5GrjEOLOe6QsxEE0vpe3jshhGMJTYqLni3kQ==} - engines: {node: '>= 16.0.0'} - peerDependencies: - '@parcel/core': ^2.14.4 - '@paypal/paypal-js@5.1.6': resolution: {integrity: sha512-1upF06pv0AUtTftRVSra44p8ibqGa3ruKLArvdhpZla25zcrND7R+nDUIMrJ0iteVYZowhujZStFs6NoruExfg==} - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - - '@protobufjs/aspromise@1.1.2': - resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} - - '@protobufjs/base64@1.1.2': - resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} - - '@protobufjs/codegen@2.0.4': - resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} - - '@protobufjs/eventemitter@1.1.0': - resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} - - '@protobufjs/fetch@1.1.0': - resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} - - '@protobufjs/float@1.0.2': - resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} - - '@protobufjs/inquire@1.1.0': - resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} - - '@protobufjs/path@1.1.2': - resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} - - '@protobufjs/pool@1.1.0': - resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} - - '@protobufjs/utf8@1.1.0': - resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} - '@redis/bloom@1.2.0': resolution: {integrity: sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==} peerDependencies: @@ -1481,103 +1621,186 @@ packages: peerDependencies: '@redis/client': ^1.0.0 - '@rollup/rollup-android-arm-eabi@4.40.2': - resolution: {integrity: sha512-JkdNEq+DFxZfUwxvB58tHMHBHVgX23ew41g1OQinthJ+ryhdRk67O31S7sYw8u2lTjHUPFxwar07BBt1KHp/hg==} + '@rollup/plugin-babel@6.1.0': + resolution: {integrity: sha512-dFZNuFD2YRcoomP4oYf+DvQNSUA9ih+A3vUqopQx5EdtPGo3WBnQcI/S8pwpz91UsGfL0HsMSOlaMld8HrbubA==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@babel/core': ^7.29.6 + '@types/babel__core': ^7.1.9 + rollup: '>=4.59.0' + peerDependenciesMeta: + '@types/babel__core': + optional: true + rollup: + optional: true + + '@rollup/plugin-inject@5.0.5': + resolution: {integrity: sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: '>=4.59.0' + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-node-resolve@16.0.3': + resolution: {integrity: sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: '>=4.59.0' + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-replace@6.0.3': + resolution: {integrity: sha512-J4RZarRvQAm5IF0/LwUUg+obsm+xZhYnbMXmXROyoSE1ATJe3oXSb9L5MMppdxP2ylNSjv6zFBwKYjcKMucVfA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: '>=4.59.0' + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-terser@1.0.0': + resolution: {integrity: sha512-FnCxhTBx6bMOYQrar6C8h3scPt8/JwIzw3+AJ2K++6guogH5fYaIFia+zZuhqv0eo1RN7W1Pz630SyvLbDjhtQ==} + engines: {node: '>=20.0.0'} + peerDependencies: + rollup: '>=4.59.0' + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/pluginutils@5.4.0': + resolution: {integrity: sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: '>=4.59.0' + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.62.2': + resolution: {integrity: sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.40.2': - resolution: {integrity: sha512-13unNoZ8NzUmnndhPTkWPWbX3vtHodYmy+I9kuLxN+F+l+x3LdVF7UCu8TWVMt1POHLh6oDHhnOA04n8oJZhBw==} + '@rollup/rollup-android-arm64@4.62.2': + resolution: {integrity: sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.40.2': - resolution: {integrity: sha512-Gzf1Hn2Aoe8VZzevHostPX23U7N5+4D36WJNHK88NZHCJr7aVMG4fadqkIf72eqVPGjGc0HJHNuUaUcxiR+N/w==} + '@rollup/rollup-darwin-arm64@4.62.2': + resolution: {integrity: sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.40.2': - resolution: {integrity: sha512-47N4hxa01a4x6XnJoskMKTS8XZ0CZMd8YTbINbi+w03A2w4j1RTlnGHOz/P0+Bg1LaVL6ufZyNprSg+fW5nYQQ==} + '@rollup/rollup-darwin-x64@4.62.2': + resolution: {integrity: sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.40.2': - resolution: {integrity: sha512-8t6aL4MD+rXSHHZUR1z19+9OFJ2rl1wGKvckN47XFRVO+QL/dUSpKA2SLRo4vMg7ELA8pzGpC+W9OEd1Z/ZqoQ==} + '@rollup/rollup-freebsd-arm64@4.62.2': + resolution: {integrity: sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.40.2': - resolution: {integrity: sha512-C+AyHBzfpsOEYRFjztcYUFsH4S7UsE9cDtHCtma5BK8+ydOZYgMmWg1d/4KBytQspJCld8ZIujFMAdKG1xyr4Q==} + '@rollup/rollup-freebsd-x64@4.62.2': + resolution: {integrity: sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.40.2': - resolution: {integrity: sha512-de6TFZYIvJwRNjmW3+gaXiZ2DaWL5D5yGmSYzkdzjBDS3W+B9JQ48oZEsmMvemqjtAFzE16DIBLqd6IQQRuG9Q==} + '@rollup/rollup-linux-arm-gnueabihf@4.62.2': + resolution: {integrity: sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.40.2': - resolution: {integrity: sha512-urjaEZubdIkacKc930hUDOfQPysezKla/O9qV+O89enqsqUmQm8Xj8O/vh0gHg4LYfv7Y7UsE3QjzLQzDYN1qg==} + '@rollup/rollup-linux-arm-musleabihf@4.62.2': + resolution: {integrity: sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.40.2': - resolution: {integrity: sha512-KlE8IC0HFOC33taNt1zR8qNlBYHj31qGT1UqWqtvR/+NuCVhfufAq9fxO8BMFC22Wu0rxOwGVWxtCMvZVLmhQg==} + '@rollup/rollup-linux-arm64-gnu@4.62.2': + resolution: {integrity: sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.40.2': - resolution: {integrity: sha512-j8CgxvfM0kbnhu4XgjnCWJQyyBOeBI1Zq91Z850aUddUmPeQvuAy6OiMdPS46gNFgy8gN1xkYyLgwLYZG3rBOg==} + '@rollup/rollup-linux-arm64-musl@4.62.2': + resolution: {integrity: sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.40.2': - resolution: {integrity: sha512-Ybc/1qUampKuRF4tQXc7G7QY9YRyeVSykfK36Y5Qc5dmrIxwFhrOzqaVTNoZygqZ1ZieSWTibfFhQ5qK8jpWxw==} + '@rollup/rollup-linux-loong64-gnu@4.62.2': + resolution: {integrity: sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-loong64-musl@4.62.2': + resolution: {integrity: sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.40.2': - resolution: {integrity: sha512-3FCIrnrt03CCsZqSYAOW/k9n625pjpuMzVfeI+ZBUSDT3MVIFDSPfSUgIl9FqUftxcUXInvFah79hE1c9abD+Q==} + '@rollup/rollup-linux-ppc64-gnu@4.62.2': + resolution: {integrity: sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-ppc64-musl@4.62.2': + resolution: {integrity: sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.40.2': - resolution: {integrity: sha512-QNU7BFHEvHMp2ESSY3SozIkBPaPBDTsfVNGx3Xhv+TdvWXFGOSH2NJvhD1zKAT6AyuuErJgbdvaJhYVhVqrWTg==} + '@rollup/rollup-linux-riscv64-gnu@4.62.2': + resolution: {integrity: sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.40.2': - resolution: {integrity: sha512-5W6vNYkhgfh7URiXTO1E9a0cy4fSgfE4+Hl5agb/U1sa0kjOLMLC1wObxwKxecE17j0URxuTrYZZME4/VH57Hg==} + '@rollup/rollup-linux-riscv64-musl@4.62.2': + resolution: {integrity: sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.40.2': - resolution: {integrity: sha512-B7LKIz+0+p348JoAL4X/YxGx9zOx3sR+o6Hj15Y3aaApNfAshK8+mWZEf759DXfRLeL2vg5LYJBB7DdcleYCoQ==} + '@rollup/rollup-linux-s390x-gnu@4.62.2': + resolution: {integrity: sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.40.2': - resolution: {integrity: sha512-lG7Xa+BmBNwpjmVUbmyKxdQJ3Q6whHjMjzQplOs5Z+Gj7mxPtWakGHqzMqNER68G67kmCX9qX57aRsW5V0VOng==} + '@rollup/rollup-linux-x64-gnu@4.62.2': + resolution: {integrity: sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.40.2': - resolution: {integrity: sha512-tD46wKHd+KJvsmije4bUskNuvWKFcTOIM9tZ/RrmIvcXnbi0YK/cKS9FzFtAm7Oxi2EhV5N2OpfFB348vSQRXA==} + '@rollup/rollup-linux-x64-musl@4.62.2': + resolution: {integrity: sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.40.2': - resolution: {integrity: sha512-Bjv/HG8RRWLNkXwQQemdsWw4Mg+IJ29LK+bJPW2SCzPKOUaMmPEppQlu/Fqk1d7+DX3V7JbFdbkh/NMmurT6Pg==} + '@rollup/rollup-openbsd-x64@4.62.2': + resolution: {integrity: sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.62.2': + resolution: {integrity: sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.62.2': + resolution: {integrity: sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.40.2': - resolution: {integrity: sha512-dt1llVSGEsGKvzeIO76HToiYPNPYPkmjhMHhP00T9S4rDern8P2ZWvWAQUEJ+R1UdMWJ/42i/QqJ2WV765GZcA==} + '@rollup/rollup-win32-ia32-msvc@4.62.2': + resolution: {integrity: sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.40.2': - resolution: {integrity: sha512-bwspbWB04XJpeElvsp+DCylKfF4trJDa2Y9Go8O6A7YLX2LIKGcNK/CYImJN6ZP4DcuOHB4Utl3iCbnR62DudA==} + '@rollup/rollup-win32-x64-gnu@4.62.2': + resolution: {integrity: sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.62.2': + resolution: {integrity: sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==} cpu: [x64] os: [win32] @@ -1593,9 +1816,6 @@ packages: resolution: {integrity: sha512-jjmJywLAFoWeBi1W7994zZyiNWPIiqRRNAmSERxyg93xRGzNYvGjlZ0gR6x0F4gPRi2+0O6S71kOZYyr3cxaIQ==} engines: {node: '>=v14.0.0', npm: '>=7.0.0'} - '@scarf/scarf@1.4.0': - resolution: {integrity: sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==} - '@servie/events@1.0.0': resolution: {integrity: sha512-sBSO19KzdrJCM3gdx6eIxV8M9Gxfgg6iDQmH5TIAGaUu+X9VDdsINXJOnoiZ1Kx3TrHdH4bt5UVglkjsEGBcvw==} @@ -1614,8 +1834,12 @@ packages: resolution: {integrity: sha512-+sKqDBQqb036hh4NPaUiEkYFkTUGYzRsn3EuFhyfQfMy6oGHEUJDurLP9Ufb5dasr/XiAmPNMr6wa9afjQB+Gw==} engines: {node: '>=18.0.0'} - '@smithy/config-resolver@4.1.2': - resolution: {integrity: sha512-7r6mZGwb5LmLJ+zPtkLoznf2EtwEuSWdtid10pjGl/7HefCE4mueOkrfki8JCUm99W6UfP47/r3tbxx9CfBN5A==} + '@smithy/config-resolver@4.6.1': + resolution: {integrity: sha512-VgMsljDnHwHjJQAvLmkaOc1d3On5/2Zh1/21++9FFhYS9YKMnGgolJF73EU3QfFPSzK5jTTFlGk3em0hiRKtwg==} + engines: {node: '>=18.0.0'} + + '@smithy/core@3.25.1': + resolution: {integrity: sha512-zpDbpXBCBsxfLtG2GEUyfgvHvSFrw5CwDZSNzL0v52gx/c3oPlPbm+7W7num8xs6vyiUBn+bvYPHcQDOXZynCQ==} engines: {node: '>=18.0.0'} '@smithy/core@3.3.1': @@ -1738,6 +1962,10 @@ packages: resolution: {integrity: sha512-oolSEpr/ABUtVmFMdNgi6sSXsK4csV9n4XM9yXgvDJGRa32tQDUdv9s+ztFZKccay1AiTWLSGsyDj2xy1gsv7Q==} engines: {node: '>=18.0.0'} + '@smithy/types@4.15.0': + resolution: {integrity: sha512-Z5TAOxygoFvybJV3igo5SloFflSokHx2hu1eFA+DxDTcn+FtKxUSui+rbTRG1pAafMA888Z3MVvCWUuvCrTXjg==} + engines: {node: '>=18.0.0'} + '@smithy/types@4.2.0': resolution: {integrity: sha512-7eMk09zQKCO+E/ivsjQv+fDlOupcFUCSC/L2YUPgwhvowVGWbPQHjEFcmjt7QQ4ra5lyowS92SV53Zc6XD4+fg==} engines: {node: '>=18.0.0'} @@ -1819,105 +2047,27 @@ packages: peerDependencies: solid-js: ^1.8.6 - '@swc/core-darwin-arm64@1.11.24': - resolution: {integrity: sha512-dhtVj0PC1APOF4fl5qT2neGjRLgHAAYfiVP8poJelhzhB/318bO+QCFWAiimcDoyMgpCXOhTp757gnoJJrheWA==} - engines: {node: '>=10'} - cpu: [arm64] - os: [darwin] + '@thisbeyond/solid-dnd@0.7.5': + resolution: {integrity: sha512-DfI5ff+yYGpK9M21LhYwIPlbP2msKxN2ARwuu6GF8tT1GgNVDTI8VCQvH4TJFoVApP9d44izmAcTh/iTCH2UUw==} + engines: {node: '>=18.0.0', pnpm: '>=8.6.0'} + peerDependencies: + solid-js: ^1.5 - '@swc/core-darwin-x64@1.11.24': - resolution: {integrity: sha512-H/3cPs8uxcj2Fe3SoLlofN5JG6Ny5bl8DuZ6Yc2wr7gQFBmyBkbZEz+sPVgsID7IXuz7vTP95kMm1VL74SO5AQ==} - engines: {node: '>=10'} - cpu: [x64] - os: [darwin] + '@trickfilm400/rollup-plugin-off-main-thread@3.0.0-pre1': + resolution: {integrity: sha512-/67zpWDBLV+oYAEL682s1ktXL0HgqX76f6gaVGkGnVZlBbm1zd0v4Bz8MFF2GGhoX9rvfq3KSQHubFHwa6w6/Q==} + engines: {node: '>=12'} - '@swc/core-linux-arm-gnueabihf@1.11.24': - resolution: {integrity: sha512-PHJgWEpCsLo/NGj+A2lXZ2mgGjsr96ULNW3+T3Bj2KTc8XtMUkE8tmY2Da20ItZOvPNC/69KroU7edyo1Flfbw==} - engines: {node: '>=10'} - cpu: [arm] - os: [linux] + '@types/adm-zip@0.5.7': + resolution: {integrity: sha512-DNEs/QvmyRLurdQPChqq0Md4zGvPwHerAJYWk9l2jCbD1VPpnzRJorOdiq4zsw09NFbYnhfsoEhWtxIzXpn2yw==} - '@swc/core-linux-arm64-gnu@1.11.24': - resolution: {integrity: sha512-C2FJb08+n5SD4CYWCTZx1uR88BN41ZieoHvI8A55hfVf2woT8+6ZiBzt74qW2g+ntZ535Jts5VwXAKdu41HpBg==} - engines: {node: '>=10'} - cpu: [arm64] - os: [linux] + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} - '@swc/core-linux-arm64-musl@1.11.24': - resolution: {integrity: sha512-ypXLIdszRo0re7PNNaXN0+2lD454G8l9LPK/rbfRXnhLWDBPURxzKlLlU/YGd2zP98wPcVooMmegRSNOKfvErw==} - engines: {node: '>=10'} - cpu: [arm64] - os: [linux] + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} - '@swc/core-linux-x64-gnu@1.11.24': - resolution: {integrity: sha512-IM7d+STVZD48zxcgo69L0yYptfhaaE9cMZ+9OoMxirNafhKKXwoZuufol1+alEFKc+Wbwp+aUPe/DeWC/Lh3dg==} - engines: {node: '>=10'} - cpu: [x64] - os: [linux] - - '@swc/core-linux-x64-musl@1.11.24': - resolution: {integrity: sha512-DZByJaMVzSfjQKKQn3cqSeqwy6lpMaQDQQ4HPlch9FWtDx/dLcpdIhxssqZXcR2rhaQVIaRQsCqwV6orSDGAGw==} - engines: {node: '>=10'} - cpu: [x64] - os: [linux] - - '@swc/core-win32-arm64-msvc@1.11.24': - resolution: {integrity: sha512-Q64Ytn23y9aVDKN5iryFi8mRgyHw3/kyjTjT4qFCa8AEb5sGUuSj//AUZ6c0J7hQKMHlg9do5Etvoe61V98/JQ==} - engines: {node: '>=10'} - cpu: [arm64] - os: [win32] - - '@swc/core-win32-ia32-msvc@1.11.24': - resolution: {integrity: sha512-9pKLIisE/Hh2vJhGIPvSoTK4uBSPxNVyXHmOrtdDot4E1FUUI74Vi8tFdlwNbaj8/vusVnb8xPXsxF1uB0VgiQ==} - engines: {node: '>=10'} - cpu: [ia32] - os: [win32] - - '@swc/core-win32-x64-msvc@1.11.24': - resolution: {integrity: sha512-sybnXtOsdB+XvzVFlBVGgRHLqp3yRpHK7CrmpuDKszhj/QhmsaZzY/GHSeALlMtLup13M0gqbcQvsTNlAHTg3w==} - engines: {node: '>=10'} - cpu: [x64] - os: [win32] - - '@swc/core@1.11.24': - resolution: {integrity: sha512-MaQEIpfcEMzx3VWWopbofKJvaraqmL6HbLlw2bFZ7qYqYw3rkhM0cQVEgyzbHtTWwCwPMFZSC2DUbhlZgrMfLg==} - engines: {node: '>=10'} - peerDependencies: - '@swc/helpers': '>=0.5.17' - peerDependenciesMeta: - '@swc/helpers': - optional: true - - '@swc/counter@0.1.3': - resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - - '@swc/helpers@0.5.17': - resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} - - '@swc/types@0.1.21': - resolution: {integrity: sha512-2YEtj5HJVbKivud9N4bpPBAyZhj4S2Ipe5LkUG94alTpr7in/GU/EARgPAd3BwU+YOmFVJC2+kjqhGRi3r0ZpQ==} - - '@thisbeyond/solid-dnd@0.7.5': - resolution: {integrity: sha512-DfI5ff+yYGpK9M21LhYwIPlbP2msKxN2ARwuu6GF8tT1GgNVDTI8VCQvH4TJFoVApP9d44izmAcTh/iTCH2UUw==} - engines: {node: '>=18.0.0', pnpm: '>=8.6.0'} - peerDependencies: - solid-js: ^1.5 - - '@trysound/sax@0.2.0': - resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} - engines: {node: '>=10.13.0'} - - '@types/adm-zip@0.5.7': - resolution: {integrity: sha512-DNEs/QvmyRLurdQPChqq0Md4zGvPwHerAJYWk9l2jCbD1VPpnzRJorOdiq4zsw09NFbYnhfsoEhWtxIzXpn2yw==} - - '@types/babel__core@7.20.5': - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} - - '@types/babel__generator@7.27.0': - resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} - - '@types/babel__template@7.4.4': - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} '@types/babel__traverse@7.20.7': resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} @@ -1958,6 +2108,9 @@ packages: '@types/estree@1.0.7': resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + '@types/express-serve-static-core@4.19.6': resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==} @@ -1991,12 +2144,6 @@ packages: '@types/jsonwebtoken@9.0.9': resolution: {integrity: sha512-uoe+GxEuHbvy12OUQct2X9JenKM3qAscquYymuQN4fMWG9DBQtykrQEFcAbVACF7qaLw9BePSodUL0kquqBJpQ==} - '@types/localtunnel@2.0.4': - resolution: {integrity: sha512-7WM5nlEfEKp8MpwthPa2utdy+f/7ZBxMPzu8qw6EijFFTcpzh5CXgt2YoncxWAZNOPNieMofXCKFudtDEY4bag==} - - '@types/long@4.0.2': - resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} - '@types/mime@1.3.5': resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} @@ -2033,6 +2180,9 @@ packages: '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + '@types/resolve@1.20.2': + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + '@types/send@0.17.4': resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} @@ -2127,8 +2277,8 @@ packages: '@xenova/transformers@2.17.2': resolution: {integrity: sha512-lZmHqzrVIkSvZdKZEx7IYY51TK0WDrC8eR0c5IMnBsO8di8are1zzw8BlLhyO2TklZKLN5UffNGs1IJwT6oOqQ==} - '@xmldom/xmldom@0.9.8': - resolution: {integrity: sha512-p96FSY54r+WJ50FIOsCOjyj/wavs8921hG5+kVMmZgKcvIKxMXHTrjNJvRgWa/zuX3B6t2lijLNFaOyuxUH+2A==} + '@xmldom/xmldom@0.9.10': + resolution: {integrity: sha512-A9gOqLdi6cV4ibazAjcQufGj0B1y/vDqYrcuP6d/6x8P27gRS8643Dj9o1dEKtB6O7fwxb2FgBmJS2mX7gpvdw==} engines: {node: '>=14.6'} '@xtuc/ieee754@1.2.0': @@ -2161,7 +2311,7 @@ packages: ajv-formats@2.1.1: resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} peerDependencies: - ajv: ^8.0.0 + ajv: '>=8.18.0' peerDependenciesMeta: ajv: optional: true @@ -2169,18 +2319,15 @@ packages: ajv-keywords@3.5.2: resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} peerDependencies: - ajv: ^6.9.1 + ajv: '>=8.18.0' ajv-keywords@5.1.0: resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} peerDependencies: - ajv: ^8.8.2 - - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv: '>=8.18.0' - ajv@8.17.1: - resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} @@ -2190,10 +2337,6 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.1.0: - resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} - engines: {node: '>=12'} - ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -2202,10 +2345,6 @@ packages: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} @@ -2213,6 +2352,9 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} + anynum@1.0.1: + resolution: {integrity: sha512-N6//FLET/tXYNM/F6ABca1oH6fWB+KlTt909Le28WMDBk8oaT4vY17DCrwg2MvmuqUKt3Ni4N5dGJ/EoBgcO6A==} + app-root-path@3.1.0: resolution: {integrity: sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==} engines: {node: '>= 6.0.0'} @@ -2223,15 +2365,20 @@ packages: arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} - argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + asn1.js@4.10.1: resolution: {integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==} @@ -2241,6 +2388,17 @@ packages: assertion-error@1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + atomic-sleep@1.0.0: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} @@ -2249,9 +2407,6 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} - axios@0.21.4: - resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} - b4a@1.6.7: resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} @@ -2262,20 +2417,36 @@ packages: babel-plugin-jsx-dom-expressions@0.39.8: resolution: {integrity: sha512-/MVOIIjonylDXnrWmG23ZX82m9mtKATsVHB7zYlPfDR9Vdd/NBE48if+wv27bSkBtyO7EPMUlcUc4J63QwuACQ==} peerDependencies: - '@babel/core': ^7.20.12 + '@babel/core': ^7.29.6 + + babel-plugin-polyfill-corejs2@0.4.17: + resolution: {integrity: sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==} + peerDependencies: + '@babel/core': ^7.29.6 + + babel-plugin-polyfill-corejs3@0.14.2: + resolution: {integrity: sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g==} + peerDependencies: + '@babel/core': ^7.29.6 + + babel-plugin-polyfill-regenerator@0.6.8: + resolution: {integrity: sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==} + peerDependencies: + '@babel/core': ^7.29.6 babel-preset-current-node-syntax@1.1.0: resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} peerDependencies: - '@babel/core': ^7.0.0 + '@babel/core': ^7.29.6 babel-preset-solid@1.9.6: resolution: {integrity: sha512-HXTK9f93QxoH8dYn1M2mJdOlWgMsR88Lg/ul6QCZGkNTktjTE5HAf93YxQumHoCudLEtZrU1cFCMFOVho6GqFg==} peerDependencies: - '@babel/core': ^7.0.0 + '@babel/core': ^7.29.6 - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} bare-events@2.5.4: resolution: {integrity: sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==} @@ -2307,12 +2478,14 @@ packages: bare-events: optional: true - base-x@3.0.11: - resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} - base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + baseline-browser-mapping@2.10.40: + resolution: {integrity: sha512-BSSLZ9/Cjjv7Gtj5B68ZzXcXUg8iOf3fme+FCuh8rC/Go+Kmh8cox7M3A8dolou16s64QjLPOSdngh7GxXvkSw==} + engines: {node: '>=6.0.0'} + hasBin: true + bcryptjs@2.4.3: resolution: {integrity: sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==} @@ -2326,14 +2499,8 @@ packages: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} - bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - - bn.js@4.12.2: - resolution: {integrity: sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==} - - bn.js@5.2.2: - resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} + bn.js@5.2.3: + resolution: {integrity: sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==} body-parser@1.20.3: resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} @@ -2345,11 +2512,9 @@ packages: bowser@2.11.0: resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@5.0.6: + resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} + engines: {node: 18 || 20 || >=22} braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} @@ -2358,6 +2523,9 @@ packages: brorand@1.1.0: resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + browser-resolve@2.0.0: + resolution: {integrity: sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==} + browser-stdout@1.3.1: resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} @@ -2386,6 +2554,11 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + browserslist@4.28.4: + resolution: {integrity: sha512-MTc8i/x9jBQd1iMw2CFGS+rwMa07eYjLR0CCTLDACl9xhxy+nIs3KeML/biicXtk9JrZ6dnnTatmc7ErPXIxqw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + bser@2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} @@ -2433,14 +2606,14 @@ packages: resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} engines: {node: '>= 0.4'} + call-bind@1.0.9: + resolution: {integrity: sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==} + engines: {node: '>= 0.4'} + call-bound@1.0.4: resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} engines: {node: '>= 0.4'} - callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - camelcase-css@2.0.1: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} @@ -2460,6 +2633,9 @@ packages: caniuse-lite@1.0.30001717: resolution: {integrity: sha512-auPpttCq6BDEG8ZAuHJIplGw6GODhjw+/11e7IjpnYCxZcW/ONgPs0KVBJ0d1bY3e2+7PRe5RCLyP+PfwVgkYw==} + caniuse-lite@1.0.30001799: + resolution: {integrity: sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==} + chai@4.5.0: resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} engines: {node: '>=4'} @@ -2482,9 +2658,6 @@ packages: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} - chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - chrome-trace-event@1.0.4: resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} engines: {node: '>=6.0'} @@ -2508,10 +2681,6 @@ packages: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} - clone@2.1.2: - resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} - engines: {node: '>=0.8'} - cluster-key-slot@1.1.2: resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} engines: {node: '>=0.10.0'} @@ -2540,10 +2709,6 @@ packages: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} - commander@12.1.0: - resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} - engines: {node: '>=18'} - commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -2559,8 +2724,9 @@ packages: resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} engines: {node: ^12.20.0 || >=14} - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + common-tags@1.8.2: + resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} + engines: {node: '>=4.0.0'} concat-stream@1.6.2: resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} @@ -2571,6 +2737,12 @@ packages: engines: {node: ^12.20.0 || ^14.13.0 || >=16.0.0} hasBin: true + console-browserify@1.2.0: + resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==} + + constants-browserify@1.0.0: + resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==} + content-disposition@0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} @@ -2589,6 +2761,9 @@ packages: resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} engines: {node: '>= 0.6'} + core-js-compat@3.49.0: + resolution: {integrity: sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==} + core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -2596,15 +2771,6 @@ packages: resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} engines: {node: '>= 0.10'} - cosmiconfig@9.0.0: - resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} - engines: {node: '>=14'} - peerDependencies: - typescript: '>=4.9.5' - peerDependenciesMeta: - typescript: - optional: true - crc-32@0.3.0: resolution: {integrity: sha512-kucVIjOmMc1f0tv53BJ/5WIX+MGLcKuoBhnGqQrgKJNqLByb/sVMWfW/Aw6hw0jgcqjJ2pi9E5y32zOIpaUlsA==} engines: {node: '>=0.8'} @@ -2618,13 +2784,12 @@ packages: create-hmac@1.1.7: resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + cross-fetch@3.2.0: resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} - cross-spawn@7.0.6: - resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} - engines: {node: '>= 8'} - crypto-browserify@3.12.1: resolution: {integrity: sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==} engines: {node: '>= 0.10'} @@ -2632,6 +2797,10 @@ packages: crypto-js@4.2.0: resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} + crypto-random-string@2.0.0: + resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} + engines: {node: '>=8'} + css-select@5.1.0: resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} @@ -2671,6 +2840,18 @@ packages: dagre@0.8.5: resolution: {integrity: sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==} + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + date-fns@2.30.0: resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} engines: {node: '>=0.11'} @@ -2686,8 +2867,8 @@ packages: supports-color: optional: true - debug@4.3.2: - resolution: {integrity: sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==} + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -2695,8 +2876,8 @@ packages: supports-color: optional: true - debug@4.4.0: - resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -2720,9 +2901,9 @@ packages: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} - deepmerge-ts@5.1.0: - resolution: {integrity: sha512-eS8dRJOckyo9maw9Tu5O5RUi/4inFLrnoLkBe3cPfDMx3WZioXtmOew4TXQaxq7Rhl4xjDtR7c6x8nNTxOvbFw==} - engines: {node: '>=16.0.0'} + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} @@ -2759,8 +2940,8 @@ packages: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - diff@5.2.0: - resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + diff@9.0.0: + resolution: {integrity: sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw==} engines: {node: '>=0.3.1'} diffie-hellman@5.0.3: @@ -2776,36 +2957,26 @@ packages: dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} - dom-serializer@1.4.1: - resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} - dom-serializer@2.0.0: resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + domain-browser@4.22.0: + resolution: {integrity: sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw==} + engines: {node: '>=10'} + domelementtype@2.3.0: resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - domhandler@4.3.1: - resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} - engines: {node: '>= 4'} - domhandler@5.0.3: resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} engines: {node: '>= 4'} - dompurify@3.2.5: - resolution: {integrity: sha512-mLPd29uoRe9HpvwP2TxClGQBzGXeEC/we/q+bFlmPPmj2p2Ugl3r6ATu/UU1v77DXNcehiBg9zsr1dREyA/dJQ==} - - domutils@2.8.0: - resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + dompurify@3.4.11: + resolution: {integrity: sha512-zhlUV12GsaRzMsf9q5M254YhA4+VuF0fG+QFqu6aYpoGlKtz+w8//jBcGVYBgQkR5GHjUomejY84AV+/uPbWdw==} domutils@3.2.2: resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} - dotenv-expand@11.0.7: - resolution: {integrity: sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==} - engines: {node: '>=12'} - dotenv@16.5.0: resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==} engines: {node: '>=12'} @@ -2814,9 +2985,6 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - easy-speech@2.4.0: resolution: {integrity: sha512-wpMv29DEoeP/eyXr4aXpDqd9DvlXl7aQs7BgfKbjGVxqkmQPgNmpbF5YULaTH5bc/5qrteg5MDfCD2Zd0qr4rQ==} engines: {node: '>= 14.x'} @@ -2827,18 +2995,23 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + electron-to-chromium@1.5.151: resolution: {integrity: sha512-Rl6uugut2l9sLojjS4H4SAr3A4IgACMLgpuEMPYCVcKydzfyPrn5absNRju38IhQOf/NwjJY8OGWjlteqYeBCA==} + electron-to-chromium@1.5.378: + resolution: {integrity: sha512-VinvOAuuPmdD1guEgGv5f2Qp7/vlfqOrUOMYNnOD4wj3pit8kRsQHzfIf6teyUGWo15Tg5+bOJaRunvyltpVWQ==} + elliptic@6.6.1: resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - emojis-list@3.0.0: resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} engines: {node: '>= 4'} @@ -2858,13 +3031,6 @@ packages: resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} engines: {node: '>=10.13.0'} - entities@2.2.0: - resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} - - entities@3.0.1: - resolution: {integrity: sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==} - engines: {node: '>=0.12'} - entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -2873,12 +3039,13 @@ packages: resolution: {integrity: sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==} engines: {node: '>=0.12'} - env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} + es-abstract-get@1.0.0: + resolution: {integrity: sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==} + engines: {node: '>= 0.4'} - error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + es-abstract@1.24.2: + resolution: {integrity: sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==} + engines: {node: '>= 0.4'} es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} @@ -2895,9 +3062,21 @@ packages: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} - esbuild@0.21.5: - resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} - engines: {node: '>=12'} + es-object-atoms@1.1.2: + resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.3.3: + resolution: {integrity: sha512-3OJmZ3m4VNhTWEfn/bPv7yoSd/7Kx0MYdm27o7SqgS45l03O4purW3zO4B/4JroAWHluvmQaXqrPXFtT4IKYEw==} + engines: {node: '>= 0.4'} + + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + engines: {node: '>=18'} hasBin: true escalade@3.2.0: @@ -2919,11 +3098,6 @@ packages: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} - esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} @@ -2936,6 +3110,17 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + eta@4.6.0: + resolution: {integrity: sha512-lW6is4T1NFOYnmqGZIfvixqj7A7sSvScF+DN8EK6K58xI5MZ5UvYe0GjopxOXQtZvUn4eDdVuZ8XSoYWTMEKwA==} + engines: {node: '>=20'} + etag@1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} @@ -2954,8 +3139,9 @@ packages: evtstore@12.0.1: resolution: {integrity: sha512-a7ryRcTYvLNVdtLhgL8T2qsxxVPru2YijFP4cxbo2/gmStHfQhXLKZaR5BFEC0PfOSxfIDrwnvRUECR3/2C/1A==} - exifreader@4.30.1: - resolution: {integrity: sha512-XoEKKQ0FmJwCKHnuErceFAM+MSfZ+px7Nci5BhBP1cgEHi/fHSBvQySsdfd0MaFHzNh8ITsRNwpnvkMuIPicrg==} + exifreader@4.41.0: + resolution: {integrity: sha512-P3nPeh6GWs5D5RZdRZ6q/LorHPmmeDgKsowduqRabtTFiqMD2bc5eTN+Dhq00O9BCuV2eksu3oOJh4ZaZvkK0A==} + hasBin: true expand-template@2.0.3: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} @@ -2995,11 +3181,14 @@ packages: fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - fast-uri@3.0.6: - resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} + fast-uri@4.0.0: + resolution: {integrity: sha512-l90y339r2DkZs/ldcWQXcwTjkbp/NbuJDGYoQ3awBgaT3GXOFkm3OkVpz6Z86TywYcya0eVP2r1kTV90f3krGQ==} - fast-xml-parser@4.4.1: - resolution: {integrity: sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==} + fast-xml-builder@1.2.0: + resolution: {integrity: sha512-00aAWieqff+ZJhsXA4g1g7M8k+7AYoMUUHF+/zFb5U6Uv/P0Vl4QZo84/IcufzYalLuEj9928bXN9PbbFzMF0Q==} + + fast-xml-parser@5.9.3: + resolution: {integrity: sha512-brCNCeScma/kqa54J4PIDriSSSLssRkuYaUCpvHJulGc3HGI/xxKUCTDcYkAdqJsyb//ydpbxecjC3hB9+tb/g==} hasBin: true fastq@1.19.1: @@ -3008,6 +3197,18 @@ packages: fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: '>=2.3.2' + peerDependenciesMeta: + picomatch: + optional: true + + filelist@1.0.6: + resolution: {integrity: sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==} + fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -3034,23 +3235,10 @@ packages: flatbuffers@1.12.0: resolution: {integrity: sha512-c7CZADjRcl6j0PlvFy0ZqXQ67qSEZfrVPynmnL+2zPc+NtMvrF8Y0QceMo7QqnSPc7+uWjUIAbvCQ5WIKlMVdQ==} - follow-redirects@1.15.9: - resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - for-each@0.3.5: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} - foreground-child@3.3.1: - resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} - engines: {node: '>=14'} - forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} @@ -3062,11 +3250,9 @@ packages: frisker@1.7.0: resolution: {integrity: sha512-p0udqOocipf++8y4Mp7DnJreiJBoJxrqY66hSOcePRas9GYAK9xsZ9OWVrXtLhHrugnIPvPC6CkPtl0gZixcTg==} - fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} @@ -3076,6 +3262,13 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + function.prototype.name@1.2.0: + resolution: {integrity: sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + gaxios@6.7.1: resolution: {integrity: sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==} engines: {node: '>=14'} @@ -3103,18 +3296,21 @@ packages: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} + get-own-enumerable-property-symbols@3.0.2: + resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} + get-package-type@0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} - get-port@4.2.0: - resolution: {integrity: sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw==} - engines: {node: '>=6'} - get-proto@1.0.1: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + github-from-package@0.0.0: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} @@ -3129,26 +3325,17 @@ packages: glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - glob@10.4.5: - resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} - hasBin: true - - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported - - glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - deprecated: Glob versions prior to v9 are no longer supported + glob@13.0.6: + resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} + engines: {node: 18 || 20 || >=22} globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} - globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} globrex@0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} @@ -3181,6 +3368,10 @@ packages: guid-typescript@1.0.9: resolution: {integrity: sha512-Y8T4vYhEfwJOTbouREvG+3XDsjr8E3kIr7uf+JZ0BYloFsttiHU0WfvANVsR7TxNUJa/WpCnw/Ino/p+DeBhBQ==} + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} @@ -3192,6 +3383,10 @@ packages: has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + has-symbols@1.1.0: resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} @@ -3204,6 +3399,10 @@ packages: resolution: {integrity: sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==} engines: {node: '>= 0.10'} + hash-base@3.1.2: + resolution: {integrity: sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg==} + engines: {node: '>= 0.8'} + hash.js@1.1.7: resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} @@ -3211,6 +3410,10 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + hasown@2.0.4: + resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} + engines: {node: '>= 0.4'} + he@1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true @@ -3228,41 +3431,6 @@ packages: html-entities@2.3.3: resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==} - htmlnano@2.1.2: - resolution: {integrity: sha512-8Fst+0bhAfU362S6oHVb4wtJj/UYEFr0qiCLAEi8zioqmp1JYBQx5crZAADlFVX0Ly/6s/IQz6G7PL9/hgoJaQ==} - peerDependencies: - cssnano: ^7.0.0 - postcss: ^8.3.11 - purgecss: ^7.0.2 - relateurl: ^0.2.7 - srcset: 5.0.1 - svgo: ^3.0.2 - terser: ^5.10.0 - uncss: ^0.17.3 - peerDependenciesMeta: - cssnano: - optional: true - postcss: - optional: true - purgecss: - optional: true - relateurl: - optional: true - srcset: - optional: true - svgo: - optional: true - terser: - optional: true - uncss: - optional: true - - htmlparser2@7.2.0: - resolution: {integrity: sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==} - - htmlparser2@9.1.0: - resolution: {integrity: sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==} - http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} @@ -3286,6 +3454,9 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} + idb@7.1.1: + resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} + ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -3295,21 +3466,13 @@ packages: immediate@3.0.6: resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} - immutable@5.1.2: - resolution: {integrity: sha512-qHKXW1q6liAk1Oys6umoaZbDRqjcjgSrbnrifHsfsttza7zcvRAsL7mMV6xWcyhwQy7Xj5v4hhbr6b+iDYwlmQ==} - - import-fresh@3.3.1: - resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} - engines: {node: '>=6'} + immutable@5.1.6: + resolution: {integrity: sha512-q1swsS8K7L8usSHuOqF2TAoCCkonYz0SG38wLAggaa4Wml70zixIvt2ql4coQ2C2B3hTjltJry4r6bULwgAXLQ==} imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - infobox-parser@3.6.2: resolution: {integrity: sha512-lasdwvbtjCtDDO6mArAs/ueFEnBJRyo2UbZPAkd5rEG5NVJ3XFCOvbMwNTT/rJlFv1+ORw8D3UvZV4brpgATCg==} @@ -3319,8 +3482,12 @@ packages: ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - ip-address@9.0.5: - resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + + ip-address@10.2.0: + resolution: {integrity: sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==} engines: {node: '>= 12'} ipaddr.js@1.9.1: @@ -3331,16 +3498,29 @@ packages: resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} engines: {node: '>= 0.4'} - is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} is-arrayish@0.3.2: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} @@ -3349,10 +3529,26 @@ packages: resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + + is-document.all@1.0.0: + resolution: {integrity: sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==} + engines: {node: '>= 0.4'} + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} @@ -3365,17 +3561,33 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - is-json@2.0.1: - resolution: {integrity: sha512-6BEnpVn1rcf3ngfmViLM6vjUjGErbdrL4rwlv+u1NO1XO8kqT4YGL8+19Q+Z/bas8tY90BTWMk2+fW1g6hQjbA==} + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} is-nan@1.3.2: resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} engines: {node: '>= 0.4'} + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + is-obj@1.0.1: + resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} + engines: {node: '>=0.10.0'} + is-plain-obj@2.1.0: resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} engines: {node: '>=8'} @@ -3384,10 +3596,30 @@ packages: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} + is-regexp@1.0.0: + resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} + engines: {node: '>=0.10.0'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + is-typed-array@1.1.15: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} @@ -3396,6 +3628,21 @@ packages: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} + is-unsafe@1.0.1: + resolution: {integrity: sha512-CLK2+VdgERgD96EYm5lUQssZYlRg2tkZnbsxZoacmSiRxiFJ4Nk4SzjCl+Ur+v3kXIY9dTIdb3IH22y1mZ56LA==} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + is-what@4.1.16: resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} engines: {node: '>=12.13'} @@ -3403,8 +3650,12 @@ packages: isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isomorphic-timers-promises@1.0.1: + resolution: {integrity: sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ==} + engines: {node: '>=10'} istanbul-lib-coverage@3.2.2: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} @@ -3414,8 +3665,10 @@ packages: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} - jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + jake@10.9.4: + resolution: {integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==} + engines: {node: '>=10'} + hasBin: true jest-diff@29.7.0: resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} @@ -3465,9 +3718,8 @@ packages: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} - js-cookie@3.0.5: - resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} - engines: {node: '>=14'} + js-cookie@3.0.8: + resolution: {integrity: sha512-yeJd4aNAdYZQjaon2bpD/Gb0B/omw7HQOsynXXcOiWVCacbBcPlgn8S/d1X6blFSaHao7ozqtW7NZW19xpCtIw==} js-tiktoken@1.0.20: resolution: {integrity: sha512-Xlaqhhs8VfCd6Sh7a1cFkZHQbYTLCwVJJWiHVxBYzLPxW0XsoxBy1hitmjkdIjD3Aon5BXLHFwU5O8WUx6HH+A==} @@ -3475,17 +3727,10 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + js-yaml@5.0.0: + resolution: {integrity: sha512-GSvaPUbk1U+FMZ7rJzF+F8e5YVtu7KnD40et/5rBXXRBv2jCO9L3qCewvIDDdudC0QycTFlf6EAA+h3kxBsuUw==} hasBin: true - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - jsbn@1.1.0: - resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} - jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} @@ -3497,9 +3742,6 @@ packages: json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} @@ -3508,21 +3750,26 @@ packages: engines: {node: '>=6'} hasBin: true + jsonfile@6.2.1: + resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==} + + jsonpointer@5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} + engines: {node: '>=0.10.0'} + jsonwebtoken@9.0.2: resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} engines: {node: '>=12', npm: '>=6'} - jwa@1.4.2: - resolution: {integrity: sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==} - jwa@2.0.1: resolution: {integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==} - jws@3.2.2: - resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} + jws@4.0.1: + resolution: {integrity: sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==} - jws@4.0.0: - resolution: {integrity: sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==} + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} libsodium-sumo@0.7.15: resolution: {integrity: sha512-5tPmqPmq8T8Nikpm1Nqj0hBHvsLFCXvdhBFV7SGOitQPZAA6jso8XoL0r4L7vmfKXr486fiQInvErHtEvizFMw==} @@ -3604,10 +3851,6 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - lmdb@2.8.5: - resolution: {integrity: sha512-9bMdFfc80S+vSldBmG3HOuLVHnxRdNTlpzR6QDnzqCQtCzGUEAGTzBKYMeIM+I/sU4oZfgbcbS7X7F65/z/oxQ==} - hasBin: true - loader-runner@4.3.0: resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} engines: {node: '>=6.11.5'} @@ -3619,11 +3862,6 @@ packages: localforage@1.10.0: resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==} - localtunnel@2.0.2: - resolution: {integrity: sha512-n418Cn5ynvJd7m/N1d9WVJISLJF/ellZnfsLnx8WBWGzxv/ntNcFkJ1o6se5quUhCplfLGBNL5tYHiq5WF3Nug==} - engines: {node: '>=8.3.0'} - hasBin: true - locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -3632,6 +3870,9 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + lodash.includes@4.3.0: resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} @@ -3656,8 +3897,11 @@ packages: lodash.snakecase@4.1.1: resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + + lodash@4.18.1: + resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} log-symbols@4.1.0: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} @@ -3666,23 +3910,25 @@ packages: long@4.0.0: resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} + long@5.3.2: + resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + loupe@2.3.7: resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@11.5.1: + resolution: {integrity: sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==} + engines: {node: 20 || >=22} lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - lucide-solid@0.356.0: - resolution: {integrity: sha512-s1sMreftM+Ha7PnSe/jJXu+FjIYQaklDkUfYFiUztlQZVY81XJl9ZQHS6kUge1sa8QYz/7Xd0hKn3M1njGfN/g==} - peerDependencies: - solid-js: ^1.4.7 - magic-bytes.js@1.12.1: resolution: {integrity: sha512-ThQLOhN86ZkJ7qemtVRGYM+gRgR8GEXNli9H/PMvpnZsE44Xfh3wx9kGJaldg314v85m+bFW6WBMaVHJc/c3zA==} + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + make-error-cause@2.3.0: resolution: {integrity: sha512-etgt+n4LlOkGSJbBTV9VROHA5R7ekIPS4vfh+bCAoJgRrJWdqJCBbpS3osRJ/HrT7R68MzMiY3L3sDJ/Fd8aBg==} @@ -3761,22 +4007,15 @@ packages: minimalistic-crypto-utils@1.0.1: resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} - - minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} - engines: {node: '>=16 || 14 >=14.17'} + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} engines: {node: '>=16 || 14 >=14.17'} mix-css-color@0.2.0: @@ -3835,19 +4074,9 @@ packages: ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - msgpackr-extract@3.0.3: - resolution: {integrity: sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==} - hasBin: true - - msgpackr@1.11.2: - resolution: {integrity: sha512-F9UngXRlPyWCDEASDpTf6c9uNhGPTqnTeLVt7bN+bU1eajoR/8V9ys2BRaV5C/e5ihE6sJ9uPIKaYt6bFuO32g==} - multer@1.4.5-lts.1: resolution: {integrity: sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==} engines: {node: '>= 6.0.0'} @@ -3858,8 +4087,8 @@ packages: nai-js-tokenizer@1.0.1: resolution: {integrity: sha512-gJHIMHpxE7OGl9TWWYzVQafg//tN64WBT16b+8Yt+WnMFZ/nL1Y7NwnPvko1QfHgPtx2PJj4c2UnIK5XGBFFjw==} - nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + nanoid@3.3.14: + resolution: {integrity: sha512-U9kYi5bpVMEI31yC8iw4bJJp0avcHXA0W8/wNfLfnvJYzihQo2ZRPYPvpAAd570HAcCBjCTN7vnr+v4StKl1IQ==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -3900,20 +4129,20 @@ packages: encoding: optional: true - node-gyp-build-optional-packages@5.1.1: - resolution: {integrity: sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==} - hasBin: true - - node-gyp-build-optional-packages@5.2.2: - resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==} - hasBin: true - node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + node-releases@2.0.50: + resolution: {integrity: sha512-J6l92tKHX6w8Jy5nO1Vuc01NoIiRGi/d6qBKVxh+IQ8Cr3b6HbVNfKiF8ZpFKufTwpwxMmce2W3iQZ861ZRyTg==} + engines: {node: '>=18'} + + node-stdlib-browser@1.3.1: + resolution: {integrity: sha512-X75ZN8DCLftGM5iKwoYLA3rjnrAEs97MkzvSd4q2746Tgpg8b8XWiBGiBG4ZpgcAqBgtgPHTiAc8ZMCvZuikDw==} + engines: {node: '>=10'} + nodemon@3.1.10: resolution: {integrity: sha512-WDjw3pJ0/0jMFmyNDp3gvY2YizjLmmOUQo6DEBY+JgdvW/yQ9mEeSw6H5ythl5Ny2ytb7f9C2nIbjSxMNzbJXw==} engines: {node: '>=10'} @@ -3926,9 +4155,6 @@ packages: nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - nullthrows@1.1.1: - resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} - object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -3977,11 +4203,12 @@ packages: onnxruntime-web@1.14.0: resolution: {integrity: sha512-Kcqf43UMfW8mCydVGcX9OMXI2VN17c0p6XvR7IPSZzBf/6lteBzXHvcEVWDPmCKuGombl997HgLqj91F11DzXw==} - openurl@1.1.1: - resolution: {integrity: sha512-d/gTkTb1i1GKz5k3XE3XFV/PxQ1k45zDqGP2OA7YhgsaLoqm6qRvARAZOFer1fcXritWlGBRCu/UgeS4HAnXAA==} + os-browserify@0.3.0: + resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==} - ordered-binary@1.5.3: - resolution: {integrity: sha512-oGFr3T+pYdTGJ+YFEILMpS3es+GiIbs9h/XQrclBXUtd44ey7XwfsMzM31f64I1SQOawDoDr/D823kNCADI8TA==} + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} @@ -4003,21 +4230,9 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} - package-json-from-dist@1.0.1: - resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - pako@1.0.11: resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} - parcel@2.14.4: - resolution: {integrity: sha512-XmnIurC4CPdQm9OFJMbjgvto5Jz2szZ5/p6EY4pAljU/SLPhtBzJ3+J6OyljGFdbVxEXx4dp+7Cvf7eaDZsEEg==} - engines: {node: '>= 16.0.0'} - hasBin: true - - parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - parse-asn1@5.1.7: resolution: {integrity: sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==} engines: {node: '>= 0.10'} @@ -4028,10 +4243,6 @@ packages: parse-css-color@0.2.0: resolution: {integrity: sha512-uWQyuOe+SMxnUgHf4mjdn2C/YzA1tOW+uU8Z2UiV3qnao9ZFnvYeyzeoU7TNv8NLIJo0PiRkETW48QNJZ4IA9g==} - parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - parse5@7.3.0: resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} @@ -4046,23 +4257,19 @@ packages: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} + path-expression-matcher@1.6.0: + resolution: {integrity: sha512-e5y7RCLHKjemsgQ4eqGJtPyr10ILz25HO7flzxhTV8bgvd5yHx98DGtCAtbVW9f2TqnYI/gEVZd+vz7snrdPTw==} + engines: {node: '>=14.0.0'} path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} + path-scurry@2.0.2: + resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} + engines: {node: 18 || 20 || >=22} - path-to-regexp@0.1.12: - resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} + path-to-regexp@0.1.13: + resolution: {integrity: sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==} pathval@1.1.1: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} @@ -4076,9 +4283,9 @@ packages: engines: {node: '>= v0.6.0'} deprecated: 'Package no longer supported. The author suggests using the @paypal/paypal-server-sdk package instead: https://www.npmjs.com/package/@paypal/paypal-server-sdk. Contact Support at https://www.npmjs.com/support for more info.' - pbkdf2@3.1.2: - resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} - engines: {node: '>=0.12'} + pbkdf2@3.1.6: + resolution: {integrity: sha512-BT6eelPB1EyGHo8pC0o9Bl6k6SYVhKO1jEbd3lcTrtr7XHdjP8BW1YpfCV3G9Kwkxgattk+S5q2/RvuttCsS1g==} + engines: {node: '>= 0.10'} pdfdataextract@3.2.0: resolution: {integrity: sha512-t4W7h+cdr/aefdftzxmf+3w4ntVO70OlOFAGgH2zrbc+lDmYKIzAUXJhP+zpIqK6SnkRnZrQOC0fv/sejUJnrg==} @@ -4093,12 +4300,18 @@ packages: engines: {node: '>=14'} hasBin: true + phosphor-solid@1.1.5: + resolution: {integrity: sha512-FNvvkJytLTYrsvzafgkv/jUhsWOuiXAUcJevX/BD+bs0vATVoO1JCpEToFkVnYY8gkIWrT8Mojwzqb1mFTFQgw==} + engines: {node: '>=10'} + peerDependencies: + react: '>=16' + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} @@ -4122,6 +4335,10 @@ packages: resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} + pkg-dir@5.0.0: + resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} + engines: {node: '>=10'} + platform@1.3.6: resolution: {integrity: sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==} @@ -4177,19 +4394,19 @@ packages: resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} engines: {node: '>=14.0.0'} peerDependencies: - postcss: ^8.0.0 + postcss: '>=8.5.10' postcss-js@4.0.1: resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} engines: {node: ^12 || ^14 || >= 16} peerDependencies: - postcss: ^8.4.21 + postcss: '>=8.5.10' postcss-load-config@4.0.2: resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} engines: {node: '>= 14'} peerDependencies: - postcss: '>=8.0.9' + postcss: '>=8.5.10' ts-node: '>=9.0.0' peerDependenciesMeta: postcss: @@ -4201,7 +4418,7 @@ packages: resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} engines: {node: '>=12.0'} peerDependencies: - postcss: ^8.2.14 + postcss: '>=8.5.10' postcss-selector-parser@6.1.2: resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} @@ -4210,26 +4427,10 @@ packages: postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.5.3: - resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + postcss@8.5.15: + resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==} engines: {node: ^10 || ^12 || >=14} - posthtml-parser@0.11.0: - resolution: {integrity: sha512-QecJtfLekJbWVo/dMAA+OSwY79wpRmbqS5TeXvXSX+f0c6pW4/SE6inzZ2qkU7oAMCPqIDkZDvd/bQsSFUnKyw==} - engines: {node: '>=12'} - - posthtml-parser@0.12.1: - resolution: {integrity: sha512-rYFmsDLfYm+4Ts2Oh4DCDSZPtdC1BLnRXAobypVzX9alj28KGl65dIFtgDY9zB57D0TC4Qxqrawuq/2et1P0GA==} - engines: {node: '>=16'} - - posthtml-render@3.0.0: - resolution: {integrity: sha512-z+16RoxK3fUPgwaIgH9NGnK1HKY9XIDpydky5eQGgAFVXTCSezalv9U2jQuNV+Z9qV1fDWNzldcw4eK0SSbqKA==} - engines: {node: '>=12'} - - posthtml@0.16.6: - resolution: {integrity: sha512-JcEmHlyLK/o0uGAlj65vgg+7LIms0xKXe60lcDOTU7oVX/3LuEuLwrQpW3VJ7de5TaFKiW4kWkaIpJL42FEgxQ==} - engines: {node: '>=12.0.0'} - prebuild-install@7.1.3: resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} engines: {node: '>=10'} @@ -4289,6 +4490,14 @@ packages: engines: {node: '>=10.13.0'} hasBin: true + pretty-bytes@5.6.0: + resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} + engines: {node: '>=6'} + + pretty-bytes@6.1.1: + resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} + engines: {node: ^14.13.1 || >=16.0.0} + pretty-format@29.7.0: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -4306,9 +4515,9 @@ packages: promise-polyfill@8.3.0: resolution: {integrity: sha512-H5oELycFml5yto/atYqmjyigJoAo3+OXwolYiH7OfQuYlAqhxNvTfiNMbV9hsC6Yp83yE5r2KTVmtrG6R9i6Pg==} - protobufjs@6.11.4: - resolution: {integrity: sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==} - hasBin: true + protobufjs@8.6.4: + resolution: {integrity: sha512-/+XMv9JalknuncEJSwsyEVlwcxVLKx2iaoSUXFZA86MJkdqyOdfrlB1sB7S6aKyUk9tl20YY+SgQe5J2sJHTcg==} + engines: {node: '>=12.0.0'} proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} @@ -4336,12 +4545,8 @@ packages: pure-color@1.3.0: resolution: {integrity: sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==} - qs@6.13.0: - resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} - engines: {node: '>=0.6'} - - qs@6.14.0: - resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + qs@6.15.2: + resolution: {integrity: sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==} engines: {node: '>=0.6'} querystring-es3@0.2.1: @@ -4378,10 +4583,6 @@ packages: react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - react-refresh@0.16.0: - resolution: {integrity: sha512-FPvF2XxTSikpJxcr+bHut2H4gJ17+18Uy20D5/F+SKzFap62R3cM5wH6b8WN3LyGSYeQilLEcJcR1fjBSI2S1A==} - engines: {node: '>=0.10.0'} - react@19.1.0: resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} engines: {node: '>=0.10.0'} @@ -4415,8 +4616,31 @@ packages: redis@4.7.1: resolution: {integrity: sha512-S1bJDnqLftzHXHP8JsT5II/CtHWQrASX5K96REjWjlmWKrviSOLWmM7QnRLstAWsu1VBBV1ffV6DzCvxNP0UJQ==} - regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + + regenerate-unicode-properties@10.2.2: + resolution: {integrity: sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==} + engines: {node: '>=4'} + + regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + + regexpu-core@6.4.0: + resolution: {integrity: sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==} + engines: {node: '>=4'} + + regjsgen@0.8.0: + resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} + + regjsparser@0.13.2: + resolution: {integrity: sha512-NgRBy2Nx/bE+9F27nVHnqcN5HjyLmecqsqx2PJHu3/IEtADD4WuxuXIVExD5PoSDFVrl78dOonfcOe5O+5nbzQ==} + hasBin: true require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} @@ -4429,10 +4653,6 @@ packages: requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} @@ -4442,6 +4662,11 @@ packages: engines: {node: '>= 0.4'} hasBin: true + resolve@1.22.12: + resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} + engines: {node: '>= 0.4'} + hasBin: true + reusify@1.1.0: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -4449,8 +4674,12 @@ packages: ripemd160@2.0.2: resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} - rollup@4.40.2: - resolution: {integrity: sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg==} + ripemd160@2.0.3: + resolution: {integrity: sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA==} + engines: {node: '>= 0.8'} + + rollup@4.62.2: + resolution: {integrity: sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -4460,12 +4689,20 @@ packages: rxjs@7.8.2: resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + safe-array-concat@1.1.4: + resolution: {integrity: sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==} + engines: {node: '>=0.4'} + safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + safe-regex-test@1.1.0: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} @@ -4485,6 +4722,10 @@ packages: sax@1.4.1: resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + sax@1.6.0: + resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==} + engines: {node: '>=11.0.0'} + schema-utils@3.3.0: resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} engines: {node: '>= 10.13.0'} @@ -4513,17 +4754,18 @@ packages: resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} engines: {node: '>= 0.8.0'} - serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + serialize-javascript@7.0.6: + resolution: {integrity: sha512-ATTK5Q4gFVg0YDp1my2vqygyvhcklD/UV5GIlYHooGTn/NogJqIzpetkD6E5kmuVULqz/S9inUL25XcAgDRJQg==} + engines: {node: '>=20.0.0'} seroval-plugins@1.3.0: resolution: {integrity: sha512-FFu/UE3uA8L1vj0CXXZo2Nlh10MtYoOs0G//ptwlQMjfPFSeIVYUNy0zewfV8iM0CrOebAfHEG6J3xA9c+lsaQ==} engines: {node: '>=10'} peerDependencies: - seroval: ^1.0 + seroval: '>=1.4.1' - seroval@1.3.0: - resolution: {integrity: sha512-4tYQDy3HVM0JjJ1CfDK3K8FhBKIDDri27oc2AyabuuHfQw6/yTDPp2Abt1h2cNtf1R0T+7AQYAzPhUgqXztaXw==} + seroval@1.5.4: + resolution: {integrity: sha512-46uFvgrXTVxZcUorgSSRZ4y+ieqLLQRMlG4bnCZKW3qI6BZm7Rg4ntMW4p1mILEEBZWrFlcpp0AyIIlM6jD9iw==} engines: {node: '>=10'} serve-static@1.16.2: @@ -4537,33 +4779,33 @@ packages: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - sha.js@2.4.11: - resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + sha.js@2.4.12: + resolution: {integrity: sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==} + engines: {node: '>= 0.10'} hasBin: true sharp@0.32.6: resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==} engines: {node: '>=14.15.0'} - shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - - shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - shell-quote@1.8.2: - resolution: {integrity: sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==} + shell-quote@1.8.4: + resolution: {integrity: sha512-VsC6n6vz1ihYYyZZwX7YZSF5l5x36ca17OC+a69h94YqB7X6XLwf+5MOgynYir2SLFUbl8gIYvBo8K8RoNQ6bQ==} engines: {node: '>= 0.4'} - shepherd.js@13.0.3: - resolution: {integrity: sha512-1lQtQUNQYi+8k9BAmbUZh7D2QxFfkxiWKU0XFTbzYaIrCkB4nR0DLQuarH5G7Ym6L8wfbadxP3hJhZ2HzVktaA==} - engines: {node: 18.* || >= 20} - showdown@2.1.0: resolution: {integrity: sha512-/6NVYu4U819R2pUIk79n67SYgJHWCce0a5xTP979WbNp0FL9MN1I1QK662IDU1b6JzKTvmhgI7T7JYIxBi3kMQ==} hasBin: true @@ -4587,10 +4829,6 @@ packages: signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - simple-concat@1.0.1: resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} @@ -4615,6 +4853,10 @@ packages: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + smob@1.6.2: + resolution: {integrity: sha512-RQsvleCbF8cVHEv+xuDGaA4pOizFqJ0GgjtMSRo6oP8pnN7WsigHgVGey6aILRBKv4W2YOMHLqbKdnB6hpB9fw==} + engines: {node: '>=20.0.0'} + socks@2.8.4: resolution: {integrity: sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==} engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} @@ -4653,6 +4895,11 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + deprecated: The work that was done in this beta branch won't be included in future versions + sparse-bitfield@3.0.3: resolution: {integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==} @@ -4663,16 +4910,6 @@ packages: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} - sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - - sprintf-js@1.1.3: - resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} - - srcset@4.0.0: - resolution: {integrity: sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==} - engines: {node: '>=12'} - stack-utils@2.0.6: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} @@ -4681,6 +4918,10 @@ packages: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + stream-browserify@3.0.0: resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} @@ -4698,9 +4939,21 @@ packages: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} + string.prototype.matchall@4.0.12: + resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} + engines: {node: '>= 0.4'} + + string.prototype.trim@1.2.11: + resolution: {integrity: sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.10: + resolution: {integrity: sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} @@ -4708,13 +4961,17 @@ packages: string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + stringify-object@3.3.0: + resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} + engines: {node: '>=4'} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} + strip-comments@2.0.1: + resolution: {integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==} + engines: {node: '>=10'} strip-json-comments@2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} @@ -4728,8 +4985,8 @@ packages: resolution: {integrity: sha512-yPxVJxUzP1QHhHeFnYjJl48QwDS1+5befcL7ju7+t+i88D5r0rbsL+GkCCS6zgcU+TiV5bF9eMGcKyJfLf8BZQ==} engines: {node: '>=12.*'} - strnum@1.1.2: - resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==} + strnum@2.4.1: + resolution: {integrity: sha512-M9eUSMT2dCB2cTNPG7UYj6KuK7RJR2SN2+yCV/fTW3xzTCS6EaGZ5pSMgDIjB7r8zSfTGk+dvvn9rTjpVS9Mwg==} sucrase@3.35.0: resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} @@ -4752,8 +5009,8 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - svgo@3.3.2: - resolution: {integrity: sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==} + svgo@3.3.3: + resolution: {integrity: sha512-+wn7I4p7YgJhHs38k2TNjy1vCfPIfLIJWR5MnCStsN8WuuTcBnRKcMHQLMM2ijxGZmDoZwNv8ipl5aTTen62ng==} engines: {node: '>=14.0.0'} hasBin: true @@ -4766,23 +5023,20 @@ packages: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} - tar-fs@2.1.2: - resolution: {integrity: sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==} - - tar-fs@3.0.8: - resolution: {integrity: sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==} - - tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} + tar-fs@3.1.2: + resolution: {integrity: sha512-QGxxTxxyleAdyM3kpFs14ymbYmNFrfY+pHj7Z8FgtbZ7w2//VAgLMac7sT6nRpIHjppXO2AwwEOg0bPFVRcmXw==} tar-stream@3.1.7: resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} - term-size@2.2.1: - resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} + temp-dir@2.0.0: + resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} engines: {node: '>=8'} + tempy@0.6.0: + resolution: {integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==} + engines: {node: '>=10'} + terser-webpack-plugin@5.3.14: resolution: {integrity: sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==} engines: {node: '>= 10.13.0'} @@ -4828,9 +5082,21 @@ packages: throwback@4.1.0: resolution: {integrity: sha512-dLFe8bU8SeH0xeqeKL7BNo8XoPC/o91nz9/ooeplZPiso+DZukhoyZcSz9TFnUNScm+cA9qjU1m1853M6sPOng==} + timers-browserify@2.0.12: + resolution: {integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==} + engines: {node: '>=0.6.0'} + + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + to-buffer@1.2.2: + resolution: {integrity: sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==} + engines: {node: '>= 0.4'} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -4850,6 +5116,9 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + tr46@3.0.0: resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} engines: {node: '>=12'} @@ -4883,6 +5152,9 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tty-browserify@0.0.1: + resolution: {integrity: sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==} + tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} @@ -4890,14 +5162,30 @@ packages: resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} engines: {node: '>=4'} - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + type-fest@0.16.0: + resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} engines: {node: '>=10'} type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.8: + resolution: {integrity: sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==} + engines: {node: '>= 0.4'} + typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} @@ -4906,32 +5194,67 @@ packages: engines: {node: '>=14.17'} hasBin: true + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + undefsafe@2.0.5: resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - undici@6.21.1: - resolution: {integrity: sha512-q/1rj5D0/zayJB2FraXdaWxbhWiNKDvu8naDT2dl1yTlvJp4BLtOcp2a5BvgGNQpYYJzau7tf1WgKv3b+7mqpQ==} - engines: {node: '>=18.17'} + undici@8.5.0: + resolution: {integrity: sha512-xamtWoB1EshgjpmlXd7GGm2VfdDtw1+rD8uhry8pSNW3If6S8E0m2T2+orSKeZXEn/aPJMviCpDBA65WJt8zhg==} + engines: {node: '>=22.19.0'} + + unicode-canonical-property-names-ecmascript@2.0.1: + resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} + engines: {node: '>=4'} + + unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + + unicode-match-property-value-ecmascript@2.2.1: + resolution: {integrity: sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==} + engines: {node: '>=4'} + + unicode-property-aliases-ecmascript@2.2.0: + resolution: {integrity: sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==} + engines: {node: '>=4'} + + unique-string@2.0.0: + resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} + engines: {node: '>=8'} universalify@0.2.0: resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} engines: {node: '>= 4.0.0'} + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} + upath@1.2.0: + resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} + engines: {node: '>=4'} + update-browserslist-db@1.1.3: resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' - uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' url-parse@1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} @@ -4951,10 +5274,6 @@ packages: util@0.12.5: resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} - utility-types@3.11.0: - resolution: {integrity: sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==} - engines: {node: '>= 4'} - utils-merge@1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} @@ -4973,6 +5292,23 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} + vite-plugin-node-polyfills@0.22.0: + resolution: {integrity: sha512-F+G3LjiGbG8QpbH9bZ//GSBr9i1InSTkaulfUHFa9jkLqVGORFBoqc2A/Yu5Mmh1kNAbiAeKeK+6aaQUf3x0JA==} + peerDependencies: + vite: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 + + vite-plugin-pwa@0.21.2: + resolution: {integrity: sha512-vFhH6Waw8itNu37hWUJxL50q+CBbNcMVzsKaYHQVrfxTt3ihk3PeLO22SbiP1UNWzcEPaTQv+YVxe4G0KOjAkg==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@vite-pwa/assets-generator': ^0.2.6 + vite: ^3.1.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 + workbox-build: ^7.3.0 + workbox-window: ^7.3.0 + peerDependenciesMeta: + '@vite-pwa/assets-generator': + optional: true + vite-plugin-solid@2.11.6: resolution: {integrity: sha512-Sl5CTqJTGyEeOsmdH6BOgalIZlwH3t4/y0RQuFLMGnvWMBvxb4+lq7x3BSiAw6etf0QexfNJW7HSOO/Qf7pigg==} peerDependencies: @@ -4991,8 +5327,8 @@ packages: vite: optional: true - vite@5.4.19: - resolution: {integrity: sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==} + vite@5.4.21: + resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -5040,12 +5376,12 @@ packages: resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==} engines: {node: '>=10.13.0'} - weak-lru-cache@1.2.2: - resolution: {integrity: sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==} - webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + webidl-conversions@7.0.0: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} @@ -5071,19 +5407,78 @@ packages: whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + which-typed-array@1.1.19: resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} engines: {node: '>= 0.4'} - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - wikijs@6.4.1: resolution: {integrity: sha512-fnYyT9ISD9hFgAxFJu7Kzsomz48w7FpvvAfTuArvkMQY1bG9JPXoyURqUzYGcQA8FCq6MuZfjqT/6hP8Mh4hQA==} engines: {node: '>=0.10.4'} + workbox-background-sync@7.4.1: + resolution: {integrity: sha512-HhT7KE8tOWDm02wRNshXUnUPofMlhenF2DBdUnDPOubhizzPeItkYTmAB6td1Z2cjYPa98vzEiPLEuzn5hN66g==} + + workbox-broadcast-update@7.4.1: + resolution: {integrity: sha512-uAlgslKLvbQY+suirIdnBCSYrcgBhjp81Nj4l1lj/Jmj0MJO2CJERnCJjT0GFVwmReV0N+zs78K6gqd5gr9/+A==} + + workbox-build@7.4.1: + resolution: {integrity: sha512-SDhxIvEAde9Gy/5w4Yo1Jh/M49Z0qE3q0oteyE8zGq0DScxFqVBcCtIXFuLtmtxRQZCMbf0prco4VyEu3KBQuw==} + engines: {node: '>=20.0.0'} + + workbox-cacheable-response@7.4.1: + resolution: {integrity: sha512-8xaFoJdDc2OjrlbbL3gEeBO1WKcMwRqwLRupgqahYXu75yXajPLuwrbXMrIGZuWYXrQwk0xDjOxZ/ujCy/oJYw==} + + workbox-core@7.4.1: + resolution: {integrity: sha512-DT+vu46eh/2vRsSHTY4Xmc32Z1rr9PRlQUXr1Dx30ZuXRWwOsvZgGgcwxcasubQLQmbTNYZjv44LkBAQ4tT5tQ==} + + workbox-expiration@7.4.1: + resolution: {integrity: sha512-lRKUF7b+OGbeXkQk1s6MHXOa3d7Xxf7Of31W6c6hCfipfIyrtdWZ89stq21AHZMaoG7VNFoHply4Ox+rU31TWg==} + + workbox-google-analytics@7.4.1: + resolution: {integrity: sha512-Mks1JwLEt++ZAkF6sS1OpSh9RtAMIsiDgRpK+codiHGIPXeaUOgi4cPc3GFadUl8V5QPeypEk8Oxgl3HlwVzHw==} + + workbox-navigation-preload@7.4.1: + resolution: {integrity: sha512-C4KVsjPcYKJOhr631AxR9XoG2rLF3QiTk5aMv36MXOjtWvm8axwNFAtKUPGsWUwLXXAMgYM1En7fsvndaXeXRQ==} + + workbox-precaching@7.4.1: + resolution: {integrity: sha512-cdr/9qByww7yzEp7zg/qI4ukUrrNjQLgN+ONQRpjy/VqGQXwkgHwr00KksGJK8v0VifwDXBb8a4cWNZH71jn3Q==} + + workbox-range-requests@7.4.1: + resolution: {integrity: sha512-7i2oxAUE82gHdAJBCAQ04JzNOdRPqzuOzGfoUyJpFSmeqBNYGPrAH8GPoPjUQTfp+NycwrD2H68VtuF8qxv0vQ==} + + workbox-recipes@7.4.1: + resolution: {integrity: sha512-gnbVfmV4/TtmQaM4x9AtuXhcdstJsep3XMVeztOrQVPT+R6+6DeBjGTCQ7fFCXm+4GEHUA5VEBTyi5+4gWGeog==} + + workbox-routing@7.4.1: + resolution: {integrity: sha512-yubJGErZOusuidAenaL5ypfhQOa7urxP/f8E0ws7FPb4039RiWXUWBAyUkmUoOL/BcQGen3h0J8872d51IYxtA==} + + workbox-strategies@7.4.1: + resolution: {integrity: sha512-GZxpaw9NbmOelj7667uZ2kpk5BFpOGbO4X0qjwh5ls8XQ8C+Lha5LQchTiUzsTFSS+NlUpftYAyOVXvQUrcqOQ==} + + workbox-streams@7.4.1: + resolution: {integrity: sha512-HWWtraKUbJknd9kgqGcpQ3G114HOPYvqs8HaJMDs2ebLNAimDkVDaWfAXE6Ybl+m8U6KsCE6pWyLYuigWmnAXw==} + + workbox-sw@7.4.1: + resolution: {integrity: sha512-fez5f2DUlDJWTFYkCWQpY10N8gtztd849NswCbVFk0QlcSM4HT5A8x4g4ii650yem4I8tHY0R7JZahwp3ltIPw==} + + workbox-window@7.4.1: + resolution: {integrity: sha512-notZDH2u8VXaqyuD7xaqIfEFi6SRM4SUSd7ewe9PDsVqADuepxX2ZMY3uvuZGxzY5ZOsGC/vD3A/3smFtJt4/A==} + worker-loader@3.0.8: resolution: {integrity: sha512-XQyQkIFeRVC7f7uRhFdNMe/iJOdO6zxAaR3EWbDp45v3mDhrTi+++oswKNxShUNjPC/1xUp5DB29YKLhFo129g==} engines: {node: '>= 10.13.0'} @@ -5097,10 +5492,6 @@ packages: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} @@ -5108,8 +5499,8 @@ packages: resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - ws@8.18.2: - resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} + ws@8.21.0: + resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -5120,6 +5511,10 @@ packages: utf-8-validate: optional: true + xml-naming@0.1.0: + resolution: {integrity: sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw==} + engines: {node: '>=16.0.0'} + xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} @@ -5134,9 +5529,9 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - yaml@2.7.1: - resolution: {integrity: sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==} - engines: {node: '>= 14'} + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} + engines: {node: '>= 14.6'} hasBin: true yargs-parser@20.2.9: @@ -5155,10 +5550,6 @@ packages: resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} engines: {node: '>=10'} - yargs@17.1.1: - resolution: {integrity: sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ==} - engines: {node: '>=12'} - yargs@17.7.2: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} @@ -5192,10 +5583,11 @@ snapshots: '@alloc/quick-lru@5.2.0': {} - '@ampproject/remapping@2.3.0': + '@apideck/better-ajv-errors@0.3.7(ajv@8.20.0)': dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 + ajv: 8.20.0 + jsonpointer: 5.0.1 + leven: 3.1.0 '@aws-crypto/crc32@5.2.0': dependencies: @@ -5268,7 +5660,7 @@ snapshots: '@aws-sdk/util-user-agent-browser': 3.804.0 '@aws-sdk/util-user-agent-node': 3.806.0 '@aws-sdk/xml-builder': 3.804.0 - '@smithy/config-resolver': 4.1.2 + '@smithy/config-resolver': 4.6.1 '@smithy/core': 3.3.1 '@smithy/eventstream-serde-browser': 4.0.2 '@smithy/eventstream-serde-config-resolver': 4.1.0 @@ -5319,7 +5711,7 @@ snapshots: '@aws-sdk/util-endpoints': 3.806.0 '@aws-sdk/util-user-agent-browser': 3.804.0 '@aws-sdk/util-user-agent-node': 3.806.0 - '@smithy/config-resolver': 4.1.2 + '@smithy/config-resolver': 4.6.1 '@smithy/core': 3.3.1 '@smithy/fetch-http-handler': 5.0.2 '@smithy/hash-node': 4.0.2 @@ -5359,7 +5751,7 @@ snapshots: '@smithy/smithy-client': 4.2.4 '@smithy/types': 4.2.0 '@smithy/util-middleware': 4.0.2 - fast-xml-parser: 4.4.1 + fast-xml-parser: 5.9.3 tslib: 2.8.1 '@aws-sdk/credential-provider-env@3.806.0': @@ -5557,7 +5949,7 @@ snapshots: '@aws-sdk/util-endpoints': 3.806.0 '@aws-sdk/util-user-agent-browser': 3.804.0 '@aws-sdk/util-user-agent-node': 3.806.0 - '@smithy/config-resolver': 4.1.2 + '@smithy/config-resolver': 4.6.1 '@smithy/core': 3.3.1 '@smithy/fetch-http-handler': 5.0.2 '@smithy/hash-node': 4.0.2 @@ -5661,20 +6053,26 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.27.2': {} + '@babel/code-frame@7.29.7': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.29.7': {} - '@babel/core@7.27.1': + '@babel/core@7.29.7': dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.27.1 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.27.1(@babel/core@7.27.1) - '@babel/helpers': 7.27.1 - '@babel/parser': 7.27.2 - '@babel/template': 7.27.2 - '@babel/traverse': 7.27.1 - '@babel/types': 7.27.1 + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helpers': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 debug: 4.4.0 gensync: 1.0.0-beta.2 @@ -5691,14 +6089,66 @@ snapshots: '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.1.0 - '@babel/helper-compilation-targets@7.27.2': + '@babel/generator@7.29.7': + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-annotate-as-pure@7.29.7': dependencies: - '@babel/compat-data': 7.27.2 - '@babel/helper-validator-option': 7.27.1 + '@babel/types': 7.29.7 + + '@babel/helper-compilation-targets@7.29.7': + dependencies: + '@babel/compat-data': 7.29.7 + '@babel/helper-validator-option': 7.29.7 browserslist: 4.24.5 lru-cache: 5.1.1 semver: 6.3.1 + '@babel/helper-create-class-features-plugin@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-member-expression-to-functions': 7.29.7 + '@babel/helper-optimise-call-expression': 7.29.7 + '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7) + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + '@babel/traverse': 7.29.7 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-create-regexp-features-plugin@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.29.7 + regexpu-core: 6.4.0 + semver: 6.3.1 + + '@babel/helper-define-polyfill-provider@0.6.8(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + debug: 4.4.3 + lodash.debounce: 4.0.8 + resolve: 1.22.12 + transitivePeerDependencies: + - supports-color + + '@babel/helper-globals@7.29.7': {} + + '@babel/helper-member-expression-to-functions@7.29.7': + dependencies: + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + transitivePeerDependencies: + - supports-color + '@babel/helper-module-imports@7.18.6': dependencies: '@babel/types': 7.27.1 @@ -5710,117 +6160,651 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.27.1(@babel/core@7.27.1)': + '@babel/helper-module-imports@7.29.7': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.27.1 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helper-plugin-utils@7.27.1': {} + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color - '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-optimise-call-expression@7.29.7': + dependencies: + '@babel/types': 7.29.7 + + '@babel/helper-plugin-utils@7.27.1': {} + + '@babel/helper-plugin-utils@7.29.7': {} + + '@babel/helper-remap-async-to-generator@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-wrap-function': 7.29.7 + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-replace-supers@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-member-expression-to-functions': 7.29.7 + '@babel/helper-optimise-call-expression': 7.29.7 + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.29.7': + dependencies: + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-string-parser@7.29.7': {} '@babel/helper-validator-identifier@7.27.1': {} - '@babel/helper-validator-option@7.27.1': {} + '@babel/helper-validator-identifier@7.29.7': {} - '@babel/helpers@7.27.1': + '@babel/helper-validator-option@7.29.7': {} + + '@babel/helper-wrap-function@7.29.7': dependencies: - '@babel/template': 7.27.2 - '@babel/types': 7.27.1 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helpers@7.29.7': + dependencies: + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 '@babel/parser@7.27.2': dependencies: '@babel/types': 7.27.1 - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.27.1)': + '@babel/parser@7.29.7': + dependencies: + '@babel/types': 7.29.7 + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-bugfix-safari-rest-destructuring-rhs-array@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + '@babel/plugin-transform-optional-chaining': 7.29.7(@babel/core@7.29.7) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.27.1)': + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.27.1)': + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.27.1)': + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-syntax-import-assertions@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.27.1)': + '@babel/plugin-syntax-import-attributes@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.27.1)': + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.27.1)': + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.27.1)': + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.27.1)': + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.27.1)': + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.27.1)': + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.27.1)': + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.27.1)': + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.27.1)': + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-arrow-functions@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-async-generator-functions@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-remap-async-to-generator': 7.29.7(@babel/core@7.29.7) + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-async-to-generator@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-remap-async-to-generator': 7.29.7(@babel/core@7.29.7) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-block-scoped-functions@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-block-scoping@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-class-properties@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-class-static-block@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-classes@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-globals': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7) + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-computed-properties@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/template': 7.29.7 + + '@babel/plugin-transform-destructuring@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-dotall-regex@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-duplicate-keys@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-dynamic-import@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-explicit-resource-management@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.29.7) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-exponentiation-operator@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-export-namespace-from@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-for-of@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-function-name@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-json-strings@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-literals@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-logical-assignment-operators@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-member-expression-literals@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-modules-amd@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-commonjs@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-systemjs@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-umd@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-named-capturing-groups-regex@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-new-target@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-nullish-coalescing-operator@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-numeric-separator@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-object-rest-spread@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-parameters': 7.29.7(@babel/core@7.29.7) + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-object-super@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-optional-catch-binding@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-optional-chaining@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-parameters@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-private-methods@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-private-property-in-object@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-property-literals@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-regenerator@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-regexp-modifiers@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-reserved-words@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-shorthand-properties@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-spread@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-sticky-regex@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-template-literals@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-typeof-symbol@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-unicode-escapes@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-unicode-property-regex@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-unicode-regex@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-unicode-sets-regex@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/preset-env@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/compat-data': 7.29.7 + '@babel/core': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-bugfix-safari-rest-destructuring-rhs-array': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.29.7) + '@babel/plugin-syntax-import-assertions': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-syntax-import-attributes': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.29.7) + '@babel/plugin-transform-arrow-functions': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-async-generator-functions': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-async-to-generator': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-block-scoped-functions': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-block-scoping': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-class-properties': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-class-static-block': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-classes': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-computed-properties': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-dotall-regex': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-duplicate-keys': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-dynamic-import': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-explicit-resource-management': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-exponentiation-operator': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-export-namespace-from': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-for-of': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-function-name': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-json-strings': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-literals': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-logical-assignment-operators': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-member-expression-literals': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-modules-amd': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-modules-systemjs': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-modules-umd': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-named-capturing-groups-regex': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-new-target': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-nullish-coalescing-operator': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-numeric-separator': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-object-rest-spread': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-object-super': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-optional-catch-binding': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-optional-chaining': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-parameters': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-private-methods': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-private-property-in-object': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-property-literals': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-regenerator': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-regexp-modifiers': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-reserved-words': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-shorthand-properties': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-spread': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-sticky-regex': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-template-literals': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-typeof-symbol': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-unicode-escapes': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-unicode-property-regex': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-unicode-regex': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-unicode-sets-regex': 7.29.7(@babel/core@7.29.7) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.29.7) + babel-plugin-polyfill-corejs2: 0.4.17(@babel/core@7.29.7) + babel-plugin-polyfill-corejs3: 0.14.2(@babel/core@7.29.7) + babel-plugin-polyfill-regenerator: 0.6.8(@babel/core@7.29.7) + core-js-compat: 3.49.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/types': 7.29.7 + esutils: 2.0.3 + '@babel/runtime@7.27.1': {} '@babel/template@7.27.2': @@ -5829,6 +6813,12 @@ snapshots: '@babel/parser': 7.27.2 '@babel/types': 7.27.1 + '@babel/template@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + '@babel/traverse@7.27.1': dependencies: '@babel/code-frame': 7.27.1 @@ -5841,11 +6831,28 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/traverse@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-globals': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + '@babel/types@7.27.1': dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 + '@babel/types@7.29.7': + dependencies: + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@css-hooks/core@1.8.2': {} '@css-hooks/solid@1.8.2(solid-js@1.9.6)': @@ -5882,7 +6889,7 @@ snapshots: discord-api-types: 0.38.4 magic-bytes.js: 1.12.1 tslib: 2.8.1 - undici: 6.21.1 + undici: 8.5.0 '@discordjs/util@1.1.1': {} @@ -5896,110 +6903,101 @@ snapshots: '@vladfrangu/async_event_emitter': 2.4.6 discord-api-types: 0.38.4 tslib: 2.8.1 - ws: 8.18.2 + ws: 8.21.0 transitivePeerDependencies: - bufferutil - utf-8-validate '@dqbd/tiktoken@1.0.21': {} - '@esbuild/aix-ppc64@0.21.5': + '@esbuild/aix-ppc64@0.25.12': optional: true - '@esbuild/android-arm64@0.21.5': + '@esbuild/android-arm64@0.25.12': optional: true - '@esbuild/android-arm@0.21.5': + '@esbuild/android-arm@0.25.12': optional: true - '@esbuild/android-x64@0.21.5': + '@esbuild/android-x64@0.25.12': optional: true - '@esbuild/darwin-arm64@0.21.5': + '@esbuild/darwin-arm64@0.25.12': optional: true - '@esbuild/darwin-x64@0.21.5': + '@esbuild/darwin-x64@0.25.12': optional: true - '@esbuild/freebsd-arm64@0.21.5': + '@esbuild/freebsd-arm64@0.25.12': optional: true - '@esbuild/freebsd-x64@0.21.5': + '@esbuild/freebsd-x64@0.25.12': optional: true - '@esbuild/linux-arm64@0.21.5': + '@esbuild/linux-arm64@0.25.12': optional: true - '@esbuild/linux-arm@0.21.5': + '@esbuild/linux-arm@0.25.12': optional: true - '@esbuild/linux-ia32@0.21.5': + '@esbuild/linux-ia32@0.25.12': optional: true - '@esbuild/linux-loong64@0.21.5': + '@esbuild/linux-loong64@0.25.12': optional: true - '@esbuild/linux-mips64el@0.21.5': + '@esbuild/linux-mips64el@0.25.12': optional: true - '@esbuild/linux-ppc64@0.21.5': + '@esbuild/linux-ppc64@0.25.12': optional: true - '@esbuild/linux-riscv64@0.21.5': + '@esbuild/linux-riscv64@0.25.12': optional: true - '@esbuild/linux-s390x@0.21.5': + '@esbuild/linux-s390x@0.25.12': optional: true - '@esbuild/linux-x64@0.21.5': + '@esbuild/linux-x64@0.25.12': optional: true - '@esbuild/netbsd-x64@0.21.5': + '@esbuild/netbsd-arm64@0.25.12': optional: true - '@esbuild/openbsd-x64@0.21.5': + '@esbuild/netbsd-x64@0.25.12': optional: true - '@esbuild/sunos-x64@0.21.5': + '@esbuild/openbsd-arm64@0.25.12': optional: true - '@esbuild/win32-arm64@0.21.5': + '@esbuild/openbsd-x64@0.25.12': optional: true - '@esbuild/win32-ia32@0.21.5': + '@esbuild/openharmony-arm64@0.25.12': optional: true - '@esbuild/win32-x64@0.21.5': + '@esbuild/sunos-x64@0.25.12': optional: true - '@floating-ui/core@1.7.0': - dependencies: - '@floating-ui/utils': 0.2.9 + '@esbuild/win32-arm64@0.25.12': + optional: true - '@floating-ui/dom@1.7.0': - dependencies: - '@floating-ui/core': 1.7.0 - '@floating-ui/utils': 0.2.9 + '@esbuild/win32-ia32@0.25.12': + optional: true - '@floating-ui/utils@0.2.9': {} + '@esbuild/win32-x64@0.25.12': + optional: true - '@huggingface/jinja@0.2.2': {} + '@fingerprintjs/fingerprintjs@5.2.0': {} - '@isaacs/cliui@8.0.2': - dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 + '@huggingface/jinja@0.2.2': {} '@istanbuljs/load-nyc-config@1.1.0': dependencies: camelcase: 5.3.1 find-up: 4.1.0 get-package-type: 0.1.0 - js-yaml: 3.14.1 + js-yaml: 5.0.0 resolve-from: 5.0.0 '@istanbuljs/schema@0.1.3': {} @@ -6030,7 +7028,7 @@ snapshots: '@jest/transform@29.7.0': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.29.7 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 babel-plugin-istanbul: 6.1.1 @@ -6057,720 +7055,65 @@ snapshots: '@types/yargs': 17.0.33 chalk: 4.1.2 + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/gen-mapping@0.3.8': dependencies: '@jridgewell/set-array': 1.2.1 '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 - '@jridgewell/resolve-uri@3.1.2': {} - - '@jridgewell/set-array@1.2.1': {} - - '@jridgewell/source-map@0.3.6': + '@jridgewell/remapping@2.3.5': dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 - - '@jridgewell/sourcemap-codec@1.5.0': {} - - '@jridgewell/trace-mapping@0.3.25': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 - - '@lezer/common@1.2.3': {} - - '@lezer/lr@1.4.2': - dependencies: - '@lezer/common': 1.2.3 - - '@lmdb/lmdb-darwin-arm64@2.8.5': - optional: true - - '@lmdb/lmdb-darwin-x64@2.8.5': - optional: true - - '@lmdb/lmdb-linux-arm64@2.8.5': - optional: true - - '@lmdb/lmdb-linux-arm@2.8.5': - optional: true - - '@lmdb/lmdb-linux-x64@2.8.5': - optional: true - - '@lmdb/lmdb-win32-x64@2.8.5': - optional: true - - '@melloware/coloris@0.20.0': {} - - '@mischnic/json-sourcemap@0.1.1': - dependencies: - '@lezer/common': 1.2.3 - '@lezer/lr': 1.4.2 - json5: 2.2.3 - - '@mongodb-js/saslprep@1.2.2': - dependencies: - sparse-bitfield: 3.0.3 - optional: true - - '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': - optional: true - - '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': - optional: true - - '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': - optional: true - - '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': - optional: true - - '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': - optional: true - - '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': - optional: true - - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - '@nodelib/fs.stat@2.0.5': {} - - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.19.1 - - '@parcel/bundler-default@2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))': - dependencies: - '@parcel/diagnostic': 2.14.4 - '@parcel/graph': 3.4.4 - '@parcel/plugin': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/rust': 2.14.4 - '@parcel/utils': 2.14.4 - nullthrows: 1.1.1 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm - - '@parcel/cache@2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))': - dependencies: - '@parcel/core': 2.14.4(@swc/helpers@0.5.17) - '@parcel/fs': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/logger': 2.14.4 - '@parcel/utils': 2.14.4 - lmdb: 2.8.5 - transitivePeerDependencies: - - napi-wasm - - '@parcel/codeframe@2.14.4': - dependencies: - chalk: 4.1.2 - - '@parcel/compressor-raw@2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))': - dependencies: - '@parcel/plugin': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm - - '@parcel/config-default@2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))(@swc/helpers@0.5.17)(postcss@8.5.3)(svgo@3.3.2)(terser@5.39.0)(typescript@5.8.3)': - dependencies: - '@parcel/bundler-default': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/compressor-raw': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/core': 2.14.4(@swc/helpers@0.5.17) - '@parcel/namer-default': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/optimizer-css': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/optimizer-htmlnano': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))(postcss@8.5.3)(svgo@3.3.2)(terser@5.39.0)(typescript@5.8.3) - '@parcel/optimizer-image': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/optimizer-svgo': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/optimizer-swc': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))(@swc/helpers@0.5.17) - '@parcel/packager-css': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/packager-html': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/packager-js': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/packager-raw': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/packager-svg': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/packager-wasm': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/reporter-dev-server': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/resolver-default': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/runtime-browser-hmr': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/runtime-js': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/runtime-rsc': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/runtime-service-worker': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/transformer-babel': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/transformer-css': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/transformer-html': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/transformer-image': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/transformer-js': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/transformer-json': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/transformer-node': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/transformer-postcss': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/transformer-posthtml': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/transformer-raw': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/transformer-react-refresh-wrap': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/transformer-svg': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - transitivePeerDependencies: - - '@swc/helpers' - - cssnano - - napi-wasm - - postcss - - purgecss - - relateurl - - srcset - - svgo - - terser - - typescript - - uncss - - '@parcel/core@2.14.4(@swc/helpers@0.5.17)': - dependencies: - '@mischnic/json-sourcemap': 0.1.1 - '@parcel/cache': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/diagnostic': 2.14.4 - '@parcel/events': 2.14.4 - '@parcel/feature-flags': 2.14.4 - '@parcel/fs': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/graph': 3.4.4 - '@parcel/logger': 2.14.4 - '@parcel/package-manager': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))(@swc/helpers@0.5.17) - '@parcel/plugin': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/profiler': 2.14.4 - '@parcel/rust': 2.14.4 - '@parcel/source-map': 2.1.1 - '@parcel/types': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/utils': 2.14.4 - '@parcel/workers': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - base-x: 3.0.11 - browserslist: 4.24.5 - clone: 2.1.2 - dotenv: 16.5.0 - dotenv-expand: 11.0.7 - json5: 2.2.3 - msgpackr: 1.11.2 - nullthrows: 1.1.1 - semver: 7.7.1 - transitivePeerDependencies: - - '@swc/helpers' - - napi-wasm - - '@parcel/diagnostic@2.14.4': - dependencies: - '@mischnic/json-sourcemap': 0.1.1 - nullthrows: 1.1.1 - - '@parcel/error-overlay@2.14.4': {} - - '@parcel/events@2.14.4': {} - - '@parcel/feature-flags@2.14.4': {} + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 - '@parcel/fs@2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))': - dependencies: - '@parcel/core': 2.14.4(@swc/helpers@0.5.17) - '@parcel/feature-flags': 2.14.4 - '@parcel/rust': 2.14.4 - '@parcel/types-internal': 2.14.4 - '@parcel/utils': 2.14.4 - '@parcel/watcher': 2.5.1 - '@parcel/workers': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - transitivePeerDependencies: - - napi-wasm - - '@parcel/graph@3.4.4': - dependencies: - '@parcel/feature-flags': 2.14.4 - nullthrows: 1.1.1 - - '@parcel/logger@2.14.4': - dependencies: - '@parcel/diagnostic': 2.14.4 - '@parcel/events': 2.14.4 - - '@parcel/markdown-ansi@2.14.4': - dependencies: - chalk: 4.1.2 - - '@parcel/namer-default@2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))': - dependencies: - '@parcel/diagnostic': 2.14.4 - '@parcel/plugin': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - nullthrows: 1.1.1 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm - - '@parcel/node-resolver-core@3.5.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))': - dependencies: - '@mischnic/json-sourcemap': 0.1.1 - '@parcel/diagnostic': 2.14.4 - '@parcel/fs': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/rust': 2.14.4 - '@parcel/utils': 2.14.4 - nullthrows: 1.1.1 - semver: 7.7.1 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm - - '@parcel/optimizer-css@2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))': - dependencies: - '@parcel/diagnostic': 2.14.4 - '@parcel/plugin': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/source-map': 2.1.1 - '@parcel/utils': 2.14.4 - browserslist: 4.24.5 - lightningcss: 1.29.3 - nullthrows: 1.1.1 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm - - '@parcel/optimizer-htmlnano@2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))(postcss@8.5.3)(svgo@3.3.2)(terser@5.39.0)(typescript@5.8.3)': - dependencies: - '@parcel/diagnostic': 2.14.4 - '@parcel/plugin': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/utils': 2.14.4 - htmlnano: 2.1.2(postcss@8.5.3)(svgo@3.3.2)(terser@5.39.0)(typescript@5.8.3) - nullthrows: 1.1.1 - posthtml: 0.16.6 - transitivePeerDependencies: - - '@parcel/core' - - cssnano - - napi-wasm - - postcss - - purgecss - - relateurl - - srcset - - svgo - - terser - - typescript - - uncss - - '@parcel/optimizer-image@2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))': - dependencies: - '@parcel/core': 2.14.4(@swc/helpers@0.5.17) - '@parcel/diagnostic': 2.14.4 - '@parcel/plugin': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/rust': 2.14.4 - '@parcel/utils': 2.14.4 - '@parcel/workers': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - transitivePeerDependencies: - - napi-wasm - - '@parcel/optimizer-svgo@2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))': - dependencies: - '@parcel/diagnostic': 2.14.4 - '@parcel/plugin': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/utils': 2.14.4 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm - - '@parcel/optimizer-swc@2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))(@swc/helpers@0.5.17)': - dependencies: - '@parcel/diagnostic': 2.14.4 - '@parcel/plugin': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/source-map': 2.1.1 - '@parcel/utils': 2.14.4 - '@swc/core': 1.11.24(@swc/helpers@0.5.17) - nullthrows: 1.1.1 - transitivePeerDependencies: - - '@parcel/core' - - '@swc/helpers' - - napi-wasm - - '@parcel/package-manager@2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))(@swc/helpers@0.5.17)': - dependencies: - '@parcel/core': 2.14.4(@swc/helpers@0.5.17) - '@parcel/diagnostic': 2.14.4 - '@parcel/fs': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/logger': 2.14.4 - '@parcel/node-resolver-core': 3.5.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/types': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/utils': 2.14.4 - '@parcel/workers': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@swc/core': 1.11.24(@swc/helpers@0.5.17) - semver: 7.7.1 - transitivePeerDependencies: - - '@swc/helpers' - - napi-wasm - - '@parcel/packager-css@2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))': - dependencies: - '@parcel/diagnostic': 2.14.4 - '@parcel/plugin': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/source-map': 2.1.1 - '@parcel/utils': 2.14.4 - lightningcss: 1.29.3 - nullthrows: 1.1.1 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm - - '@parcel/packager-html@2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))': - dependencies: - '@parcel/plugin': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/types': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/utils': 2.14.4 - nullthrows: 1.1.1 - posthtml: 0.16.6 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm - - '@parcel/packager-js@2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))': - dependencies: - '@parcel/diagnostic': 2.14.4 - '@parcel/plugin': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/rust': 2.14.4 - '@parcel/source-map': 2.1.1 - '@parcel/types': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/utils': 2.14.4 - globals: 13.24.0 - nullthrows: 1.1.1 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm - - '@parcel/packager-raw-url@2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))': - dependencies: - '@parcel/plugin': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/utils': 2.14.4 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm - - '@parcel/packager-raw@2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))': - dependencies: - '@parcel/plugin': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm - - '@parcel/packager-svg@2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))': - dependencies: - '@parcel/plugin': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/types': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/utils': 2.14.4 - posthtml: 0.16.6 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm - - '@parcel/packager-wasm@2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))': - dependencies: - '@parcel/plugin': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm - - '@parcel/plugin@2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))': - dependencies: - '@parcel/types': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm - - '@parcel/profiler@2.14.4': - dependencies: - '@parcel/diagnostic': 2.14.4 - '@parcel/events': 2.14.4 - '@parcel/types-internal': 2.14.4 - chrome-trace-event: 1.0.4 - - '@parcel/reporter-cli@2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))': - dependencies: - '@parcel/plugin': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/types': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/utils': 2.14.4 - chalk: 4.1.2 - term-size: 2.2.1 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm - - '@parcel/reporter-dev-server@2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))': - dependencies: - '@parcel/codeframe': 2.14.4 - '@parcel/plugin': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/source-map': 2.1.1 - '@parcel/utils': 2.14.4 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm - - '@parcel/reporter-tracer@2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))': - dependencies: - '@parcel/plugin': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/utils': 2.14.4 - chrome-trace-event: 1.0.4 - nullthrows: 1.1.1 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm - - '@parcel/resolver-default@2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))': - dependencies: - '@parcel/node-resolver-core': 3.5.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/plugin': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm - - '@parcel/resolver-glob@2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))': - dependencies: - '@parcel/diagnostic': 2.14.4 - '@parcel/node-resolver-core': 3.5.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/plugin': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/utils': 2.14.4 - nullthrows: 1.1.1 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm - - '@parcel/runtime-browser-hmr@2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))': - dependencies: - '@parcel/plugin': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/utils': 2.14.4 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm - - '@parcel/runtime-js@2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))': - dependencies: - '@parcel/diagnostic': 2.14.4 - '@parcel/plugin': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/utils': 2.14.4 - nullthrows: 1.1.1 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm - - '@parcel/runtime-rsc@2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))': - dependencies: - '@parcel/plugin': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/rust': 2.14.4 - '@parcel/utils': 2.14.4 - nullthrows: 1.1.1 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm - - '@parcel/runtime-service-worker@2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))': - dependencies: - '@parcel/plugin': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/utils': 2.14.4 - nullthrows: 1.1.1 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm - - '@parcel/rust@2.14.4': {} - - '@parcel/source-map@2.1.1': - dependencies: - detect-libc: 1.0.3 - - '@parcel/transformer-babel@2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))': - dependencies: - '@parcel/diagnostic': 2.14.4 - '@parcel/plugin': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/source-map': 2.1.1 - '@parcel/utils': 2.14.4 - browserslist: 4.24.5 - json5: 2.2.3 - nullthrows: 1.1.1 - semver: 7.7.1 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm - - '@parcel/transformer-css@2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))': - dependencies: - '@parcel/diagnostic': 2.14.4 - '@parcel/plugin': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/source-map': 2.1.1 - '@parcel/utils': 2.14.4 - browserslist: 4.24.5 - lightningcss: 1.29.3 - nullthrows: 1.1.1 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm - - '@parcel/transformer-html@2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))': - dependencies: - '@parcel/diagnostic': 2.14.4 - '@parcel/plugin': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/rust': 2.14.4 - nullthrows: 1.1.1 - posthtml: 0.16.6 - posthtml-parser: 0.12.1 - posthtml-render: 3.0.0 - semver: 7.7.1 - srcset: 4.0.0 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm - - '@parcel/transformer-image@2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))': - dependencies: - '@parcel/core': 2.14.4(@swc/helpers@0.5.17) - '@parcel/plugin': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/utils': 2.14.4 - '@parcel/workers': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - nullthrows: 1.1.1 - transitivePeerDependencies: - - napi-wasm - - '@parcel/transformer-inline-string@2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))': - dependencies: - '@parcel/plugin': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm - - '@parcel/transformer-js@2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))': - dependencies: - '@parcel/core': 2.14.4(@swc/helpers@0.5.17) - '@parcel/diagnostic': 2.14.4 - '@parcel/plugin': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/rust': 2.14.4 - '@parcel/source-map': 2.1.1 - '@parcel/utils': 2.14.4 - '@parcel/workers': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@swc/helpers': 0.5.17 - browserslist: 4.24.5 - nullthrows: 1.1.1 - regenerator-runtime: 0.14.1 - semver: 7.7.1 - transitivePeerDependencies: - - napi-wasm - - '@parcel/transformer-json@2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))': - dependencies: - '@parcel/plugin': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - json5: 2.2.3 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm - - '@parcel/transformer-node@2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))': - dependencies: - '@parcel/plugin': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm + '@jridgewell/resolve-uri@3.1.2': {} - '@parcel/transformer-postcss@2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))': - dependencies: - '@parcel/diagnostic': 2.14.4 - '@parcel/plugin': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/rust': 2.14.4 - '@parcel/utils': 2.14.4 - clone: 2.1.2 - nullthrows: 1.1.1 - postcss-value-parser: 4.2.0 - semver: 7.7.1 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm + '@jridgewell/set-array@1.2.1': {} - '@parcel/transformer-posthtml@2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))': + '@jridgewell/source-map@0.3.6': dependencies: - '@parcel/plugin': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/utils': 2.14.4 - nullthrows: 1.1.1 - posthtml: 0.16.6 - posthtml-parser: 0.12.1 - posthtml-render: 3.0.0 - semver: 7.7.1 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 - '@parcel/transformer-raw@2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))': - dependencies: - '@parcel/plugin': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm + '@jridgewell/sourcemap-codec@1.5.0': {} - '@parcel/transformer-react-refresh-wrap@2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))': - dependencies: - '@parcel/error-overlay': 2.14.4 - '@parcel/plugin': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/utils': 2.14.4 - react-refresh: 0.16.0 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm + '@jridgewell/sourcemap-codec@1.5.5': {} - '@parcel/transformer-sass@2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))': + '@jridgewell/trace-mapping@0.3.25': dependencies: - '@parcel/plugin': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/source-map': 2.1.1 - sass: 1.87.0 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm - - '@parcel/transformer-svg@2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))': - dependencies: - '@parcel/diagnostic': 2.14.4 - '@parcel/plugin': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/rust': 2.14.4 - nullthrows: 1.1.1 - posthtml: 0.16.6 - posthtml-parser: 0.12.1 - posthtml-render: 3.0.0 - semver: 7.7.1 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 - '@parcel/transformer-webmanifest@2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))': + '@jridgewell/trace-mapping@0.3.31': dependencies: - '@mischnic/json-sourcemap': 0.1.1 - '@parcel/diagnostic': 2.14.4 - '@parcel/plugin': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/utils': 2.14.4 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@melloware/coloris@0.20.0': {} - '@parcel/types-internal@2.14.4': + '@mongodb-js/saslprep@1.2.2': dependencies: - '@parcel/diagnostic': 2.14.4 - '@parcel/feature-flags': 2.14.4 - '@parcel/source-map': 2.1.1 - utility-types: 3.11.0 + sparse-bitfield: 3.0.3 + optional: true - '@parcel/types@2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))': + '@nodable/entities@2.2.0': {} + + '@nodelib/fs.scandir@2.1.5': dependencies: - '@parcel/types-internal': 2.14.4 - '@parcel/workers': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} - '@parcel/utils@2.14.4': + '@nodelib/fs.walk@1.2.8': dependencies: - '@parcel/codeframe': 2.14.4 - '@parcel/diagnostic': 2.14.4 - '@parcel/logger': 2.14.4 - '@parcel/markdown-ansi': 2.14.4 - '@parcel/rust': 2.14.4 - '@parcel/source-map': 2.1.1 - chalk: 4.1.2 - nullthrows: 1.1.1 - transitivePeerDependencies: - - napi-wasm + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 '@parcel/watcher-android-arm64@2.5.1': optional: true @@ -6831,49 +7174,12 @@ snapshots: '@parcel/watcher-win32-arm64': 2.5.1 '@parcel/watcher-win32-ia32': 2.5.1 '@parcel/watcher-win32-x64': 2.5.1 - - '@parcel/workers@2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))': - dependencies: - '@parcel/core': 2.14.4(@swc/helpers@0.5.17) - '@parcel/diagnostic': 2.14.4 - '@parcel/logger': 2.14.4 - '@parcel/profiler': 2.14.4 - '@parcel/types-internal': 2.14.4 - '@parcel/utils': 2.14.4 - nullthrows: 1.1.1 - transitivePeerDependencies: - - napi-wasm + optional: true '@paypal/paypal-js@5.1.6': dependencies: promise-polyfill: 8.3.0 - '@pkgjs/parseargs@0.11.0': - optional: true - - '@protobufjs/aspromise@1.1.2': {} - - '@protobufjs/base64@1.1.2': {} - - '@protobufjs/codegen@2.0.4': {} - - '@protobufjs/eventemitter@1.1.0': {} - - '@protobufjs/fetch@1.1.0': - dependencies: - '@protobufjs/aspromise': 1.1.2 - '@protobufjs/inquire': 1.1.0 - - '@protobufjs/float@1.0.2': {} - - '@protobufjs/inquire@1.1.0': {} - - '@protobufjs/path@1.1.2': {} - - '@protobufjs/pool@1.1.0': {} - - '@protobufjs/utf8@1.1.0': {} - '@redis/bloom@1.2.0(@redis/client@1.6.1)': dependencies: '@redis/client': 1.6.1 @@ -6900,64 +7206,131 @@ snapshots: dependencies: '@redis/client': 1.6.1 - '@rollup/rollup-android-arm-eabi@4.40.2': + '@rollup/plugin-babel@6.1.0(@babel/core@7.29.7)(@types/babel__core@7.20.5)(rollup@4.62.2)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@rollup/pluginutils': 5.4.0(rollup@4.62.2) + optionalDependencies: + '@types/babel__core': 7.20.5 + rollup: 4.62.2 + transitivePeerDependencies: + - supports-color + + '@rollup/plugin-inject@5.0.5(rollup@4.62.2)': + dependencies: + '@rollup/pluginutils': 5.4.0(rollup@4.62.2) + estree-walker: 2.0.2 + magic-string: 0.30.21 + optionalDependencies: + rollup: 4.62.2 + + '@rollup/plugin-node-resolve@16.0.3(rollup@4.62.2)': + dependencies: + '@rollup/pluginutils': 5.4.0(rollup@4.62.2) + '@types/resolve': 1.20.2 + deepmerge: 4.3.1 + is-module: 1.0.0 + resolve: 1.22.12 + optionalDependencies: + rollup: 4.62.2 + + '@rollup/plugin-replace@6.0.3(rollup@4.62.2)': + dependencies: + '@rollup/pluginutils': 5.4.0(rollup@4.62.2) + magic-string: 0.30.21 + optionalDependencies: + rollup: 4.62.2 + + '@rollup/plugin-terser@1.0.0(rollup@4.62.2)': + dependencies: + serialize-javascript: 7.0.6 + smob: 1.6.2 + terser: 5.39.0 + optionalDependencies: + rollup: 4.62.2 + + '@rollup/pluginutils@5.4.0(rollup@4.62.2)': + dependencies: + '@types/estree': 1.0.7 + estree-walker: 2.0.2 + picomatch: 4.0.4 + optionalDependencies: + rollup: 4.62.2 + + '@rollup/rollup-android-arm-eabi@4.62.2': + optional: true + + '@rollup/rollup-android-arm64@4.62.2': + optional: true + + '@rollup/rollup-darwin-arm64@4.62.2': + optional: true + + '@rollup/rollup-darwin-x64@4.62.2': optional: true - '@rollup/rollup-android-arm64@4.40.2': + '@rollup/rollup-freebsd-arm64@4.62.2': optional: true - '@rollup/rollup-darwin-arm64@4.40.2': + '@rollup/rollup-freebsd-x64@4.62.2': optional: true - '@rollup/rollup-darwin-x64@4.40.2': + '@rollup/rollup-linux-arm-gnueabihf@4.62.2': optional: true - '@rollup/rollup-freebsd-arm64@4.40.2': + '@rollup/rollup-linux-arm-musleabihf@4.62.2': optional: true - '@rollup/rollup-freebsd-x64@4.40.2': + '@rollup/rollup-linux-arm64-gnu@4.62.2': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.40.2': + '@rollup/rollup-linux-arm64-musl@4.62.2': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.40.2': + '@rollup/rollup-linux-loong64-gnu@4.62.2': optional: true - '@rollup/rollup-linux-arm64-gnu@4.40.2': + '@rollup/rollup-linux-loong64-musl@4.62.2': optional: true - '@rollup/rollup-linux-arm64-musl@4.40.2': + '@rollup/rollup-linux-ppc64-gnu@4.62.2': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.40.2': + '@rollup/rollup-linux-ppc64-musl@4.62.2': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.40.2': + '@rollup/rollup-linux-riscv64-gnu@4.62.2': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.40.2': + '@rollup/rollup-linux-riscv64-musl@4.62.2': optional: true - '@rollup/rollup-linux-riscv64-musl@4.40.2': + '@rollup/rollup-linux-s390x-gnu@4.62.2': optional: true - '@rollup/rollup-linux-s390x-gnu@4.40.2': + '@rollup/rollup-linux-x64-gnu@4.62.2': optional: true - '@rollup/rollup-linux-x64-gnu@4.40.2': + '@rollup/rollup-linux-x64-musl@4.62.2': optional: true - '@rollup/rollup-linux-x64-musl@4.40.2': + '@rollup/rollup-openbsd-x64@4.62.2': optional: true - '@rollup/rollup-win32-arm64-msvc@4.40.2': + '@rollup/rollup-openharmony-arm64@4.62.2': optional: true - '@rollup/rollup-win32-ia32-msvc@4.40.2': + '@rollup/rollup-win32-arm64-msvc@4.62.2': optional: true - '@rollup/rollup-win32-x64-msvc@4.40.2': + '@rollup/rollup-win32-ia32-msvc@4.62.2': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.62.2': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.62.2': optional: true '@sapphire/async-queue@1.5.5': {} @@ -6965,12 +7338,10 @@ snapshots: '@sapphire/shapeshift@4.0.0': dependencies: fast-deep-equal: 3.1.3 - lodash: 4.17.21 + lodash: 4.18.1 '@sapphire/snowflake@3.5.3': {} - '@scarf/scarf@1.4.0': {} - '@servie/events@1.0.0': {} '@sinclair/typebox@0.27.8': {} @@ -6989,12 +7360,15 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/config-resolver@4.1.2': + '@smithy/config-resolver@4.6.1': dependencies: - '@smithy/node-config-provider': 4.1.1 - '@smithy/types': 4.2.0 - '@smithy/util-config-provider': 4.0.0 - '@smithy/util-middleware': 4.0.2 + '@smithy/core': 3.25.1 + tslib: 2.8.1 + + '@smithy/core@3.25.1': + dependencies: + '@aws-crypto/crc32': 5.2.0 + '@smithy/types': 4.15.0 tslib: 2.8.1 '@smithy/core@3.3.1': @@ -7198,6 +7572,10 @@ snapshots: '@smithy/util-stream': 4.2.0 tslib: 2.8.1 + '@smithy/types@4.15.0': + dependencies: + tslib: 2.8.1 + '@smithy/types@4.2.0': dependencies: tslib: 2.8.1 @@ -7246,7 +7624,7 @@ snapshots: '@smithy/util-defaults-mode-node@4.0.12': dependencies: - '@smithy/config-resolver': 4.1.2 + '@smithy/config-resolver': 4.6.1 '@smithy/credential-provider-imds': 4.0.4 '@smithy/node-config-provider': 4.1.1 '@smithy/property-provider': 4.0.2 @@ -7310,68 +7688,16 @@ snapshots: dependencies: solid-js: 1.9.6 - '@swc/core-darwin-arm64@1.11.24': - optional: true - - '@swc/core-darwin-x64@1.11.24': - optional: true - - '@swc/core-linux-arm-gnueabihf@1.11.24': - optional: true - - '@swc/core-linux-arm64-gnu@1.11.24': - optional: true - - '@swc/core-linux-arm64-musl@1.11.24': - optional: true - - '@swc/core-linux-x64-gnu@1.11.24': - optional: true - - '@swc/core-linux-x64-musl@1.11.24': - optional: true - - '@swc/core-win32-arm64-msvc@1.11.24': - optional: true - - '@swc/core-win32-ia32-msvc@1.11.24': - optional: true - - '@swc/core-win32-x64-msvc@1.11.24': - optional: true - - '@swc/core@1.11.24(@swc/helpers@0.5.17)': - dependencies: - '@swc/counter': 0.1.3 - '@swc/types': 0.1.21 - optionalDependencies: - '@swc/core-darwin-arm64': 1.11.24 - '@swc/core-darwin-x64': 1.11.24 - '@swc/core-linux-arm-gnueabihf': 1.11.24 - '@swc/core-linux-arm64-gnu': 1.11.24 - '@swc/core-linux-arm64-musl': 1.11.24 - '@swc/core-linux-x64-gnu': 1.11.24 - '@swc/core-linux-x64-musl': 1.11.24 - '@swc/core-win32-arm64-msvc': 1.11.24 - '@swc/core-win32-ia32-msvc': 1.11.24 - '@swc/core-win32-x64-msvc': 1.11.24 - '@swc/helpers': 0.5.17 - - '@swc/counter@0.1.3': {} - - '@swc/helpers@0.5.17': - dependencies: - tslib: 2.8.1 - - '@swc/types@0.1.21': - dependencies: - '@swc/counter': 0.1.3 - '@thisbeyond/solid-dnd@0.7.5(solid-js@1.9.6)': dependencies: solid-js: 1.9.6 - '@trysound/sax@0.2.0': {} + '@trickfilm400/rollup-plugin-off-main-thread@3.0.0-pre1': + dependencies: + ejs: 3.1.10 + json5: 2.2.3 + magic-string: 0.30.21 + string.prototype.matchall: 4.0.12 '@types/adm-zip@0.5.7': dependencies: @@ -7428,15 +7754,17 @@ snapshots: '@types/eslint-scope@3.7.7': dependencies: '@types/eslint': 9.6.1 - '@types/estree': 1.0.7 + '@types/estree': 1.0.9 '@types/eslint@9.6.1': dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.9 '@types/json-schema': 7.0.15 '@types/estree@1.0.7': {} + '@types/estree@1.0.9': {} + '@types/express-serve-static-core@4.19.6': dependencies: '@types/node': 18.19.100 @@ -7478,12 +7806,6 @@ snapshots: '@types/ms': 2.1.0 '@types/node': 18.19.100 - '@types/localtunnel@2.0.4': - dependencies: - '@types/node': 18.19.100 - - '@types/long@4.0.2': {} - '@types/mime@1.3.5': {} '@types/mocha@10.0.10': {} @@ -7520,6 +7842,8 @@ snapshots: '@types/range-parser@1.2.7': {} + '@types/resolve@1.20.2': {} + '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 @@ -7541,8 +7865,7 @@ snapshots: '@types/tough-cookie@4.0.5': {} - '@types/trusted-types@2.0.7': - optional: true + '@types/trusted-types@2.0.7': {} '@types/uuid@9.0.8': {} @@ -7651,7 +7974,7 @@ snapshots: transitivePeerDependencies: - bare-buffer - '@xmldom/xmldom@0.9.8': + '@xmldom/xmldom@0.9.10': optional: true '@xtuc/ieee754@1.2.0': {} @@ -7673,30 +7996,23 @@ snapshots: agent-base@7.1.3: {} - ajv-formats@2.1.1(ajv@8.17.1): + ajv-formats@2.1.1(ajv@8.20.0): optionalDependencies: - ajv: 8.17.1 - - ajv-keywords@3.5.2(ajv@6.12.6): - dependencies: - ajv: 6.12.6 + ajv: 8.20.0 - ajv-keywords@5.1.0(ajv@8.17.1): + ajv-keywords@3.5.2(ajv@8.20.0): dependencies: - ajv: 8.17.1 - fast-deep-equal: 3.1.3 + ajv: 8.20.0 - ajv@6.12.6: + ajv-keywords@5.1.0(ajv@8.20.0): dependencies: + ajv: 8.20.0 fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - ajv@8.17.1: + ajv@8.20.0: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.0.6 + fast-uri: 4.0.0 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -7704,22 +8020,20 @@ snapshots: ansi-regex@5.0.1: {} - ansi-regex@6.1.0: {} - ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 ansi-styles@5.2.0: {} - ansi-styles@6.2.1: {} - any-promise@1.3.0: {} anymatch@3.1.3: dependencies: normalize-path: 3.0.0 - picomatch: 2.3.1 + picomatch: 4.0.4 + + anynum@1.0.1: {} app-root-path@3.1.0: {} @@ -7727,17 +8041,28 @@ snapshots: arg@5.0.2: {} - argparse@1.0.10: - dependencies: - sprintf-js: 1.0.3 - argparse@2.0.1: {} + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 + array-flatten@1.1.1: {} + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + asn1.js@4.10.1: dependencies: - bn.js: 4.12.2 + bn.js: 5.2.3 inherits: 2.0.4 minimalistic-assert: 1.0.1 @@ -7751,18 +8076,18 @@ snapshots: assertion-error@1.1.0: {} + async-function@1.0.0: {} + + async@3.2.6: {} + + at-least-node@1.0.0: {} + atomic-sleep@1.0.0: {} available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.1.0 - axios@0.21.4(debug@4.3.2): - dependencies: - follow-redirects: 1.15.9(debug@4.3.2) - transitivePeerDependencies: - - debug - b4a@1.6.7: {} babel-plugin-istanbul@6.1.1: @@ -7775,41 +8100,65 @@ snapshots: transitivePeerDependencies: - supports-color - babel-plugin-jsx-dom-expressions@0.39.8(@babel/core@7.27.1): + babel-plugin-jsx-dom-expressions@0.39.8(@babel/core@7.29.7): dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.29.7 '@babel/helper-module-imports': 7.18.6 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.29.7) '@babel/types': 7.27.1 html-entities: 2.3.3 parse5: 7.3.0 validate-html-nesting: 1.2.2 - babel-preset-current-node-syntax@1.1.0(@babel/core@7.27.1): + babel-plugin-polyfill-corejs2@0.4.17(@babel/core@7.29.7): + dependencies: + '@babel/compat-data': 7.29.7 + '@babel/core': 7.29.7 + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-corejs3@0.14.2(@babel/core@7.29.7): + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7) + core-js-compat: 3.49.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-regenerator@0.6.8(@babel/core@7.29.7): + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7) + transitivePeerDependencies: + - supports-color + + babel-preset-current-node-syntax@1.1.0(@babel/core@7.29.7): dependencies: - '@babel/core': 7.27.1 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.27.1) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.27.1) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.27.1) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.27.1) - '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.27.1) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.27.1) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.27.1) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.27.1) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.27.1) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.27.1) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.27.1) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.27.1) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.27.1) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.27.1) + '@babel/core': 7.29.7 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.29.7) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.29.7) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.29.7) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.29.7) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.29.7) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.29.7) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.29.7) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.29.7) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.29.7) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.29.7) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.29.7) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.29.7) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.29.7) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.29.7) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.29.7) - babel-preset-solid@1.9.6(@babel/core@7.27.1): + babel-preset-solid@1.9.6(@babel/core@7.29.7): dependencies: - '@babel/core': 7.27.1 - babel-plugin-jsx-dom-expressions: 0.39.8(@babel/core@7.27.1) + '@babel/core': 7.29.7 + babel-plugin-jsx-dom-expressions: 0.39.8(@babel/core@7.29.7) - balanced-match@1.0.2: {} + balanced-match@4.0.4: {} bare-events@2.5.4: optional: true @@ -7836,12 +8185,10 @@ snapshots: bare-events: 2.5.4 optional: true - base-x@3.0.11: - dependencies: - safe-buffer: 5.2.1 - base64-js@1.5.1: {} + baseline-browser-mapping@2.10.40: {} + bcryptjs@2.4.3: {} big.js@5.2.2: {} @@ -7850,15 +8197,7 @@ snapshots: binary-extensions@2.3.0: {} - bl@4.1.0: - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 - - bn.js@4.12.2: {} - - bn.js@5.2.2: {} + bn.js@5.2.3: {} body-parser@1.20.3: dependencies: @@ -7870,7 +8209,7 @@ snapshots: http-errors: 2.0.0 iconv-lite: 0.4.24 on-finished: 2.4.1 - qs: 6.13.0 + qs: 6.15.2 raw-body: 2.5.2 type-is: 1.6.18 unpipe: 1.0.0 @@ -7881,14 +8220,9 @@ snapshots: bowser@2.11.0: {} - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - brace-expansion@2.0.1: + brace-expansion@5.0.6: dependencies: - balanced-match: 1.0.2 + balanced-match: 4.0.4 braces@3.0.3: dependencies: @@ -7896,6 +8230,10 @@ snapshots: brorand@1.1.0: {} + browser-resolve@2.0.0: + dependencies: + resolve: 1.22.10 + browser-stdout@1.3.1: {} browserify-aes@1.2.0: @@ -7922,13 +8260,13 @@ snapshots: browserify-rsa@4.1.1: dependencies: - bn.js: 5.2.2 + bn.js: 5.2.3 randombytes: 2.1.0 safe-buffer: 5.2.1 browserify-sign@4.2.3: dependencies: - bn.js: 5.2.2 + bn.js: 5.2.3 browserify-rsa: 4.1.1 create-hash: 1.2.0 create-hmac: 1.1.7 @@ -7950,6 +8288,14 @@ snapshots: node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.24.5) + browserslist@4.28.4: + dependencies: + baseline-browser-mapping: 2.10.40 + caniuse-lite: 1.0.30001799 + electron-to-chromium: 1.5.378 + node-releases: 2.0.50 + update-browserslist-db: 1.2.3(browserslist@4.28.4) + bser@2.1.1: dependencies: node-int64: 0.4.0 @@ -7996,12 +8342,17 @@ snapshots: get-intrinsic: 1.3.0 set-function-length: 1.2.2 - call-bound@1.0.4: + call-bind@1.0.9: dependencies: call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 get-intrinsic: 1.3.0 + set-function-length: 1.2.2 - callsites@3.1.0: {} + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 camelcase-css@2.0.1: {} @@ -8013,6 +8364,8 @@ snapshots: caniuse-lite@1.0.30001717: {} + caniuse-lite@1.0.30001799: {} + chai@4.5.0: dependencies: assertion-error: 1.1.0 @@ -8049,8 +8402,7 @@ snapshots: chokidar@4.0.3: dependencies: readdirp: 4.1.2 - - chownr@1.1.4: {} + optional: true chrome-trace-event@1.0.4: {} @@ -8078,8 +8430,6 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - clone@2.1.2: {} - cluster-key-slot@1.1.2: {} collect-v8-coverage@1.0.2: {} @@ -8104,8 +8454,6 @@ snapshots: commander@10.0.1: {} - commander@12.1.0: {} - commander@2.20.3: {} commander@4.1.1: {} @@ -8114,7 +8462,7 @@ snapshots: commander@9.5.0: {} - concat-map@0.0.1: {} + common-tags@1.8.2: {} concat-stream@1.6.2: dependencies: @@ -8127,14 +8475,18 @@ snapshots: dependencies: chalk: 4.1.2 date-fns: 2.30.0 - lodash: 4.17.21 + lodash: 4.18.1 rxjs: 7.8.2 - shell-quote: 1.8.2 + shell-quote: 1.8.4 spawn-command: 0.0.2 supports-color: 8.1.1 tree-kill: 1.2.2 yargs: 17.7.2 + console-browserify@1.2.0: {} + + constants-browserify@1.0.0: {} + content-disposition@0.5.4: dependencies: safe-buffer: 5.2.1 @@ -8147,6 +8499,10 @@ snapshots: cookie@0.7.1: {} + core-js-compat@3.49.0: + dependencies: + browserslist: 4.28.4 + core-util-is@1.0.3: {} cors@2.8.5: @@ -8154,20 +8510,11 @@ snapshots: object-assign: 4.1.1 vary: 1.1.2 - cosmiconfig@9.0.0(typescript@5.8.3): - dependencies: - env-paths: 2.2.1 - import-fresh: 3.3.1 - js-yaml: 4.1.0 - parse-json: 5.2.0 - optionalDependencies: - typescript: 5.8.3 - crc-32@0.3.0: {} create-ecdh@4.0.4: dependencies: - bn.js: 4.12.2 + bn.js: 5.2.3 elliptic: 6.6.1 create-hash@1.2.0: @@ -8176,7 +8523,7 @@ snapshots: inherits: 2.0.4 md5.js: 1.3.5 ripemd160: 2.0.2 - sha.js: 2.4.11 + sha.js: 2.4.12 create-hmac@1.1.7: dependencies: @@ -8185,7 +8532,9 @@ snapshots: inherits: 2.0.4 ripemd160: 2.0.2 safe-buffer: 5.2.1 - sha.js: 2.4.11 + sha.js: 2.4.12 + + create-require@1.1.1: {} cross-fetch@3.2.0: dependencies: @@ -8193,12 +8542,6 @@ snapshots: transitivePeerDependencies: - encoding - cross-spawn@7.0.6: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - crypto-browserify@3.12.1: dependencies: browserify-cipher: 1.0.1 @@ -8209,13 +8552,15 @@ snapshots: diffie-hellman: 5.0.3 hash-base: 3.0.5 inherits: 2.0.4 - pbkdf2: 3.1.2 + pbkdf2: 3.1.6 public-encrypt: 4.0.3 randombytes: 2.1.0 randomfill: 1.0.4 crypto-js@4.2.0: {} + crypto-random-string@2.0.0: {} + css-select@5.1.0: dependencies: boolbase: 1.0.0 @@ -8254,7 +8599,25 @@ snapshots: dagre@0.8.5: dependencies: graphlib: 2.1.8 - lodash: 4.17.21 + lodash: 4.18.1 + + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 date-fns@2.30.0: dependencies: @@ -8266,10 +8629,6 @@ snapshots: dependencies: ms: 2.0.0 - debug@4.3.2: - dependencies: - ms: 2.1.2 - debug@4.4.0: dependencies: ms: 2.1.3 @@ -8286,6 +8645,10 @@ snapshots: optionalDependencies: supports-color: 8.1.1 + debug@4.4.3: + dependencies: + ms: 2.1.3 + decamelize@4.0.0: {} decompress-response@6.0.0: @@ -8298,7 +8661,7 @@ snapshots: deep-extend@0.6.0: {} - deepmerge-ts@5.1.0: {} + deepmerge@4.3.1: {} define-data-property@1.1.4: dependencies: @@ -8321,7 +8684,8 @@ snapshots: destroy@1.2.0: {} - detect-libc@1.0.3: {} + detect-libc@1.0.3: + optional: true detect-libc@2.0.4: {} @@ -8329,11 +8693,11 @@ snapshots: diff-sequences@29.6.3: {} - diff@5.2.0: {} + diff@9.0.0: {} diffie-hellman@5.0.3: dependencies: - bn.js: 4.12.2 + bn.js: 5.2.3 miller-rabin: 4.0.1 randombytes: 2.1.0 @@ -8353,55 +8717,37 @@ snapshots: lodash.snakecase: 4.1.1 magic-bytes.js: 1.12.1 tslib: 2.8.1 - undici: 6.21.1 + undici: 8.5.0 transitivePeerDependencies: - bufferutil - utf-8-validate dlv@1.1.3: {} - dom-serializer@1.4.1: - dependencies: - domelementtype: 2.3.0 - domhandler: 4.3.1 - entities: 2.2.0 - dom-serializer@2.0.0: dependencies: domelementtype: 2.3.0 domhandler: 5.0.3 entities: 4.5.0 - domelementtype@2.3.0: {} + domain-browser@4.22.0: {} - domhandler@4.3.1: - dependencies: - domelementtype: 2.3.0 + domelementtype@2.3.0: {} domhandler@5.0.3: dependencies: domelementtype: 2.3.0 - dompurify@3.2.5: + dompurify@3.4.11: optionalDependencies: '@types/trusted-types': 2.0.7 - domutils@2.8.0: - dependencies: - dom-serializer: 1.4.1 - domelementtype: 2.3.0 - domhandler: 4.3.1 - domutils@3.2.2: dependencies: dom-serializer: 2.0.0 domelementtype: 2.3.0 domhandler: 5.0.3 - dotenv-expand@11.0.7: - dependencies: - dotenv: 16.5.0 - dotenv@16.5.0: {} dunder-proto@1.0.1: @@ -8410,8 +8756,6 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - eastasianwidth@0.2.0: {} - easy-speech@2.4.0: {} ecdsa-sig-formatter@1.0.11: @@ -8420,11 +8764,17 @@ snapshots: ee-first@1.1.1: {} + ejs@3.1.10: + dependencies: + jake: 10.9.4 + electron-to-chromium@1.5.151: {} + electron-to-chromium@1.5.378: {} + elliptic@6.6.1: dependencies: - bn.js: 4.12.2 + bn.js: 5.2.3 brorand: 1.1.0 hash.js: 1.1.7 hmac-drbg: 1.0.1 @@ -8434,8 +8784,6 @@ snapshots: emoji-regex@8.0.0: {} - emoji-regex@9.2.2: {} - emojis-list@3.0.0: {} encodeurl@1.0.2: {} @@ -8451,19 +8799,73 @@ snapshots: graceful-fs: 4.2.11 tapable: 2.2.1 - entities@2.2.0: {} - - entities@3.0.1: {} - entities@4.5.0: {} entities@6.0.0: {} - env-paths@2.2.1: {} + es-abstract-get@1.0.0: + dependencies: + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + is-callable: 1.2.7 + object-inspect: 1.13.4 - error-ex@1.3.2: + es-abstract@1.24.2: dependencies: - is-arrayish: 0.2.1 + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.9 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.3 + function.prototype.name: 1.2.0 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.4 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-negative-zero: 2.0.3 + is-regex: 1.2.1 + is-set: 2.0.3 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.4 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 + string.prototype.trim: 1.2.11 + string.prototype.trimend: 1.0.10 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.8 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.19 es-define-property@1.0.1: {} @@ -8475,31 +8877,53 @@ snapshots: dependencies: es-errors: 1.3.0 - esbuild@0.21.5: + es-object-atoms@1.1.2: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.4 + + es-to-primitive@1.3.3: + dependencies: + es-abstract-get: 1.0.0 + es-errors: 1.3.0 + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + + esbuild@0.25.12: optionalDependencies: - '@esbuild/aix-ppc64': 0.21.5 - '@esbuild/android-arm': 0.21.5 - '@esbuild/android-arm64': 0.21.5 - '@esbuild/android-x64': 0.21.5 - '@esbuild/darwin-arm64': 0.21.5 - '@esbuild/darwin-x64': 0.21.5 - '@esbuild/freebsd-arm64': 0.21.5 - '@esbuild/freebsd-x64': 0.21.5 - '@esbuild/linux-arm': 0.21.5 - '@esbuild/linux-arm64': 0.21.5 - '@esbuild/linux-ia32': 0.21.5 - '@esbuild/linux-loong64': 0.21.5 - '@esbuild/linux-mips64el': 0.21.5 - '@esbuild/linux-ppc64': 0.21.5 - '@esbuild/linux-riscv64': 0.21.5 - '@esbuild/linux-s390x': 0.21.5 - '@esbuild/linux-x64': 0.21.5 - '@esbuild/netbsd-x64': 0.21.5 - '@esbuild/openbsd-x64': 0.21.5 - '@esbuild/sunos-x64': 0.21.5 - '@esbuild/win32-arm64': 0.21.5 - '@esbuild/win32-ia32': 0.21.5 - '@esbuild/win32-x64': 0.21.5 + '@esbuild/aix-ppc64': 0.25.12 + '@esbuild/android-arm': 0.25.12 + '@esbuild/android-arm64': 0.25.12 + '@esbuild/android-x64': 0.25.12 + '@esbuild/darwin-arm64': 0.25.12 + '@esbuild/darwin-x64': 0.25.12 + '@esbuild/freebsd-arm64': 0.25.12 + '@esbuild/freebsd-x64': 0.25.12 + '@esbuild/linux-arm': 0.25.12 + '@esbuild/linux-arm64': 0.25.12 + '@esbuild/linux-ia32': 0.25.12 + '@esbuild/linux-loong64': 0.25.12 + '@esbuild/linux-mips64el': 0.25.12 + '@esbuild/linux-ppc64': 0.25.12 + '@esbuild/linux-riscv64': 0.25.12 + '@esbuild/linux-s390x': 0.25.12 + '@esbuild/linux-x64': 0.25.12 + '@esbuild/netbsd-arm64': 0.25.12 + '@esbuild/netbsd-x64': 0.25.12 + '@esbuild/openbsd-arm64': 0.25.12 + '@esbuild/openbsd-x64': 0.25.12 + '@esbuild/openharmony-arm64': 0.25.12 + '@esbuild/sunos-x64': 0.25.12 + '@esbuild/win32-arm64': 0.25.12 + '@esbuild/win32-ia32': 0.25.12 + '@esbuild/win32-x64': 0.25.12 escalade@3.2.0: {} @@ -8514,8 +8938,6 @@ snapshots: esrecurse: 4.3.0 estraverse: 4.3.0 - esprima@4.0.1: {} - esrecurse@4.3.0: dependencies: estraverse: 5.3.0 @@ -8524,6 +8946,12 @@ snapshots: estraverse@5.3.0: {} + estree-walker@2.0.2: {} + + esutils@2.0.3: {} + + eta@4.6.0: {} + etag@1.8.1: {} event-target-shim@5.0.1: {} @@ -8537,9 +8965,9 @@ snapshots: evtstore@12.0.1: {} - exifreader@4.30.1: + exifreader@4.41.0: optionalDependencies: - '@xmldom/xmldom': 0.9.8 + '@xmldom/xmldom': 0.9.10 expand-template@2.0.3: {} @@ -8572,9 +9000,9 @@ snapshots: methods: 1.1.2 on-finished: 2.4.1 parseurl: 1.3.3 - path-to-regexp: 0.1.12 + path-to-regexp: 0.1.13 proxy-addr: 2.0.7 - qs: 6.13.0 + qs: 6.15.2 range-parser: 1.2.1 safe-buffer: 5.2.1 send: 0.19.0 @@ -8609,11 +9037,21 @@ snapshots: fast-safe-stringify@2.1.1: {} - fast-uri@3.0.6: {} + fast-uri@4.0.0: {} - fast-xml-parser@4.4.1: + fast-xml-builder@1.2.0: dependencies: - strnum: 1.1.2 + path-expression-matcher: 1.6.0 + xml-naming: 0.1.0 + + fast-xml-parser@5.9.3: + dependencies: + '@nodable/entities': 2.2.0 + fast-xml-builder: 1.2.0 + is-unsafe: 1.0.1 + path-expression-matcher: 1.6.0 + strnum: 2.4.1 + xml-naming: 0.1.0 fastq@1.19.1: dependencies: @@ -8623,6 +9061,14 @@ snapshots: dependencies: bser: 2.1.1 + fdir@6.5.0(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 + + filelist@1.0.6: + dependencies: + minimatch: 10.2.5 + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -8655,19 +9101,10 @@ snapshots: flatbuffers@1.12.0: {} - follow-redirects@1.15.9(debug@4.3.2): - optionalDependencies: - debug: 4.3.2 - for-each@0.3.5: dependencies: is-callable: 1.2.7 - foreground-child@3.3.1: - dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 - forwarded@0.2.0: {} fresh@0.5.2: {} @@ -8676,15 +9113,32 @@ snapshots: dependencies: '@types/node': 15.14.9 - fs-constants@1.0.0: {} - - fs.realpath@1.0.0: {} + fs-extra@9.1.0: + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.2.1 + universalify: 2.0.1 fsevents@2.3.3: optional: true function-bind@1.1.2: {} + function.prototype.name@1.2.0: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + es-define-property: 1.0.1 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + hasown: 2.0.4 + is-callable: 1.2.7 + is-document.all: 1.0.0 + + functions-have-names@1.2.3: {} + gaxios@6.7.1: dependencies: extend: 3.0.2 @@ -8726,15 +9180,21 @@ snapshots: hasown: 2.0.2 math-intrinsics: 1.1.0 - get-package-type@0.1.0: {} + get-own-enumerable-property-symbols@3.0.2: {} - get-port@4.2.0: {} + get-package-type@0.1.0: {} get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + github-from-package@0.0.0: {} glob-parent@5.1.2: @@ -8747,37 +9207,18 @@ snapshots: glob-to-regexp@0.4.1: {} - glob@10.4.5: - dependencies: - foreground-child: 3.3.1 - jackspeak: 3.4.3 - minimatch: 9.0.5 - minipass: 7.1.2 - package-json-from-dist: 1.0.1 - path-scurry: 1.11.1 - - glob@7.2.3: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - glob@8.1.0: + glob@13.0.6: dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 + minimatch: 10.2.5 + minipass: 7.1.3 + path-scurry: 2.0.2 globals@11.12.0: {} - globals@13.24.0: + globalthis@1.0.4: dependencies: - type-fest: 0.20.2 + define-properties: 1.2.1 + gopd: 1.2.0 globrex@0.1.2: {} @@ -8788,7 +9229,7 @@ snapshots: gaxios: 6.7.1 gcp-metadata: 6.1.1 gtoken: 7.1.0 - jws: 4.0.0 + jws: 4.0.1 transitivePeerDependencies: - encoding - supports-color @@ -8803,18 +9244,20 @@ snapshots: graphlib@2.1.8: dependencies: - lodash: 4.17.21 + lodash: 4.18.1 gtoken@7.1.0: dependencies: gaxios: 6.7.1 - jws: 4.0.0 + jws: 4.0.1 transitivePeerDependencies: - encoding - supports-color guid-typescript@1.0.9: {} + has-bigints@1.1.0: {} + has-flag@3.0.0: {} has-flag@4.0.0: {} @@ -8823,6 +9266,10 @@ snapshots: dependencies: es-define-property: 1.0.1 + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + has-symbols@1.1.0: {} has-tostringtag@1.0.2: @@ -8834,6 +9281,13 @@ snapshots: inherits: 2.0.4 safe-buffer: 5.2.1 + hash-base@3.1.2: + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.8 + safe-buffer: 5.2.1 + to-buffer: 1.2.2 + hash.js@1.1.7: dependencies: inherits: 2.0.4 @@ -8843,11 +9297,15 @@ snapshots: dependencies: function-bind: 1.1.2 + hasown@2.0.4: + dependencies: + function-bind: 1.1.2 + he@1.2.0: {} help-me@4.2.0: dependencies: - glob: 8.1.0 + glob: 13.0.6 readable-stream: 3.6.2 hex-rgb@4.3.0: {} @@ -8860,31 +9318,6 @@ snapshots: html-entities@2.3.3: {} - htmlnano@2.1.2(postcss@8.5.3)(svgo@3.3.2)(terser@5.39.0)(typescript@5.8.3): - dependencies: - cosmiconfig: 9.0.0(typescript@5.8.3) - posthtml: 0.16.6 - optionalDependencies: - postcss: 8.5.3 - svgo: 3.3.2 - terser: 5.39.0 - transitivePeerDependencies: - - typescript - - htmlparser2@7.2.0: - dependencies: - domelementtype: 2.3.0 - domhandler: 4.3.1 - domutils: 2.8.0 - entities: 3.0.1 - - htmlparser2@9.1.0: - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - domutils: 3.2.2 - entities: 4.5.0 - http-errors@2.0.0: dependencies: depd: 2.0.0 @@ -8912,26 +9345,19 @@ snapshots: dependencies: safer-buffer: 2.1.2 + idb@7.1.1: {} + ieee754@1.2.1: {} ignore-by-default@1.0.1: {} immediate@3.0.6: {} - immutable@5.1.2: {} - - import-fresh@3.3.1: - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 + immutable@5.1.6: + optional: true imurmurhash@0.1.4: {} - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - infobox-parser@3.6.2: dependencies: camelcase: 4.1.0 @@ -8940,10 +9366,13 @@ snapshots: ini@1.3.8: {} - ip-address@9.0.5: + internal-slot@1.1.0: dependencies: - jsbn: 1.1.0 - sprintf-js: 1.1.3 + es-errors: 1.3.0 + hasown: 2.0.4 + side-channel: 1.1.0 + + ip-address@10.2.0: {} ipaddr.js@1.9.1: {} @@ -8952,22 +9381,62 @@ snapshots: call-bound: 1.0.4 has-tostringtag: 1.0.2 - is-arrayish@0.2.1: {} + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 is-arrayish@0.3.2: {} + is-async-function@2.1.1: + dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + is-callable@1.2.7: {} is-core-module@2.16.1: dependencies: hasown: 2.0.2 + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-document.all@1.0.0: + dependencies: + call-bound: 1.0.4 + is-extglob@2.1.1: {} + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.4 + is-fullwidth-code-point@3.0.0: {} is-generator-function@1.1.0: @@ -8981,15 +9450,26 @@ snapshots: dependencies: is-extglob: 2.1.1 - is-json@2.0.1: {} + is-map@2.0.3: {} + + is-module@1.0.0: {} is-nan@1.3.2: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 + is-negative-zero@2.0.3: {} + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + is-number@7.0.0: {} + is-obj@1.0.1: {} + is-plain-obj@2.1.0: {} is-regex@1.2.1: @@ -8999,25 +9479,59 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 + is-regexp@1.0.0: {} + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.4 + is-stream@2.0.1: {} + is-string@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + is-typed-array@1.1.15: dependencies: which-typed-array: 1.1.19 is-unicode-supported@0.1.0: {} + is-unsafe@1.0.1: {} + + is-weakmap@2.0.2: {} + + is-weakref@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-what@4.1.16: {} isarray@1.0.0: {} - isexe@2.0.0: {} + isarray@2.0.5: {} + + isomorphic-timers-promises@1.0.1: {} istanbul-lib-coverage@3.2.2: {} istanbul-lib-instrument@5.2.1: dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.29.7 '@babel/parser': 7.27.2 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 @@ -9025,11 +9539,11 @@ snapshots: transitivePeerDependencies: - supports-color - jackspeak@3.4.3: + jake@10.9.4: dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 + async: 3.2.6 + filelist: 1.0.6 + picocolors: 1.1.1 jest-diff@29.7.0: dependencies: @@ -9079,15 +9593,15 @@ snapshots: jest-snapshot@29.7.0: dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.29.7 '@babel/generator': 7.27.1 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.29.7) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.29.7) '@babel/types': 7.27.1 '@jest/expect-utils': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.27.1) + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.29.7) chalk: 4.1.2 expect: 29.7.0 graceful-fs: 4.2.11 @@ -9109,7 +9623,7 @@ snapshots: chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 - picomatch: 2.3.1 + picomatch: 4.0.4 jest-worker@27.5.1: dependencies: @@ -9128,7 +9642,7 @@ snapshots: joycon@3.1.1: {} - js-cookie@3.0.5: {} + js-cookie@3.0.8: {} js-tiktoken@1.0.20: dependencies: @@ -9136,17 +9650,10 @@ snapshots: js-tokens@4.0.0: {} - js-yaml@3.14.1: - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - - js-yaml@4.1.0: + js-yaml@5.0.0: dependencies: argparse: 2.0.1 - jsbn@1.1.0: {} - jsesc@3.1.0: {} json-bigint@1.0.0: @@ -9155,15 +9662,21 @@ snapshots: json-parse-even-better-errors@2.3.1: {} - json-schema-traverse@0.4.1: {} - json-schema-traverse@1.0.0: {} json5@2.2.3: {} + jsonfile@6.2.1: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + jsonpointer@5.0.1: {} + jsonwebtoken@9.0.2: dependencies: - jws: 3.2.2 + jws: 4.0.1 lodash.includes: 4.3.0 lodash.isboolean: 3.0.3 lodash.isinteger: 4.0.4 @@ -9174,28 +9687,19 @@ snapshots: ms: 2.1.3 semver: 7.7.1 - jwa@1.4.2: - dependencies: - buffer-equal-constant-time: 1.0.1 - ecdsa-sig-formatter: 1.0.11 - safe-buffer: 5.2.1 - jwa@2.0.1: dependencies: buffer-equal-constant-time: 1.0.1 ecdsa-sig-formatter: 1.0.11 safe-buffer: 5.2.1 - jws@3.2.2: - dependencies: - jwa: 1.4.2 - safe-buffer: 5.2.1 - - jws@4.0.0: + jws@4.0.1: dependencies: jwa: 2.0.1 safe-buffer: 5.2.1 + leven@3.1.0: {} + libsodium-sumo@0.7.15: {} libsodium-wrappers-sumo@0.7.15: @@ -9250,26 +9754,12 @@ snapshots: lightningcss-linux-x64-musl: 1.29.3 lightningcss-win32-arm64-msvc: 1.29.3 lightningcss-win32-x64-msvc: 1.29.3 + optional: true lilconfig@3.1.3: {} lines-and-columns@1.2.4: {} - lmdb@2.8.5: - dependencies: - msgpackr: 1.11.2 - node-addon-api: 6.1.0 - node-gyp-build-optional-packages: 5.1.1 - ordered-binary: 1.5.3 - weak-lru-cache: 1.2.2 - optionalDependencies: - '@lmdb/lmdb-darwin-arm64': 2.8.5 - '@lmdb/lmdb-darwin-x64': 2.8.5 - '@lmdb/lmdb-linux-arm': 2.8.5 - '@lmdb/lmdb-linux-arm64': 2.8.5 - '@lmdb/lmdb-linux-x64': 2.8.5 - '@lmdb/lmdb-win32-x64': 2.8.5 - loader-runner@4.3.0: {} loader-utils@2.0.4: @@ -9282,15 +9772,6 @@ snapshots: dependencies: lie: 3.1.1 - localtunnel@2.0.2: - dependencies: - axios: 0.21.4(debug@4.3.2) - debug: 4.3.2 - openurl: 1.1.1 - yargs: 17.1.1 - transitivePeerDependencies: - - supports-color - locate-path@5.0.0: dependencies: p-locate: 4.1.0 @@ -9299,6 +9780,8 @@ snapshots: dependencies: p-locate: 5.0.0 + lodash.debounce@4.0.8: {} + lodash.includes@4.3.0: {} lodash.isboolean@3.0.3: {} @@ -9315,7 +9798,9 @@ snapshots: lodash.snakecase@4.1.1: {} - lodash@4.17.21: {} + lodash.sortby@4.7.0: {} + + lodash@4.18.1: {} log-symbols@4.1.0: dependencies: @@ -9324,22 +9809,24 @@ snapshots: long@4.0.0: {} + long@5.3.2: {} + loupe@2.3.7: dependencies: get-func-name: 2.0.2 - lru-cache@10.4.3: {} + lru-cache@11.5.1: {} lru-cache@5.1.1: dependencies: yallist: 3.1.1 - lucide-solid@0.356.0(solid-js@1.9.6): - dependencies: - solid-js: 1.9.6 - magic-bytes.js@1.12.1: {} + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + make-error-cause@2.3.0: dependencies: make-error: 1.3.6 @@ -9382,11 +9869,11 @@ snapshots: micromatch@4.0.8: dependencies: braces: 3.0.3 - picomatch: 2.3.1 + picomatch: 4.0.4 miller-rabin@4.0.1: dependencies: - bn.js: 4.12.2 + bn.js: 5.2.3 brorand: 1.1.0 mime-db@1.52.0: {} @@ -9403,21 +9890,13 @@ snapshots: minimalistic-crypto-utils@1.0.1: {} - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@5.1.6: + minimatch@10.2.5: dependencies: - brace-expansion: 2.0.1 - - minimatch@9.0.5: - dependencies: - brace-expansion: 2.0.1 + brace-expansion: 5.0.6 minimist@1.2.8: {} - minipass@7.1.2: {} + minipass@7.1.3: {} mix-css-color@0.2.0: dependencies: @@ -9450,16 +9929,16 @@ snapshots: browser-stdout: 1.3.1 chokidar: 3.6.0 debug: 4.4.0(supports-color@8.1.1) - diff: 5.2.0 + diff: 9.0.0 escape-string-regexp: 4.0.0 find-up: 5.0.0 - glob: 8.1.0 + glob: 13.0.6 he: 1.2.0 - js-yaml: 4.1.0 + js-yaml: 5.0.0 log-symbols: 4.1.0 - minimatch: 5.1.6 + minimatch: 10.2.5 ms: 2.1.3 - serialize-javascript: 6.0.2 + serialize-javascript: 7.0.6 strip-json-comments: 3.1.1 supports-color: 8.1.1 workerpool: 6.5.1 @@ -9486,26 +9965,8 @@ snapshots: ms@2.0.0: {} - ms@2.1.2: {} - ms@2.1.3: {} - msgpackr-extract@3.0.3: - dependencies: - node-gyp-build-optional-packages: 5.2.2 - optionalDependencies: - '@msgpackr-extract/msgpackr-extract-darwin-arm64': 3.0.3 - '@msgpackr-extract/msgpackr-extract-darwin-x64': 3.0.3 - '@msgpackr-extract/msgpackr-extract-linux-arm': 3.0.3 - '@msgpackr-extract/msgpackr-extract-linux-arm64': 3.0.3 - '@msgpackr-extract/msgpackr-extract-linux-x64': 3.0.3 - '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.3 - optional: true - - msgpackr@1.11.2: - optionalDependencies: - msgpackr-extract: 3.0.3 - multer@1.4.5-lts.1: dependencies: append-field: 1.0.0 @@ -9524,7 +9985,7 @@ snapshots: nai-js-tokenizer@1.0.1: {} - nanoid@3.3.11: {} + nanoid@3.3.14: {} napi-build-utils@2.0.0: {} @@ -9545,31 +10006,55 @@ snapshots: node-addon-api@6.1.0: {} - node-addon-api@7.1.1: {} + node-addon-api@7.1.1: + optional: true node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 - node-gyp-build-optional-packages@5.1.1: - dependencies: - detect-libc: 2.0.4 - - node-gyp-build-optional-packages@5.2.2: - dependencies: - detect-libc: 2.0.4 - optional: true - node-int64@0.4.0: {} node-releases@2.0.19: {} + node-releases@2.0.50: {} + + node-stdlib-browser@1.3.1: + dependencies: + assert: 2.1.0 + browser-resolve: 2.0.0 + browserify-zlib: 0.2.0 + buffer: 5.7.1 + console-browserify: 1.2.0 + constants-browserify: 1.0.0 + create-require: 1.1.1 + crypto-browserify: 3.12.1 + domain-browser: 4.22.0 + events: 3.3.0 + https-browserify: 1.0.0 + isomorphic-timers-promises: 1.0.1 + os-browserify: 0.3.0 + path-browserify: 1.0.1 + pkg-dir: 5.0.0 + process: 0.11.10 + punycode: 1.4.1 + querystring-es3: 0.2.1 + readable-stream: 3.6.2 + stream-browserify: 3.0.0 + stream-http: 3.2.0 + string_decoder: 1.3.0 + timers-browserify: 2.0.12 + tty-browserify: 0.0.1 + url: 0.11.4 + util: 0.12.5 + vm-browserify: 1.1.2 + nodemon@3.1.10: dependencies: chokidar: 3.6.0 debug: 4.4.0(supports-color@5.5.0) ignore-by-default: 1.0.1 - minimatch: 3.1.2 + minimatch: 10.2.5 pstree.remy: 1.1.8 semver: 7.7.1 simple-update-notifier: 2.0.0 @@ -9583,8 +10068,6 @@ snapshots: dependencies: boolbase: 1.0.0 - nullthrows@1.1.1: {} - object-assign@4.1.1: {} object-hash@3.0.0: {} @@ -9619,7 +10102,7 @@ snapshots: onnx-proto@4.0.4: dependencies: - protobufjs: 6.11.4 + protobufjs: 8.6.4 onnxruntime-common@1.14.0: {} @@ -9637,9 +10120,13 @@ snapshots: onnxruntime-common: 1.14.0 platform: 1.3.6 - openurl@1.1.1: {} + os-browserify@0.3.0: {} - ordered-binary@1.5.3: {} + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 p-limit@2.3.0: dependencies: @@ -9659,51 +10146,15 @@ snapshots: p-try@2.2.0: {} - package-json-from-dist@1.0.1: {} - pako@1.0.11: {} - parcel@2.14.4(@swc/helpers@0.5.17)(postcss@8.5.3)(svgo@3.3.2)(terser@5.39.0)(typescript@5.8.3): - dependencies: - '@parcel/config-default': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))(@swc/helpers@0.5.17)(postcss@8.5.3)(svgo@3.3.2)(terser@5.39.0)(typescript@5.8.3) - '@parcel/core': 2.14.4(@swc/helpers@0.5.17) - '@parcel/diagnostic': 2.14.4 - '@parcel/events': 2.14.4 - '@parcel/feature-flags': 2.14.4 - '@parcel/fs': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/logger': 2.14.4 - '@parcel/package-manager': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17))(@swc/helpers@0.5.17) - '@parcel/reporter-cli': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/reporter-dev-server': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/reporter-tracer': 2.14.4(@parcel/core@2.14.4(@swc/helpers@0.5.17)) - '@parcel/utils': 2.14.4 - chalk: 4.1.2 - commander: 12.1.0 - get-port: 4.2.0 - transitivePeerDependencies: - - '@swc/helpers' - - cssnano - - napi-wasm - - postcss - - purgecss - - relateurl - - srcset - - svgo - - terser - - typescript - - uncss - - parent-module@1.0.1: - dependencies: - callsites: 3.1.0 - parse-asn1@5.1.7: dependencies: asn1.js: 4.10.1 browserify-aes: 1.2.0 evp_bytestokey: 1.0.3 hash-base: 3.0.5 - pbkdf2: 3.1.2 + pbkdf2: 3.1.6 safe-buffer: 5.2.1 parse-css-color@0.1.2: @@ -9716,13 +10167,6 @@ snapshots: color-name: 1.1.4 hex-rgb: 4.3.0 - parse-json@5.2.0: - dependencies: - '@babel/code-frame': 7.27.1 - error-ex: 1.3.2 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - parse5@7.3.0: dependencies: entities: 6.0.0 @@ -9733,18 +10177,16 @@ snapshots: path-exists@4.0.0: {} - path-is-absolute@1.0.1: {} - - path-key@3.1.1: {} + path-expression-matcher@1.6.0: {} path-parse@1.0.7: {} - path-scurry@1.11.1: + path-scurry@2.0.2: dependencies: - lru-cache: 10.4.3 - minipass: 7.1.2 + lru-cache: 11.5.1 + minipass: 7.1.3 - path-to-regexp@0.1.12: {} + path-to-regexp@0.1.13: {} pathval@1.1.1: {} @@ -9757,13 +10199,14 @@ snapshots: buffer-crc32: 0.2.13 semver: 5.7.2 - pbkdf2@3.1.2: + pbkdf2@3.1.6: dependencies: create-hash: 1.2.0 create-hmac: 1.1.7 - ripemd160: 2.0.2 + ripemd160: 2.0.3 safe-buffer: 5.2.1 - sha.js: 2.4.11 + sha.js: 2.4.12 + to-buffer: 1.2.2 pdfdataextract@3.2.0(worker-loader@3.0.8(webpack@5.99.8)): dependencies: @@ -9780,9 +10223,14 @@ snapshots: commander: 10.0.1 source-map-generator: 0.8.0 + phosphor-solid@1.1.5(react@19.1.0): + dependencies: + react: 19.1.0 + solid-js: 1.9.6 + picocolors@1.1.1: {} - picomatch@2.3.1: {} + picomatch@4.0.4: {} pify@2.3.0: {} @@ -9826,6 +10274,10 @@ snapshots: pirates@4.0.7: {} + pkg-dir@5.0.0: + dependencies: + find-up: 5.0.0 + platform@1.3.6: {} png-chunk-text@1.0.0: {} @@ -9879,28 +10331,28 @@ snapshots: possible-typed-array-names@1.1.0: {} - postcss-import@15.1.0(postcss@8.5.3): + postcss-import@15.1.0(postcss@8.5.15): dependencies: - postcss: 8.5.3 + postcss: 8.5.15 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.10 - postcss-js@4.0.1(postcss@8.5.3): + postcss-js@4.0.1(postcss@8.5.15): dependencies: camelcase-css: 2.0.1 - postcss: 8.5.3 + postcss: 8.5.15 - postcss-load-config@4.0.2(postcss@8.5.3): + postcss-load-config@4.0.2(postcss@8.5.15): dependencies: lilconfig: 3.1.3 - yaml: 2.7.1 + yaml: 2.9.0 optionalDependencies: - postcss: 8.5.3 + postcss: 8.5.15 - postcss-nested@6.2.0(postcss@8.5.3): + postcss-nested@6.2.0(postcss@8.5.15): dependencies: - postcss: 8.5.3 + postcss: 8.5.15 postcss-selector-parser: 6.1.2 postcss-selector-parser@6.1.2: @@ -9910,29 +10362,12 @@ snapshots: postcss-value-parser@4.2.0: {} - postcss@8.5.3: + postcss@8.5.15: dependencies: - nanoid: 3.3.11 + nanoid: 3.3.14 picocolors: 1.1.1 source-map-js: 1.2.1 - posthtml-parser@0.11.0: - dependencies: - htmlparser2: 7.2.0 - - posthtml-parser@0.12.1: - dependencies: - htmlparser2: 9.1.0 - - posthtml-render@3.0.0: - dependencies: - is-json: 2.0.1 - - posthtml@0.16.6: - dependencies: - posthtml-parser: 0.11.0 - posthtml-render: 3.0.0 - prebuild-install@7.1.3: dependencies: detect-libc: 2.0.4 @@ -9945,8 +10380,10 @@ snapshots: pump: 3.0.2 rc: 1.2.8 simple-get: 4.0.1 - tar-fs: 2.1.2 + tar-fs: 3.1.2 tunnel-agent: 0.6.0 + transitivePeerDependencies: + - bare-buffer prettier-plugin-tailwindcss@0.2.8(prettier@2.8.8): dependencies: @@ -9954,6 +10391,10 @@ snapshots: prettier@2.8.8: {} + pretty-bytes@5.6.0: {} + + pretty-bytes@6.1.1: {} + pretty-format@29.7.0: dependencies: '@jest/schemas': 29.6.3 @@ -9968,21 +10409,9 @@ snapshots: promise-polyfill@8.3.0: {} - protobufjs@6.11.4: - dependencies: - '@protobufjs/aspromise': 1.1.2 - '@protobufjs/base64': 1.1.2 - '@protobufjs/codegen': 2.0.4 - '@protobufjs/eventemitter': 1.1.0 - '@protobufjs/fetch': 1.1.0 - '@protobufjs/float': 1.0.2 - '@protobufjs/inquire': 1.1.0 - '@protobufjs/path': 1.1.2 - '@protobufjs/pool': 1.1.0 - '@protobufjs/utf8': 1.1.0 - '@types/long': 4.0.2 - '@types/node': 18.19.100 - long: 4.0.0 + protobufjs@8.6.4: + dependencies: + long: 5.3.2 proxy-addr@2.0.7: dependencies: @@ -9997,7 +10426,7 @@ snapshots: public-encrypt@4.0.3: dependencies: - bn.js: 4.12.2 + bn.js: 5.2.3 browserify-rsa: 4.1.1 create-hash: 1.2.0 parse-asn1: 5.1.7 @@ -10015,11 +10444,7 @@ snapshots: pure-color@1.3.0: {} - qs@6.13.0: - dependencies: - side-channel: 1.1.0 - - qs@6.14.0: + qs@6.15.2: dependencies: side-channel: 1.1.0 @@ -10058,8 +10483,6 @@ snapshots: react-is@18.3.1: {} - react-refresh@0.16.0: {} - react@19.1.0: {} read-cache@1.0.0: @@ -10092,9 +10515,10 @@ snapshots: readdirp@3.6.0: dependencies: - picomatch: 2.3.1 + picomatch: 4.0.4 - readdirp@4.1.2: {} + readdirp@4.1.2: + optional: true real-require@0.2.0: {} @@ -10107,7 +10531,46 @@ snapshots: '@redis/search': 1.2.0(@redis/client@1.6.1) '@redis/time-series': 1.1.0(@redis/client@1.6.1) - regenerator-runtime@0.14.1: {} + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + + regenerate-unicode-properties@10.2.2: + dependencies: + regenerate: 1.4.2 + + regenerate@1.4.2: {} + + regexp.prototype.flags@1.5.4: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + + regexpu-core@6.4.0: + dependencies: + regenerate: 1.4.2 + regenerate-unicode-properties: 10.2.2 + regjsgen: 0.8.0 + regjsparser: 0.13.2 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.2.1 + + regjsgen@0.8.0: {} + + regjsparser@0.13.2: + dependencies: + jsesc: 3.1.0 require-directory@2.1.1: {} @@ -10115,8 +10578,6 @@ snapshots: requires-port@1.0.0: {} - resolve-from@4.0.0: {} - resolve-from@5.0.0: {} resolve@1.22.10: @@ -10125,6 +10586,13 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + resolve@1.22.12: + dependencies: + es-errors: 1.3.0 + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + reusify@1.1.0: {} ripemd160@2.0.2: @@ -10132,30 +10600,40 @@ snapshots: hash-base: 3.0.5 inherits: 2.0.4 - rollup@4.40.2: + ripemd160@2.0.3: dependencies: - '@types/estree': 1.0.7 + hash-base: 3.1.2 + inherits: 2.0.4 + + rollup@4.62.2: + dependencies: + '@types/estree': 1.0.9 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.40.2 - '@rollup/rollup-android-arm64': 4.40.2 - '@rollup/rollup-darwin-arm64': 4.40.2 - '@rollup/rollup-darwin-x64': 4.40.2 - '@rollup/rollup-freebsd-arm64': 4.40.2 - '@rollup/rollup-freebsd-x64': 4.40.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.40.2 - '@rollup/rollup-linux-arm-musleabihf': 4.40.2 - '@rollup/rollup-linux-arm64-gnu': 4.40.2 - '@rollup/rollup-linux-arm64-musl': 4.40.2 - '@rollup/rollup-linux-loongarch64-gnu': 4.40.2 - '@rollup/rollup-linux-powerpc64le-gnu': 4.40.2 - '@rollup/rollup-linux-riscv64-gnu': 4.40.2 - '@rollup/rollup-linux-riscv64-musl': 4.40.2 - '@rollup/rollup-linux-s390x-gnu': 4.40.2 - '@rollup/rollup-linux-x64-gnu': 4.40.2 - '@rollup/rollup-linux-x64-musl': 4.40.2 - '@rollup/rollup-win32-arm64-msvc': 4.40.2 - '@rollup/rollup-win32-ia32-msvc': 4.40.2 - '@rollup/rollup-win32-x64-msvc': 4.40.2 + '@rollup/rollup-android-arm-eabi': 4.62.2 + '@rollup/rollup-android-arm64': 4.62.2 + '@rollup/rollup-darwin-arm64': 4.62.2 + '@rollup/rollup-darwin-x64': 4.62.2 + '@rollup/rollup-freebsd-arm64': 4.62.2 + '@rollup/rollup-freebsd-x64': 4.62.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.62.2 + '@rollup/rollup-linux-arm-musleabihf': 4.62.2 + '@rollup/rollup-linux-arm64-gnu': 4.62.2 + '@rollup/rollup-linux-arm64-musl': 4.62.2 + '@rollup/rollup-linux-loong64-gnu': 4.62.2 + '@rollup/rollup-linux-loong64-musl': 4.62.2 + '@rollup/rollup-linux-ppc64-gnu': 4.62.2 + '@rollup/rollup-linux-ppc64-musl': 4.62.2 + '@rollup/rollup-linux-riscv64-gnu': 4.62.2 + '@rollup/rollup-linux-riscv64-musl': 4.62.2 + '@rollup/rollup-linux-s390x-gnu': 4.62.2 + '@rollup/rollup-linux-x64-gnu': 4.62.2 + '@rollup/rollup-linux-x64-musl': 4.62.2 + '@rollup/rollup-openbsd-x64': 4.62.2 + '@rollup/rollup-openharmony-arm64': 4.62.2 + '@rollup/rollup-win32-arm64-msvc': 4.62.2 + '@rollup/rollup-win32-ia32-msvc': 4.62.2 + '@rollup/rollup-win32-x64-gnu': 4.62.2 + '@rollup/rollup-win32-x64-msvc': 4.62.2 fsevents: 2.3.3 run-parallel@1.2.0: @@ -10166,10 +10644,23 @@ snapshots: dependencies: tslib: 2.8.1 + safe-array-concat@1.1.4: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + safe-buffer@5.1.2: {} safe-buffer@5.2.1: {} + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + safe-regex-test@1.1.0: dependencies: call-bound: 1.0.4 @@ -10183,25 +10674,28 @@ snapshots: sass@1.87.0: dependencies: chokidar: 4.0.3 - immutable: 5.1.2 + immutable: 5.1.6 source-map-js: 1.2.1 optionalDependencies: '@parcel/watcher': 2.5.1 + optional: true sax@1.4.1: {} + sax@1.6.0: {} + schema-utils@3.3.0: dependencies: '@types/json-schema': 7.0.15 - ajv: 6.12.6 - ajv-keywords: 3.5.2(ajv@6.12.6) + ajv: 8.20.0 + ajv-keywords: 3.5.2(ajv@8.20.0) schema-utils@4.3.2: dependencies: '@types/json-schema': 7.0.15 - ajv: 8.17.1 - ajv-formats: 2.1.1(ajv@8.17.1) - ajv-keywords: 5.1.0(ajv@8.17.1) + ajv: 8.20.0 + ajv-formats: 2.1.1(ajv@8.20.0) + ajv-keywords: 5.1.0(ajv@8.20.0) secure-json-parse@2.7.0: {} @@ -10229,15 +10723,13 @@ snapshots: transitivePeerDependencies: - supports-color - serialize-javascript@6.0.2: - dependencies: - randombytes: 2.1.0 + serialize-javascript@7.0.6: {} - seroval-plugins@1.3.0(seroval@1.3.0): + seroval-plugins@1.3.0(seroval@1.5.4): dependencies: - seroval: 1.3.0 + seroval: 1.5.4 - seroval@1.3.0: {} + seroval@1.5.4: {} serve-static@1.16.2: dependencies: @@ -10263,12 +10755,28 @@ snapshots: gopd: 1.2.0 has-property-descriptors: 1.0.2 + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + + setimmediate@1.0.5: {} + setprototypeof@1.2.0: {} - sha.js@2.4.11: + sha.js@2.4.12: dependencies: inherits: 2.0.4 safe-buffer: 5.2.1 + to-buffer: 1.2.2 sharp@0.32.6: dependencies: @@ -10278,24 +10786,12 @@ snapshots: prebuild-install: 7.1.3 semver: 7.7.1 simple-get: 4.0.1 - tar-fs: 3.0.8 + tar-fs: 3.1.2 tunnel-agent: 0.6.0 transitivePeerDependencies: - bare-buffer - shebang-command@2.0.0: - dependencies: - shebang-regex: 3.0.0 - - shebang-regex@3.0.0: {} - - shell-quote@1.8.2: {} - - shepherd.js@13.0.3: - dependencies: - '@floating-ui/dom': 1.7.0 - '@scarf/scarf': 1.4.0 - deepmerge-ts: 5.1.0 + shell-quote@1.8.4: {} showdown@2.1.0: dependencies: @@ -10331,8 +10827,6 @@ snapshots: signal-exit@3.0.7: {} - signal-exit@4.1.0: {} - simple-concat@1.0.1: {} simple-get@4.0.1: @@ -10355,16 +10849,18 @@ snapshots: smart-buffer@4.2.0: {} + smob@1.6.2: {} + socks@2.8.4: dependencies: - ip-address: 9.0.5 + ip-address: 10.2.0 smart-buffer: 4.2.0 solid-js@1.9.6: dependencies: csstype: 3.1.3 - seroval: 1.3.0 - seroval-plugins: 1.3.0(seroval@1.3.0) + seroval: 1.5.4 + seroval-plugins: 1.3.0(seroval@1.5.4) solid-refresh@0.6.3(solid-js@1.9.6): dependencies: @@ -10398,6 +10894,10 @@ snapshots: source-map@0.6.1: {} + source-map@0.8.0-beta.0: + dependencies: + whatwg-url: 7.1.0 + sparse-bitfield@3.0.3: dependencies: memory-pager: 1.5.0 @@ -10407,18 +10907,17 @@ snapshots: split2@4.2.0: {} - sprintf-js@1.0.3: {} - - sprintf-js@1.1.3: {} - - srcset@4.0.0: {} - stack-utils@2.0.6: dependencies: escape-string-regexp: 2.0.0 statuses@2.0.1: {} + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + stream-browserify@3.0.0: dependencies: inherits: 2.0.4 @@ -10446,11 +10945,45 @@ snapshots: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - string-width@5.1.2: + string.prototype.matchall@4.0.12: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + regexp.prototype.flags: 1.5.4 + set-function-name: 2.0.2 + side-channel: 1.1.0 + + string.prototype.trim@1.2.11: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-object-atoms: 1.1.2 + has-property-descriptors: 1.0.2 + safe-regex-test: 1.1.0 + + string.prototype.trimend@1.0.10: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.2 + + string.prototype.trimstart@1.0.8: dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.1.0 + call-bind: 1.0.9 + define-properties: 1.2.1 + es-object-atoms: 1.1.2 string_decoder@1.1.1: dependencies: @@ -10460,13 +10993,17 @@ snapshots: dependencies: safe-buffer: 5.2.1 + stringify-object@3.3.0: + dependencies: + get-own-enumerable-property-symbols: 3.0.2 + is-obj: 1.0.1 + is-regexp: 1.0.0 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 - strip-ansi@7.1.0: - dependencies: - ansi-regex: 6.1.0 + strip-comments@2.0.1: {} strip-json-comments@2.0.1: {} @@ -10475,15 +11012,17 @@ snapshots: stripe@13.11.0: dependencies: '@types/node': 18.19.100 - qs: 6.14.0 + qs: 6.15.2 - strnum@1.1.2: {} + strnum@2.4.1: + dependencies: + anynum: 1.0.1 sucrase@3.35.0: dependencies: '@jridgewell/gen-mapping': 0.3.8 commander: 4.1.1 - glob: 10.4.5 + glob: 13.0.6 lines-and-columns: 1.2.4 mz: 2.7.0 pirates: 4.0.7 @@ -10503,15 +11042,15 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svgo@3.3.2: + svgo@3.3.3: dependencies: - '@trysound/sax': 0.2.0 commander: 7.2.0 css-select: 5.1.0 css-tree: 2.3.1 css-what: 6.1.0 csso: 5.0.5 picocolors: 1.1.1 + sax: 1.6.0 tailwindcss@3.4.17: dependencies: @@ -10529,11 +11068,11 @@ snapshots: normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.1.1 - postcss: 8.5.3 - postcss-import: 15.1.0(postcss@8.5.3) - postcss-js: 4.0.1(postcss@8.5.3) - postcss-load-config: 4.0.2(postcss@8.5.3) - postcss-nested: 6.2.0(postcss@8.5.3) + postcss: 8.5.15 + postcss-import: 15.1.0(postcss@8.5.15) + postcss-js: 4.0.1(postcss@8.5.15) + postcss-load-config: 4.0.2(postcss@8.5.15) + postcss-nested: 6.2.0(postcss@8.5.15) postcss-selector-parser: 6.1.2 resolve: 1.22.10 sucrase: 3.35.0 @@ -10542,14 +11081,7 @@ snapshots: tapable@2.2.1: {} - tar-fs@2.1.2: - dependencies: - chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.2 - tar-stream: 2.2.0 - - tar-fs@3.0.8: + tar-fs@3.1.2: dependencies: pump: 3.0.2 tar-stream: 3.1.7 @@ -10559,28 +11091,27 @@ snapshots: transitivePeerDependencies: - bare-buffer - tar-stream@2.2.0: - dependencies: - bl: 4.1.0 - end-of-stream: 1.4.4 - fs-constants: 1.0.0 - inherits: 2.0.4 - readable-stream: 3.6.2 - tar-stream@3.1.7: dependencies: b4a: 1.6.7 fast-fifo: 1.3.2 streamx: 2.22.0 - term-size@2.2.1: {} + temp-dir@2.0.0: {} + + tempy@0.6.0: + dependencies: + is-stream: 2.0.1 + temp-dir: 2.0.0 + type-fest: 0.16.0 + unique-string: 2.0.0 terser-webpack-plugin@5.3.14(webpack@5.99.8): dependencies: - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.2 - serialize-javascript: 6.0.2 + serialize-javascript: 7.0.6 terser: 5.39.0 webpack: 5.99.8 @@ -10594,8 +11125,8 @@ snapshots: test-exclude@6.0.0: dependencies: '@istanbuljs/schema': 0.1.3 - glob: 7.2.3 - minimatch: 3.1.2 + glob: 13.0.6 + minimatch: 10.2.5 text-decoder@1.2.3: dependencies: @@ -10615,12 +11146,27 @@ snapshots: throng@5.0.0: dependencies: - lodash: 4.17.21 + lodash: 4.18.1 throwback@4.1.0: {} + timers-browserify@2.0.12: + dependencies: + setimmediate: 1.0.5 + + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + tmpl@1.0.5: {} + to-buffer@1.2.2: + dependencies: + isarray: 2.0.5 + safe-buffer: 5.2.1 + typed-array-buffer: 1.0.3 + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -10638,6 +11184,10 @@ snapshots: tr46@0.0.3: {} + tr46@1.0.1: + dependencies: + punycode: 2.3.1 + tr46@3.0.0: dependencies: punycode: 2.3.1 @@ -10658,42 +11208,105 @@ snapshots: tslib@2.8.1: {} + tty-browserify@0.0.1: {} + tunnel-agent@0.6.0: dependencies: safe-buffer: 5.2.1 type-detect@4.1.0: {} - type-fest@0.20.2: {} + type-fest@0.16.0: {} type-is@1.6.18: dependencies: media-typer: 0.3.0 mime-types: 2.1.35 + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.9 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.9 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + + typed-array-length@1.0.8: + dependencies: + call-bind: 1.0.9 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + typedarray@0.0.6: {} typescript@5.8.3: {} + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + undefsafe@2.0.5: {} undici-types@5.26.5: {} - undici@6.21.1: {} + undici@8.5.0: {} + + unicode-canonical-property-names-ecmascript@2.0.1: {} + + unicode-match-property-ecmascript@2.0.0: + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.1 + unicode-property-aliases-ecmascript: 2.2.0 + + unicode-match-property-value-ecmascript@2.2.1: {} + + unicode-property-aliases-ecmascript@2.2.0: {} + + unique-string@2.0.0: + dependencies: + crypto-random-string: 2.0.0 universalify@0.2.0: {} + universalify@2.0.1: {} + unpipe@1.0.0: {} + upath@1.2.0: {} + update-browserslist-db@1.1.3(browserslist@4.24.5): dependencies: browserslist: 4.24.5 escalade: 3.2.0 picocolors: 1.1.1 - uri-js@4.4.1: + update-browserslist-db@1.2.3(browserslist@4.28.4): dependencies: - punycode: 2.3.1 + browserslist: 4.28.4 + escalade: 3.2.0 + picocolors: 1.1.1 url-parse@1.5.10: dependencies: @@ -10703,7 +11316,7 @@ snapshots: url@0.11.4: dependencies: punycode: 1.4.1 - qs: 6.14.0 + qs: 6.15.2 use-sync-external-store@1.5.0(react@19.1.0): dependencies: @@ -10719,8 +11332,6 @@ snapshots: is-typed-array: 1.1.15 which-typed-array: 1.1.19 - utility-types@3.11.0: {} - utils-merge@1.0.1: {} uuid@9.0.1: {} @@ -10735,35 +11346,54 @@ snapshots: vary@1.1.2: {} - vite-plugin-solid@2.11.6(solid-js@1.9.6)(vite@5.4.19(@types/node@18.19.100)(lightningcss@1.29.3)(sass@1.87.0)(terser@5.39.0)): + vite-plugin-node-polyfills@0.22.0(rollup@4.62.2)(vite@5.4.21(@types/node@18.19.100)(lightningcss@1.29.3)(sass@1.87.0)(terser@5.39.0)): + dependencies: + '@rollup/plugin-inject': 5.0.5(rollup@4.62.2) + node-stdlib-browser: 1.3.1 + vite: 5.4.21(@types/node@18.19.100)(lightningcss@1.29.3)(sass@1.87.0)(terser@5.39.0) + transitivePeerDependencies: + - rollup + + vite-plugin-pwa@0.21.2(vite@5.4.21(@types/node@18.19.100)(lightningcss@1.29.3)(sass@1.87.0)(terser@5.39.0))(workbox-build@7.4.1(@types/babel__core@7.20.5))(workbox-window@7.4.1): + dependencies: + debug: 4.4.0 + pretty-bytes: 6.1.1 + tinyglobby: 0.2.17 + vite: 5.4.21(@types/node@18.19.100)(lightningcss@1.29.3)(sass@1.87.0)(terser@5.39.0) + workbox-build: 7.4.1(@types/babel__core@7.20.5) + workbox-window: 7.4.1 + transitivePeerDependencies: + - supports-color + + vite-plugin-solid@2.11.6(solid-js@1.9.6)(vite@5.4.21(@types/node@18.19.100)(lightningcss@1.29.3)(sass@1.87.0)(terser@5.39.0)): dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.29.7 '@types/babel__core': 7.20.5 - babel-preset-solid: 1.9.6(@babel/core@7.27.1) + babel-preset-solid: 1.9.6(@babel/core@7.29.7) merge-anything: 5.1.7 solid-js: 1.9.6 solid-refresh: 0.6.3(solid-js@1.9.6) - vite: 5.4.19(@types/node@18.19.100)(lightningcss@1.29.3)(sass@1.87.0)(terser@5.39.0) - vitefu: 1.0.6(vite@5.4.19(@types/node@18.19.100)(lightningcss@1.29.3)(sass@1.87.0)(terser@5.39.0)) + vite: 5.4.21(@types/node@18.19.100)(lightningcss@1.29.3)(sass@1.87.0)(terser@5.39.0) + vitefu: 1.0.6(vite@5.4.21(@types/node@18.19.100)(lightningcss@1.29.3)(sass@1.87.0)(terser@5.39.0)) transitivePeerDependencies: - supports-color - vite-tsconfig-paths@4.3.2(typescript@5.8.3)(vite@5.4.19(@types/node@18.19.100)(lightningcss@1.29.3)(sass@1.87.0)(terser@5.39.0)): + vite-tsconfig-paths@4.3.2(typescript@5.8.3)(vite@5.4.21(@types/node@18.19.100)(lightningcss@1.29.3)(sass@1.87.0)(terser@5.39.0)): dependencies: debug: 4.4.0 globrex: 0.1.2 tsconfck: 3.1.5(typescript@5.8.3) optionalDependencies: - vite: 5.4.19(@types/node@18.19.100)(lightningcss@1.29.3)(sass@1.87.0)(terser@5.39.0) + vite: 5.4.21(@types/node@18.19.100)(lightningcss@1.29.3)(sass@1.87.0)(terser@5.39.0) transitivePeerDependencies: - supports-color - typescript - vite@5.4.19(@types/node@18.19.100)(lightningcss@1.29.3)(sass@1.87.0)(terser@5.39.0): + vite@5.4.21(@types/node@18.19.100)(lightningcss@1.29.3)(sass@1.87.0)(terser@5.39.0): dependencies: - esbuild: 0.21.5 - postcss: 8.5.3 - rollup: 4.40.2 + esbuild: 0.25.12 + postcss: 8.5.15 + rollup: 4.62.2 optionalDependencies: '@types/node': 18.19.100 fsevents: 2.3.3 @@ -10771,9 +11401,9 @@ snapshots: sass: 1.87.0 terser: 5.39.0 - vitefu@1.0.6(vite@5.4.19(@types/node@18.19.100)(lightningcss@1.29.3)(sass@1.87.0)(terser@5.39.0)): + vitefu@1.0.6(vite@5.4.21(@types/node@18.19.100)(lightningcss@1.29.3)(sass@1.87.0)(terser@5.39.0)): optionalDependencies: - vite: 5.4.19(@types/node@18.19.100)(lightningcss@1.29.3)(sass@1.87.0)(terser@5.39.0) + vite: 5.4.21(@types/node@18.19.100)(lightningcss@1.29.3)(sass@1.87.0)(terser@5.39.0) vm-browserify@1.1.2: {} @@ -10786,10 +11416,10 @@ snapshots: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 - weak-lru-cache@1.2.2: {} - webidl-conversions@3.0.1: {} + webidl-conversions@4.0.2: {} + webidl-conversions@7.0.0: {} webpack-sources@3.2.3: {} @@ -10797,13 +11427,13 @@ snapshots: webpack@5.99.8: dependencies: '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.7 + '@types/estree': 1.0.9 '@types/json-schema': 7.0.15 '@webassemblyjs/ast': 1.14.1 '@webassemblyjs/wasm-edit': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.14.1 - browserslist: 4.24.5 + browserslist: 4.28.4 chrome-trace-event: 1.0.4 enhanced-resolve: 5.18.1 es-module-lexer: 1.7.0 @@ -10835,6 +11465,43 @@ snapshots: tr46: 0.0.3 webidl-conversions: 3.0.1 + whatwg-url@7.1.0: + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.2.0 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.0 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.19 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + which-typed-array@1.1.19: dependencies: available-typed-arrays: 1.0.7 @@ -10845,10 +11512,6 @@ snapshots: gopd: 1.2.0 has-tostringtag: 1.0.2 - which@2.0.2: - dependencies: - isexe: 2.0.0 - wikijs@6.4.1: dependencies: cross-fetch: 3.2.0 @@ -10857,6 +11520,119 @@ snapshots: transitivePeerDependencies: - encoding + workbox-background-sync@7.4.1: + dependencies: + idb: 7.1.1 + workbox-core: 7.4.1 + + workbox-broadcast-update@7.4.1: + dependencies: + workbox-core: 7.4.1 + + workbox-build@7.4.1(@types/babel__core@7.20.5): + dependencies: + '@apideck/better-ajv-errors': 0.3.7(ajv@8.20.0) + '@babel/core': 7.29.7 + '@babel/preset-env': 7.29.7(@babel/core@7.29.7) + '@babel/runtime': 7.27.1 + '@rollup/plugin-babel': 6.1.0(@babel/core@7.29.7)(@types/babel__core@7.20.5)(rollup@4.62.2) + '@rollup/plugin-node-resolve': 16.0.3(rollup@4.62.2) + '@rollup/plugin-replace': 6.0.3(rollup@4.62.2) + '@rollup/plugin-terser': 1.0.0(rollup@4.62.2) + '@trickfilm400/rollup-plugin-off-main-thread': 3.0.0-pre1 + ajv: 8.20.0 + common-tags: 1.8.2 + eta: 4.6.0 + fast-json-stable-stringify: 2.1.0 + fs-extra: 9.1.0 + glob: 13.0.6 + pretty-bytes: 5.6.0 + rollup: 4.62.2 + source-map: 0.8.0-beta.0 + stringify-object: 3.3.0 + strip-comments: 2.0.1 + tempy: 0.6.0 + upath: 1.2.0 + workbox-background-sync: 7.4.1 + workbox-broadcast-update: 7.4.1 + workbox-cacheable-response: 7.4.1 + workbox-core: 7.4.1 + workbox-expiration: 7.4.1 + workbox-google-analytics: 7.4.1 + workbox-navigation-preload: 7.4.1 + workbox-precaching: 7.4.1 + workbox-range-requests: 7.4.1 + workbox-recipes: 7.4.1 + workbox-routing: 7.4.1 + workbox-strategies: 7.4.1 + workbox-streams: 7.4.1 + workbox-sw: 7.4.1 + workbox-window: 7.4.1 + transitivePeerDependencies: + - '@types/babel__core' + - supports-color + + workbox-cacheable-response@7.4.1: + dependencies: + workbox-core: 7.4.1 + + workbox-core@7.4.1: {} + + workbox-expiration@7.4.1: + dependencies: + idb: 7.1.1 + workbox-core: 7.4.1 + + workbox-google-analytics@7.4.1: + dependencies: + workbox-background-sync: 7.4.1 + workbox-core: 7.4.1 + workbox-routing: 7.4.1 + workbox-strategies: 7.4.1 + + workbox-navigation-preload@7.4.1: + dependencies: + workbox-core: 7.4.1 + + workbox-precaching@7.4.1: + dependencies: + workbox-core: 7.4.1 + workbox-routing: 7.4.1 + workbox-strategies: 7.4.1 + + workbox-range-requests@7.4.1: + dependencies: + workbox-core: 7.4.1 + + workbox-recipes@7.4.1: + dependencies: + workbox-cacheable-response: 7.4.1 + workbox-core: 7.4.1 + workbox-expiration: 7.4.1 + workbox-precaching: 7.4.1 + workbox-routing: 7.4.1 + workbox-strategies: 7.4.1 + + workbox-routing@7.4.1: + dependencies: + workbox-core: 7.4.1 + + workbox-strategies@7.4.1: + dependencies: + workbox-core: 7.4.1 + + workbox-streams@7.4.1: + dependencies: + workbox-core: 7.4.1 + workbox-routing: 7.4.1 + + workbox-sw@7.4.1: {} + + workbox-window@7.4.1: + dependencies: + '@types/trusted-types': 2.0.7 + workbox-core: 7.4.1 + worker-loader@3.0.8(webpack@5.99.8): dependencies: loader-utils: 2.0.4 @@ -10871,12 +11647,6 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 - wrap-ansi@8.1.0: - dependencies: - ansi-styles: 6.2.1 - string-width: 5.1.2 - strip-ansi: 7.1.0 - wrappy@1.0.2: {} write-file-atomic@4.0.2: @@ -10884,7 +11654,9 @@ snapshots: imurmurhash: 0.1.4 signal-exit: 3.0.7 - ws@8.18.2: {} + ws@8.21.0: {} + + xml-naming@0.1.0: {} xtend@4.0.2: {} @@ -10894,7 +11666,7 @@ snapshots: yallist@4.0.0: {} - yaml@2.7.1: {} + yaml@2.9.0: {} yargs-parser@20.2.9: {} @@ -10917,16 +11689,6 @@ snapshots: y18n: 5.0.8 yargs-parser: 20.2.9 - yargs@17.1.1: - dependencies: - cliui: 7.0.4 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.9 - yargs@17.7.2: dependencies: cliui: 8.0.1 diff --git a/srv.tsconfig.tsbuildinfo b/srv.tsconfig.tsbuildinfo index 5b63f6ae..109a4f2a 100644 --- a/srv.tsconfig.tsbuildinfo +++ b/srv.tsconfig.tsbuildinfo @@ -1 +1 @@ -{"fileNames":["./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es5.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.dom.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.dom.asynciterable.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.webworker.importscripts.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.scripthost.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.full.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/compatibility/disposable.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/compatibility/indexable.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/compatibility/iterators.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/compatibility/index.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/globals.typedarray.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/buffer.buffer.d.ts","./node_modules/.pnpm/buffer@5.7.1/node_modules/buffer/index.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/header.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/readable.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/file.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/fetch.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/formdata.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/connector.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/client.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/errors.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/dispatcher.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/global-dispatcher.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/global-origin.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/pool-stats.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/pool.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/handlers.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/balanced-pool.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/agent.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/mock-interceptor.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/mock-agent.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/mock-client.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/mock-pool.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/mock-errors.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/proxy-agent.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/api.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/cookies.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/patch.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/filereader.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/diagnostics-channel.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/websocket.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/content-type.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/cache.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/interceptors.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/index.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/globals.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/assert.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/assert/strict.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/async_hooks.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/buffer.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/child_process.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/cluster.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/console.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/constants.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/crypto.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/dgram.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/dns.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/dns/promises.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/domain.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/dom-events.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/events.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/fs.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/fs/promises.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/http.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/http2.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/https.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/inspector.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/module.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/net.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/os.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/path.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/perf_hooks.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/process.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/punycode.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/querystring.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/readline.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/readline/promises.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/repl.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/stream.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/stream/promises.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/stream/consumers.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/stream/web.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/string_decoder.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/test.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/timers.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/timers/promises.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/tls.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/trace_events.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/tty.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/url.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/util.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/v8.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/vm.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/wasi.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/worker_threads.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/zlib.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/index.d.ts","./node_modules/.pnpm/@types+cors@2.8.18/node_modules/@types/cors/index.d.ts","./node_modules/.pnpm/@types+mime@1.3.5/node_modules/@types/mime/index.d.ts","./node_modules/.pnpm/@types+send@0.17.4/node_modules/@types/send/index.d.ts","./node_modules/.pnpm/@types+qs@6.9.18/node_modules/@types/qs/index.d.ts","./node_modules/.pnpm/@types+range-parser@1.2.7/node_modules/@types/range-parser/index.d.ts","./node_modules/.pnpm/@types+express-serve-static-core@4.19.6/node_modules/@types/express-serve-static-core/index.d.ts","./node_modules/.pnpm/@types+http-errors@2.0.4/node_modules/@types/http-errors/index.d.ts","./node_modules/.pnpm/@types+serve-static@1.15.7/node_modules/@types/serve-static/index.d.ts","./node_modules/.pnpm/@types+connect@3.4.38/node_modules/@types/connect/index.d.ts","./node_modules/.pnpm/@types+body-parser@1.19.5/node_modules/@types/body-parser/index.d.ts","./node_modules/.pnpm/@types+express@4.17.21/node_modules/@types/express/index.d.ts","./node_modules/.pnpm/@types+multer@1.4.12/node_modules/@types/multer/index.d.ts","./node_modules/.pnpm/@types+uuid@9.0.8/node_modules/@types/uuid/index.d.ts","./node_modules/.pnpm/pino-std-serializers@6.2.2/node_modules/pino-std-serializers/index.d.ts","./node_modules/.pnpm/sonic-boom@3.8.1/node_modules/sonic-boom/types/index.d.ts","./node_modules/.pnpm/pino@8.21.0/node_modules/pino/pino.d.ts","./common/adapters.ts","./common/types/memory.ts","./common/presets/claude.ts","./common/types/ui.ts","./common/types/sprite.ts","./common/types/saga.ts","./common/types/texttospeech-schema.ts","./common/types/index.ts","./common/memory.ts","./common/characters.ts","./common/mode-templates.ts","./common/grammar.ts","./node_modules/.pnpm/source-map-generator@0.8.0/node_modules/source-map-generator/source-map.d.ts","./node_modules/.pnpm/peggy@3.0.2/node_modules/peggy/lib/peg.d.ts","./common/template-parser.ts","./common/prompt-order.ts","./common/prompt.ts","./srv/adapter/type.ts","./common/util.ts","./common/presets/templates.ts","./common/presets/horde.ts","./common/presets/kobold.ts","./common/presets/novel.ts","./common/presets/ooba.ts","./common/presets/openai.ts","./common/presets/replicate.ts","./common/presets/scale.ts","./common/presets/openrouter.ts","./common/presets/agnaistic.ts","./common/default-preset.ts","./common/presets.ts","./common/types/image-schema.ts","./common/types/library.ts","./common/types/presets.ts","./common/types/admin.ts","./common/types/schema.ts","./srv/api/wrap.ts","./node_modules/.pnpm/@types+chance@1.1.6/node_modules/@types/chance/index.d.ts","./node_modules/.pnpm/@types+ms@2.1.0/node_modules/@types/ms/index.d.ts","./node_modules/.pnpm/@types+jsonwebtoken@9.0.9/node_modules/@types/jsonwebtoken/index.d.ts","./node_modules/.pnpm/@types+bcryptjs@2.4.6/node_modules/@types/bcryptjs/index.d.ts","./node_modules/.pnpm/bson@5.5.1/node_modules/bson/bson.d.ts","./node_modules/.pnpm/mongodb@5.9.2/node_modules/mongodb/mongodb.d.ts","./node_modules/.pnpm/dotenv@16.5.0/node_modules/dotenv/lib/main.d.ts","./common/valid/types.ts","./common/valid/util.ts","./common/valid/validate.ts","./common/valid/index.ts","./srv/config.ts","./srv/db/client.ts","./srv/db/util.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/lib.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/crypto/crypto.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/net/net.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/shared.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Errors.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/OAuth.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Webhooks.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/EventTypes.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/UpcomingInvoices.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/AccountLinksResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/AccountSessionsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/AccountsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/ApplePayDomainsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/ApplicationFeesResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Apps/SecretsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/BalanceResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/BalanceTransactionsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/BillingPortal/ConfigurationsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/BillingPortal/SessionsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/ChargesResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Checkout/SessionsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/CountrySpecsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/CouponsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/CreditNotesResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/CustomersResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/DisputesResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/EphemeralKeysResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/EventsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/ExchangeRatesResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/FileLinksResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/FilesResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/FinancialConnections/AccountsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/FinancialConnections/SessionsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Identity/VerificationReportsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Identity/VerificationSessionsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/InvoiceItemsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/InvoicesResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Issuing/AuthorizationsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Issuing/CardholdersResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Issuing/CardsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Issuing/DisputesResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Issuing/TokensResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Issuing/TransactionsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/MandatesResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/PaymentIntentsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/PaymentLinksResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/PaymentMethodConfigurationsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/PaymentMethodDomainsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/PaymentMethodsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/PayoutsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/PlansResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/PricesResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/ProductsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/PromotionCodesResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/QuotesResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Radar/EarlyFraudWarningsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Radar/ValueListItemsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Radar/ValueListsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/RefundsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Reporting/ReportRunsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Reporting/ReportTypesResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/ReviewsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/SetupAttemptsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/SetupIntentsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/ShippingRatesResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Sigma/ScheduledQueryRunsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/SourcesResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/SubscriptionItemsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/SubscriptionSchedulesResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/SubscriptionsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Tax/CalculationsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Tax/SettingsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Tax/TransactionsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/TaxCodesResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/TaxRatesResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Terminal/ConfigurationsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Terminal/ConnectionTokensResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Terminal/LocationsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Terminal/ReadersResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/TestHelpers/CustomersResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/TestHelpers/Issuing/AuthorizationsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/TestHelpers/Issuing/CardsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/TestHelpers/Issuing/TransactionsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/TestHelpers/RefundsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/TestHelpers/Terminal/ReadersResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/TestHelpers/TestClocksResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/TestHelpers/Treasury/InboundTransfersResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/TestHelpers/Treasury/OutboundPaymentsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/TestHelpers/Treasury/OutboundTransfersResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/TestHelpers/Treasury/ReceivedCreditsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/TestHelpers/Treasury/ReceivedDebitsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/TokensResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/TopupsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/TransfersResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Treasury/CreditReversalsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Treasury/DebitReversalsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Treasury/FinancialAccountsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Treasury/InboundTransfersResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Treasury/OutboundPaymentsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Treasury/OutboundTransfersResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Treasury/ReceivedCreditsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Treasury/ReceivedDebitsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Treasury/TransactionEntriesResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Treasury/TransactionsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/WebhookEndpointsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/AccountLinks.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/AccountSessions.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Accounts.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/ApplePayDomains.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/ApplicationFees.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Applications.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Apps/Secrets.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Balance.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/BalanceTransactionSources.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/BalanceTransactions.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/BankAccounts.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/BillingPortal/Configurations.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/BillingPortal/Sessions.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Capabilities.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Cards.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/CashBalances.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Charges.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Checkout/Sessions.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/ConnectCollectionTransfers.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/CountrySpecs.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Coupons.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/CreditNoteLineItems.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/CreditNotes.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/CustomerBalanceTransactions.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/CustomerCashBalanceTransactions.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/CustomerSources.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Customers.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Discounts.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Disputes.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/EphemeralKeys.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Events.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/ExchangeRates.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/ExternalAccounts.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/FeeRefunds.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/FileLinks.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Files.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/FinancialConnections/AccountOwners.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/FinancialConnections/AccountOwnerships.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/FinancialConnections/Accounts.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/FinancialConnections/Sessions.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/FundingInstructions.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Identity/VerificationReports.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Identity/VerificationSessions.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/InvoiceItems.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/InvoiceLineItems.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Invoices.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Issuing/Authorizations.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Issuing/Cardholders.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Issuing/Cards.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Issuing/Disputes.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Issuing/Tokens.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Issuing/Transactions.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/LineItems.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/LoginLinks.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Mandates.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/PaymentIntents.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/PaymentLinks.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/PaymentMethodConfigurations.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/PaymentMethodDomains.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/PaymentMethods.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Payouts.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Persons.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Plans.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/PlatformTaxFees.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Prices.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Products.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/PromotionCodes.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Quotes.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Radar/EarlyFraudWarnings.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Radar/ValueListItems.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Radar/ValueLists.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Refunds.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Reporting/ReportRuns.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Reporting/ReportTypes.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/ReserveTransactions.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Reviews.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/SetupAttempts.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/SetupIntents.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/ShippingRates.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Sigma/ScheduledQueryRuns.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/SourceMandateNotifications.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/SourceTransactions.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Sources.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/SubscriptionItems.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/SubscriptionSchedules.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Subscriptions.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Tax/CalculationLineItems.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Tax/Calculations.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Tax/Settings.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Tax/TransactionLineItems.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Tax/Transactions.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/TaxCodes.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/TaxDeductedAtSources.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/TaxIds.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/TaxRates.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Terminal/Configurations.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Terminal/ConnectionTokens.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Terminal/Locations.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Terminal/Readers.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/TestHelpers/TestClocks.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Tokens.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Topups.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/TransferReversals.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Transfers.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Treasury/CreditReversals.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Treasury/DebitReversals.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Treasury/FinancialAccountFeatures.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Treasury/FinancialAccounts.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Treasury/InboundTransfers.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Treasury/OutboundPayments.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Treasury/OutboundTransfers.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Treasury/ReceivedCredits.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Treasury/ReceivedDebits.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Treasury/TransactionEntries.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Treasury/Transactions.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/UsageRecordSummaries.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/UsageRecords.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/WebhookEndpoints.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/index.d.ts","./srv/db/characters.ts","./srv/db/chats.ts","./node_modules/.pnpm/@types+ws@8.18.1/node_modules/@types/ws/index.d.ts","./srv/api/ws/types.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/command-options.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/lua-script.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/index.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ACL_CAT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ACL_DELUSER.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ACL_DRYRUN.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ACL_GENPASS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ACL_GETUSER.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ACL_LIST.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ACL_LOAD.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ACL_LOG_RESET.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ACL_LOG.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ACL_SAVE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ACL_SETUSER.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ACL_USERS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ACL_WHOAMI.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ASKING.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/AUTH.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/BGREWRITEAOF.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/BGSAVE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLIENT_CACHING.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLIENT_GETNAME.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLIENT_GETREDIR.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLIENT_ID.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLIENT_KILL.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLIENT_INFO.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLIENT_LIST.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLIENT_NO-EVICT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLIENT_NO-TOUCH.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLIENT_PAUSE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLIENT_SETNAME.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLIENT_TRACKING.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLIENT_TRACKINGINFO.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLIENT_UNPAUSE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLUSTER_ADDSLOTS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/generic-transformers.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLUSTER_ADDSLOTSRANGE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLUSTER_BUMPEPOCH.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLUSTER_COUNT-FAILURE-REPORTS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLUSTER_COUNTKEYSINSLOT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLUSTER_DELSLOTS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLUSTER_DELSLOTSRANGE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLUSTER_FAILOVER.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLUSTER_FLUSHSLOTS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLUSTER_FORGET.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLUSTER_GETKEYSINSLOT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLUSTER_INFO.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLUSTER_KEYSLOT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLUSTER_LINKS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLUSTER_MEET.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLUSTER_MYID.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLUSTER_MYSHARDID.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLUSTER_NODES.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLUSTER_REPLICAS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLUSTER_REPLICATE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLUSTER_RESET.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLUSTER_SAVECONFIG.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLUSTER_SET-CONFIG-EPOCH.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLUSTER_SETSLOT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLUSTER_SLOTS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/COMMAND_COUNT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/COMMAND_GETKEYS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/COMMAND_GETKEYSANDFLAGS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/COMMAND_INFO.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/COMMAND_LIST.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/COMMAND.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CONFIG_GET.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CONFIG_RESETSTAT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CONFIG_REWRITE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CONFIG_SET.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/DBSIZE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/DISCARD.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ECHO.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/FAILOVER.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/FLUSHALL.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/FLUSHDB.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/FUNCTION_DELETE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/FUNCTION_DUMP.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/FUNCTION_FLUSH.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/FUNCTION_KILL.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/FUNCTION_LIST_WITHCODE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/FUNCTION_LIST.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/FUNCTION_LOAD.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/FUNCTION_RESTORE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/FUNCTION_STATS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HELLO.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/INFO.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/KEYS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/LASTSAVE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/LATENCY_DOCTOR.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/LATENCY_GRAPH.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/LATENCY_HISTORY.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/LATENCY_LATEST.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/LOLWUT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/MEMORY_DOCTOR.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/MEMORY_MALLOC-STATS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/MEMORY_PURGE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/MEMORY_STATS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/MEMORY_USAGE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/MODULE_LIST.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/MODULE_LOAD.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/MODULE_UNLOAD.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/MOVE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/PING.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/PUBSUB_CHANNELS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/PUBSUB_NUMPAT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/PUBSUB_NUMSUB.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/PUBSUB_SHARDCHANNELS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/PUBSUB_SHARDNUMSUB.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/RANDOMKEY.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/READONLY.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/READWRITE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/REPLICAOF.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/RESTORE-ASKING.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ROLE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SAVE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SCAN.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SCRIPT_DEBUG.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SCRIPT_EXISTS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SCRIPT_FLUSH.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SCRIPT_KILL.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SCRIPT_LOAD.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SHUTDOWN.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SWAPDB.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/TIME.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/UNWATCH.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/WAIT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/APPEND.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/BITCOUNT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/BITFIELD.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/BITFIELD_RO.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/BITOP.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/BITPOS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/BLMOVE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/LMPOP.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/BLMPOP.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/BLPOP.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/BRPOP.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/BRPOPLPUSH.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZMPOP.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/BZMPOP.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/BZPOPMAX.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/BZPOPMIN.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/COPY.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/DECR.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/DECRBY.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/DEL.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/DUMP.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/EVAL_RO.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/EVAL.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/EVALSHA.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/EVALSHA_RO.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/EXISTS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/EXPIRE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/EXPIREAT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/EXPIRETIME.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/FCALL_RO.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/FCALL.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/GEOADD.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/GEODIST.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/GEOHASH.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/GEOPOS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/GEORADIUS_RO.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/GEORADIUS_RO_WITH.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/GEORADIUS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/GEORADIUS_WITH.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/GEORADIUSBYMEMBER_RO.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/GEORADIUSBYMEMBER_RO_WITH.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/GEORADIUSBYMEMBER.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/GEORADIUSBYMEMBER_WITH.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/GEORADIUSBYMEMBERSTORE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/GEORADIUSSTORE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/GEOSEARCH.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/GEOSEARCH_WITH.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/GEOSEARCHSTORE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/GET.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/GETBIT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/GETDEL.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/GETEX.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/GETRANGE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/GETSET.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HDEL.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HEXISTS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HEXPIRE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HEXPIREAT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HEXPIRETIME.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HGET.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HGETALL.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HINCRBY.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HINCRBYFLOAT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HKEYS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HLEN.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HMGET.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HPERSIST.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HPEXPIRE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HPEXPIREAT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HPEXPIRETIME.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HPTTL.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HRANDFIELD.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HRANDFIELD_COUNT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HRANDFIELD_COUNT_WITHVALUES.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HSCAN.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HSCAN_NOVALUES.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HSET.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HSETNX.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HSTRLEN.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HTTL.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HVALS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/INCR.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/INCRBY.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/INCRBYFLOAT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/LCS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/LCS_IDX_WITHMATCHLEN.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/LCS_IDX.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/LCS_LEN.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/LINDEX.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/LINSERT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/LLEN.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/LMOVE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/LPOP_COUNT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/LPOP.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/LPOS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/LPOS_COUNT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/LPUSH.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/LPUSHX.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/LRANGE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/LREM.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/LSET.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/LTRIM.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/MGET.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/MIGRATE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/MSET.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/MSETNX.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/OBJECT_ENCODING.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/OBJECT_FREQ.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/OBJECT_IDLETIME.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/OBJECT_REFCOUNT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/PERSIST.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/PEXPIRE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/PEXPIREAT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/PEXPIRETIME.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/PFADD.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/PFCOUNT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/PFMERGE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/PSETEX.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/PTTL.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/PUBLISH.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/RENAME.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/RENAMENX.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/RESTORE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/RPOP_COUNT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/RPOP.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/RPOPLPUSH.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/RPUSH.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/RPUSHX.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SADD.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SCARD.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SDIFF.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SDIFFSTORE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SINTER.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SINTERCARD.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SINTERSTORE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SET.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SETBIT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SETEX.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SETNX.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SETRANGE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SISMEMBER.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SMEMBERS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SMISMEMBER.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SMOVE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SORT_RO.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SORT_STORE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SORT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SPOP.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SPUBLISH.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SRANDMEMBER.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SRANDMEMBER_COUNT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SREM.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SSCAN.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/STRLEN.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SUNION.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SUNIONSTORE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/TOUCH.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/TTL.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/TYPE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/UNLINK.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/WATCH.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/XACK.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/XADD.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/XAUTOCLAIM.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/XAUTOCLAIM_JUSTID.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/XCLAIM.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/XCLAIM_JUSTID.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/XDEL.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/XGROUP_CREATE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/XGROUP_CREATECONSUMER.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/XGROUP_DELCONSUMER.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/XGROUP_DESTROY.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/XGROUP_SETID.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/XINFO_CONSUMERS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/XINFO_GROUPS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/XINFO_STREAM.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/XLEN.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/XPENDING_RANGE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/XPENDING.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/XRANGE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/XREAD.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/XREADGROUP.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/XREVRANGE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/XSETID.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/XTRIM.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZADD.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZCARD.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZCOUNT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZDIFF.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZDIFF_WITHSCORES.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZDIFFSTORE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZINCRBY.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZINTER.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZINTER_WITHSCORES.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZINTERCARD.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZINTERSTORE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZLEXCOUNT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZMSCORE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZPOPMAX.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZPOPMAX_COUNT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZPOPMIN.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZPOPMIN_COUNT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZRANDMEMBER.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZRANDMEMBER_COUNT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZRANDMEMBER_COUNT_WITHSCORES.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZRANGE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZRANGE_WITHSCORES.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZRANGEBYLEX.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZRANGEBYSCORE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZRANGEBYSCORE_WITHSCORES.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZRANGESTORE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZRANK.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZREM.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZREMRANGEBYLEX.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZREMRANGEBYRANK.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZREMRANGEBYSCORE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZREVRANK.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZSCAN.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZSCORE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZUNION.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZUNION_WITHSCORES.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZUNIONSTORE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/client/commands.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/client/socket.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/client/pub-sub.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/client/commands-queue.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/errors.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/multi-command.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/client/multi-command.d.ts","./node_modules/.pnpm/generic-pool@3.9.0/node_modules/generic-pool/index.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/client/index.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/cluster/commands.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/cluster/cluster-slots.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/cluster/multi-command.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/cluster/index.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/index.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/bloom/ADD.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/bloom/CARD.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/bloom/EXISTS.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/bloom/INFO.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/bloom/INSERT.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/bloom/LOADCHUNK.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/bloom/MADD.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/bloom/MEXISTS.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/bloom/RESERVE.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/bloom/SCANDUMP.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/count-min-sketch/INCRBY.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/count-min-sketch/INFO.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/count-min-sketch/INITBYDIM.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/count-min-sketch/INITBYPROB.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/count-min-sketch/MERGE.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/count-min-sketch/QUERY.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/cuckoo/ADD.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/cuckoo/ADDNX.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/cuckoo/COUNT.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/cuckoo/DEL.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/cuckoo/EXISTS.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/cuckoo/INFO.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/cuckoo/INSERTNX.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/cuckoo/LOADCHUNK.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/cuckoo/RESERVE.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/cuckoo/SCANDUMP.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/cuckoo/index.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/cuckoo/INSERT.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/t-digest/ADD.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/t-digest/BYREVRANK.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/t-digest/CDF.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/t-digest/CREATE.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/t-digest/INFO.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/t-digest/MAX.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/t-digest/MERGE.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/t-digest/MIN.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/t-digest/QUANTILE.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/t-digest/RANK.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/t-digest/RESET.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/t-digest/REVRANK.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/t-digest/TRIMMED_MEAN.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/t-digest/index.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/t-digest/BYRANK.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/top-k/ADD.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/top-k/COUNT.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/top-k/INCRBY.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/top-k/INFO.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/top-k/LIST_WITHCOUNT.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/top-k/LIST.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/top-k/QUERY.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/top-k/RESERVE.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/index.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/index.d.ts","./node_modules/.pnpm/@redis+graph@1.1.1_@redis+client@1.6.1/node_modules/@redis/graph/dist/commands/CONFIG_GET.d.ts","./node_modules/.pnpm/@redis+graph@1.1.1_@redis+client@1.6.1/node_modules/@redis/graph/dist/commands/CONFIG_SET.d.ts","./node_modules/.pnpm/@redis+graph@1.1.1_@redis+client@1.6.1/node_modules/@redis/graph/dist/commands/DELETE.d.ts","./node_modules/.pnpm/@redis+graph@1.1.1_@redis+client@1.6.1/node_modules/@redis/graph/dist/commands/EXPLAIN.d.ts","./node_modules/.pnpm/@redis+graph@1.1.1_@redis+client@1.6.1/node_modules/@redis/graph/dist/commands/LIST.d.ts","./node_modules/.pnpm/@redis+graph@1.1.1_@redis+client@1.6.1/node_modules/@redis/graph/dist/commands/PROFILE.d.ts","./node_modules/.pnpm/@redis+graph@1.1.1_@redis+client@1.6.1/node_modules/@redis/graph/dist/commands/QUERY.d.ts","./node_modules/.pnpm/@redis+graph@1.1.1_@redis+client@1.6.1/node_modules/@redis/graph/dist/commands/RO_QUERY.d.ts","./node_modules/.pnpm/@redis+graph@1.1.1_@redis+client@1.6.1/node_modules/@redis/graph/dist/commands/SLOWLOG.d.ts","./node_modules/.pnpm/@redis+graph@1.1.1_@redis+client@1.6.1/node_modules/@redis/graph/dist/commands/index.d.ts","./node_modules/.pnpm/@redis+graph@1.1.1_@redis+client@1.6.1/node_modules/@redis/graph/dist/graph.d.ts","./node_modules/.pnpm/@redis+graph@1.1.1_@redis+client@1.6.1/node_modules/@redis/graph/dist/index.d.ts","./node_modules/.pnpm/@redis+json@1.0.7_@redis+client@1.6.1/node_modules/@redis/json/dist/commands/ARRAPPEND.d.ts","./node_modules/.pnpm/@redis+json@1.0.7_@redis+client@1.6.1/node_modules/@redis/json/dist/commands/ARRINDEX.d.ts","./node_modules/.pnpm/@redis+json@1.0.7_@redis+client@1.6.1/node_modules/@redis/json/dist/commands/ARRINSERT.d.ts","./node_modules/.pnpm/@redis+json@1.0.7_@redis+client@1.6.1/node_modules/@redis/json/dist/commands/ARRLEN.d.ts","./node_modules/.pnpm/@redis+json@1.0.7_@redis+client@1.6.1/node_modules/@redis/json/dist/commands/ARRPOP.d.ts","./node_modules/.pnpm/@redis+json@1.0.7_@redis+client@1.6.1/node_modules/@redis/json/dist/commands/ARRTRIM.d.ts","./node_modules/.pnpm/@redis+json@1.0.7_@redis+client@1.6.1/node_modules/@redis/json/dist/commands/DEBUG_MEMORY.d.ts","./node_modules/.pnpm/@redis+json@1.0.7_@redis+client@1.6.1/node_modules/@redis/json/dist/commands/DEL.d.ts","./node_modules/.pnpm/@redis+json@1.0.7_@redis+client@1.6.1/node_modules/@redis/json/dist/commands/FORGET.d.ts","./node_modules/.pnpm/@redis+json@1.0.7_@redis+client@1.6.1/node_modules/@redis/json/dist/commands/GET.d.ts","./node_modules/.pnpm/@redis+json@1.0.7_@redis+client@1.6.1/node_modules/@redis/json/dist/commands/MERGE.d.ts","./node_modules/.pnpm/@redis+json@1.0.7_@redis+client@1.6.1/node_modules/@redis/json/dist/commands/MGET.d.ts","./node_modules/.pnpm/@redis+json@1.0.7_@redis+client@1.6.1/node_modules/@redis/json/dist/commands/MSET.d.ts","./node_modules/.pnpm/@redis+json@1.0.7_@redis+client@1.6.1/node_modules/@redis/json/dist/commands/NUMINCRBY.d.ts","./node_modules/.pnpm/@redis+json@1.0.7_@redis+client@1.6.1/node_modules/@redis/json/dist/commands/NUMMULTBY.d.ts","./node_modules/.pnpm/@redis+json@1.0.7_@redis+client@1.6.1/node_modules/@redis/json/dist/commands/OBJKEYS.d.ts","./node_modules/.pnpm/@redis+json@1.0.7_@redis+client@1.6.1/node_modules/@redis/json/dist/commands/OBJLEN.d.ts","./node_modules/.pnpm/@redis+json@1.0.7_@redis+client@1.6.1/node_modules/@redis/json/dist/commands/RESP.d.ts","./node_modules/.pnpm/@redis+json@1.0.7_@redis+client@1.6.1/node_modules/@redis/json/dist/commands/SET.d.ts","./node_modules/.pnpm/@redis+json@1.0.7_@redis+client@1.6.1/node_modules/@redis/json/dist/commands/STRAPPEND.d.ts","./node_modules/.pnpm/@redis+json@1.0.7_@redis+client@1.6.1/node_modules/@redis/json/dist/commands/STRLEN.d.ts","./node_modules/.pnpm/@redis+json@1.0.7_@redis+client@1.6.1/node_modules/@redis/json/dist/commands/TYPE.d.ts","./node_modules/.pnpm/@redis+json@1.0.7_@redis+client@1.6.1/node_modules/@redis/json/dist/commands/index.d.ts","./node_modules/.pnpm/@redis+json@1.0.7_@redis+client@1.6.1/node_modules/@redis/json/dist/index.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/_LIST.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/ALTER.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/AGGREGATE.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/AGGREGATE_WITHCURSOR.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/ALIASADD.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/ALIASDEL.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/ALIASUPDATE.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/CONFIG_GET.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/CONFIG_SET.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/CREATE.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/CURSOR_DEL.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/CURSOR_READ.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/DICTADD.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/DICTDEL.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/DICTDUMP.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/DROPINDEX.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/EXPLAIN.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/EXPLAINCLI.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/INFO.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/SEARCH.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/PROFILE_SEARCH.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/PROFILE_AGGREGATE.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/SEARCH_NOCONTENT.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/SPELLCHECK.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/SUGADD.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/SUGDEL.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/SUGGET.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/SUGGET_WITHPAYLOADS.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/SUGGET_WITHSCORES.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/SUGGET_WITHSCORES_WITHPAYLOADS.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/SUGLEN.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/SYNDUMP.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/SYNUPDATE.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/TAGVALS.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/index.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/index.d.ts","./node_modules/.pnpm/@redis+time-series@1.1.0_@redis+client@1.6.1/node_modules/@redis/time-series/dist/commands/ADD.d.ts","./node_modules/.pnpm/@redis+time-series@1.1.0_@redis+client@1.6.1/node_modules/@redis/time-series/dist/commands/ALTER.d.ts","./node_modules/.pnpm/@redis+time-series@1.1.0_@redis+client@1.6.1/node_modules/@redis/time-series/dist/commands/CREATE.d.ts","./node_modules/.pnpm/@redis+time-series@1.1.0_@redis+client@1.6.1/node_modules/@redis/time-series/dist/commands/CREATERULE.d.ts","./node_modules/.pnpm/@redis+time-series@1.1.0_@redis+client@1.6.1/node_modules/@redis/time-series/dist/commands/DECRBY.d.ts","./node_modules/.pnpm/@redis+time-series@1.1.0_@redis+client@1.6.1/node_modules/@redis/time-series/dist/commands/DEL.d.ts","./node_modules/.pnpm/@redis+time-series@1.1.0_@redis+client@1.6.1/node_modules/@redis/time-series/dist/commands/DELETERULE.d.ts","./node_modules/.pnpm/@redis+time-series@1.1.0_@redis+client@1.6.1/node_modules/@redis/time-series/dist/commands/GET.d.ts","./node_modules/.pnpm/@redis+time-series@1.1.0_@redis+client@1.6.1/node_modules/@redis/time-series/dist/commands/INCRBY.d.ts","./node_modules/.pnpm/@redis+time-series@1.1.0_@redis+client@1.6.1/node_modules/@redis/time-series/dist/commands/INFO.d.ts","./node_modules/.pnpm/@redis+time-series@1.1.0_@redis+client@1.6.1/node_modules/@redis/time-series/dist/commands/INFO_DEBUG.d.ts","./node_modules/.pnpm/@redis+time-series@1.1.0_@redis+client@1.6.1/node_modules/@redis/time-series/dist/commands/MADD.d.ts","./node_modules/.pnpm/@redis+time-series@1.1.0_@redis+client@1.6.1/node_modules/@redis/time-series/dist/commands/MGET.d.ts","./node_modules/.pnpm/@redis+time-series@1.1.0_@redis+client@1.6.1/node_modules/@redis/time-series/dist/commands/MGET_WITHLABELS.d.ts","./node_modules/.pnpm/@redis+time-series@1.1.0_@redis+client@1.6.1/node_modules/@redis/time-series/dist/commands/QUERYINDEX.d.ts","./node_modules/.pnpm/@redis+time-series@1.1.0_@redis+client@1.6.1/node_modules/@redis/time-series/dist/commands/RANGE.d.ts","./node_modules/.pnpm/@redis+time-series@1.1.0_@redis+client@1.6.1/node_modules/@redis/time-series/dist/commands/REVRANGE.d.ts","./node_modules/.pnpm/@redis+time-series@1.1.0_@redis+client@1.6.1/node_modules/@redis/time-series/dist/commands/MRANGE.d.ts","./node_modules/.pnpm/@redis+time-series@1.1.0_@redis+client@1.6.1/node_modules/@redis/time-series/dist/commands/MRANGE_WITHLABELS.d.ts","./node_modules/.pnpm/@redis+time-series@1.1.0_@redis+client@1.6.1/node_modules/@redis/time-series/dist/commands/MREVRANGE.d.ts","./node_modules/.pnpm/@redis+time-series@1.1.0_@redis+client@1.6.1/node_modules/@redis/time-series/dist/commands/MREVRANGE_WITHLABELS.d.ts","./node_modules/.pnpm/@redis+time-series@1.1.0_@redis+client@1.6.1/node_modules/@redis/time-series/dist/commands/index.d.ts","./node_modules/.pnpm/@redis+time-series@1.1.0_@redis+client@1.6.1/node_modules/@redis/time-series/dist/index.d.ts","./node_modules/.pnpm/redis@4.7.1/node_modules/redis/dist/index.d.ts","./srv/api/ws/bus.ts","./srv/api/ws/handlers.ts","./srv/api/ws/handle.ts","./srv/api/ws/setup.ts","./srv/api/ws/index.ts","./srv/db/invite.ts","./node_modules/.pnpm/evtstore@12.0.1/node_modules/evtstore/src/types.ts","./node_modules/.pnpm/evtstore@12.0.1/node_modules/evtstore/src/common.ts","./node_modules/.pnpm/evtstore@12.0.1/node_modules/evtstore/provider/util.ts","./node_modules/.pnpm/evtstore@12.0.1/node_modules/evtstore/src/event-handler.ts","./node_modules/.pnpm/evtstore@12.0.1/node_modules/evtstore/src/create-aggregate.ts","./node_modules/.pnpm/evtstore@12.0.1/node_modules/evtstore/src/domain.ts","./node_modules/.pnpm/evtstore@12.0.1/node_modules/evtstore/src/create-handler.ts","./node_modules/.pnpm/evtstore@12.0.1/node_modules/evtstore/src/create-bookmark.ts","./node_modules/.pnpm/evtstore@12.0.1/node_modules/evtstore/src/domain-v2.ts","./node_modules/.pnpm/evtstore@12.0.1/node_modules/evtstore/src/create-command.ts","./node_modules/.pnpm/evtstore@12.0.1/node_modules/evtstore/provider/error.ts","./node_modules/.pnpm/evtstore@12.0.1/node_modules/evtstore/index.d.ts","./node_modules/.pnpm/evtstore@12.0.1/node_modules/evtstore/provider/mongo.ts","./srv/domains/billing/types.ts","./srv/domains/billing/agg.ts","./srv/domains/subs/types.ts","./srv/domains/subs/agg.ts","./srv/domains/patreons/types.ts","./srv/domains/patreons/index.ts","./srv/domains/domain.ts","./srv/domains/billing/cmd.ts","./srv/domains/patreons/cmd.ts","./srv/domains/subs/cmd.ts","./srv/domains/index.ts","./srv/db/admin.ts","./srv/db/presets.ts","./srv/db/messages.ts","./srv/db/memory.ts","./srv/db/shop.ts","./srv/db/matches.ts","./srv/db/credits.ts","./srv/db/scenario.ts","./srv/db/invitecode.ts","./srv/db/subscriptions.ts","./srv/db/announcements.ts","./srv/db/index.ts","./srv/api/billing/stripe.ts","./node_modules/.pnpm/@types+needle@3.3.0/node_modules/@types/needle/index.d.ts","./srv/api/user/patreon.ts","./srv/adapter/register.ts","./srv/db/user.ts","./srv/db/oauth.ts","./srv/middleware.ts","./srv/api/auth.ts","./common/xplevel.ts","./srv/api/chat/create.ts","./common/requests/util.ts","./srv/api/chat/common.ts","./srv/api/chat/edit.ts","./srv/api/chat/get.ts","./srv/api/chat/guest-msg.ts","./srv/image/types.ts","./node_modules/.pnpm/@types+adm-zip@0.5.7/node_modules/@types/adm-zip/util.d.ts","./node_modules/.pnpm/@types+adm-zip@0.5.7/node_modules/@types/adm-zip/index.d.ts","./common/image.ts","./srv/image/novel.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/abort-handler.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/abort.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/auth/auth.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/auth/HttpApiKeyAuth.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/identity/identity.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/response.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/command.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/endpoint.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/feature-ids.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/logger.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/uri.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/http.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/util.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/middleware.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/auth/HttpSigner.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/auth/IdentityProviderConfig.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/auth/HttpAuthScheme.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/auth/HttpAuthSchemeProvider.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/auth/index.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/transform/exact.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/externals-check/browser-externals-check.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/blob/blob-payload-input-types.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/crypto.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/checksum.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/client.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/connection/config.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/transfer.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/connection/manager.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/connection/pool.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/connection/index.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/eventStream.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/encode.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/endpoints/shared.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/endpoints/EndpointRuleObject.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/endpoints/ErrorRuleObject.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/endpoints/TreeRuleObject.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/endpoints/RuleSetObject.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/endpoints/index.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/extensions/checksum.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/extensions/defaultClientConfiguration.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/shapes.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/retry.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/extensions/retry.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/extensions/defaultExtensionConfiguration.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/extensions/index.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/http/httpHandlerInitialization.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/identity/apiKeyIdentity.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/identity/awsCredentialIdentity.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/identity/tokenIdentity.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/identity/index.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/pagination.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/profile.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/serde.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/signature.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/stream.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/streaming-payload/streaming-blob-common-types.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/streaming-payload/streaming-blob-payload-input-types.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/streaming-payload/streaming-blob-payload-output-types.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/transform/type-transform.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/transform/client-method-transforms.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/transform/client-payload-blob-type-narrow.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/transform/no-undefined.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/waiter.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/index.d.ts","./node_modules/.pnpm/@smithy+node-config-provider@4.1.1/node_modules/@smithy/node-config-provider/dist-types/fromEnv.d.ts","./node_modules/.pnpm/@smithy+shared-ini-file-loader@4.0.2/node_modules/@smithy/shared-ini-file-loader/dist-types/getHomeDir.d.ts","./node_modules/.pnpm/@smithy+shared-ini-file-loader@4.0.2/node_modules/@smithy/shared-ini-file-loader/dist-types/getProfileName.d.ts","./node_modules/.pnpm/@smithy+shared-ini-file-loader@4.0.2/node_modules/@smithy/shared-ini-file-loader/dist-types/getSSOTokenFilepath.d.ts","./node_modules/.pnpm/@smithy+shared-ini-file-loader@4.0.2/node_modules/@smithy/shared-ini-file-loader/dist-types/getSSOTokenFromFile.d.ts","./node_modules/.pnpm/@smithy+shared-ini-file-loader@4.0.2/node_modules/@smithy/shared-ini-file-loader/dist-types/loadSharedConfigFiles.d.ts","./node_modules/.pnpm/@smithy+shared-ini-file-loader@4.0.2/node_modules/@smithy/shared-ini-file-loader/dist-types/loadSsoSessionData.d.ts","./node_modules/.pnpm/@smithy+shared-ini-file-loader@4.0.2/node_modules/@smithy/shared-ini-file-loader/dist-types/parseKnownFiles.d.ts","./node_modules/.pnpm/@smithy+shared-ini-file-loader@4.0.2/node_modules/@smithy/shared-ini-file-loader/dist-types/types.d.ts","./node_modules/.pnpm/@smithy+shared-ini-file-loader@4.0.2/node_modules/@smithy/shared-ini-file-loader/dist-types/index.d.ts","./node_modules/.pnpm/@smithy+node-config-provider@4.1.1/node_modules/@smithy/node-config-provider/dist-types/fromSharedConfigFiles.d.ts","./node_modules/.pnpm/@smithy+node-config-provider@4.1.1/node_modules/@smithy/node-config-provider/dist-types/fromStatic.d.ts","./node_modules/.pnpm/@smithy+node-config-provider@4.1.1/node_modules/@smithy/node-config-provider/dist-types/configLoader.d.ts","./node_modules/.pnpm/@smithy+node-config-provider@4.1.1/node_modules/@smithy/node-config-provider/dist-types/index.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-flexible-checksums@3.806.0/node_modules/@aws-sdk/middleware-flexible-checksums/dist-types/constants.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-flexible-checksums@3.806.0/node_modules/@aws-sdk/middleware-flexible-checksums/dist-types/NODE_REQUEST_CHECKSUM_CALCULATION_CONFIG_OPTIONS.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-flexible-checksums@3.806.0/node_modules/@aws-sdk/middleware-flexible-checksums/dist-types/NODE_RESPONSE_CHECKSUM_VALIDATION_CONFIG_OPTIONS.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-flexible-checksums@3.806.0/node_modules/@aws-sdk/middleware-flexible-checksums/dist-types/crc64-nvme-crt-container.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-flexible-checksums@3.806.0/node_modules/@aws-sdk/middleware-flexible-checksums/dist-types/configuration.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-flexible-checksums@3.806.0/node_modules/@aws-sdk/middleware-flexible-checksums/dist-types/flexibleChecksumsMiddleware.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-flexible-checksums@3.806.0/node_modules/@aws-sdk/middleware-flexible-checksums/dist-types/flexibleChecksumsInputMiddleware.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-flexible-checksums@3.806.0/node_modules/@aws-sdk/middleware-flexible-checksums/dist-types/flexibleChecksumsResponseMiddleware.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-flexible-checksums@3.806.0/node_modules/@aws-sdk/middleware-flexible-checksums/dist-types/getFlexibleChecksumsPlugin.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-flexible-checksums@3.806.0/node_modules/@aws-sdk/middleware-flexible-checksums/dist-types/resolveFlexibleChecksumsConfig.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-flexible-checksums@3.806.0/node_modules/@aws-sdk/middleware-flexible-checksums/dist-types/index.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-host-header@3.804.0/node_modules/@aws-sdk/middleware-host-header/dist-types/index.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-sdk-s3@3.806.0/node_modules/@aws-sdk/middleware-sdk-s3/dist-types/check-content-length-header.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-sdk-s3@3.806.0/node_modules/@aws-sdk/middleware-sdk-s3/dist-types/region-redirect-middleware.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-sdk-s3@3.806.0/node_modules/@aws-sdk/middleware-sdk-s3/dist-types/region-redirect-endpoint-middleware.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-sdk-s3@3.806.0/node_modules/@aws-sdk/middleware-sdk-s3/dist-types/s3-expires-middleware.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/abort.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/auth.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/blob/blob-types.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/checksum.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/client.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/command.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/connection.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/identity/Identity.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/identity/AnonymousIdentity.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/feature-ids.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/identity/AwsCredentialIdentity.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/identity/LoginIdentity.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/identity/TokenIdentity.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/identity/index.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/util.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/credentials.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/crypto.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/dns.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/encode.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/endpoint.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/eventStream.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/extensions/index.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/function.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/http.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/logger.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/middleware.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/pagination.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/profile.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/request.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/response.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/retry.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/serde.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/shapes.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/signature.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/stream.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/token.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/transfer.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/uri.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/waiter.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/index.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-sdk-s3@3.806.0/node_modules/@aws-sdk/middleware-sdk-s3/dist-types/s3-express/interfaces/S3ExpressIdentity.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-sdk-s3@3.806.0/node_modules/@aws-sdk/middleware-sdk-s3/dist-types/s3-express/classes/S3ExpressIdentityCacheEntry.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-sdk-s3@3.806.0/node_modules/@aws-sdk/middleware-sdk-s3/dist-types/s3-express/classes/S3ExpressIdentityCache.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-sdk-s3@3.806.0/node_modules/@aws-sdk/middleware-sdk-s3/dist-types/s3-express/interfaces/S3ExpressIdentityProvider.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-sdk-s3@3.806.0/node_modules/@aws-sdk/middleware-sdk-s3/dist-types/s3-express/classes/S3ExpressIdentityProviderImpl.d.ts","./node_modules/.pnpm/@smithy+signature-v4@5.1.0/node_modules/@smithy/signature-v4/dist-types/SignatureV4Base.d.ts","./node_modules/.pnpm/@smithy+signature-v4@5.1.0/node_modules/@smithy/signature-v4/dist-types/SignatureV4.d.ts","./node_modules/.pnpm/@smithy+signature-v4@5.1.0/node_modules/@smithy/signature-v4/dist-types/constants.d.ts","./node_modules/.pnpm/@smithy+signature-v4@5.1.0/node_modules/@smithy/signature-v4/dist-types/getCanonicalHeaders.d.ts","./node_modules/.pnpm/@smithy+signature-v4@5.1.0/node_modules/@smithy/signature-v4/dist-types/getCanonicalQuery.d.ts","./node_modules/.pnpm/@smithy+signature-v4@5.1.0/node_modules/@smithy/signature-v4/dist-types/getPayloadHash.d.ts","./node_modules/.pnpm/@smithy+signature-v4@5.1.0/node_modules/@smithy/signature-v4/dist-types/moveHeadersToQuery.d.ts","./node_modules/.pnpm/@smithy+signature-v4@5.1.0/node_modules/@smithy/signature-v4/dist-types/prepareRequest.d.ts","./node_modules/.pnpm/@smithy+signature-v4@5.1.0/node_modules/@smithy/signature-v4/dist-types/credentialDerivation.d.ts","./node_modules/.pnpm/@smithy+signature-v4@5.1.0/node_modules/@smithy/signature-v4/dist-types/headerUtil.d.ts","./node_modules/.pnpm/@smithy+signature-v4@5.1.0/node_modules/@smithy/signature-v4/dist-types/signature-v4a-container.d.ts","./node_modules/.pnpm/@smithy+signature-v4@5.1.0/node_modules/@smithy/signature-v4/dist-types/index.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-sdk-s3@3.806.0/node_modules/@aws-sdk/middleware-sdk-s3/dist-types/s3-express/classes/SignatureV4S3Express.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-sdk-s3@3.806.0/node_modules/@aws-sdk/middleware-sdk-s3/dist-types/s3-express/constants.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-sdk-s3@3.806.0/node_modules/@aws-sdk/middleware-sdk-s3/dist-types/s3-express/functions/s3ExpressMiddleware.d.ts","./node_modules/.pnpm/@smithy+protocol-http@5.1.0/node_modules/@smithy/protocol-http/dist-types/httpRequest.d.ts","./node_modules/.pnpm/@smithy+protocol-http@5.1.0/node_modules/@smithy/protocol-http/dist-types/httpResponse.d.ts","./node_modules/.pnpm/@smithy+protocol-http@5.1.0/node_modules/@smithy/protocol-http/dist-types/httpHandler.d.ts","./node_modules/.pnpm/@smithy+protocol-http@5.1.0/node_modules/@smithy/protocol-http/dist-types/extensions/httpExtensionConfiguration.d.ts","./node_modules/.pnpm/@smithy+protocol-http@5.1.0/node_modules/@smithy/protocol-http/dist-types/extensions/index.d.ts","./node_modules/.pnpm/@smithy+protocol-http@5.1.0/node_modules/@smithy/protocol-http/dist-types/Field.d.ts","./node_modules/.pnpm/@smithy+protocol-http@5.1.0/node_modules/@smithy/protocol-http/dist-types/Fields.d.ts","./node_modules/.pnpm/@smithy+protocol-http@5.1.0/node_modules/@smithy/protocol-http/dist-types/isValidHostname.d.ts","./node_modules/.pnpm/@smithy+protocol-http@5.1.0/node_modules/@smithy/protocol-http/dist-types/types.d.ts","./node_modules/.pnpm/@smithy+protocol-http@5.1.0/node_modules/@smithy/protocol-http/dist-types/index.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-sdk-s3@3.806.0/node_modules/@aws-sdk/middleware-sdk-s3/dist-types/s3-express/functions/s3ExpressHttpSigningMiddleware.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-sdk-s3@3.806.0/node_modules/@aws-sdk/middleware-sdk-s3/dist-types/s3-express/index.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-sdk-s3@3.806.0/node_modules/@aws-sdk/middleware-sdk-s3/dist-types/s3Configuration.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-sdk-s3@3.806.0/node_modules/@aws-sdk/middleware-sdk-s3/dist-types/throw-200-exceptions.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-sdk-s3@3.806.0/node_modules/@aws-sdk/middleware-sdk-s3/dist-types/validate-bucket-name.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-sdk-s3@3.806.0/node_modules/@aws-sdk/middleware-sdk-s3/dist-types/index.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-user-agent@3.806.0/node_modules/@aws-sdk/middleware-user-agent/dist-types/configurations.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-user-agent@3.806.0/node_modules/@aws-sdk/middleware-user-agent/dist-types/user-agent-middleware.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-user-agent@3.806.0/node_modules/@aws-sdk/middleware-user-agent/dist-types/index.d.ts","./node_modules/.pnpm/@smithy+config-resolver@4.1.2/node_modules/@smithy/config-resolver/dist-types/endpointsConfig/NodeUseDualstackEndpointConfigOptions.d.ts","./node_modules/.pnpm/@smithy+config-resolver@4.1.2/node_modules/@smithy/config-resolver/dist-types/endpointsConfig/NodeUseFipsEndpointConfigOptions.d.ts","./node_modules/.pnpm/@smithy+config-resolver@4.1.2/node_modules/@smithy/config-resolver/dist-types/endpointsConfig/resolveEndpointsConfig.d.ts","./node_modules/.pnpm/@smithy+config-resolver@4.1.2/node_modules/@smithy/config-resolver/dist-types/endpointsConfig/resolveCustomEndpointsConfig.d.ts","./node_modules/.pnpm/@smithy+config-resolver@4.1.2/node_modules/@smithy/config-resolver/dist-types/endpointsConfig/index.d.ts","./node_modules/.pnpm/@smithy+config-resolver@4.1.2/node_modules/@smithy/config-resolver/dist-types/regionConfig/config.d.ts","./node_modules/.pnpm/@smithy+config-resolver@4.1.2/node_modules/@smithy/config-resolver/dist-types/regionConfig/resolveRegionConfig.d.ts","./node_modules/.pnpm/@smithy+config-resolver@4.1.2/node_modules/@smithy/config-resolver/dist-types/regionConfig/index.d.ts","./node_modules/.pnpm/@smithy+config-resolver@4.1.2/node_modules/@smithy/config-resolver/dist-types/regionInfo/EndpointVariantTag.d.ts","./node_modules/.pnpm/@smithy+config-resolver@4.1.2/node_modules/@smithy/config-resolver/dist-types/regionInfo/EndpointVariant.d.ts","./node_modules/.pnpm/@smithy+config-resolver@4.1.2/node_modules/@smithy/config-resolver/dist-types/regionInfo/PartitionHash.d.ts","./node_modules/.pnpm/@smithy+config-resolver@4.1.2/node_modules/@smithy/config-resolver/dist-types/regionInfo/RegionHash.d.ts","./node_modules/.pnpm/@smithy+config-resolver@4.1.2/node_modules/@smithy/config-resolver/dist-types/regionInfo/getRegionInfo.d.ts","./node_modules/.pnpm/@smithy+config-resolver@4.1.2/node_modules/@smithy/config-resolver/dist-types/regionInfo/index.d.ts","./node_modules/.pnpm/@smithy+config-resolver@4.1.2/node_modules/@smithy/config-resolver/dist-types/index.d.ts","./node_modules/.pnpm/@smithy+eventstream-serde-config-resolver@4.1.0/node_modules/@smithy/eventstream-serde-config-resolver/dist-types/EventStreamSerdeConfig.d.ts","./node_modules/.pnpm/@smithy+eventstream-serde-config-resolver@4.1.0/node_modules/@smithy/eventstream-serde-config-resolver/dist-types/index.d.ts","./node_modules/.pnpm/@smithy+middleware-endpoint@4.1.4/node_modules/@smithy/middleware-endpoint/dist-types/resolveEndpointConfig.d.ts","./node_modules/.pnpm/@smithy+middleware-endpoint@4.1.4/node_modules/@smithy/middleware-endpoint/dist-types/types.d.ts","./node_modules/.pnpm/@smithy+middleware-endpoint@4.1.4/node_modules/@smithy/middleware-endpoint/dist-types/adaptors/getEndpointFromInstructions.d.ts","./node_modules/.pnpm/@smithy+middleware-endpoint@4.1.4/node_modules/@smithy/middleware-endpoint/dist-types/adaptors/toEndpointV1.d.ts","./node_modules/.pnpm/@smithy+middleware-endpoint@4.1.4/node_modules/@smithy/middleware-endpoint/dist-types/adaptors/index.d.ts","./node_modules/.pnpm/@smithy+middleware-endpoint@4.1.4/node_modules/@smithy/middleware-endpoint/dist-types/endpointMiddleware.d.ts","./node_modules/.pnpm/@smithy+middleware-endpoint@4.1.4/node_modules/@smithy/middleware-endpoint/dist-types/getEndpointPlugin.d.ts","./node_modules/.pnpm/@smithy+middleware-endpoint@4.1.4/node_modules/@smithy/middleware-endpoint/dist-types/index.d.ts","./node_modules/.pnpm/@smithy+util-retry@4.0.3/node_modules/@smithy/util-retry/dist-types/types.d.ts","./node_modules/.pnpm/@smithy+util-retry@4.0.3/node_modules/@smithy/util-retry/dist-types/AdaptiveRetryStrategy.d.ts","./node_modules/.pnpm/@smithy+util-retry@4.0.3/node_modules/@smithy/util-retry/dist-types/StandardRetryStrategy.d.ts","./node_modules/.pnpm/@smithy+util-retry@4.0.3/node_modules/@smithy/util-retry/dist-types/ConfiguredRetryStrategy.d.ts","./node_modules/.pnpm/@smithy+util-retry@4.0.3/node_modules/@smithy/util-retry/dist-types/DefaultRateLimiter.d.ts","./node_modules/.pnpm/@smithy+util-retry@4.0.3/node_modules/@smithy/util-retry/dist-types/config.d.ts","./node_modules/.pnpm/@smithy+util-retry@4.0.3/node_modules/@smithy/util-retry/dist-types/constants.d.ts","./node_modules/.pnpm/@smithy+util-retry@4.0.3/node_modules/@smithy/util-retry/dist-types/index.d.ts","./node_modules/.pnpm/@smithy+middleware-retry@4.1.5/node_modules/@smithy/middleware-retry/dist-types/types.d.ts","./node_modules/.pnpm/@smithy+middleware-retry@4.1.5/node_modules/@smithy/middleware-retry/dist-types/StandardRetryStrategy.d.ts","./node_modules/.pnpm/@smithy+middleware-retry@4.1.5/node_modules/@smithy/middleware-retry/dist-types/AdaptiveRetryStrategy.d.ts","./node_modules/.pnpm/@smithy+middleware-retry@4.1.5/node_modules/@smithy/middleware-retry/dist-types/configurations.d.ts","./node_modules/.pnpm/@smithy+middleware-retry@4.1.5/node_modules/@smithy/middleware-retry/dist-types/delayDecider.d.ts","./node_modules/.pnpm/@smithy+middleware-retry@4.1.5/node_modules/@smithy/middleware-retry/dist-types/omitRetryHeadersMiddleware.d.ts","./node_modules/.pnpm/@smithy+middleware-retry@4.1.5/node_modules/@smithy/middleware-retry/dist-types/retryDecider.d.ts","./node_modules/.pnpm/@smithy+middleware-retry@4.1.5/node_modules/@smithy/middleware-retry/dist-types/retryMiddleware.d.ts","./node_modules/.pnpm/@smithy+middleware-retry@4.1.5/node_modules/@smithy/middleware-retry/dist-types/index.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/client.d.ts","./node_modules/.pnpm/@smithy+util-stream@4.2.0/node_modules/@smithy/util-stream/dist-types/blob/Uint8ArrayBlobAdapter.d.ts","./node_modules/.pnpm/@smithy+util-stream@4.2.0/node_modules/@smithy/util-stream/dist-types/checksum/ChecksumStream.d.ts","./node_modules/.pnpm/@smithy+util-stream@4.2.0/node_modules/@smithy/util-stream/dist-types/checksum/ChecksumStream.browser.d.ts","./node_modules/.pnpm/@smithy+util-stream@4.2.0/node_modules/@smithy/util-stream/dist-types/checksum/createChecksumStream.browser.d.ts","./node_modules/.pnpm/@smithy+util-stream@4.2.0/node_modules/@smithy/util-stream/dist-types/checksum/createChecksumStream.d.ts","./node_modules/.pnpm/@smithy+util-stream@4.2.0/node_modules/@smithy/util-stream/dist-types/createBufferedReadable.d.ts","./node_modules/.pnpm/@smithy+util-stream@4.2.0/node_modules/@smithy/util-stream/dist-types/getAwsChunkedEncodingStream.d.ts","./node_modules/.pnpm/@smithy+util-stream@4.2.0/node_modules/@smithy/util-stream/dist-types/headStream.d.ts","./node_modules/.pnpm/@smithy+util-stream@4.2.0/node_modules/@smithy/util-stream/dist-types/sdk-stream-mixin.d.ts","./node_modules/.pnpm/@smithy+util-stream@4.2.0/node_modules/@smithy/util-stream/dist-types/splitStream.d.ts","./node_modules/.pnpm/@smithy+util-stream@4.2.0/node_modules/@smithy/util-stream/dist-types/stream-type-check.d.ts","./node_modules/.pnpm/@smithy+util-stream@4.2.0/node_modules/@smithy/util-stream/dist-types/index.d.ts","./node_modules/.pnpm/@smithy+core@3.3.1/node_modules/@smithy/core/dist-types/submodules/protocols/collect-stream-body.d.ts","./node_modules/.pnpm/@smithy+core@3.3.1/node_modules/@smithy/core/dist-types/submodules/protocols/extended-encode-uri-component.d.ts","./node_modules/.pnpm/@smithy+core@3.3.1/node_modules/@smithy/core/dist-types/submodules/protocols/requestBuilder.d.ts","./node_modules/.pnpm/@smithy+core@3.3.1/node_modules/@smithy/core/dist-types/submodules/protocols/resolve-path.d.ts","./node_modules/.pnpm/@smithy+core@3.3.1/node_modules/@smithy/core/dist-types/submodules/protocols/index.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/collect-stream-body.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/command.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/constants.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/create-aggregated-client.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/date-utils.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/default-error-handler.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/defaults-mode.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/emitWarningIfUnsupportedVersion.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/exceptions.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/extended-encode-uri-component.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/extensions/checksum.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/extensions/retry.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/extensions/defaultExtensionConfiguration.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/extensions/index.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/get-array-if-single-item.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/get-value-from-text-node.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/is-serializable-header-value.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/lazy-json.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/NoOpLogger.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/object-mapping.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/parse-utils.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/quote-header.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/resolve-path.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/ser-utils.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/serde-json.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/split-every.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/split-header.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/index.d.ts","./node_modules/.pnpm/@aws-sdk+core@3.806.0/node_modules/@aws-sdk/core/dist-types/submodules/client/emitWarningIfUnsupportedVersion.d.ts","./node_modules/.pnpm/@aws-sdk+core@3.806.0/node_modules/@aws-sdk/core/dist-types/submodules/client/setCredentialFeature.d.ts","./node_modules/.pnpm/@aws-sdk+core@3.806.0/node_modules/@aws-sdk/core/dist-types/submodules/client/setFeature.d.ts","./node_modules/.pnpm/@aws-sdk+core@3.806.0/node_modules/@aws-sdk/core/dist-types/submodules/client/index.d.ts","./node_modules/.pnpm/@aws-sdk+core@3.806.0/node_modules/@aws-sdk/core/dist-types/submodules/httpAuthSchemes/aws_sdk/resolveAwsSdkSigV4AConfig.d.ts","./node_modules/.pnpm/@aws-sdk+core@3.806.0/node_modules/@aws-sdk/core/dist-types/submodules/httpAuthSchemes/aws_sdk/AwsSdkSigV4Signer.d.ts","./node_modules/.pnpm/@aws-sdk+core@3.806.0/node_modules/@aws-sdk/core/dist-types/submodules/httpAuthSchemes/aws_sdk/AwsSdkSigV4ASigner.d.ts","./node_modules/.pnpm/@aws-sdk+core@3.806.0/node_modules/@aws-sdk/core/dist-types/submodules/httpAuthSchemes/aws_sdk/NODE_AUTH_SCHEME_PREFERENCE_OPTIONS.d.ts","./node_modules/.pnpm/@aws-sdk+core@3.806.0/node_modules/@aws-sdk/core/dist-types/submodules/httpAuthSchemes/aws_sdk/resolveAwsSdkSigV4Config.d.ts","./node_modules/.pnpm/@aws-sdk+core@3.806.0/node_modules/@aws-sdk/core/dist-types/submodules/httpAuthSchemes/aws_sdk/index.d.ts","./node_modules/.pnpm/@aws-sdk+core@3.806.0/node_modules/@aws-sdk/core/dist-types/submodules/httpAuthSchemes/index.d.ts","./node_modules/.pnpm/@aws-sdk+core@3.806.0/node_modules/@aws-sdk/core/dist-types/submodules/protocols/coercing-serializers.d.ts","./node_modules/.pnpm/@aws-sdk+core@3.806.0/node_modules/@aws-sdk/core/dist-types/submodules/protocols/json/awsExpectUnion.d.ts","./node_modules/.pnpm/@aws-sdk+core@3.806.0/node_modules/@aws-sdk/core/dist-types/submodules/protocols/json/parseJsonBody.d.ts","./node_modules/.pnpm/@aws-sdk+core@3.806.0/node_modules/@aws-sdk/core/dist-types/submodules/protocols/xml/parseXmlBody.d.ts","./node_modules/.pnpm/@aws-sdk+core@3.806.0/node_modules/@aws-sdk/core/dist-types/submodules/protocols/index.d.ts","./node_modules/.pnpm/@aws-sdk+core@3.806.0/node_modules/@aws-sdk/core/dist-types/index.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/endpoint/EndpointParameters.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/auth/httpAuthSchemeProvider.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/models/S3ServiceException.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/models/models_0.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/AbortMultipartUploadCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/CompleteMultipartUploadCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/CopyObjectCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/CreateBucketCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/CreateBucketMetadataTableConfigurationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/CreateMultipartUploadCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/CreateSessionCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/DeleteBucketAnalyticsConfigurationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/DeleteBucketCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/DeleteBucketCorsCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/DeleteBucketEncryptionCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/DeleteBucketIntelligentTieringConfigurationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/DeleteBucketInventoryConfigurationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/DeleteBucketLifecycleCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/DeleteBucketMetadataTableConfigurationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/DeleteBucketMetricsConfigurationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/DeleteBucketOwnershipControlsCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/DeleteBucketPolicyCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/DeleteBucketReplicationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/DeleteBucketTaggingCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/DeleteBucketWebsiteCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/DeleteObjectCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/DeleteObjectsCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/DeleteObjectTaggingCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/DeletePublicAccessBlockCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetBucketAccelerateConfigurationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetBucketAclCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetBucketAnalyticsConfigurationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetBucketCorsCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetBucketEncryptionCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetBucketIntelligentTieringConfigurationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetBucketInventoryConfigurationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetBucketLifecycleConfigurationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetBucketLocationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetBucketLoggingCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetBucketMetadataTableConfigurationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetBucketMetricsConfigurationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetBucketNotificationConfigurationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetBucketOwnershipControlsCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetBucketPolicyCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetBucketPolicyStatusCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetBucketReplicationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetBucketRequestPaymentCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetBucketTaggingCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetBucketVersioningCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetBucketWebsiteCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetObjectAclCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetObjectAttributesCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetObjectCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetObjectLegalHoldCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetObjectLockConfigurationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetObjectRetentionCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetObjectTaggingCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetObjectTorrentCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetPublicAccessBlockCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/HeadBucketCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/HeadObjectCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/ListBucketAnalyticsConfigurationsCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/ListBucketIntelligentTieringConfigurationsCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/ListBucketInventoryConfigurationsCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/ListBucketMetricsConfigurationsCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/ListBucketsCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/ListDirectoryBucketsCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/ListMultipartUploadsCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/ListObjectsCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/ListObjectsV2Command.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/ListObjectVersionsCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/ListPartsCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/PutBucketAccelerateConfigurationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/PutBucketAclCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/PutBucketAnalyticsConfigurationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/models/models_1.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/PutBucketCorsCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/PutBucketEncryptionCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/PutBucketIntelligentTieringConfigurationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/PutBucketInventoryConfigurationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/PutBucketLifecycleConfigurationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/PutBucketLoggingCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/PutBucketMetricsConfigurationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/PutBucketNotificationConfigurationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/PutBucketOwnershipControlsCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/PutBucketPolicyCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/PutBucketReplicationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/PutBucketRequestPaymentCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/PutBucketTaggingCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/PutBucketVersioningCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/PutBucketWebsiteCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/PutObjectAclCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/PutObjectCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/PutObjectLegalHoldCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/PutObjectLockConfigurationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/PutObjectRetentionCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/PutObjectTaggingCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/PutPublicAccessBlockCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/RestoreObjectCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/SelectObjectContentCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/UploadPartCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/UploadPartCopyCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/WriteGetObjectResponseCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/auth/httpAuthExtensionConfiguration.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/extensionConfiguration.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/runtimeExtensions.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/S3Client.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/S3.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/index.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/pagination/Interfaces.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/pagination/ListBucketsPaginator.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/pagination/ListDirectoryBucketsPaginator.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/pagination/ListObjectsV2Paginator.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/pagination/ListPartsPaginator.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/pagination/index.d.ts","./node_modules/.pnpm/@smithy+util-waiter@4.0.3/node_modules/@smithy/util-waiter/dist-types/waiter.d.ts","./node_modules/.pnpm/@smithy+util-waiter@4.0.3/node_modules/@smithy/util-waiter/dist-types/createWaiter.d.ts","./node_modules/.pnpm/@smithy+util-waiter@4.0.3/node_modules/@smithy/util-waiter/dist-types/index.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/waiters/waitForBucketExists.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/waiters/waitForBucketNotExists.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/waiters/waitForObjectExists.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/waiters/waitForObjectNotExists.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/waiters/index.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/models/index.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/index.d.ts","./node_modules/.pnpm/mkdirp@2.1.6/node_modules/mkdirp/dist/cjs/src/opts-arg.d.ts","./node_modules/.pnpm/mkdirp@2.1.6/node_modules/mkdirp/dist/cjs/src/mkdirp-manual.d.ts","./node_modules/.pnpm/mkdirp@2.1.6/node_modules/mkdirp/dist/cjs/src/mkdirp-native.d.ts","./node_modules/.pnpm/mkdirp@2.1.6/node_modules/mkdirp/dist/cjs/src/use-native.d.ts","./node_modules/.pnpm/mkdirp@2.1.6/node_modules/mkdirp/dist/cjs/src/index.d.ts","./srv/api/upload.ts","./srv/image/stable-diffusion.ts","./common/horde-gen.ts","./common/performance.ts","./srv/api/request.ts","./srv/api/horde.ts","./srv/image/horde.ts","./srv/image/index.ts","./srv/api/chat/image.ts","./srv/api/chat/invite.ts","./node_modules/.pnpm/@agnai+web-tokenizers@0.1.3/node_modules/@agnai/web-tokenizers/lib/tokenizers.d.ts","./node_modules/.pnpm/@agnai+web-tokenizers@0.1.3/node_modules/@agnai/web-tokenizers/lib/index.d.ts","./node_modules/.pnpm/@dqbd+tiktoken@1.0.21/node_modules/@dqbd/tiktoken/lite/tiktoken.d.ts","./node_modules/.pnpm/@dqbd+tiktoken@1.0.21/node_modules/@dqbd/tiktoken/lite/tiktoken_bg.d.ts","./node_modules/.pnpm/@dqbd+tiktoken@1.0.21/node_modules/@dqbd/tiktoken/lite/init.d.ts","./node_modules/.pnpm/@dqbd+tiktoken@1.0.21/node_modules/@dqbd/tiktoken/tiktoken.d.ts","./node_modules/.pnpm/nai-js-tokenizer@1.0.1/node_modules/nai-js-tokenizer/lib/index.d.ts","./srv/tokenize.ts","./srv/adapter/prompt.ts","./srv/adapter/stream.ts","./srv/adapter/chat-completion.ts","./srv/adapter/claude.ts","./srv/adapter/openrouter.ts","./srv/adapter/goose.ts","./srv/adapter/horde.ts","./srv/adapter/dispatch.ts","./srv/adapter/payloads.ts","./common/sampler-order.ts","./srv/adapter/kobold.ts","./srv/adapter/mancer.ts","./srv/adapter/novel-bad-words.ts","./srv/adapter/novel.ts","./srv/adapter/openai.ts","./srv/adapter/petals.ts","./common/types/replicate.ts","./srv/adapter/replicate.ts","./srv/adapter/scale.ts","./srv/adapter/venus.ts","./srv/api/chat/lock.ts","./srv/adapter/agnaistic.ts","./srv/api/settings.ts","./common/guidance/grammar.ts","./common/guidance/guidance-parser.ts","./srv/adapter/generate.ts","./common/scenario.ts","./srv/api/chat/message.ts","./srv/api/chat/remove.ts","./srv/voice/types.ts","./srv/voice/elevenlabs.ts","./srv/voice/novel.ts","./srv/voice/webspeechsynthesis.ts","./srv/voice/moderation.ts","./srv/voice/agnai.ts","./srv/voice/index.ts","./srv/api/chat/texttospeech.ts","./srv/api/chat/characters.ts","./srv/api/chat/inference.ts","./srv/api/chat/index.ts","./srv/api/memory/index.ts","./srv/api/character.ts","./srv/api/classify/index.ts","./srv/api/user/settings.ts","./node_modules/.pnpm/gaxios@6.7.1/node_modules/gaxios/build/src/common.d.ts","./node_modules/.pnpm/gaxios@6.7.1/node_modules/gaxios/build/src/interceptor.d.ts","./node_modules/.pnpm/gaxios@6.7.1/node_modules/gaxios/build/src/gaxios.d.ts","./node_modules/.pnpm/gaxios@6.7.1/node_modules/gaxios/build/src/index.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/transporters.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/auth/credentials.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/crypto/crypto.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/util.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/auth/authclient.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/auth/loginticket.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/auth/oauth2client.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/auth/idtokenclient.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/auth/envDetect.d.ts","./node_modules/.pnpm/gtoken@7.1.0/node_modules/gtoken/build/src/index.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/auth/jwtclient.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/auth/refreshclient.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/auth/impersonated.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/auth/baseexternalclient.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/auth/identitypoolclient.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/auth/awsrequestsigner.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/auth/awsclient.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/auth/pluggable-auth-client.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/auth/externalclient.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/auth/externalAccountAuthorizedUserClient.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/auth/googleauth.d.ts","./node_modules/.pnpm/gcp-metadata@6.1.1/node_modules/gcp-metadata/build/src/gcp-residency.d.ts","./node_modules/.pnpm/gcp-metadata@6.1.1/node_modules/gcp-metadata/build/src/index.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/auth/computeclient.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/auth/iam.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/auth/jwtaccess.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/auth/downscopedclient.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/auth/passthrough.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/index.d.ts","./srv/api/user/auth.ts","./srv/api/user/presets.ts","./srv/api/user/services.ts","./srv/api/user/delete-user.ts","./srv/api/user/index.ts","./srv/api/admin.ts","./srv/api/billing/checkout.ts","./srv/api/billing/cancel.ts","./srv/api/billing/modify.ts","./srv/api/billing/resume.ts","./srv/api/billing/index.ts","./srv/api/subscriptions.ts","./srv/api/scenario/index.ts","./srv/api/json/index.ts","./srv/api/voice.ts","./srv/api/announcements.ts","./srv/api/freecredits.ts","./srv/api/charimport.ts","./node_modules/.pnpm/frisker@1.7.0/node_modules/frisker/dist/types.d.ts","./node_modules/.pnpm/frisker@1.7.0/node_modules/frisker/dist/util.d.ts","./node_modules/.pnpm/frisker@1.7.0/node_modules/frisker/dist/format/gql.d.ts","./node_modules/.pnpm/frisker@1.7.0/node_modules/frisker/dist/format/index.d.ts","./node_modules/.pnpm/frisker@1.7.0/node_modules/frisker/dist/validate.d.ts","./node_modules/.pnpm/frisker@1.7.0/node_modules/frisker/dist/index.d.ts","./srv/api/match.ts","./node_modules/.pnpm/@types+paypal-rest-sdk@1.7.9/node_modules/@types/paypal-rest-sdk/index.d.ts","./node_modules/.pnpm/@types+crypto-js@4.2.2/node_modules/@types/crypto-js/index.d.ts","./srv/api/cart.ts","./srv/api/paypal.ts","./srv/api/index.ts","./srv/server.ts","./srv/api/pipeline.ts","./srv/app.ts","./srv/augment.d.ts","./srv/bin.ts","./srv/demandGPT.ts","./node_modules/.pnpm/@sapphire+shapeshift@4.0.0/node_modules/@sapphire/shapeshift/dist/cjs/index.d.cts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/globals.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/rest/common.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/payloads/common.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/utils/internals.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/payloads/v10/permissions.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/payloads/v10/user.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/payloads/v10/emoji.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/payloads/v10/oauth2.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/payloads/v10/sticker.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/payloads/v10/guild.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/payloads/v10/autoModeration.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/payloads/v10/guildScheduledEvent.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/payloads/v10/stageInstance.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/payloads/v10/webhook.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/payloads/v10/auditLog.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/payloads/v10/invite.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/payloads/v10/monetization.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/payloads/v10/poll.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/payloads/v10/soundboard.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/payloads/v10/teams.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/rest/v10/application.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/rest/v10/auditLog.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/rest/v10/autoModeration.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/rest/v10/poll.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/rest/v10/channel.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/rest/v10/emoji.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/rest/v10/gateway.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/rest/v10/guild.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/rest/v10/guildScheduledEvent.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/rest/v10/webhook.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/rest/v10/interactions.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/rest/v10/invite.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/rest/v10/monetization.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/rest/v10/oauth2.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/rest/v10/soundboard.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/rest/v10/stageInstance.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/rest/v10/sticker.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/rest/v10/template.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/rest/v10/user.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/rest/v10/voice.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/rest/v10/index.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/payloads/v10/template.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/payloads/v10/voice.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/payloads/v10/index.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/payloads/v10/_interactions/responses.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/payloads/v10/_interactions/base.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/payloads/v10/_interactions/_applicationCommands/_chatInput/shared.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/payloads/v10/_interactions/_applicationCommands/_chatInput/base.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/payloads/v10/_interactions/_applicationCommands/_chatInput/attachment.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/payloads/v10/_interactions/_applicationCommands/_chatInput/boolean.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/payloads/v10/_interactions/_applicationCommands/_chatInput/channel.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/payloads/v10/_interactions/_applicationCommands/_chatInput/integer.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/payloads/v10/_interactions/_applicationCommands/_chatInput/mentionable.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/payloads/v10/_interactions/_applicationCommands/_chatInput/number.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/payloads/v10/_interactions/_applicationCommands/_chatInput/role.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/payloads/v10/_interactions/_applicationCommands/_chatInput/string.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/payloads/v10/_interactions/_applicationCommands/_chatInput/subcommand.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/payloads/v10/_interactions/_applicationCommands/_chatInput/subcommandGroup.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/payloads/v10/_interactions/_applicationCommands/_chatInput/user.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/payloads/v10/_interactions/_applicationCommands/internals.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/payloads/v10/_interactions/_applicationCommands/chatInput.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/payloads/v10/_interactions/_applicationCommands/contextMenu.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/payloads/v10/_interactions/_applicationCommands/entryPoint.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/payloads/v10/_interactions/_applicationCommands/permissions.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/payloads/v10/_interactions/applicationCommands.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/payloads/v10/_interactions/autocomplete.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/payloads/v10/_interactions/messageComponents.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/payloads/v10/_interactions/modalSubmit.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/payloads/v10/_interactions/ping.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/payloads/v10/interactions.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/payloads/v10/application.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/payloads/v10/channel.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/payloads/v10/gateway.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/gateway/common.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/gateway/v10.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/rpc/common.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/rpc/v10.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/utils/v10.d.ts","./node_modules/.pnpm/discord-api-types@0.38.4/node_modules/discord-api-types/v10.d.ts","./node_modules/.pnpm/@discordjs+formatters@0.6.1/node_modules/@discordjs/formatters/dist/index.d.ts","./node_modules/.pnpm/@discordjs+util@1.1.1/node_modules/@discordjs/util/dist/index.d.ts","./node_modules/.pnpm/@discordjs+builders@1.11.2/node_modules/@discordjs/builders/dist/index.d.ts","./node_modules/.pnpm/@discordjs+collection@1.5.3/node_modules/@discordjs/collection/dist/index.d.ts","./node_modules/.pnpm/@discordjs+collection@2.1.1/node_modules/@discordjs/collection/dist/index.d.ts","./node_modules/.pnpm/undici@6.21.1/node_modules/undici/types/header.d.ts","./node_modules/.pnpm/undici@6.21.1/node_modules/undici/types/readable.d.ts","./node_modules/.pnpm/undici@6.21.1/node_modules/undici/types/file.d.ts","./node_modules/.pnpm/undici@6.21.1/node_modules/undici/types/fetch.d.ts","./node_modules/.pnpm/undici@6.21.1/node_modules/undici/types/formdata.d.ts","./node_modules/.pnpm/undici@6.21.1/node_modules/undici/types/connector.d.ts","./node_modules/.pnpm/undici@6.21.1/node_modules/undici/types/client.d.ts","./node_modules/.pnpm/undici@6.21.1/node_modules/undici/types/errors.d.ts","./node_modules/.pnpm/undici@6.21.1/node_modules/undici/types/dispatcher.d.ts","./node_modules/.pnpm/undici@6.21.1/node_modules/undici/types/global-dispatcher.d.ts","./node_modules/.pnpm/undici@6.21.1/node_modules/undici/types/global-origin.d.ts","./node_modules/.pnpm/undici@6.21.1/node_modules/undici/types/pool-stats.d.ts","./node_modules/.pnpm/undici@6.21.1/node_modules/undici/types/pool.d.ts","./node_modules/.pnpm/undici@6.21.1/node_modules/undici/types/handlers.d.ts","./node_modules/.pnpm/undici@6.21.1/node_modules/undici/types/balanced-pool.d.ts","./node_modules/.pnpm/undici@6.21.1/node_modules/undici/types/agent.d.ts","./node_modules/.pnpm/undici@6.21.1/node_modules/undici/types/mock-interceptor.d.ts","./node_modules/.pnpm/undici@6.21.1/node_modules/undici/types/mock-agent.d.ts","./node_modules/.pnpm/undici@6.21.1/node_modules/undici/types/mock-client.d.ts","./node_modules/.pnpm/undici@6.21.1/node_modules/undici/types/mock-pool.d.ts","./node_modules/.pnpm/undici@6.21.1/node_modules/undici/types/mock-errors.d.ts","./node_modules/.pnpm/undici@6.21.1/node_modules/undici/types/proxy-agent.d.ts","./node_modules/.pnpm/undici@6.21.1/node_modules/undici/types/env-http-proxy-agent.d.ts","./node_modules/.pnpm/undici@6.21.1/node_modules/undici/types/retry-handler.d.ts","./node_modules/.pnpm/undici@6.21.1/node_modules/undici/types/retry-agent.d.ts","./node_modules/.pnpm/undici@6.21.1/node_modules/undici/types/api.d.ts","./node_modules/.pnpm/undici@6.21.1/node_modules/undici/types/interceptors.d.ts","./node_modules/.pnpm/undici@6.21.1/node_modules/undici/types/util.d.ts","./node_modules/.pnpm/undici@6.21.1/node_modules/undici/types/cookies.d.ts","./node_modules/.pnpm/undici@6.21.1/node_modules/undici/types/patch.d.ts","./node_modules/.pnpm/undici@6.21.1/node_modules/undici/types/websocket.d.ts","./node_modules/.pnpm/undici@6.21.1/node_modules/undici/types/eventsource.d.ts","./node_modules/.pnpm/undici@6.21.1/node_modules/undici/types/filereader.d.ts","./node_modules/.pnpm/undici@6.21.1/node_modules/undici/types/diagnostics-channel.d.ts","./node_modules/.pnpm/undici@6.21.1/node_modules/undici/types/content-type.d.ts","./node_modules/.pnpm/undici@6.21.1/node_modules/undici/types/cache.d.ts","./node_modules/.pnpm/undici@6.21.1/node_modules/undici/types/index.d.ts","./node_modules/.pnpm/undici@6.21.1/node_modules/undici/index.d.ts","./node_modules/.pnpm/@vladfrangu+async_event_emitter@2.4.6/node_modules/@vladfrangu/async_event_emitter/dist/index.d.ts","./node_modules/.pnpm/@discordjs+rest@2.5.0/node_modules/@discordjs/rest/dist/index.d.ts","./node_modules/.pnpm/@sapphire+async-queue@1.5.5/node_modules/@sapphire/async-queue/dist/cjs/index.d.cts","./node_modules/.pnpm/@discordjs+ws@1.2.2/node_modules/@discordjs/ws/dist/index.d.ts","./node_modules/.pnpm/discord.js@14.19.3/node_modules/discord.js/typings/rawDataTypes.d.ts","./node_modules/.pnpm/@sapphire+snowflake@3.5.3/node_modules/@sapphire/snowflake/dist/cjs/index.d.cts","./node_modules/.pnpm/discord.js@14.19.3/node_modules/discord.js/typings/index.d.ts","./srv/deploy-bot.ts","./srv/discord.ts","./srv/module.d.ts","./node_modules/.pnpm/@types+localtunnel@2.0.4/node_modules/@types/localtunnel/index.d.ts","./node_modules/.pnpm/@types+throng@5.0.7/node_modules/@types/throng/index.d.ts","./srv/start.ts","./srv/discord/access.ts","./srv/discord/ask.ts","./srv/discord/character.ts","./srv/discord/ping.ts","./srv/discord/register.ts","./srv/domains/lock.ts","./srv/domains/billing/manager.ts","./srv/domains/gifts/agg.ts","./srv/domains/gifts/cmd.ts","./srv/domains/gifts/types.ts","./common/ambient.d.ts","./common/chat.ts","./common/dummy.ts","./common/tokenize.ts","./common/image-prompt.ts","./common/module.d.ts","./common/typed-event-emitter.ts","./common/guidance/v2/grammar.ts","./common/guidance/v2/index.ts","./common/requests/stream.ts","./common/requests/types.ts","./common/requests/openai.ts","./common/requests/payloads.ts","./common/requests/index.ts","./node_modules/.pnpm/@types+chai@4.3.20/node_modules/@types/chai/index.d.ts","./node_modules/.pnpm/@types+yargs-parser@21.0.3/node_modules/@types/yargs-parser/index.d.ts","./node_modules/.pnpm/@types+yargs@17.0.33/node_modules/@types/yargs/index.d.ts","./node_modules/.pnpm/@types+istanbul-lib-coverage@2.0.6/node_modules/@types/istanbul-lib-coverage/index.d.ts","./node_modules/.pnpm/chalk@4.1.2/node_modules/chalk/index.d.ts","./node_modules/.pnpm/@types+istanbul-lib-report@3.0.3/node_modules/@types/istanbul-lib-report/index.d.ts","./node_modules/.pnpm/@types+istanbul-reports@3.0.4/node_modules/@types/istanbul-reports/index.d.ts","./node_modules/.pnpm/@sinclair+typebox@0.27.8/node_modules/@sinclair/typebox/typebox.d.ts","./node_modules/.pnpm/@jest+schemas@29.6.3/node_modules/@jest/schemas/build/index.d.ts","./node_modules/.pnpm/@jest+types@29.6.3/node_modules/@jest/types/build/index.d.ts","./node_modules/.pnpm/@jest+expect-utils@29.7.0/node_modules/@jest/expect-utils/build/index.d.ts","./node_modules/.pnpm/pretty-format@29.7.0/node_modules/pretty-format/build/index.d.ts","./node_modules/.pnpm/jest-diff@29.7.0/node_modules/jest-diff/build/index.d.ts","./node_modules/.pnpm/jest-matcher-utils@29.7.0/node_modules/jest-matcher-utils/build/index.d.ts","./node_modules/.pnpm/expect@29.7.0/node_modules/expect/build/index.d.ts","./node_modules/.pnpm/jest-snapshot@29.7.0/node_modules/jest-snapshot/build/index.d.ts","./node_modules/.pnpm/@types+mocha@10.0.10/node_modules/@types/mocha/index.d.ts","./node_modules/.pnpm/@types+stack-utils@2.0.3/node_modules/@types/stack-utils/index.d.ts","./node_modules/.pnpm/jest-message-util@29.7.0/node_modules/jest-message-util/build/index.d.ts","./node_modules/.pnpm/@jest+console@29.7.0/node_modules/@jest/console/build/index.d.ts","./node_modules/.pnpm/@types+graceful-fs@4.1.9/node_modules/@types/graceful-fs/index.d.ts","./node_modules/.pnpm/jest-haste-map@29.7.0/node_modules/jest-haste-map/build/index.d.ts","./node_modules/.pnpm/collect-v8-coverage@1.0.2/node_modules/collect-v8-coverage/index.d.ts","./node_modules/.pnpm/@jest+test-result@29.7.0/node_modules/@jest/test-result/build/index.d.ts","./node_modules/.pnpm/mocha-chai-jest-snapshot@1.1.6/node_modules/mocha-chai-jest-snapshot/dist/utils/jest-test-result-helper.d.ts","./node_modules/.pnpm/mocha-chai-jest-snapshot@1.1.6/node_modules/mocha-chai-jest-snapshot/dist/manager.d.ts","./node_modules/.pnpm/mocha-chai-jest-snapshot@1.1.6/node_modules/mocha-chai-jest-snapshot/dist/index.d.ts","./tests/init.ts","./tests/util.ts","./tests/chat-model-sample-chat.spec.ts","./tests/parser.spec.ts","./tests/placeholder.spec.ts","./tests/prompt.spec.ts","./tests/resolve-scenario.spec.ts","./web/pages/Chat/update-gaslight.ts","./tests/system-prompt-extraction.spec.ts","./tests/trim-sentence.spec.ts","./tests/trim.spec.ts","./node_modules/.pnpm/@types+cytoscape@3.21.9/node_modules/@types/cytoscape/index.d.ts","./node_modules/.pnpm/@types+cytoscape-dagre@2.3.3/node_modules/@types/cytoscape-dagre/index.d.ts","./node_modules/.pnpm/@types+google-publisher-tag@1.20250428.0/node_modules/@types/google-publisher-tag/index.d.ts","./node_modules/.pnpm/@types+js-cookie@3.0.6/node_modules/@types/js-cookie/index.d.ts","./node_modules/.pnpm/@types+paypal__checkout-server-sdk@1.0.8/node_modules/@types/paypal__checkout-server-sdk/lib/core/access_token.d.ts","./node_modules/.pnpm/@types+paypal__paypalhttp@1.0.3/node_modules/@types/paypal__paypalhttp/lib/paypalhttp/environment.d.ts","./node_modules/.pnpm/@types+paypal__paypalhttp@1.0.3/node_modules/@types/paypal__paypalhttp/lib/paypalhttp/serializer/serializer.d.ts","./node_modules/.pnpm/@types+paypal__paypalhttp@1.0.3/node_modules/@types/paypal__paypalhttp/lib/paypalhttp/serializer/form_encoded.d.ts","./node_modules/.pnpm/@types+paypal__paypalhttp@1.0.3/node_modules/@types/paypal__paypalhttp/lib/paypalhttp/serializer/json.d.ts","./node_modules/.pnpm/@types+paypal__paypalhttp@1.0.3/node_modules/@types/paypal__paypalhttp/lib/paypalhttp/serializer/multipart.d.ts","./node_modules/.pnpm/@types+paypal__paypalhttp@1.0.3/node_modules/@types/paypal__paypalhttp/lib/paypalhttp/serializer/text.d.ts","./node_modules/.pnpm/@types+paypal__paypalhttp@1.0.3/node_modules/@types/paypal__paypalhttp/lib/paypalhttp/http_client.d.ts","./node_modules/.pnpm/@types+paypal__paypalhttp@1.0.3/node_modules/@types/paypal__paypalhttp/lib/paypalhttp/encoder.d.ts","./node_modules/.pnpm/@types+paypal__paypalhttp@1.0.3/node_modules/@types/paypal__paypalhttp/lib/paypalhttp.d.ts","./node_modules/.pnpm/@types+paypal__paypalhttp@1.0.3/node_modules/@types/paypal__paypalhttp/index.d.ts","./node_modules/.pnpm/@types+paypal__checkout-server-sdk@1.0.8/node_modules/@types/paypal__checkout-server-sdk/lib/core/paypal_environment.d.ts","./node_modules/.pnpm/@types+paypal__checkout-server-sdk@1.0.8/node_modules/@types/paypal__checkout-server-sdk/lib/core/access_token_request.d.ts","./node_modules/.pnpm/@types+paypal__checkout-server-sdk@1.0.8/node_modules/@types/paypal__checkout-server-sdk/lib/core/paypal_http_client.d.ts","./node_modules/.pnpm/@types+paypal__checkout-server-sdk@1.0.8/node_modules/@types/paypal__checkout-server-sdk/lib/core/refresh_token_request.d.ts","./node_modules/.pnpm/@types+paypal__checkout-server-sdk@1.0.8/node_modules/@types/paypal__checkout-server-sdk/lib/core/token_cache.d.ts","./node_modules/.pnpm/@types+paypal__checkout-server-sdk@1.0.8/node_modules/@types/paypal__checkout-server-sdk/lib/core/lib.d.ts","./node_modules/.pnpm/@types+paypal__checkout-server-sdk@1.0.8/node_modules/@types/paypal__checkout-server-sdk/lib/payments/lib.d.ts","./node_modules/.pnpm/@types+paypal__checkout-server-sdk@1.0.8/node_modules/@types/paypal__checkout-server-sdk/lib/orders/lib.d.ts","./node_modules/.pnpm/@types+paypal__checkout-server-sdk@1.0.8/node_modules/@types/paypal__checkout-server-sdk/lib/lib.d.ts","./node_modules/.pnpm/@types+paypal__checkout-server-sdk@1.0.8/node_modules/@types/paypal__checkout-server-sdk/index.d.ts","./node_modules/.pnpm/@types+showdown@2.0.6/node_modules/@types/showdown/index.d.ts","./node_modules/.pnpm/@types+sortablejs@1.15.8/node_modules/@types/sortablejs/plugins.d.ts","./node_modules/.pnpm/@types+sortablejs@1.15.8/node_modules/@types/sortablejs/index.d.ts"],"fileIdsList":[[57,95,195,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,168,195,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,167,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,162,180,181,182,183,184,185,186,187,188,195,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,160,195,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,173,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,992,1462],[57,95,173,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1705],[57,95,178,189,195,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,999,1011],[57,95,176,195,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1701],[57,95,167,176,190,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,160,164,178,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,160,178,189,195,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,160,167,179,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,160,179,195,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,179,195,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,178,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,167,178,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,160,167,168,169,170,174,175,177,178,179,190,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,177,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1003,1708,1709,1710],[57,95,160,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,994,1003,1441,1701,1707,1708],[57,95,176,178,189,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1708],[57,95,160,178,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,177,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,160,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,156,167,169,171,173,176,178,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,107,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,160,163,176,193,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,161,163,164,165,166,195,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,160,161,164,166,176,191,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,160,179,191,192,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,179,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,160,161,163,165,166,190,191,192,193,194,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,177,195,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,204,205,206,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,204,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,204,205,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1431],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1076,1166,1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1367,1368,1369,1370,1371,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1397],[57,95,125,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1076,1101,1102,1146,1166,1176,1182,1185,1200,1202,1210,1227,1273,1291,1292,1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1367,1368,1369,1370,1371,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1396],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1076,1166,1292],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1076,1166,1290,1291,1397],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1076,1166,1210,1273,1294,1397],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1076,1166,1210,1273,1366,1397],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1367,1368,1369,1370,1371,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1076,1166],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1076,1146,1166,1176,1394],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1291,1293,1395,1396,1397,1398,1399,1405,1413,1414],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1273],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1294,1366],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1076,1166,1273,1293],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1076,1166,1273,1293,1294],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1076,1166,1397],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1076,1166,1356,1400],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1076,1166,1357,1400],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1076,1166,1360,1400],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1076,1166,1362,1400],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1400,1401,1402,1403,1404],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1395],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1409,1410,1411,1412],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1350,1397,1408],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1351,1397,1408],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1277,1284,1289],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1274,1275,1276],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1146],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1076,1166,1279],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1076,1166,1278],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1090],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1278,1279,1280,1281,1282],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1076,1090,1166],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1076,1146,1163,1166],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1283],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1285,1286,1287,1288],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1090,1091],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1076,1091,1166],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1076,1095,1166],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1076,1095,1096,1097,1098,1166],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1091,1092,1093,1094,1096,1099,1100],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1103,1104,1105,1106,1178,1179,1180,1181],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1076,1104,1166],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1148],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1147],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1146,1147,1149,1150],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1076,1166,1176],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1076,1146,1147,1150,1166],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1147,1148,1149,1150,1151,1164,1165,1166,1177],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1146,1147],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1076,1166,1178],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1076,1166,1179],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1183,1184],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1076,1146,1166,1183],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1076,1120,1121,1166],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1114],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1076,1116,1166],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1114,1115,1117,1118,1119],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1107,1108,1109,1110,1111,1112,1113,1116,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1120,1121],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1552,1631,1632,1633],[57,95,136,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1553],[57,95,125,128,136,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1631,1633,1636,1674,1675],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1631,1633,1636,1675,1676,1677],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1433],[57,95,98,137,143,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1721,1730],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1719],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1715,1721,1731,1733,1734],[57,95,143,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1714,1715,1716,1718,1720],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,474],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,474],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,474,828],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,818,819,820,821,822,823,824,825,826,827,829],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,829,830,831,832,833,834,835,836,837,838,839,840,841,842,844,845,846,847,848,849,850,851,852],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,843],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,830,831,832,833,834,835,836,837,838,839,840,841,842,844],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,853],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,440,441,474,513,701,792,796,800],[57,95,143,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,790],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787],[57,95,107,143,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,439,441,474,555,640,788,789,790,791,793,794,795],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,788,793],[57,95,143,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441],[57,95,107,115,133,143,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441],[57,95,125,143,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,790,796,800],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787],[57,95,107,143,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,790,796,797,798,799],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,793,797],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,568],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,474,573],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,575],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,474,578],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,580],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,464],[57,95,143,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,491],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,513],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,474,607],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,474,605],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,474,603],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,474,601],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,474,611],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,456],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,622],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,637],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,474,638],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,474,640],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,474,650],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,650],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,660],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,474,670],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,715],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,729],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,731],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,474,754],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,474,758],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,474,764],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,474,766],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,768],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,474,769],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,474,774],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,474,771],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,474,785],[57,95,143,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,439,440,796],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,792],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,864],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,861,864],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,855,856,857,858,859,860,861,862,863],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,796,861,862,864],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,864,865],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,889],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,889],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887,888],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,925],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,893],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,925],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,894],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,893,925],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,910,925],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,910],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,917],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,917,918,919],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,891,892,893,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,893,910,925],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,948],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,927,948],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,948],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,936],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,939,948],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,441,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947],[57,95,137,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1186,1187,1188,1189],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1076,1166,1188],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1190,1193,1199],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1191,1192],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1194],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1195],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1076,1166,1196,1197],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1196,1197,1198],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1076,1166,1240],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1241,1242,1243,1244],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1201],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1076,1166,1203,1204],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1205,1206],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1203,1204,1207,1208,1209],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1076,1166,1218,1220],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1076,1166,1219],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1220,1221,1222,1223,1224,1225,1226],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1076,1166,1222],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1076,1077,1087,1088,1166],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1076,1086,1166],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1077,1087,1088,1089],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1076,1166,1172],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1169],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1170],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1076,1166,1167,1168],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1167,1168,1169,1171,1172,1173,1174,1175],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1078,1079,1080,1081,1082,1083,1084,1085],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1076,1082,1166],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1076,1152,1166],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161,1162],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1245],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1076,1166,1210],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1228],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1076,1166,1256,1257],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1258],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1076,1166,1228,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1014],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1013],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1017,1026,1027,1028],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1026,1029],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1017,1024],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1017,1029],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1015,1016,1027,1028,1029,1030],[57,95,125,143,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1033],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1035],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1018,1019,1025,1026],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1018,1026],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1038,1040,1041],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1038,1039],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1043],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1015],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1020,1045],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1045],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1048],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1045,1046,1047],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1045,1046,1047,1048,1049],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1022],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1018,1024,1026],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1035,1036],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1051],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1051,1055],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1051,1052,1055,1056],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1025,1054],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1032],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1014,1023],[57,95,110,112,143,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1022,1024],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1017],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1017,1059,1060,1061],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1014,1018,1019,1020,1021,1022,1023,1024,1025,1026,1031,1034,1035,1036,1037,1039,1042,1043,1044,1050,1053,1054,1057,1058,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1073,1074,1075],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1015,1019,1020,1021,1022,1025,1029],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1019,1037],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1053],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1024,1025,1039],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1018,1024],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1024,1043],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1025,1035,1036],[57,95,110,125,143,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1033,1065],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1018,1019,1070,1071],[57,95,110,111,143,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1019,1024,1037,1065,1069,1070,1071,1072],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1019,1037,1053],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1024],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1076,1166,1211],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1076,1166,1213],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1211],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1211,1212,1213,1214,1215,1216,1217],[57,95,125,143,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1076,1166],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1231],[57,95,125,143,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1230,1232],[57,95,125,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1229,1230,1233,1234,1235,1236,1237,1238,1239],[57,95,125,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1076,1166],[57,95,125,143,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1406],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1406,1407],[57,95,108,143,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1009],[57,95,110,143,152,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,110,143,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1750],[57,95,107,110,143,146,147,148,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,147,149,151,153,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,108,143,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1715],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1717],[57,95,100,143,198,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,107,143,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,125,154,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,110,112,143,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,92,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,94,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,100,128,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,96,107,108,115,125,136,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,96,97,107,115,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[52,53,54,57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,98,137,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,99,100,108,116,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,100,125,133,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,101,103,107,115,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,94,95,102,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,103,104,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,105,107,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,94,95,107,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,107,108,109,125,136,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,107,108,109,122,125,128,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,90,95,141,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,103,107,110,115,125,136,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,107,108,110,111,115,125,133,136,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,110,112,125,133,136,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[55,56,57,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,107,113,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,114,136,141,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,103,107,115,125,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,116,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,117,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,94,95,118,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,119,135,141,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,120,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,121,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,107,122,123,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,122,124,137,139,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,107,125,126,128,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,127,128,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,125,126,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,128,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,129,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,107,131,132,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,131,132,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,100,115,125,133,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,134,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,115,135,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,110,121,136,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,100,137,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,125,138,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,114,139,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,140,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,100,107,109,118,125,136,139,141,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,125,142,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1773],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1765],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1754,1765,1766,1767,1768,1769],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1764],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1764,1765],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1765,1766],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1754,1764],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1770,1771,1772],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1771],[57,95,143,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1763],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1755,1759,1761,1762],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1761],[57,95,110,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1755,1757,1758,1759,1760,1762],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1756,1761],[57,95,108,125,143,145,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,110,143,146,150,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1776],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1777],[57,95,107,110,112,115,125,133,136,142,143,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1713],[57,95,113,143,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1553,1556,1593,1596,1625,1626],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1554],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1553,1599,1600],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1599,1631],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1599,1600],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1553,1599,1600,1624],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1597,1599,1600],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1631],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1597,1599,1600,1613],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1597,1599,1600,1609],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1596,1598,1599,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1617],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1553,1598,1612,1617,1624],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1598,1612,1617],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1553,1617],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1553],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1553,1597,1598,1612,1613,1614,1615,1616,1631],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1596],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1553,1558,1562,1569,1597,1624,1631],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1553,1598,1622,1624],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1596,1624],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1597,1598],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1617,1624,1631],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1553,1555,1558,1560,1562,1566,1572,1622],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1553,1557,1558,1561,1562,1563,1564,1565,1566,1622,1624],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1553,1557,1558,1559,1561,1562,1570,1622,1623],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1553,1556,1557,1558],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1553,1558,1559,1624],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1553,1554,1557,1558,1559,1560,1561,1625],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1553,1558,1562],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1555,1557,1558,1559,1560,1561,1562,1563,1564,1565,1566,1567,1568,1569,1570,1571,1572,1594,1595,1622,1623,1624,1625],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1597,1598,1617,1618,1619,1620,1621],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1558,1562,1564,1565,1623,1624],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1559],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1553,1558],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1553,1562],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1553,1554,1558,1593],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1553,1596],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1556,1623],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1553,1567],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1553,1556,1576,1596],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1553,1554,1556,1577,1596],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1553,1556,1631],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1553,1554,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1553,1556,1582,1596],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1553,1631],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1556,1596],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1553,1556,1576,1577,1596],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1628,1631],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1553,1556,1593,1596,1627,1629,1630],[57,95,96,107,125,141,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1631,1632,1633,1634,1635,1676,1678,1679,1680],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1631,1681,1683],[57,95,136,143,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,957,958,961,962,963,964,965,966,967],[57,95,202,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,957,959,967],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,957],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,957,958],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,957,960],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,957,960,961],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,957,958,959],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1722,1725],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1534],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1536],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1534,1535,1537,1538],[57,95,110,125,136,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,110,136,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1483,1484],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1483,1484,1485],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1483],[57,95,110,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1508],[57,95,107,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1486,1487,1488,1490,1493],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1490,1491,1500,1502],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1486],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1486,1487,1488,1490,1491,1493],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1486,1493],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1486,1487,1488,1491,1493],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1486,1487,1488,1491,1493,1500],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1491,1500,1501,1503,1504],[57,95,125,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1486,1487,1488,1491,1493,1494,1495,1497,1498,1499,1500,1505,1506,1515],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1490,1491,1500],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1493],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1491,1493,1494,1507],[57,95,125,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1488,1493],[57,95,125,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1488,1493,1494,1496],[57,95,121,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1486,1487,1488,1489,1491,1492],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1486,1491,1493],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1491,1500],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1486,1487,1488,1491,1492,1493,1494,1495,1497,1498,1499,1500,1501,1502,1503,1504,1505,1507,1509,1510,1511,1512,1513,1514,1515],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1723],[57,95,143,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1721,1732],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1716,1724],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1721,1729],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1721,1723,1726],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1416,1417,1418,1419],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1416],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1712,1721,1723,1727,1737],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1712,1727,1728,1736],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1727,1735],[57,95,103,107,115,125,133,143,201,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,172,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,107,141,157,158,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1720],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,829,830,831,832,833,834,835,836,837,838,839,840,841,842,844,845,846,847,848,849,850,851,852,854,855,856,857,858,859,860,861,862,863,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887,888,890,891,892,893,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,949],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,143,211,212,213,214,215,216,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,110,143,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,110,143,211,212,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,67,71,95,136,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,67,95,125,136,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,62,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,64,67,95,133,136,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,115,133,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,62,95,143,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,64,67,95,115,136,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,59,60,63,66,95,107,125,136,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,59,65,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,63,67,95,128,136,143,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,83,95,143,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,61,62,95,143,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,67,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,61,62,63,64,65,66,67,68,69,71,72,73,74,75,76,77,78,79,80,81,82,84,85,86,87,88,89,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,67,74,75,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,65,67,75,76,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,66,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,59,62,67,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,67,71,75,76,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,71,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,65,67,70,95,136,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,59,64,65,67,71,74,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,62,67,83,95,141,143,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1673],[57,95,136,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1645,1649],[57,95,125,136,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1645],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1640],[57,95,133,136,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1642,1645],[57,95,143,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1640],[57,95,115,136,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1642,1645],[57,95,107,125,136,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1637,1638,1641,1644],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1645,1652],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1637,1643],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1645,1666,1667],[57,95,128,136,143,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1641,1645],[57,95,143,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1666],[57,95,143,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1639,1640],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1645],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1639,1640,1641,1642,1643,1644,1645,1646,1647,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1660,1661,1662,1663,1664,1665,1667,1668,1669,1670,1671,1672],[57,95,103,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1645,1660],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1645,1652,1653],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1643,1645,1653,1654],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1644],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1637,1640,1645],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1645,1649,1653,1654],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1649],[57,95,136,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1643,1645,1648],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1637,1642,1645,1652],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1645,1660],[57,95,141,143,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1640,1645,1666],[57,95,160,167,177,178,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,955,981,990,992,996,1003,1440,1442,1443,1444,1445,1446,1447,1449,1450,1452,1453,1454,1456,1457,1458,1459],[57,95,167,176,177,178,189,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,994,1011],[57,95,160,176,177,190,195,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,955,994,999,1003,1438,1440,1441],[57,95,178,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,994],[57,95,160,176,177,178,179,190,192,195,196,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,955,990,992,994,999,1423,1426,1438,1460,1461,1463],[57,95,160,177,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,994,996,999,1003],[57,95,167,177,178,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,955,992,999,1003,1423,1426],[57,95,160,177,190,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,994,999,1003,1004,1439,1440,1446,1447,1448],[57,95,177,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,994,996,1003,1439],[57,95,160,177,195,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,994,999,1003,1438,1439,1440,1448,1451],[57,95,160,177,190,195,208,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,999,1003,1438,1440,1441],[57,95,160,177,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,994,996,999,1003,1439,1440,1442],[57,95,176,177,178,189,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1439],[57,95,177,178,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,437,996,999,1003],[57,95,167,177,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,992],[57,95,160,167,177,208,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,999],[57,95,177,208,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,955,994,996,999,1003,1438,1455],[57,95,177,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,994,1003],[57,95,160,177,178,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,437,994,999],[57,95,160,167,176,195,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,999],[57,95,177,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,996,1003,1439,1440],[57,95,154,196,207,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,951,992,1000],[57,95,154,196,207,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,955,992,1000],[57,95,154,196,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,992],[57,95,196,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,979,992,993],[57,95,156,196,207,208,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,979,980,992,993],[57,95,154,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,993,1000,1522,1523,1524,1525],[57,95,196,207,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,979,980,990,992,993,995,1482],[57,95,167,208,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,979,980,990,992,999],[57,95,112,154,156,195,196,208,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,955,992,994,1000,1539,1541,1542],[57,95,154,156,160,176,178,195,196,206,207,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,955,992,1000,1421,1428,1464,1474,1479],[57,95,154,196,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,994,1000],[57,95,156,167,178,196,207,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,955,992,1421],[57,95,195,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1003],[57,95,160,196,207,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,983,992,1001],[57,95,167,196,207,208,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,955,992,1004],[57,95,196,202,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,992],[57,95,196,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,196,207,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,992,1428],[57,95,154,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1000,1002,1005,1006,1007,1429,1430,1466,1467,1475,1476,1477],[57,95,156,160,167,170,174,190,196,207,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,955,992,1459,1464],[57,95,196,207,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,955,992],[57,95,156,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,992],[57,95,154,156,178,195,196,207,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,955,992,1459,1464,1465],[57,95,166,196,207,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,992,1474],[57,95,154,196,208,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,994],[57,95,209,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,992,1000],[57,95,154,160,196,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1423,1424,1425],[57,95,154,208,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1000,1426,1461,1477,1478,1479,1480,1481,1520,1521,1527,1528,1529,1530,1531,1532,1533,1540,1543,1544],[57,95,109,117,154,156,196,208,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1421,1461],[57,95,154,156,160,196,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,992,1000,1539],[57,95,154,196,207,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,992,1000],[57,95,112,154,196,208,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,955,992,1543],[57,95,154,196,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,994],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,994],[57,95,154,167,196,207,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,992,1000],[57,95,109,117,154,160,195,196,208,209,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,992,996,1426,1443,1460],[57,95,154,190,196,207,208,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,955,992,995,1000,1526],[57,95,108,109,117,154,196,207,208,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1415,1420],[57,95,167,196,207,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,992,995,997,1482,1515],[57,95,196,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,992,993],[57,95,154,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1000,1482,1516,1517,1518,1519],[57,95,167,196,208,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,955,980,990,992,994],[57,95,160,167,190,196,207,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,992,1448],[57,95,160,196,207,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,992,994,996,1426,1443,1456,1482],[57,95,156,160,167,178,195,196,207,208,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,955,992,994,996,997,1421,1425,1426,1452,1456,1461],[57,95,154,166,196,207,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,992,1474],[57,95,154,195,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,999],[57,95,116,178,208,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,438,950,999],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,438,951,952],[57,95,207,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,438,951,992,997],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,951,954],[57,95,110,156,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,437,438,953],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,437],[57,95,117,144,154,155,196,208,209,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,951,955,999,1545,1546,1547],[57,95,167,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,999],[57,95,96,108,116,117,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1420],[57,95,108,117,156,160,203,207,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,195,202,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,980],[57,95,156,167,196,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,156,195,202,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,156,174,195,196,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435],[57,95,195,202,208,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,999],[57,95,195,196,209,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,436,955],[57,95,209,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,956,981,982,983,984,985,986,987,988,989,990,991,997,998],[57,95,156,195,196,209,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,436,955],[57,95,156,195,209,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,156,195,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,156,195,202,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,992],[57,95,156,167,196,197,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,997],[57,95,156,195,196,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,156,167,209,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,195,202,209,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,156,176,178,195,196,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,955],[57,95,156,160,169,178,195,196,199,200,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,980,990,992,993,995,996,999],[57,95,100,169,195,200,208,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,108,117,208,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1681,1683],[57,95,108,117,208,209,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,950,992,1681,1683],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,992,1681,1683],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1551,1681,1683],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1681,1683],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,968,970],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,968,970,976],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,976],[57,95,209,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,968,969,971,973,975,999],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,976,977,978,979],[57,95,156,209,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,976,999],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,968,974,976],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,968,974],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,968,972],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,968,972,976,992],[57,95,208,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,955,1008,1423,1426],[57,95,156,208,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,955,992,999,1008,1012,1421,1422,1427],[57,95,191,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,994,1008,1010,1011],[57,95,178,191,195,208,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,990,992,994,999,1008,1011],[57,95,191,195,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,999],[57,95,154,156,159,178,196,208,209,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,990,997,998],[57,95,110,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,116,208,209,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,955,980,992,999,1438,1548,1685,1686],[57,95,108,117,160,167,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,999,1432,1435,1436,1437,1684],[57,95,195,196,207,208,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,992,994,1468],[57,95,166,195,196,207,208,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,994,1468],[57,95,156,166,195,196,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,955,992,999,1421,1468,1469,1470,1471,1472,1473],[57,95,195,196,207,208,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,994],[57,95,195,196,207,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,994,1468],[57,95,166,195,207,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,999],[57,95,196,207,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,160,177,178,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1438,1441,1712,1739,1740],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1712,1738],[57,95,161,167,174,176,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1438,1712,1739,1740],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1712,1739,1740],[57,95,160,176,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1438,1712,1739,1740],[57,95,176,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1712,1739,1740],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1712,1740,1746],[57,95,178,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1712],[57,95,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1003,1712,1739,1740],[57,95,174,176,195,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,1438,1700]],"fileInfos":[{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","affectsGlobalScope":true,"impliedFormat":1},{"version":"07f073f19d67f74d732b1adea08e1dc66b1b58d77cb5b43931dee3d798a2fd53","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7a3c8b952931daebdfc7a2897c53c0a1c73624593fa070e46bd537e64dcd20a","affectsGlobalScope":true,"impliedFormat":1},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true,"impliedFormat":1},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"1305d1e76ca44e30fb8b2b8075fa522b83f60c0bcf5d4326a9d2cf79b53724f8","impliedFormat":1},{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"32cb3140d0e9cee0aea7264fd6a1d297394052a18eb05ca0220d133e6c043fb5","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"7180c03fd3cb6e22f911ce9ba0f8a7008b1a6ddbe88ccf16a9c8140ef9ac1686","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"54cb85a47d760da1c13c00add10d26b5118280d44d58e6908d8e89abbd9d7725","impliedFormat":1},{"version":"3e4825171442666d31c845aeb47fcd34b62e14041bb353ae2b874285d78482aa","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"a967bfe3ad4e62243eb604bf956101e4c740f5921277c60debaf325c1320bf88","impliedFormat":1},{"version":"e9775e97ac4877aebf963a0289c81abe76d1ec9a2a7778dbe637e5151f25c5f3","impliedFormat":1},{"version":"471e1da5a78350bc55ef8cef24eb3aca6174143c281b8b214ca2beda51f5e04a","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"db3435f3525cd785bf21ec6769bf8da7e8a776be1a99e2e7efb5f244a2ef5fee","impliedFormat":1},{"version":"c3b170c45fc031db31f782e612adf7314b167e60439d304b49e704010e7bafe5","impliedFormat":1},{"version":"40383ebef22b943d503c6ce2cb2e060282936b952a01bea5f9f493d5fb487cc7","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"3a84b7cb891141824bd00ef8a50b6a44596aded4075da937f180c90e362fe5f6","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"33203609eba548914dc83ddf6cadbc0bcb6e8ef89f6d648ca0908ae887f9fcc5","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"e53a3c2a9f624d90f24bf4588aacd223e7bec1b9d0d479b68d2f4a9e6011147f","impliedFormat":1},{"version":"339dc5265ee5ed92e536a93a04c4ebbc2128f45eeec6ed29f379e0085283542c","impliedFormat":1},{"version":"9f0a92164925aa37d4a5d9dd3e0134cff8177208dba55fd2310cd74beea40ee2","impliedFormat":1},{"version":"8bfdb79bf1a9d435ec48d9372dc93291161f152c0865b81fc0b2694aedb4578d","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"d32275be3546f252e3ad33976caf8c5e842c09cb87d468cb40d5f4cf092d1acc","impliedFormat":1},{"version":"4a0c3504813a3289f7fb1115db13967c8e004aa8e4f8a9021b95285502221bd1","impliedFormat":1},{"version":"1433ccafba1ab975f1fcd3fabac5290c56fe89397f64447207e62e5df634bb4c","affectsGlobalScope":true,"impliedFormat":1},{"version":"2aadab4729954c700a3ae50977f5611a8487dc3e3dc0e7f8fcd57f40475260a8","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"75eb536b960b85f75e21490beeab53ea616646a995ad203e1af532d67a774fb6","impliedFormat":1},{"version":"befbf9d2259d0266234e6a021267b15a430efd1e1fdb8ed5c662d19e7be53763","affectsGlobalScope":true,"impliedFormat":1},{"version":"51bb58ef3a22fdc49a2d338a852050855d1507f918d4d7fa77a68d72fee9f780","impliedFormat":1},{"version":"7646ad748a9ca15bf43d4c88f83cc851c67f8ec9c1186295605b59ba6bb36dcb","impliedFormat":1},{"version":"cef8931bc129687165253f0642427c2a72705a4613b3ac461b9fa78c7cdaef32","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"47b62c294beb69daa5879f052e416b02e6518f3e4541ae98adbfb27805dd6711","impliedFormat":1},{"version":"f8375506002c556ec412c7e2a5a9ece401079ee5d9eb2c1372e9f5377fac56c7","impliedFormat":1},{"version":"e3460c2b8af8bf0fdf0994388a9e642fff700dc0bcedf6c7c0b9bed4a956b3da","impliedFormat":1},{"version":"548d9051fd6a3544216aec47d3520ce922566c2508df667a1b351658b2e46b8d","impliedFormat":1},{"version":"c175f4dd3b15b38833abfe19acb8ee38c6be2f80f5964b01a4354cafb676a428","impliedFormat":1},{"version":"b9a4824bb83f25d6d227394db2ed99985308cf2a3a35f0d6d39aa72b15473982","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"b84f34005e497dbc0c1948833818cdb38e8c01ff4f88d810b4d70aa2e6c52916","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e8e284b3832911aeede987e4d74cf0a00f2b03896b2fd3bf924344cc0f96b3c","impliedFormat":1},{"version":"37d37474a969ab1b91fc332eb6a375885dfd25279624dfa84dea48c9aedf4472","impliedFormat":1},{"version":"3210b45e363a2cbd501d5e9beaed94e31f2b642076c809a52bf0c0743aa61c4d","impliedFormat":1},{"version":"6b3c4aa0ce6eb9cf6187e61d352cd269ff0e492f333ae102dda121e76f90285c","impliedFormat":1},{"version":"565fda33feca88f4b5db23ba8e605da1fd28b6d63292d276bdbd2afe6cd4c490","impliedFormat":1},{"version":"e822320b448edce0c7ede9cbeada034c72e1f1c8c8281974817030564c63dcb1","impliedFormat":1},{"version":"ebfc5ac063aa88ab26982757a8a9e6e9299306a5f9ea3e03ea5fd78c23dc5d79","affectsGlobalScope":true,"impliedFormat":1},{"version":"16bc7fc733bade239218d2f4351b0b53d7482c5aa917e5e12cf294c688f2e1b3","impliedFormat":1},{"version":"821c79b046e40d54a447bebd9307e70b86399a89980a87bbc98114411169e274","impliedFormat":1},{"version":"17bc38afc78d40b2f54af216c0cc31a4bd0c6897a5945fa39945dfc43260be2c","impliedFormat":1},{"version":"0e6726f7ab7649f3c668f4eadb45461dcfaab2c5899dd7db1e08f8a63905eb94","affectsGlobalScope":true,"impliedFormat":1},{"version":"d44445141f204d5672c502a39c1124bcf1df225eba05df0d2957f79122be87b5","affectsGlobalScope":true,"impliedFormat":1},{"version":"de905bc5f7e7a81cb420e212b95ab5e3ab840f93e0cfa8ce879f6e7fa465d4a2","impliedFormat":1},{"version":"bc2ff43214898bc6d53cab92fb41b5309efec9cbb59a0650525980aee994de2b","impliedFormat":1},{"version":"bede3143eeddca3b8ec3592b09d7eb02042f9e195251040c5146eac09b173236","impliedFormat":1},{"version":"64a40cf4ec8a7a29db2b4bc35f042e5be8537c4be316e5221f40f30ca8ed7051","impliedFormat":1},{"version":"294c082d609e6523520290db4f1d54114ebc83643fb42abd965be5bcc5d9416b","impliedFormat":1},{"version":"5a64238d944ada60d4bec0f91ba970a064618ae3795cff27bb163c84b811284a","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"63c3208a57f10a4f89944c80a6cdb31faff343e41a2d3e06831c621788969fa7","affectsGlobalScope":true,"impliedFormat":1},{"version":"b85151402164ab7cb665e58df5c1a29aa25ea4ed3a367f84a15589e7d7a9c8ca","impliedFormat":1},{"version":"5d8cd11d44a41a6966a04e627d38efce8d214edb36daf494153ec15b2b95eee2","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc6cb10764a82f3025c0f4822b8ad711c16d1a5c75789be2d188d553b69b2d48","affectsGlobalScope":true,"impliedFormat":1},{"version":"41d510caf7ed692923cb6ef5932dc9cf1ed0f57de8eb518c5bab8358a21af674","impliedFormat":1},{"version":"2751c5a6b9054b61c9b03b3770b2d39b1327564672b63e3485ac03ffeb28b4f6","impliedFormat":1},{"version":"dc058956a93388aab38307b7b3b9b6379e1021e73a244aab6ac9427dc3a252a7","impliedFormat":1},{"version":"f33302cf240672359992c356f2005d395b559e176196d03f31a28cc7b01e69bc","impliedFormat":1},{"version":"3ce25041ff6ae06c08fcaccd5fcd9baf4ca6e80e6cb5a922773a1985672e74c2","affectsGlobalScope":true,"impliedFormat":1},{"version":"652c0de14329a834ff06af6ad44670fac35849654a464fd9ae36edb92a362c12","affectsGlobalScope":true,"impliedFormat":1},{"version":"3b1e178016d3fc554505ae087c249b205b1c50624d482c542be9d4682bab81fc","impliedFormat":1},{"version":"dae82763de98657d13112532b6f88fbf4c401d4656c4588a0cd2a95e7b35272b","impliedFormat":1},{"version":"cf45d0510b661f1da461479851ff902f188edb111777c37055eff12fa986a23a","impliedFormat":1},{"version":"cb41c174db409193c4b26e1e02b39a80f3050318a6af120cc304323f29e1ec1b","affectsGlobalScope":true,"impliedFormat":1},{"version":"37bef1064b7d015aeaa7c0716fe23a0b3844abe2c0a3df7144153ca8445fe0da","impliedFormat":1},{"version":"1a013cfc1fa53be19899330926b9e09ccdb6514b3635ef80471ad427b1bbf817","impliedFormat":1},{"version":"25be1eb939c9c63242c7a45446edb20c40541da967f43f1aa6a00ed53c0552db","impliedFormat":1},{"version":"d3f2d715f57df3f04bf7b16dde01dec10366f64fce44503c92b8f78f614c1769","impliedFormat":1},{"version":"b78cd10245a90e27e62d0558564f5d9a16576294eee724a59ae21b91f9269e4a","impliedFormat":1},{"version":"936eb43a381712a8ec1249f2afc819f6fc7ca68f10dfec71762b428dfdc53bf1","impliedFormat":1},{"version":"2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed","impliedFormat":1},{"version":"a45c25e77c911c1f2a04cade78f6f42b4d7d896a3882d4e226efd3a3fcd5f2c4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","impliedFormat":1},{"version":"0e13570a7e86c6d83dd92e81758a930f63747483e2cd34ef36fcdb47d1f9726a","impliedFormat":1},{"version":"104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","impliedFormat":1},{"version":"cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","impliedFormat":1},{"version":"5c45abf1e13e4463eacfd5dedda06855da8748a6a6cb3334f582b52e219acc04","impliedFormat":1},{"version":"d57be402cf1a3f1bd1852fc71b31ff54da497f64dcdcf8af9ad32435e3f32c1f","affectsGlobalScope":true,"impliedFormat":1},{"version":"7d2b7fe4adb76d8253f20e4dbdce044f1cdfab4902ec33c3604585f553883f7d","impliedFormat":1},{"version":"4fe80f12b1d5189384a219095c2eabadbb389c2d3703aae7c5376dbaa56061df","impliedFormat":1},{"version":"ad70fdf3826676b87e49c859035690311e6e1f27fc58c76ebfd5c714f7cee2e6","impliedFormat":1},{"version":"edd2bf117f61517d22264e2204925df0f422315f5df9be844feebb3aab4876f0","impliedFormat":1},{"version":"ca760503b9e3370bcdad948cd7378db44e519c6d1f9e83b2cbfad4c581269081","impliedFormat":1},{"version":"0701d91bf364e0b72c7540b719224b816788a97b269070d7721ae1cc3389d328","impliedFormat":1},{"version":"9897d250adde4a9402245e586185bf7e4f3c06b14a936dc97ab58ef23207caaf","impliedFormat":1},{"version":"a82a05fed697fb55ad24190fbbbefe9448b2e54be4bedbeab5fe88564bc63f11","impliedFormat":1},{"version":"21be395cc8df766b54effd85c62d9b4c5f594442d79b29af8e5fd5c10828cce0","impliedFormat":1},{"version":"f7b38a05722ffd7cf982227e64501690e07d6f140ffaec9b7e87b70e7779186f","impliedFormat":1},{"version":"8315bd9e5a7c114d473c8d1e722959bc27cbd79deef8ec0efb5fe919f44e6171","impliedFormat":1},{"version":"a235b976c63f2017014bd6247d4e508a50a651203c5394f85d0d094d48b8847d","impliedFormat":1},{"version":"f8549be40dde648ed58e8ea6e1f2b7ab61d4b8a7c6f03536710e9bdc68a67d8a","impliedFormat":1},{"version":"3618363b0f9134da3b11e3e2d76b0b2a7f796888d691273483b021a23c3b3938","impliedFormat":1},{"version":"6c9baee31455fbbaed595f32319cd00ade0f4cd57bd7a47cca15b5ab3ba48c11","impliedFormat":1},{"version":"79fe3fb6f7adcdc6a4d26d9100def8a806ed62ce638d69f133864c8209d63629","impliedFormat":1},{"version":"a18360c6928d4d17f5315609558a6d8fe9b30bd129f7f4730a20a9e0a97e78ce","impliedFormat":1},{"version":"34c802e03a1ed5addbda41132b37f30b76e6873d8616f81bfbb83833b5b41ba7","impliedFormat":1},{"version":"ad437ca17654581cae7e625db3459d4869ee498f6442bb322e8d4cfbc0b6c3c7","impliedFormat":1},{"version":"2def0e9e2121e916699bf1c3f5754ec36d97ad2e95caa6b2938be459fa9a8d23","impliedFormat":1},{"version":"66510bb95fdd45ea7af170cd3a3d04722e997f0eefed86162990d85a23015679","impliedFormat":1},{"version":"bcb67f4ba1eb1c4d0eabcd80fd92885c226254843480c437830646d6f45ba951","impliedFormat":1},{"version":"9135077714bd5f27edf1d27bdb047a2644b57a07ec730848b75ea3cdf56e0abc","impliedFormat":1},{"version":"bc21afa9398d657968c8a56d822acc36b704a3b23d495b3ff2378834e028f334","impliedFormat":1},{"version":"d55a50e9504da4961c6e0072361d6546c91cd0427376a6933c6c1bd3e918f390","impliedFormat":1},{"version":"d68d430e4086bcb86567188faef8898e4a88609e063996173fb63403d2a2f062","impliedFormat":1},{"version":"40114cd6ec25a284bd3c7e6a0a57c275ad16309fee7b53a38ab3c320f34c31b6","impliedFormat":1},{"version":"0162726d2d6f404e9ba4f01ceb8a9904a777f349acf9575bd77d005e72ba8371","impliedFormat":1},{"version":"41bcc09d1f16745adae8a500eb0d0a11115e3312b70b8a9a6578239905a0a425","impliedFormat":1},{"version":"a2389b14f97fabcaa0d07a4b60fc528768e9b72e1da3453f6a5ca9e2149e8a0e","impliedFormat":1},{"version":"f102bc4b9034826474d09faa9c39a6889df6bc2bff085f3db3aedfbd79713157","impliedFormat":1},{"version":"511a0400077b07bd0bfc73388022b2d77897dac4edf47a2f01d2b08c4abd9c13","impliedFormat":1},{"version":"7a5eed3e7d9f0b1fd2a40fc9eb7efe3bba8833deaa0c5d4c12a9179c67eb2c85","impliedFormat":1},{"version":"3786c4e7a2d2c04a34dd1103fffa1cc45a0fa05e7069b44660dba20ea24bbe4d","impliedFormat":1},{"version":"41e1f780829ebe2c59e1b3fe0fcf57fd6c43a6a534005371a0e1f333722d8379","impliedFormat":1},{"version":"d673bdfc84bf82b9cd1069f296283dbcddc4f0a68a8f618aa59f4c74a8b522b4","impliedFormat":1},{"version":"807b41ce5ea7251d170515dd9d8fa7efd3665732f3e5b8bed78f9fdfccca9113","impliedFormat":1},{"version":"15d7c79663a0f77e0777f680eca4dac42313f1a7dff5a6bb0a84e11ed7406aef","impliedFormat":1},{"version":"4b5768034200badd11d268c4d19d81d1c6aacb4a75330cb26e5c2d9fa0a3584f","impliedFormat":1},{"version":"a800f22ed8f5f82d0186019125f584d9a248898a980ef6a3f1a5de5398876ab6","impliedFormat":1},{"version":"512c4d4ec514276223c561b9427f511924e50befa972f61ae347bc64cf6d213d","impliedFormat":1},{"version":"feb553efca1022ce1540c01b1a2f218e37c38eb3c274a059539c48892ac4695c","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb893a0dfc3c9fb0f9ca93d0648694dd95f33cbad2c0f2c629f842981dfd4e2e","impliedFormat":1},{"version":"818e7c86776c67f49dbd781d445e13297b59aa7262e54b065b1332d7dcc6f59a","impliedFormat":1},{"version":"a3d3f704c5339a36da3ca8c62b29072f87e86c783b8452d235992142ec71aa2d","impliedFormat":1},{"version":"de3367f8a20cddb78a9405a7c8836c6e9c1c66d1c585e3aea1fa75237df73df6","impliedFormat":1},{"version":"820cb01321788b520a1f287b81802cb3d7365329806af9d1b1ea67bdcf98b16c","impliedFormat":1},{"version":"f634e4c7d5cdba8e092d98098033b311c8ef304038d815c63ffdb9f78f3f7bb7","impliedFormat":1},{"version":"6c01be4bb713b1ea61dd0de16115f8033fb549cd7fe03f42dcce3ed05c056dc4","impliedFormat":1},{"version":"ae7281e0cc71368ec16c4fad9c4a63dc6c1f6c5d6a34221142683f286e30b6c5","impliedFormat":1},{"version":"73e986d8534d46ab199a49e9f939186f45401a4bc6d785c35a203c5d13c3582e","impliedFormat":1},{"version":"c60053e26258409f92f22308161ab9b3134018a0e6e7f0929f95d7a56bac0ead","impliedFormat":1},{"version":"3b93e60a0ad0aab3e3bdc8f58c68811a7294c6b15143711ff4a843b6d9ea9bcd","impliedFormat":1},{"version":"c1ede04bd498a493282a659ed4f5c615555e5a8210076acd912133cbc3d8b58e","impliedFormat":1},{"version":"53db3dfede1c043d8cea6a789696b8c0ffa80d152cd2e3cc33d1a022db29c5f5","impliedFormat":1},{"version":"af10919ddcbaa926b1369dc4c224563f9c8e3d09c44f1e20c83d987f11bc5019","impliedFormat":1},{"version":"545669924f3f3d15a1b948660a5af8c815184616e3f4f206c29fd8a1d2348459","impliedFormat":1},{"version":"195b43fb03896d064b88cb04d5f749809f6366415a6e433b70df295bc3cdbece","impliedFormat":1},{"version":"68db415f5c3001f108bd9c58dcb3ddc83054c7a155c58c3a23b6b96918ace23a","impliedFormat":1},{"version":"e474c59f6ead4f3d50bc5795cb5db657eb2ea54e11564d79d3a88b2cd2cb1ab6","impliedFormat":1},{"version":"8ad2f4ca786f17b3aa031e7474c7270e60cad48f17c0e3f4655ced6a8d22eb19","impliedFormat":1},{"version":"e9074101fae06f21d98cc6f09ec2e78a7348f4720719c94e884e36bf115ebc30","impliedFormat":1},{"version":"b5a6eafb284ffa7d5f42c49b4e37d399099200bcfa2a6a420b0ca2fb6b23a1c2","impliedFormat":1},{"version":"dffa2b8d7f35ccfa857bc50f164b9535dc04b8e3171c60d659073577ae593558","impliedFormat":1},{"version":"564f4667370930201670cac38892735e50831da838722d76a45025828a119a0c","impliedFormat":1},{"version":"4ae2399e36d7436aa239ab7bf0f95636882e9b426bc4a43fdc3c065fea42d449","impliedFormat":1},{"version":"50bc020670be08c5ccd8c384c0e48c7d39d414366818baac9ca4872d984d4706","impliedFormat":1},{"version":"04342b37fe58ab10f85a82cb095d0ac7603a38048b742856a82682e42e5374b6","impliedFormat":1},{"version":"5ef5f7aca54dd822b55f3506c15f8de386698d3853c35f866a5c666778a11514","impliedFormat":1},{"version":"bdf095a90885e0fe7b3c4107baccda7ba734a879948d8536d7f69f0142299cb4","impliedFormat":1},{"version":"aa6e5698c793e7c9f9da3dd916a969dd0e61d7a7099f9da2e199e56110509761","impliedFormat":1},{"version":"d3737589443610a1c929920b7c51e878e69be9fae5829d177efbc98a47fd1163","impliedFormat":1},{"version":"f9ae4c4e1ec34ee879c1c58062033868472091dbfd2b2a6c8058312d4017c805","impliedFormat":1},{"version":"dcd38e74e8a8e46f31fbe3d177db6a6418dbad8ee777a3da6d48875775724a26","impliedFormat":1},{"version":"66b2a14fcc0b6c47e69e483dfc218343b9dfd12926a6b943202fe4bec1f7d746","impliedFormat":1},{"version":"122768989bd1d5fa8164c661dbc81c14d205d7332fd7fe150dd33b99dadc4723","impliedFormat":1},{"version":"7318fc87ac80ab31b5da74ee7968ac0e7a208fa3347615caaafa1dc17d83499d","impliedFormat":1},{"version":"b7ad4e29b4608dcb74555bbcd889c453337d5d60dbe9c318e6ecdada4d850ebb","impliedFormat":1},{"version":"523dc52443b9a94d497e8c035ccdbe5b71a1708ad349e2d60bafb05eb9e31344","impliedFormat":1},{"version":"83aa0ee5160ac8e458d062b2a12a27fc366862d43ccfd9ae01116cf78a8b7541","impliedFormat":1},{"version":"03fe37dc9c343614de62c709600112861ea443e9000e3972db26f4337e80c794","impliedFormat":1},{"version":"ac81562b12319a11a039148b94e618c626fd338ee08df2fe916711a50893108f","impliedFormat":1},{"version":"2c83f60c7ebed64257372e6b00162b98c372c54aaad5ddf310539ea64126f214","impliedFormat":1},{"version":"c27521131d17fc8dcad6a2bbf32b1453d39163130d28db1e02d966f9fdcb0b3c","impliedFormat":1},{"version":"626f4917f67ee864977e64815911b2e420fa6338f639e0d1fad2b1f794b6d419","impliedFormat":1},{"version":"5c0ec6e0505d9972f3e20dd0d51a97a804bc89349b4bdc3a50e52ca6816e9622","impliedFormat":1},{"version":"2b4e45a5df38826571a31da96a069b782c11cc1648bf752d1a858af19f85a651","impliedFormat":1},{"version":"5d22a230719da0eb5c1db24a7b8a5e7ef3b3f29a0c1a757be0d1142699b9ae80","impliedFormat":1},{"version":"361c1a84077bf9fcdb14815421bf343d38cabef711d12b619db61b2f42a5908e","impliedFormat":1},{"version":"3c70c04308ed908c9fa921656e6f8c6f41293336e9909b3fc133e4e2fe31d113","impliedFormat":1},{"version":"baca26e8f7cce2dca7a7c038f66a976488d1e2f91d88425b35f915c5eeb46b99","impliedFormat":1},{"version":"c3a90660b74573026980751d63ce430548273955310f67bc6f900be8378914e0","impliedFormat":1},{"version":"430a86301623bf1cde8b032c0dc84e8660a5d380cee638b9a29f94df8cc3ef4e","impliedFormat":1},{"version":"959a4964dbbc7f523d842de45216707288df48ba552e680cb57b61107c149c91","impliedFormat":1},{"version":"0b1b365d4998b274bfca42745681ffb77b513df4e9128269f46fd908eeacefae","impliedFormat":1},{"version":"710e19e7386e9c023f1929ee8a8604c988b2a0859ed87ba2631e508072870556","impliedFormat":1},{"version":"0ccd836b889988f00d627fb3862dde752025c4988fa45121b7bd127ebc222ded","impliedFormat":1},{"version":"4125d11c36d4430e986018869ccbf63e33dbdc0ecea1b05ae9261af5f3855f22","impliedFormat":1},{"version":"95427c6bdbf8371f1ff39cf33d2f165b4912f80f6e4b92c1d44325df64ac151d","impliedFormat":1},{"version":"5e48bb211fa4e7cd64ef4fd23a969f8bf9374fe47611fb5fa913e45c7a9be8c5","impliedFormat":1},{"version":"eefcf3ab53e8d1c64c966d8fb2881ce8cc59956de4b1020b0cd2e73d2136aad8","impliedFormat":1},{"version":"a185a65246ace0ec3588e14831a98c373e5770fc8b4115185cebe2db087c75a4","impliedFormat":1},{"version":"01aaf2de7288e53fdc873ac317a06c62ed332b09411dceae2b632e727980284c","impliedFormat":1},{"version":"a927b1aaf0cde5d2b96b7b1fbc57af46137e7bffa553c437c22dbcb72c1eb3b7","impliedFormat":1},{"version":"055ad4860771a98de4bba3eecf5a6d99adc4a6eabc81716eabb05a1dc59a3fc2","impliedFormat":1},{"version":"95e52e5958b3d45114b3183ee8867c2fde278a13abe1429e5d463177bfea4d9a","impliedFormat":1},{"version":"b5aa3f58f8f582a4f0b137c37b61d72afd4979a51665ef59ab8b968ba7136577","impliedFormat":1},{"version":"9928bc56674696d549656d0d78ffcedad6c3b1b420041f107842e1d4480f29c8","impliedFormat":1},{"version":"e2af0c0eb4a6498c4ae98765a4ce04ae18eaa54aafe01bd7865e828553889e06","impliedFormat":1},{"version":"3f5a739ca1bcd01d899f18e201d05b0668810085efb9bbcc4b7341388dc88cf7","impliedFormat":1},{"version":"fa716439a17befb3984605fd3a0b62df36a94531ecb2d5a69ae317184efa8041","impliedFormat":1},{"version":"7e96d1ad4eb1ad0f816fd36ae822f854f8cadf30251088426018f3f13f61554b","impliedFormat":1},{"version":"907e84c5a862761ed0371710e22e0a030f9708633803d2b8241347467729dd46","impliedFormat":1},{"version":"4a7d8db387c6300e4b47ac526819589d67ea963ceae5d86222c99eaa4b339fb6","impliedFormat":1},{"version":"25f07e2d971e9c04616691331f56e884b86d238203d809a2024f74d845c02b7c","impliedFormat":1},{"version":"3c65ea8a95ce5a11f482abae178572a13a337216664fb481e151bfe696bbe9e9","impliedFormat":1},{"version":"d5c0e26a5a6313fe1ae5a5e02f5f0fc6291b6d99ced25f3bd46115888ea5f520","impliedFormat":1},{"version":"dc04dc2984778ba15a13361aea9c915182f64a1d5bcdb5b4c430168e2b154daf","impliedFormat":1},{"version":"f6f7b7ef845b6e5a80226ab598cb433950ca400fcfc8adf00dd753f095930618","impliedFormat":1},{"version":"1844c1e0ac130cace70048450871bd5006341f8f76ad8b3f6a1fdb08fa096ea2","impliedFormat":1},{"version":"1d2190bc27ec5febe38395dceed4786120cd18abcabb2621eb57d8595fec0d69","impliedFormat":1},{"version":"8ecb857929b43ad4cde4005ab49f0d73afd095005ea20aba74109251c4980a5f","impliedFormat":1},{"version":"4b8113354e0c5c3207d9cdfad5e8cda0f6c248bd514759e8b7d718ea66870697","impliedFormat":1},{"version":"f1c3453871219988b69a05921166f2e6a984005ab7cc3fdcc7703aa92b51aa5f","impliedFormat":1},{"version":"955e7e1a37a5b151899cbff84df2d0f857af4f7987f93214c472b588d33fe53d","impliedFormat":1},{"version":"18a7eb006f353ec37dc24e4aab5525d1ec5d27aad0a1bb0c2cbffebc40c6ffe2","impliedFormat":1},{"version":"cefcf164e983cfe9c73e7322ecb81149e84b2a3ab1cdc95b4d118560f1279b91","impliedFormat":1},{"version":"cc09445cf30450d0c8a052849bc24186d69dd77ed8092fbdb5caa02dd87a3ae3","impliedFormat":1},{"version":"5e3cea7a1cc38b2bb8730c66f3b3da817370ea208ef3da43e6e2a8208c32679b","impliedFormat":1},{"version":"32441703e8468a9a23d988b13e2b02f97fc0decc80072fa9f3efd2edaa70dab5","impliedFormat":1},{"version":"2f70ec4ac98558e4792fe5067446c3ba1aabab017b534bc6cd627cc0793c5be9","impliedFormat":1},{"version":"7bf8b6e7ea8c562cc790c3ab1e4930a33411ffd1933255936aab2fdd3b32467b","impliedFormat":1},{"version":"e0eeb0fc8067b402716eace1c6568785e57e957ecf96f383ab5eb4257b391d78","impliedFormat":1},{"version":"30de0a10423b959b1aa66924e4ee0986495d73f0c5661869371486120c0ce5f4","impliedFormat":1},{"version":"64b1028b92467d6e87b1bce90d012e5cdbbd4dd35dba54c5f53be19095b11b6e","impliedFormat":1},{"version":"5e54b762fbaba349fc82564220fa1028600c231277a6ae228501fed1c1e208a4","impliedFormat":1},{"version":"6e1b6505e91e8c7fc68e15cb053417ac2209c7a60729e4492bdf91a8332a3b4c","impliedFormat":1},{"version":"c5fee36f7e59a5b58e83df0c5424eee2b7cefa8464cf0985e83c6db63b7e1ec3","impliedFormat":1},{"version":"a26c924fd884bcb2e55cb5fd0008ce58113d459bbc1cb924c99847767f2a8886","impliedFormat":1},{"version":"5d9e970557883b3963e7df1461e825aec9c9057ac254e12027138e618f6e1244","impliedFormat":1},{"version":"a9ed29c4dde54a0c6da1a8092a3754e24de6b74040c68612081267506c7c14b3","impliedFormat":1},{"version":"cd2886147f367b00e24c700f7e6d6e7f4cdb27284f5d9463f412a172b094dc24","impliedFormat":1},{"version":"d11a3e4b2daebaf923b8a24e62e5b754b9e6b3faa787a3a52b1d2b245d496456","impliedFormat":1},{"version":"2fd41111477f22e3800661e38bf3ec64fe1462054108a260e70e4008309e1e49","impliedFormat":1},{"version":"89c9a7ee5c6d5ff0ed7d44ae3eb085e0f089643abd7538c646075d198f672c10","impliedFormat":1},{"version":"d42bbc524e81f662be6b34bc65f46cf4323782b581876d388fa42a89732792a8","impliedFormat":1},{"version":"0c0ef4d4ca1cb49dd9631744e183e64215499c6cf44cd57f0551a52134ea9155","impliedFormat":1},{"version":"71ce6907f7e00a0c258e61bbdc49b8a47ca987e2fc0acc065955cc05897d1ca2","impliedFormat":1},{"version":"649c341a5cf22b877a6baf3a7caaa30d494704d46df175e504e480b0df65b214","impliedFormat":1},{"version":"32497a0d6b963314a64a46a427a316aaa9891674e43f4b5409e81d00a0f5376b","impliedFormat":1},{"version":"3dee34e5d87f56f24506eb8cd1cc37d55f942c976c16b8b501e0ded32445c978","impliedFormat":1},{"version":"756b2016cdedd04aa8e583a8930872b6d422a8071f5ce1b4ef83e3a49bce5d15","impliedFormat":1},{"version":"eb950fee5f2afcd1ccd541ff892b150c22a36e682bbf7262701c97f7aa6a49cc","impliedFormat":1},{"version":"3a42d232ac28ffefbdb9edd5b488496951fc4d9f2bc4e026cf6b7a6c6329e115","impliedFormat":1},{"version":"c8810a241515f4f1ab9a38e9c904a64a9ec1a03973ebc8102f2492de4abfe47d","impliedFormat":1},{"version":"95dc4f979a9cf7a4585b70f4aac7f348748cb9188cb5817b6e248e6c7fddf8c4","impliedFormat":1},{"version":"fa66f4d1d69c409c1ea535aceeab5bb0ccb1e93d92e1b2abfe9835900d828adc","impliedFormat":1},{"version":"4bfa91d0fd398f79f68d23e479da20d5b92e44f838de96389fa7b82b55cb15ed","impliedFormat":1},{"version":"3015207cf952fd45a2bd78eb3e02f3592aa9202d2d611bafd5e0bb2f38f9d2d5","impliedFormat":1},{"version":"3da210b74d8b0d394da3c1459e9d30ded06f3a2bcb279026204c10e71de2cc04","impliedFormat":1},{"version":"9e38f76f68ee422f536b5565eb38dc8f57b56fef6f4ea498d6c2d81d243df745","impliedFormat":1},{"version":"905e27fb2136f3dfd5fd281dc0798184775a88574529e7d1ac4929edd1c84f46","impliedFormat":1},{"version":"758304fcb8cfa113019eca77bd703ef666ff24543593ffbc5f40c9663011bccc","impliedFormat":1},{"version":"b68868886ec1fdf0ebe9ac77ffc64f551d4e6fce20ed81b43ad269482635a44d","impliedFormat":1},{"version":"4f44c84a327c813dfd48b9ebb0edd6665c89bf3ef34f39ab5d854e854b923fd2","impliedFormat":1},{"version":"eeb540679fcd5c9ed3f0b0f0d2701678f6ac3048f2e06ed794ea9207036a2474","impliedFormat":1},{"version":"19d5ec8f855a2d2e98f31ff291428fe0b2257cfec3acfb1207f7e89d257888dc","impliedFormat":1},{"version":"3e444e9378777b2d52ba6e74c736938ec78f9c76a72b6d0f3577fc18b5eb2f75","impliedFormat":1},{"version":"fe555ff873aacc57fbd22772b7f0bbb8a70704fc58f9e9ff88b6f19a8b1d4a13","impliedFormat":1},{"version":"70dfa220caa510a1ee1411ba947de30f9bc7d9186f819837bb5ad3010053ee63","impliedFormat":1},{"version":"a50ae7a664d1cbaa87de5a294be6cdbc1f48bd55c9a24a1d70fbd877e7a0cbf3","impliedFormat":1},{"version":"201aea2e186f363991896c879a6317217d92c4259efe5ce55e8d8c91f532b8dd","impliedFormat":1},{"version":"c56e2b5c8d59dfb14ad86a3e8748ffb837a492cfc02bd74e6f61a30af7092722","impliedFormat":1},{"version":"0a6c3b57bb6a9cbca5ac34f7e0756e80ba79011fc431f4438b3034b1b59892b4","impliedFormat":1},{"version":"7abd883a79b153e94df23c4abe9f13bded3a44216f4e1c13c34ba00cef189f57","impliedFormat":1},{"version":"caf6506cfcf52d2a66b71503f19b70202dc13a468f9bb0faad8f900ae34f3a2c","impliedFormat":1},{"version":"268c20658ab33545068ef965e58d4e1ca14a53e39f5c0bbee66687cfdba43d9d","impliedFormat":1},{"version":"d39e2d9a2ec3a6dfbe03b59f15bdb2c74968ffa6bb9d4e544307769f0993c640","impliedFormat":1},{"version":"4717ec6b7732c61a0e7ab383a476c9817b29328b16b34156cfc5ad0b9d7d8f58","impliedFormat":1},{"version":"09fb442d1576715086c0c8bc8115fb53c46f346d28f4dc77c322ac65c6bd7f93","impliedFormat":1},{"version":"a82d3576ee20e42b53d8e45ad9465c700ef485be0c31a758d8b7e2291f9ca50d","impliedFormat":1},{"version":"82a9a680c84d4b24233310d61ed3418db7195b652ab20fc1a0b1a47aa57dc310","impliedFormat":1},{"version":"11a88787c4523067759de3933a0b8deb3f38dfefaaa4836b659b167b27275298","impliedFormat":1},{"version":"66fbb9536b031278cfa0ac5ed74d2f125da501231a2ebe22b97cdaff5e0edc39","impliedFormat":1},{"version":"2fdd12cfddf613075398c01f58690f3aacda0e926dd6c5512a6e6ef2cf6371a2","impliedFormat":1},{"version":"df53ec34e7ad7e938aad672dd08d9b75c16123464bbe1f387164a3cc78d1cc51","impliedFormat":1},{"version":"980fb4a720501947e77bf29c717a98f9625e7e56b3e633030595d081b3473514","impliedFormat":1},{"version":"83eb52c27e5844d768a09ae7c9509338635a7256f3b28d483f23a3399327a6a7","impliedFormat":1},{"version":"e938b8a60cac5f4e4a72cd9511be226bc06030d44e0f6accf3d68df18ae13040","impliedFormat":1},{"version":"ab6aa891f03df0f4369739449c0d00933e3d130a6eac0d7cfb9f665f3423ea45","impliedFormat":1},{"version":"efcabb01f314c414fc6b873615dbe0763e69487e90c4b136929cd05c6cfd1de5","impliedFormat":1},{"version":"3bb333fe459668e96758bd59642cb45886eb4d141df089c6785d35c1020433cd","impliedFormat":1},{"version":"be332510bcd8c40389283bea35e93f1f902cb9d7ef180cf2c0e927a05f085369","impliedFormat":1},{"version":"4d1a546b25a9a3ff60b1ac5e55a3878519c2dcc300dc06a04a6708d3d8e640b9","impliedFormat":1},{"version":"80a62b835bfb91609d1ccac81cf94a3276d2ed8aa9024eb99f629e9aa0f27460","impliedFormat":1},{"version":"0f51bf186354244323fc42c722b42da476e364b00b1c9280b112e6d6e61206dd","impliedFormat":1},{"version":"8dc226f7642712a4bf68991506ab095578fdb540c2da229c3abfa67f7fe4c030","impliedFormat":1},{"version":"20a143dcd7b924cafc6ab6b5b70a94a04e318e897fab3bf0a2eb21f67f67aed7","impliedFormat":1},{"version":"bc7ce3ac73c33c1d2556aad84aa06503723181ec77b603bf67c64763104dc0a0","impliedFormat":1},{"version":"aeaf848d829b37c347b27f8471ed733c8dfe9abe6883b7d5841edbdad8b9add3","impliedFormat":1},{"version":"ba31825aae74364e8f59614457e8b0211b8a2733305b4b7b552daf11193e9eea","impliedFormat":1},{"version":"8a70faa2f2ab5e0157778d325da396333b27bcfd68832e70d367e2227566448d","impliedFormat":1},{"version":"76f074eca5b7482f67f20298969025009d76d7cf62aa91d5d28f687d41edb798","impliedFormat":1},{"version":"92bfea5cd879afa636f80efc33dccca12acf823e681718127e137883a3711923","impliedFormat":1},{"version":"fccfe0d3c304089fb73ccac46334c560bc574b99080fa9a1ec25b86c69206dd6","impliedFormat":1},{"version":"557432658d74e6e06cc385c72b99e891a0a25abc2b5e481c5ad9b7b1761af6c1","impliedFormat":1},{"version":"2f776685bc0c99715c9bdd155e2cf14974445294b222d40266e3af77ac302c70","impliedFormat":1},{"version":"3dfd8259322149263de4533a74731edeb31915ceba57f1e3abc08dc920d03fee","impliedFormat":1},{"version":"033290784b31452b5d0301107fe6f14674c10533dacbf4eb303f3a3716511516","impliedFormat":1},{"version":"b9482327413f7ed1e0c3b859b30aa15e75c2db383472c1980e38cd3f1c3d8723","impliedFormat":1},{"version":"27c3e5bf46b485d141b1177dc3922c179336499e777327727008132ec3e50614","impliedFormat":1},{"version":"7c5cc7bddb7a3a1a9fc50e45b224b426a09671634e572c55c8907762dcc8bb9f","impliedFormat":1},{"version":"ff74da868ca7bfa4392d5f967dfa4d30086df765d66fabc4e29ee6a42fb592f7","impliedFormat":1},{"version":"987ee8c3f99cc4b4db7295bf86f0b571c3cf9160d6d9d8568fbb98f984370694","impliedFormat":1},{"version":"b6812be6078c34ac1cfdd89f05e0b7073a80fc5df51084345d29d97fa283ae03","impliedFormat":1},{"version":"3099729149af654a0b989c404da6017c9e682cb7fbc6603159727265b9770a0b","impliedFormat":1},{"version":"8402f665c2edf246e7bc5908bf63b496d61587b7e0f3adc862f75906804da3f7","impliedFormat":1},{"version":"532f231ec610e8af592bda8b9de5d3a90bb0d80a179a49bce4806c55cbb9aa41","impliedFormat":1},{"version":"aa6fd4f032f83a72d32fe711021edeabf3180ba86c3eb2c51675f51285181289","impliedFormat":1},{"version":"9824afe54c65346d6afa7c61036ffb5a3f5fd056e31ae2ec7d751dc5409d52b1","impliedFormat":1},{"version":"0623cf1d9e87f5c1bf34df05cbb0718e9071c6db38b9e07c98c03a47a307b9ed","impliedFormat":1},{"version":"ac7fc82281d17783ea2102e1247af1ad0cbcbe80d659b4bb7a1aff731014347f","impliedFormat":1},{"version":"3772dacfc2a47e670e4d4d2f210138e1f34e581d80d52168bb529f0e1829cc8d","impliedFormat":1},{"version":"386d173a3f776815c70a87b25cdd586bc4148bbc0e6583c36347bc508976d5a0","impliedFormat":1},{"version":"68e24b9acc1b635bc0b24d855bb8d6fb9cd35a7c04cff2669b524079e6919d98","impliedFormat":1},{"version":"3867b686b72a073d098f7c3c49a9548aa465a6e9e7a8126733c7fcd6d4aa1e5d","impliedFormat":1},{"version":"d60b6aea17f89366e00410bdc17bdbd9995d73fc1e802ab0c7a501afb4d5d10b","impliedFormat":1},{"version":"7ff1908c58e1f18c829330cd4adee4696cb90b7ea0b1f56d236dc4714cdc18c2","impliedFormat":1},{"version":"6edf9b42533a18aeeeae10a8814f4cedae8f80223baada16df13961f35864856","impliedFormat":1},{"version":"8592fe0eea7d1f67204f0b48c793be466fdba4a90a2c3ec7b1f181753d1282f0","impliedFormat":1},{"version":"3bdc4928624530a01fdbfc5273081c8e824dc0fbb3ac7327cd47210b0d34aead","impliedFormat":1},{"version":"1d1ac17655cbcb598af4ff409e9e6d70633be20f19f19d35fb514f5877898b68","impliedFormat":1},{"version":"25134baffac2b03586eda34193b974a821e567b1a5bffbc9cde61d0e16074b4f","impliedFormat":1},{"version":"a36f879f34d812bc8c5466490725b8ed9a9f9a315eee41de20a9af9b7c2a4820","impliedFormat":1},{"version":"122cfa505c7ebd278f37dc10283f4c441d150445c92a6c2bf2ba3e9176bb2f91","impliedFormat":1},{"version":"293daeff9d40177480690969b3a7c4b9b0d84b4bdbaa4950d8fffb818e74a142","impliedFormat":1},{"version":"9a4d9b1919523b597a449e256f4cd1e43ba4b60e1646df08c31538e9aedfa422","impliedFormat":1},{"version":"3bd9e9bd6a9364d82decadcf19a7c610dfea790ab07ca2b3611393f9988fb113","impliedFormat":1},{"version":"faf8d7a18645241017bd51837bffc63bd4cea01e029d88de1b2e37a407d279e5","impliedFormat":1},{"version":"b557d45c168a6a585beca8a23c5441bac7708b6a033ab6f8713116cea1118453","impliedFormat":1},{"version":"761c60844bb3c797e811a07a760fa44e61be419a1b37dfb710260cd5bc060815","impliedFormat":1},{"version":"53eb2db64558891b5dfa684e391e1c90ec47301a9f1505cf428f16f6cf7de5cf","impliedFormat":1},{"version":"e26687143e9c282921dd83b6422cf7612552e05322dc5bb50009adc68ad313a2","impliedFormat":1},{"version":"e04e7fd49f365ad6c55baea331c2c8f79552f0fa3fe61926fcc881177bc7cc25","impliedFormat":1},{"version":"7e9b6826c473e4417f6b5351f5ef054bc72ae35d090957ee67e5e2dd3e5ba6f9","impliedFormat":1},{"version":"8594866c1a04bfb01f697395e0ac3c51c0b2979da4a90b83b4b303970de817bc","impliedFormat":1},{"version":"b0ff5545b36bef2527a5444e9ff6ca4de1c74e9dc7e3ffa71b1cae738480526f","impliedFormat":1},{"version":"c81a9c6e15aaff8b5f17a6c91f34983a7b136109994312d9b25f35f3794e9f47","impliedFormat":1},{"version":"3aabf2c0f9e07c846223ac523c03e454a1656a899ecf0641594b714054092e08","impliedFormat":1},{"version":"2f91e8f141abe5e0eecf93fc5af904bbb9951748b8a5ec0554ece635f31aad9b","impliedFormat":1},{"version":"3a497b15bf7f15e70663ad041ea1d9739aa2d6765733ca95ce4f9b77f72918d0","impliedFormat":1},{"version":"b74233955e8b40025dddb55303ac2cb5189f22685b4f30dbf21ce1b1a5656ded","impliedFormat":1},{"version":"dba0925c06074e9ea94c9fce95887dd8bae26262e1522d52b769e59e90a311e5","impliedFormat":1},{"version":"a8fd2cb2353e25cbaad960507a48166f3a58c4d99de16924818fac8081baa184","impliedFormat":1},{"version":"ceb65eb1dff839acdf1f5b385ca290c32e00ccf5ba5d6df98f9075c66a39cbe2","impliedFormat":1},{"version":"3191360f1aff858dbd3e142d637035d1e5d002818aa77813ef351b87f5dd7d32","impliedFormat":1},{"version":"872fe3a7b132f8d3c6bd26bcd3e7a3c8feeed054c874488d7ae3223cbacca63d","impliedFormat":1},{"version":"54d5e3ce769fe2154d98368f2f723c8003f04aab9c2067312fc515d8a20580e5","impliedFormat":1},{"version":"cd92ddd341c2f0fb481ba03b7da90fe6d3672bed2499c44c987aacc7114bf6eb","impliedFormat":1},{"version":"6e9c7511379d87a2740bd82772e6a694afb36b18cf3a5075252b6db61846c18c","impliedFormat":1},{"version":"8e81a83a7033af65dc94636670f2192ed2d2c7c1ddc4dfc7f13a355cf93e6b9d","impliedFormat":1},{"version":"d6f8644f091f2a8fc102fcf9047754344e33b49a5dc6c96f2b155c97de8557b7","impliedFormat":1},{"version":"d6f996a2b19779b0f71152bba8b9b6659a6679b7fae83a0b5be40f7a37c17326","impliedFormat":1},{"version":"d84021ab374f116607c7b50f7c0c02c9b1dcd230b4549945cec01ace108ba004","impliedFormat":1},{"version":"0e0649c37dc6e85592933fe6f5ad004ce1853e8d21bb6ac0e3f4f9c924e6ff2e","impliedFormat":1},{"version":"68d8782bc87568b260473a027c7c6e5417e1498a5f0a38037da23e2552474546","impliedFormat":1},{"version":"5c0c825ab416ee1e9edd6b72b4ce7b13d4d4800cfd7d7de91d10755ffacc417c","impliedFormat":1},{"version":"86abf2873e0ae23aa643ee434fef70c867d54d09173fdead22b48ad024655285","impliedFormat":1},{"version":"bfc0c4e4b7d2b31eb03944fa0043b81940467a7cd94167024b8aba41e6505061","impliedFormat":1},{"version":"01ab036733fd2f44fd8f7b4cd58ca975ffaf4f5fe609e716093f9dc47f3d8994","impliedFormat":1},{"version":"10df4132355139ed4a8c1c9a40b7ffb6fc52c5ae249bad6646b4054e2c94dded","impliedFormat":1},{"version":"de43830afd606481d462bd89eae4037d7fcf455237fcdb4520c523285f4e1256","impliedFormat":1},{"version":"859f909f5246bd0f6999187febaf45a70a905061e17179fffea470d80761a5bb","impliedFormat":1},{"version":"f40c99944dcdf917a453520019184f9dcfa16194fbc43b76d0f77df23f052394","impliedFormat":1},{"version":"c6328bc1a231bd78f02b7b25136402c26010c5f8bf1253b0ba0493826a85d442","impliedFormat":1},{"version":"c380069ab6215b5c03e302aef191435e7ec855fbf70c5d4b0a424ed3197c3868","impliedFormat":1},{"version":"9e51ef8accbe8b1a3c052a95ed561b717afd6b2530de9a66c7379d2f186054ba","impliedFormat":1},{"version":"cfd3e57a42b7df68939122e7902de55f6263f3946a5391afc7fc1d3dd4beda7c","impliedFormat":1},{"version":"d66dbe78ab15123ea4a5dea6eed216ec3f1f85f0d98690f92296e2855aabfcf7","impliedFormat":1},{"version":"a51f894a28c8669c4a1298d59434105c92378f9e18f8a65f3575d07fea8e6587","impliedFormat":1},{"version":"12ea2ca08a93dc325efc0ee80cca41f774839a584662599b4ad32147180e7723","impliedFormat":1},{"version":"1ba59c8bbeed2cb75b239bb12041582fa3e8ef32f8d0bd0ec802e38442d3f317","impliedFormat":1},{"version":"100c0356d3458334391a9f572ac21c1bdde0119f9ef9d7e88f7b48fa76ac3bc1","impliedFormat":1},{"version":"8a90c628f293590574bbeb66092271849d180a7f4812cb05233a2c4cb30e0c04","impliedFormat":1},{"version":"d2ab468a72716e9a385b9c0188ddd17045efb781ce90fd9f00141729cdc867e6","impliedFormat":1},{"version":"c3fbb898f4185e04b223a3c406f71be2ce89b58816b95096e91bd40bf74d2a08","impliedFormat":1},{"version":"7bac41f2fcdc718cb06a0caee8796305de3f435a1c3d5a700305f9cb26ab3041","impliedFormat":1},{"version":"e46abaadffe51343e4b50115f22ec40c55efc952e1a5ad8ea83a379e68fdc41b","impliedFormat":1},{"version":"56a44eae80f744ff0ed0ae54ed2c98873d9efaeb94b23102ce3882cbf3c80c87","impliedFormat":1},{"version":"c1608564db1e63ec542694ce8a173bb84f6b6a797c5baf2fdd05de87d96a087f","impliedFormat":1},{"version":"4205f1615444f90977138e01f4c6becc1ae84e09767b84c5a22185ddea2b8ffe","impliedFormat":1},{"version":"823fcbdb4319180e3f9094bc859d85c393200b9568c66f45ba4d5596ace5641d","impliedFormat":1},{"version":"99c0975f5d575eb40fdf0b43fc3e9e8538aa89f47fdf1c20b06bdea609bafc60","impliedFormat":1},{"version":"99c0975f5d575eb40fdf0b43fc3e9e8538aa89f47fdf1c20b06bdea609bafc60","impliedFormat":1},{"version":"0972ae3e0217c3591053f8db589e40b1bab85f7c126e5cf6cc6f016e757a0d09","impliedFormat":1},{"version":"99c0975f5d575eb40fdf0b43fc3e9e8538aa89f47fdf1c20b06bdea609bafc60","impliedFormat":1},{"version":"165181dcaf69484f3a83fef9637de9d56cfa40ee31d88e1a6c3a802d349d32b2","impliedFormat":1},{"version":"823fcbdb4319180e3f9094bc859d85c393200b9568c66f45ba4d5596ace5641d","impliedFormat":1},{"version":"99c0975f5d575eb40fdf0b43fc3e9e8538aa89f47fdf1c20b06bdea609bafc60","impliedFormat":1},{"version":"8e517fddbe9660901d0c741161c1ee6674967aaa83c0c84916058a2c21a47feb","impliedFormat":1},{"version":"30f2b1e9cecf6e992ee38c89f95d41aebdb14a109164dd47d7e2aa2a97d16ea9","impliedFormat":1},{"version":"99c0975f5d575eb40fdf0b43fc3e9e8538aa89f47fdf1c20b06bdea609bafc60","impliedFormat":1},{"version":"f44bf6387b8c7ab8b6a4f9f82f0c455b33ca7abc499b950d0ef2a6b4af396c2a","impliedFormat":1},{"version":"725d0451e136578def8263b9f5631d45b7c7c54e72a6ce3b524a1fd5bf6a31f5","impliedFormat":1},{"version":"0a7a83acf2bd8ece46aff92a9dedb6c4f9319de598764d96074534927774223a","impliedFormat":1},{"version":"4f9142ccaefd919a8fe0b084b572940c7c87b39f2fd2c69ecb30ca9275666b3d","impliedFormat":1},{"version":"b80840cbfda90fd14082608e38e9b9c5fde7a0263792c544cddc0034f0247726","impliedFormat":1},{"version":"dcd34efd697cf0e0275eb0889bdd54ca2c9032a162a8b01b328358233a8bcd49","impliedFormat":1},{"version":"98ca8492ccc686190021638219e1a172236690a8b706755abb8f9ff7bb97b63e","impliedFormat":1},{"version":"b61f91617641d713f3ab4da7fdda0ecef11906664550c2487b0ffa8bfbdc7106","impliedFormat":1},{"version":"725d0451e136578def8263b9f5631d45b7c7c54e72a6ce3b524a1fd5bf6a31f5","impliedFormat":1},{"version":"725d0451e136578def8263b9f5631d45b7c7c54e72a6ce3b524a1fd5bf6a31f5","impliedFormat":1},{"version":"61cc5aabafaa95e33f20f2c7d3289cf4cab048fc139b62b8b7832c98c18de9ef","impliedFormat":1},{"version":"811273181a8489d26cfa0c1d611178ddbeef85ced1faec1a04f62202697a38a5","impliedFormat":1},{"version":"487d2e38f52af45f6c183407858ea3e0a894fb3723c972140436f40878a27e85","impliedFormat":1},{"version":"15e56c8cb8c5515fe9794c5d223ca5c37a302c62183137a595ba657f5d961527","impliedFormat":1},{"version":"fda3db70b49ad94d08ec58caf0ca052e51d38c51d0461a28669a419c67edb396","impliedFormat":1},{"version":"bb7dd4601aaf41b0313503ffc43142a566a87224cc1720cbbc39ff9e26696d55","impliedFormat":1},{"version":"5ef05c11e0fe4120fb0413b18ca56c78e7fe5843682731fe89c6d35f46d0a4ae","impliedFormat":1},{"version":"02c3a89952ea1b30a3573246649c474cd27b17a26d532abed1e152d5981a6b97","impliedFormat":1},{"version":"d2873a33f67fd7d843ead8cebaeebd51ada53f5fc70d4a61e1874c5d2e3fde4b","impliedFormat":1},{"version":"94c6e873b76d2b5094bd2fddd026db85264bc24faa9cb23db9375f1a770312b5","impliedFormat":1},{"version":"2e8e67d756f97ff13764c81f098b9de13ff91e31028890f3dabe9e8d354f7e47","impliedFormat":1},{"version":"a3476600ff22e7d4845d951dbd0548f8d118f2bfe236aaa6ccd695f041f7a1fc","impliedFormat":1},{"version":"02c3a89952ea1b30a3573246649c474cd27b17a26d532abed1e152d5981a6b97","impliedFormat":1},{"version":"a86a43e07633b88d9b015042b9ea799661fe341834f2b9b6484cfa18a3183c74","impliedFormat":1},{"version":"8994f4c217d03e50957cc4693ae5fd35fd15c60c7d77a31528d90cbeb89311df","impliedFormat":1},{"version":"f5db90ab2b03fc1bc55b4d46df4aa6d4cacdbdd1491bcba0a3cf1a73777204d7","impliedFormat":1},{"version":"9fd04134a11f62f6b1523168945b42a74c35ffe1ea94dfdb08ecddf32218c5c2","impliedFormat":1},{"version":"dbe0161c1a41397e79211136cc6d595b10117aa23ac2f17f7484702ada81bc13","impliedFormat":1},{"version":"b21e6c15895ef16c12925295ebbb39f6731a0c74116f7bfdf5a9085040178bac","impliedFormat":1},{"version":"ea9911c1ac347d631cd840485aef26a8079f0ab64019cc90ae6c97d97dd65034","impliedFormat":1},{"version":"e9ff90fbab735e28c091315b542c620141a76f91bb0d56a14178908905e51b35","impliedFormat":1},{"version":"839ebe64509ec88e2d7e48cc36bed2b0f52e68b02818478a6e18a88b041ed78a","impliedFormat":1},{"version":"6fcdcc891e7f13ad8bd34c4de33d76d96c84f06d9ab6629620c8cf08d0cc6bea","impliedFormat":1},{"version":"16a187924c639631e4aab3d6ea031492dc0a5973bae7e1026b6a34116bd9ff5c","impliedFormat":1},{"version":"cd78f65631ff21afa0d2d72f47bd7783126e48c986ff47df22d1dc31347730e5","impliedFormat":1},{"version":"f5db90ab2b03fc1bc55b4d46df4aa6d4cacdbdd1491bcba0a3cf1a73777204d7","impliedFormat":1},{"version":"ad068305ead33649eb11b390392e091dbf5f77a81a4c538e02b67b18eb2c23b3","impliedFormat":1},{"version":"8994f4c217d03e50957cc4693ae5fd35fd15c60c7d77a31528d90cbeb89311df","impliedFormat":1},{"version":"caa292653f273a1cee0b22df63ce67417dbc84b795867bf3cd69f7386bb0f73c","impliedFormat":1},{"version":"cbe901efe10faaa15e14472d89b3a47892afc862b91f7a3d6e31abeb3546a453","impliedFormat":1},{"version":"717b25e589f53597f65f42e0ccff891cd22743511c79b50d534d2fa548484937","impliedFormat":1},{"version":"79d5d086cfd15de8c973783e166e689aa29100d0906ccfef52928504949cf8c2","impliedFormat":1},{"version":"15ecea8b0870ebf135faa352b43b8385f5a809e321bb171062da7ad257c9fd08","impliedFormat":1},{"version":"df9712034821067a7a2a0cf49c7bb90778dc39907083fa47b20c3e22c4e62da5","impliedFormat":1},{"version":"6b2394ca4ae40e0a6e693ad721e59f5c64c2d64b3a6271b4f20b27fce6d3c9c2","impliedFormat":1},{"version":"27ea6d85f1ba97aa339451165cae6992c8a6a7b17d3c8468e3d8dce1c97d16cd","impliedFormat":1},{"version":"05751acbcbf5d3ff3d565e17589834a70feb5638ae7ee3077de76f6442b9e857","impliedFormat":1},{"version":"54edf55c5a377ee749d8c48ca5132944906c09f68b86d1d7db4acc53eea70d57","impliedFormat":1},{"version":"839ebe64509ec88e2d7e48cc36bed2b0f52e68b02818478a6e18a88b041ed78a","impliedFormat":1},{"version":"839ebe64509ec88e2d7e48cc36bed2b0f52e68b02818478a6e18a88b041ed78a","impliedFormat":1},{"version":"bd0923e7cd1c54c64d7396fbd284983003f0e757bd67f3d6cf3a4e5d394128d7","impliedFormat":1},{"version":"b80840cbfda90fd14082608e38e9b9c5fde7a0263792c544cddc0034f0247726","impliedFormat":1},{"version":"4628d6640af9591f1671e0737b3b7de3abe790ff92686a46d6ca5b2e867162c1","impliedFormat":1},{"version":"50145df9cc9bdb77ac65e4622d11fb896b4730f6f727ffd42337a4fdcd2346da","impliedFormat":1},{"version":"0211a096d47b00b5ba4f6a2557184c649db02cb13a8d63f671428c09818b6df8","impliedFormat":1},{"version":"d32d132c14387d64aa1b776f426a5c3ddcf8211d8764526380dda04f9f4dd776","impliedFormat":1},{"version":"af1c879f74fa27f97cf8ae59ed33421826b7d00647c601cafbbeea129ed5ef5b","impliedFormat":1},{"version":"3b47ab89a1b5a0d3943aace80a68b9af7ae671e359836679ff07536c56ada3fa","impliedFormat":1},{"version":"99c0975f5d575eb40fdf0b43fc3e9e8538aa89f47fdf1c20b06bdea609bafc60","impliedFormat":1},{"version":"ae66752cf1b4d08f0b1870dd7c848e491f078116e6395ee5171323c7ec30e92b","impliedFormat":1},{"version":"14a9ec5df1f55a6b37f36d5d91699092119dba1d81defd12151eb0069a26069d","impliedFormat":1},{"version":"ff49d78bd5a137f76e23cc9629105c1d216c43bf68f545acf3f997e838a47ba3","impliedFormat":1},{"version":"842f200637a0e0f390a6512e3e80c8f47c0193bbdff19b5700b070b6b29f1787","impliedFormat":1},{"version":"26a06ef0d60229641de4f9d0ac8566a471b99a3c124e567405a82e77116bee2a","impliedFormat":1},{"version":"f4f34cdbe509c0ae1a7830757a16c1ccb50093b3303af2c301c0007ec2ddf7e0","impliedFormat":1},{"version":"59ba962250bec0cde8c3823fd49a6a25dea113d19e23e0785b05afde795fad20","impliedFormat":1},{"version":"ea930c3c5a401f876daaec88bfc494d0f257e433eaa5f77208cc59e43d29c373","impliedFormat":1},{"version":"318ba92f9fcec5a9533d511ee430f1536e3e833ffe3ea8665d54fe73e28b1ad4","impliedFormat":1},{"version":"adc45c05969fc43d8b5eaac9d5cb96eccf87a6a1bd94498ddd675ea48f1ba450","impliedFormat":1},{"version":"5691d5365f48ff9de556f5883901586f2c9c428bcf75d6eff79615ae1fb67da6","impliedFormat":1},{"version":"839ebe64509ec88e2d7e48cc36bed2b0f52e68b02818478a6e18a88b041ed78a","impliedFormat":1},{"version":"a67a76d1886745066bd45956fdc5842812786be2a47285d2c59424882cefd6cf","impliedFormat":1},{"version":"66adf84e776d039acb0207f079934f389147264385fc8847b56481253da99fad","impliedFormat":1},{"version":"d2eee6a9d0b2f4123aba65f6e1bc4df3f973f73a7bdeaa9f76c3c0d3f369bef8","impliedFormat":1},{"version":"8f47038a38222bcbc8551a017ae2e32933ca4e6d2a4ec5cfa01179f1facfa975","impliedFormat":1},{"version":"839ebe64509ec88e2d7e48cc36bed2b0f52e68b02818478a6e18a88b041ed78a","impliedFormat":1},{"version":"839ebe64509ec88e2d7e48cc36bed2b0f52e68b02818478a6e18a88b041ed78a","impliedFormat":1},{"version":"839ebe64509ec88e2d7e48cc36bed2b0f52e68b02818478a6e18a88b041ed78a","impliedFormat":1},{"version":"73c82b8dd8ac2916e7cc44856da0dc795ca9952bb63baa220743d31f62b278e5","impliedFormat":1},{"version":"9e302a99187359decbfba11a58c6c1186722b956f90098bb34d8b161bc342a0d","impliedFormat":1},{"version":"839ebe64509ec88e2d7e48cc36bed2b0f52e68b02818478a6e18a88b041ed78a","impliedFormat":1},{"version":"9a06d96357b472809d65ea00b724b4309ba8c9bc1c73eadd3c465e1c336a1e2f","impliedFormat":1},{"version":"ac2b056c5c243b64e85fb8291efd5a1a5481f0bc246b92ea40827ed426ff408c","impliedFormat":1},{"version":"be78757555b38025ba2619c8eb9a3b2be294a2b7331f1f0c88e09bf94db54f3c","impliedFormat":1},{"version":"d68d6551207bf833d92fb7cda4d9428182f8c84eed1743d9a1e7135003e8e188","impliedFormat":1},{"version":"99394e8924c382a628f360a881171304a30e12ac3a26a82aba93c59c53a74a21","impliedFormat":1},{"version":"ed1f01a7eb4058da6d2cde3de9e8463da4351dbab110f50b55e6a7e6261e5e86","impliedFormat":1},{"version":"19ee405d4f1ae4cbacf4361f9a03092a9d69daa3b4ec147c346049d196b5656d","impliedFormat":1},{"version":"6d82ce2eadb900816fb1fa8b62eb4fcf375322bd1fe326b57ef521a0cac3c189","impliedFormat":1},{"version":"19ee405d4f1ae4cbacf4361f9a03092a9d69daa3b4ec147c346049d196b5656d","impliedFormat":1},{"version":"9d344fa3362148f3b55d059f2c03aa2650d5e030b4e8318596ee9bd083b9cf05","impliedFormat":1},{"version":"839ebe64509ec88e2d7e48cc36bed2b0f52e68b02818478a6e18a88b041ed78a","impliedFormat":1},{"version":"839ebe64509ec88e2d7e48cc36bed2b0f52e68b02818478a6e18a88b041ed78a","impliedFormat":1},{"version":"bfea7300ed7996fd03c8325ce6993eed134984b4bb994b0db8560b206c96f1f7","impliedFormat":1},{"version":"839ebe64509ec88e2d7e48cc36bed2b0f52e68b02818478a6e18a88b041ed78a","impliedFormat":1},{"version":"ca87e8ccd63c92b34fc734eee15d8ab2d64f0ffb85d762018bc0df29ca7185b4","impliedFormat":1},{"version":"4628d6640af9591f1671e0737b3b7de3abe790ff92686a46d6ca5b2e867162c1","impliedFormat":1},{"version":"a3913393d42c709b4faea550820241a262a4ba3577f9a00e2f8727eaa92be535","impliedFormat":1},{"version":"5e424456e19df83a4befc6cd24561c2564b7a846b7025a164ce7076ee43828ee","impliedFormat":1},{"version":"887dec57d4c44eaf8f5275c9f5e02721b55c0a34f21f5b6ed08a1414743d8fd9","impliedFormat":1},{"version":"2d53acf155ccbc6b7dca2cfdb01bac84e3571865d925411d2f08ff0445667ea8","impliedFormat":1},{"version":"839ebe64509ec88e2d7e48cc36bed2b0f52e68b02818478a6e18a88b041ed78a","impliedFormat":1},{"version":"a7161c3e94028388a80f7091eb2f7f60d2bdde6a58f76876ab30f66c26f6128e","impliedFormat":1},{"version":"381936e93d01e5697c8835df25019a7279b6383197b37126568b2e1dfa63bc14","impliedFormat":1},{"version":"9944093cbb81cc75243b5c779aebfb81fe859b1e465d50cd5331e35f35ef263a","impliedFormat":1},{"version":"fb19163944642017fcdcbdc61999ab21c108334c8b63377184a2a1095698889a","impliedFormat":1},{"version":"839ebe64509ec88e2d7e48cc36bed2b0f52e68b02818478a6e18a88b041ed78a","impliedFormat":1},{"version":"1bd91f5355283c8fa33ad3b3aace6c4ebb499372943a49f57276f29f55fd62c4","impliedFormat":1},{"version":"6535056b39d5e025505b36ec189302e15af7d197a6afd9a3c853187eb1bea7b5","impliedFormat":1},{"version":"34f97cabd716ba01042042f6523183149c573b8fb15a08a3a9524bf1950216ef","impliedFormat":1},{"version":"01911dee2f91c28782c46d57e2e19e250f7c9db4388f8e9945476379e9392d56","impliedFormat":1},{"version":"95ce7b12742f82bddb85134d8ee20a759c698e5d8beefd559fd6e87112fbf72f","impliedFormat":1},{"version":"0b464435da3dd6473694a2128d49f37c9cf43951455c56f0aa5a940f290c69d2","impliedFormat":1},{"version":"75a5fcf80ec969763cb4a31d2cf8b8531b076d6f1ef8699bd9dacca43d34b571","impliedFormat":1},{"version":"b27117352bfa4f1e6fa6874c3f5518252ae2ff30e345d9e505409a75a232372c","impliedFormat":1},{"version":"d21630c0cd7409e8078cc0aeebf3cf8b915888553d7c9c2d9debd918bfd4bebb","impliedFormat":1},{"version":"7e7a2691f49c7d2623b8a531c9eb4005c22daa57e7789f1982c19fe3c1bf55eb","impliedFormat":1},{"version":"80c54f1d257a28de68ec6c23ca7da374071646182d9a2d2106a91606ebc15f52","impliedFormat":1},{"version":"55ba9e8cb3701eff791fccbe92ef441d19bc267b8aab1f93d4cac0d16fffa26a","impliedFormat":1},{"version":"a40e9367d94ec1db62a406d6e1cb589107ea6ad457af08b544e18d206a6ae893","impliedFormat":1},{"version":"12b260ecee756ba93760308b75a8445f2fe6a1cff3f918cf7e256e3d6d1066cc","impliedFormat":1},{"version":"181de508acbe6fe1b6302b8c4088d15548fb553cb00456081d1e8d0e9d284a24","impliedFormat":1},{"version":"ead149a41e9675c986e6d87c9309e751a8c2d0521839a1902f05ec92b2cba50b","impliedFormat":1},{"version":"d15a8152e6df11bfad2d6813f4517aa8664f6551b0200eca7388e5c143cd200d","impliedFormat":1},{"version":"98884645b61ad1aa2a0b6b208ebaab133f9dd331077a0af4ec395e9492c8d275","impliedFormat":1},{"version":"a6add93dcdbb7c0b119b363ba421fb530d7fd68814be4a8314ec9aee486478f9","impliedFormat":1},{"version":"f660100bff4ca8c12762518ba1c1d62dd72ee1daa7ea42f7eae2f72e993bec6f","impliedFormat":1},{"version":"fd7140ce6b8fc050547d7da8696ed2bcdf4cabc4e65f40f4ac1b080f694711d8","impliedFormat":1},{"version":"8689dabe861fb0bdb3f577bdd9cca3990b14244d1d524c7bdb8d89e229c903a6","impliedFormat":1},{"version":"15d728b5790c39ce9abbd1363e0a5ed03ee6b59a38ee3c4d9d25476641baa7a5","impliedFormat":1},{"version":"95159570a0fc2b007b1a46ed8caf145ad6711030c0c4727cee979a3b770b0634","impliedFormat":1},{"version":"e5446a2b0c44d21a4e2ed885bbdb40a4e39a184f9155f13717993782e313bc7e","impliedFormat":1},{"version":"8683b5b593a5fd2cf99212195ba25106e61a546169068626c8a3745ec6e94bed","impliedFormat":1},{"version":"3f72337d957fd6c87b5c8628c85633d7314b8539cc641ea71a6f93a71f7533c2","impliedFormat":1},{"version":"5d0975641e296dba1ebaf16bb987a2b3abe0a62d18fa1396f57c9d4aaead48e8","impliedFormat":1},{"version":"7b08a55fd84cf8bbee204fa09e8ea402996a648c5af38b52d27231c60d9c8e4d","impliedFormat":1},{"version":"a6add93dcdbb7c0b119b363ba421fb530d7fd68814be4a8314ec9aee486478f9","impliedFormat":1},{"version":"60d3271e8f6a7e952844b716a5f9f71744cb8d6fbeb9adaf35f1735ff7e44aa0","impliedFormat":1},{"version":"632e473a59bfaff109a4405851b56c61aab4a82cedd2a658b37931f98f64ba91","impliedFormat":1},{"version":"178871c23f0cac1cb358aa23f0ba3b1650ec3e962f575e82d33bce7550e55cce","impliedFormat":1},{"version":"94386e32c1da2a3dbff53bfa3aca55ef89397f09bfbb7546890031f246d65716","impliedFormat":1},{"version":"2b96e9789937d863abbb5e33861c941da0d0607fa548f965cdf4e0cf984579ce","impliedFormat":1},{"version":"ea80ad7543efdaeb5ee48a3951f5a32adaa8814fb2a8b9f8296170aa31083455","impliedFormat":1},{"version":"72aad439f7b0cf1c9b28cba809c6b818c72d09f8eeb5978f626d088c2d520f18","impliedFormat":1},{"version":"40d4add4a758635ba84308ecf486090c2f04d4d3524262c13bfb86c8979fac4e","impliedFormat":1},{"version":"72aad439f7b0cf1c9b28cba809c6b818c72d09f8eeb5978f626d088c2d520f18","impliedFormat":1},{"version":"f44c61ac2e275304f62aace3ebc52b844a154c3230f9e5b5206198496128e098","impliedFormat":1},{"version":"924f76dc7507df1c4140262ea2a2d8ef99b8c31e995edefc8271928a3e4807a6","impliedFormat":1},{"version":"3ffc5226ff4a96e2f1a1b12720f0f8c97ac958ac8dd73822bedf6f3ed3c35769","impliedFormat":1},{"version":"924f76dc7507df1c4140262ea2a2d8ef99b8c31e995edefc8271928a3e4807a6","impliedFormat":1},{"version":"9df26a86871f5e0959d47f10bff32add294bf75b8d5a4f77a19dfc41694649d2","impliedFormat":1},{"version":"bfdd4ae390e0cad6e6b23f5c78b8b04daef9b19aa6bb3d4e971f5d245c15eb9a","impliedFormat":1},{"version":"369364a0984af880b8d53e7abb35d61a4b997b15211c701f7ea84a866f97aa67","impliedFormat":1},{"version":"7143d8e984680f794ba7fb0aa815749f2900837fb142436fe9b6090130437230","impliedFormat":1},{"version":"f7b9862117ae65bea787d8baf317dcc7b749c49efeada037c42199f675d56b7b","impliedFormat":1},{"version":"78a29d3f67ea404727199efc678567919ecebbfdc3f7f7951f24e1014b722b46","impliedFormat":1},{"version":"803e5b05c612513cf773d7826c8556eb30ff4a92ba33e9c9dde5ab4cfc342cf9","impliedFormat":1},{"version":"e53b2d245026cefec043621d6648fab344fd04415b47270da9eb4e6796d2a9f4","impliedFormat":1},{"version":"9560571cf48c84114027d57b34d769cd4e9a6cfaac7919bfbdcd6ad0801bc73c","impliedFormat":1},{"version":"f10a10d90bd1e3e12e1d7d027086a716dd6fa03d251597af77210e7a3081ac0b","impliedFormat":1},{"version":"b2bd6911e91dbb008938121d0fd7df51f00148652090bc9ccde4dc704f36f011","impliedFormat":1},{"version":"1bbdf84753428ed6f1533eabb066f9b467fade05180797e39cb32b4be4ba7d5d","impliedFormat":1},{"version":"e52d0f3e5073519a3a0a69fb0090c180f219fa04fc4053bb2bc5453a61296acd","impliedFormat":1},{"version":"24b30db28923568ff5274ec77c4c70c3e18a62e055f207633b95981ba94b0dee","impliedFormat":1},{"version":"e285a018fca2bcd32f25e2e048076b135086b3bd0d6215b1f72716129dce44ad","impliedFormat":1},{"version":"d9901d27accf8b30a3db21c9537e516427f55abd13ca53283c8237711bd37c16","impliedFormat":1},{"version":"46ded89297bd3856f536a6a990d64831ea69976626669e9371fe12e47a263ceb","impliedFormat":1},{"version":"823f27e48b1e7ff551b90d15351912470ab3cd0fa133bc2e1ddc22bea6c07d23","impliedFormat":1},{"version":"189abcb612878978d45a513656690710591b93860bc9cc2d2bf58c5f2ea9b3ae","impliedFormat":1},{"version":"e6251b50929025156877155e58eff37840da58c85d094e3f128b4f07e03aa66d","impliedFormat":1},{"version":"e6251b50929025156877155e58eff37840da58c85d094e3f128b4f07e03aa66d","impliedFormat":1},{"version":"4e5f8c9d9655d5cedd160d50dc0d04f78fafb2c21db87e5b0c87105050445d91","impliedFormat":1},{"version":"a6add93dcdbb7c0b119b363ba421fb530d7fd68814be4a8314ec9aee486478f9","impliedFormat":1},{"version":"657bfa91b3233a36081f7030fa35a16728be10e90b926a9e8ae218e9078a5e75","impliedFormat":1},{"version":"c6b1f54c34ab08126f8594801908410a93a64e0dff66df8a226a9b5460054f19","impliedFormat":1},{"version":"ca969c350e570c5fa395c4fb88ea52dfe50014890c445d2834e4f1fe96e93c2d","impliedFormat":1},{"version":"a6f374e4c41a9aaa10213ba98f7d1e520f4cc314c2f20770145124e2f207f11c","impliedFormat":1},{"version":"5d6ddacf1e9cc6fd92ae992eb6eb00910cfe3fe95f6e29b44f0730c710b2def5","impliedFormat":1},{"version":"5d6ddacf1e9cc6fd92ae992eb6eb00910cfe3fe95f6e29b44f0730c710b2def5","impliedFormat":1},{"version":"803e5b05c612513cf773d7826c8556eb30ff4a92ba33e9c9dde5ab4cfc342cf9","impliedFormat":1},{"version":"1481094055c14f5976d55446330cca137adf0b2a39dcae164f1d6460862e5e5b","impliedFormat":1},{"version":"914912142f2648f12b831ad10bcfacfbc02876161de095c479a1ae308067f646","impliedFormat":1},{"version":"b5f7732acfd56640a680acbd12caff991c839c3dfd5a4b48ad90bd7a730d501d","impliedFormat":1},{"version":"8b801973d33012fc9b97dcb37cfd2d5d30eed228b4d342ae3563972ba1004279","impliedFormat":1},{"version":"09c3bb9dac02114c00586e82c825655ea0c5031097667855544d436063322760","impliedFormat":1},{"version":"14e64ceb540cc27093ba1a04948aec14707da94a6ff1d9675efca976e10fea49","impliedFormat":1},{"version":"da6e2dde5747e6e71bdc00a26978fe29027a9e59afe7c375e2c040a07ef9ff25","impliedFormat":1},{"version":"5d6ddacf1e9cc6fd92ae992eb6eb00910cfe3fe95f6e29b44f0730c710b2def5","impliedFormat":1},{"version":"4e5f8c9d9655d5cedd160d50dc0d04f78fafb2c21db87e5b0c87105050445d91","impliedFormat":1},{"version":"a6add93dcdbb7c0b119b363ba421fb530d7fd68814be4a8314ec9aee486478f9","impliedFormat":1},{"version":"da20ac2b80ec650f4c36df8ebff9493625634329eb0f901a0971dd6619e0978c","impliedFormat":1},{"version":"ef51ac3ae8d6ddc8ee29937a039cbb4a9bfe6ab34267d4c9d998645e73f91237","impliedFormat":1},{"version":"cc45a177fe3864f8a5579ddb987cb5db0ee47c4d39335832635c241b5f98337e","impliedFormat":1},{"version":"3aaf74018283ef4c49f52bcab37f09cd6ec57fff27503090bc4bb75194fd68a8","impliedFormat":1},{"version":"69578d34fa63a8314823b04f6f57a60671755666055a9990b070f5403f21d417","impliedFormat":1},{"version":"c9aa17bf9f1d631f01764ad9087de52f8c7e263313d79ac023f7cd15967b85cb","impliedFormat":1},{"version":"78d05f11e878fe195255ac49d0c2414a1c7fa786b24e8d35c0659d5650d37441","impliedFormat":1},{"version":"b93a1522b0ae997d2b4dc0e058c1d34f029b34370ee110b49654deeef5829a41","impliedFormat":1},{"version":"eec377e6bfd366a64f9641e80ff1e7ab5fa58963364a9d6a76a11365dccd87d3","impliedFormat":1},{"version":"ae2104bdc52ab3722b5c0cfa26aa65b077e09d7288695f9e0ee9ffde08721b3d","impliedFormat":1},{"version":"a4038d37487d8535f99ba99adc4a01b08f038515dd939e57bd80a3743c0e5662","impliedFormat":1},{"version":"9560571cf48c84114027d57b34d769cd4e9a6cfaac7919bfbdcd6ad0801bc73c","impliedFormat":1},{"version":"483095dc7d04bc24cc55e72a807fa8d786a52981068c6f484947f63956b0fa92","impliedFormat":1},{"version":"4539884fadd3b91977560c64de4e5a2f894a656a9288882e1307ba11c47db82e","impliedFormat":1},{"version":"430016e60c428c9c8bfa340826ff7ed5988e522348838700f3c529dc48376c10","impliedFormat":1},{"version":"549f38b7fc2753d95809f16c29e8f86cf6f9d99cb17d8eb53f0132bc92192a2b","impliedFormat":1},{"version":"2e1b0586468b145f432257bfc0dc8d40a82b04ebd00c5f92efdde426d14d122b","impliedFormat":1},{"version":"976d79fce50c222b3aa23d34e4165e1c8424060c3744a4a5b5834bbc644e64a6","impliedFormat":1},{"version":"d61d7221ed4b74db0568ffae7765f6c2a48afc64a076dd627e98dfecd1ad9897","impliedFormat":1},{"version":"89ac12f3bd077e0d31abc0142b41a3dbbdb7ae510c6976f0a957a1f3ca8c46c9","impliedFormat":1},{"version":"694d279f9a6012c39bba6411e08b27706e0d31ea6049c69ff59d39a50de331cc","impliedFormat":1},{"version":"e27f95d214610d9d7831fdeccba54fbe463ae7e89bd1783d828668072c2d2c92","impliedFormat":1},{"version":"ed48328b38a82b98abf873153e939c9baed42cbd5d5289830dd832c552db5024","impliedFormat":1},{"version":"6ca43ca6b5f1794be3eee4993c66f15083c3b47ee45615163ee49f450e4b464a","impliedFormat":1},{"version":"8d8381e00cd14cf97b708210657e10683f7d53a4eddcfc3f022be2c9bdf591dd","impliedFormat":1},{"version":"a37d882a1490198571664d4d06e584d226f8c62445b25696f3f9efff776b2a0b","impliedFormat":1},{"version":"a37d882a1490198571664d4d06e584d226f8c62445b25696f3f9efff776b2a0b","impliedFormat":1},{"version":"a37d882a1490198571664d4d06e584d226f8c62445b25696f3f9efff776b2a0b","impliedFormat":1},{"version":"ec85bf4283c2ec8108b0b6161f155aeedfc770f42dca27bb6fca2cfb0abf1a8a","impliedFormat":1},{"version":"ec2ba248e2ad73cfd1989cb7f53ff1df5612f63b628e03a472308c1bab10c0f9","impliedFormat":1},{"version":"ea763067ac7adab4741f87de9fec3fc154ac1f3578b7e3bc0c64b42c6f6c912e","impliedFormat":1},{"version":"a6add93dcdbb7c0b119b363ba421fb530d7fd68814be4a8314ec9aee486478f9","impliedFormat":1},{"version":"d54fa16b15959ed42cd81ad92a09109fadbb94f748823e2f6b4ad2fbbee6e01f","impliedFormat":1},{"version":"a336b950cd64c3c3dd2503384bf2915a5ea03d694672bfedabd71fafdae34ebe","impliedFormat":1},{"version":"2e2ffb8593c9db471bac9f97c0b1f1c7ef524946a462936e5e68858ac3e71566","impliedFormat":1},{"version":"d4c081ae5c343c754ac0dd7212f6308d07f55ab398cee4586ee0a76480517ae5","impliedFormat":1},{"version":"eec377e6bfd366a64f9641e80ff1e7ab5fa58963364a9d6a76a11365dccd87d3","impliedFormat":1},{"version":"a4f2c605bbc73124b1bb76faa66be28937ccfb7f5b77c45cd8022071bd53696c","impliedFormat":1},{"version":"be4c58de8fd3ddd0e84076c26416ce5ffcf193a1238704692e495bc32e0a6ec5","impliedFormat":1},{"version":"af9491fcc19d5157b074871bdceafc18dd61972020fb8778c7d3cd789cd8186a","impliedFormat":1},{"version":"64da3dee7d98bdc4b99b24de094a08ffb2dda8aa14270cd51fc936dc8af1cdb2","impliedFormat":1},{"version":"a4038d37487d8535f99ba99adc4a01b08f038515dd939e57bd80a3743c0e5662","impliedFormat":1},{"version":"9560571cf48c84114027d57b34d769cd4e9a6cfaac7919bfbdcd6ad0801bc73c","impliedFormat":1},{"version":"152532087c2a91adb4527e96ccd7b3640f1b08c92301fa2f41ed6a53130bda67","impliedFormat":1},{"version":"549f38b7fc2753d95809f16c29e8f86cf6f9d99cb17d8eb53f0132bc92192a2b","impliedFormat":1},{"version":"549f38b7fc2753d95809f16c29e8f86cf6f9d99cb17d8eb53f0132bc92192a2b","impliedFormat":1},{"version":"6e39d03aa07f268eed05dd88e1bd493cb10429c1d2809e1aaa61fbcd33978196","impliedFormat":1},{"version":"aa7384441d37522532179359964184e5c8cf649db32a419542e7b5605208b45c","impliedFormat":1},{"version":"da31c5275a923bb601a84bd648fd24cc9009860fd5901351f32e686e69bfd432","impliedFormat":1},{"version":"36d27819ece3bf0eefe61ecda9e3aa2e86b5949c89dba79f17dd78a2c4587a61","impliedFormat":1},{"version":"da31c5275a923bb601a84bd648fd24cc9009860fd5901351f32e686e69bfd432","impliedFormat":1},{"version":"18a20ae79049147b460771dfd6b63b3b477772d763c26b367efa499c98e9fb5f","impliedFormat":1},{"version":"4c91908ebcc1b1c91f5c9cd7e9ffff83fc443e6926013b0b0082a6c2778b729e","impliedFormat":1},{"version":"ee51a4032beba0b38ff75838b386627a38c53008b8ca350bb42f192d0fb3cf58","impliedFormat":1},{"version":"b14b8756b166914ab1cb68c44bb579566833449d5e9d68655726f6ffc6d5e457","impliedFormat":1},{"version":"a09ae8631b5e442bbcdb93e3b60d6f71a54d192452af841616e2b49c5a03fb26","impliedFormat":1},{"version":"7a254103740333c7fb870f95ab9a26fb028cb298478f43e4750b8eddefafa11f","impliedFormat":1},{"version":"d54b449b0eff66bc26e09593df44512725b9e9fce4d86ea436bed9e7af721ff1","impliedFormat":1},{"version":"91991180db9a4d848bd9813c38a56d819a41376a039a53f0e7461cc3d1a83532","impliedFormat":1},{"version":"4e5f8c9d9655d5cedd160d50dc0d04f78fafb2c21db87e5b0c87105050445d91","impliedFormat":1},{"version":"637ffc16aeaadb1e822bffc463fcc2ca39691dea13f40829c1750747974c43d4","impliedFormat":1},{"version":"7955f3e66404ff9a4ac41f40b09457fe1c0e135bde49e4d77c3ea838956041bf","impliedFormat":1},{"version":"f6d23ab8669e32c22f28bdbdf0c673ba783df651cafcbdcc2ead0ff37ba9b2b5","impliedFormat":1},{"version":"c90ef12b8d68de871f4f0044336237f1393e93059d70e685a72846e6f0ebbbff","impliedFormat":1},{"version":"ecefe0dd407a894413d721b9bc8a68c01462382c4a6c075b9d4ca15d99613341","impliedFormat":1},{"version":"9ec3ba749a7d20528af88160c4f988ad061d826a6dd6d2f196e39628e488ccd8","impliedFormat":1},{"version":"71ce93d8e614b04d49be0251fb1d5102bb248777f64c08078ace07449700e207","impliedFormat":1},{"version":"9560571cf48c84114027d57b34d769cd4e9a6cfaac7919bfbdcd6ad0801bc73c","impliedFormat":1},{"version":"4818c918c84e9d304e6e23fdd9bea0e580f5f447f3c93d82a100184b018e50f5","impliedFormat":1},{"version":"6e39d03aa07f268eed05dd88e1bd493cb10429c1d2809e1aaa61fbcd33978196","impliedFormat":1},{"version":"eab3b41a54d5bc0e17a61b7b09639dc0d8640440e3b43715a3621d7fa721ae85","impliedFormat":1},{"version":"eec377e6bfd366a64f9641e80ff1e7ab5fa58963364a9d6a76a11365dccd87d3","impliedFormat":1},{"version":"da31c5275a923bb601a84bd648fd24cc9009860fd5901351f32e686e69bfd432","impliedFormat":1},{"version":"36d27819ece3bf0eefe61ecda9e3aa2e86b5949c89dba79f17dd78a2c4587a61","impliedFormat":1},{"version":"a336b950cd64c3c3dd2503384bf2915a5ea03d694672bfedabd71fafdae34ebe","impliedFormat":1},{"version":"eec377e6bfd366a64f9641e80ff1e7ab5fa58963364a9d6a76a11365dccd87d3","impliedFormat":1},{"version":"ce8eb80dad72ac672d0021c9a3e8ab202b4d8bccb08fa19ca06a6852efedd711","impliedFormat":1},{"version":"a336b950cd64c3c3dd2503384bf2915a5ea03d694672bfedabd71fafdae34ebe","impliedFormat":1},{"version":"d12e9c3d5e2686b5c82f274fb06227748fc71b3a6f58f7b3a6f88f4b8f6921fb","impliedFormat":1},{"version":"5f9a490be2c894ac65814a1a9e465b99882490ed3bce88c895362dc848f74a8d","impliedFormat":1},{"version":"2d5935948312241d3195b5e24df67775c6736dec1e1373efb1b6f04447106867","impliedFormat":1},{"version":"686ccf874ccbf999a155208a7ec8358a718d211f779980c2fe7cca176025d769","impliedFormat":1},{"version":"48bf56f3c8b3d0b27f94587996400c129773ab9c4810354d89850b0bee92b3d7","impliedFormat":1},{"version":"e6e9bdd2f65408a0b52d8e8ca9ddb7827c5f3496561788c974e4f2fb485427eb","impliedFormat":1},{"version":"193772121770797ee600739d86de128cd7244e3e3e101684473eb49590dbfce1","impliedFormat":1},{"version":"7a6208fa971deb77dbd7c59d56f7eb5b2516d76a3372a55917b75fc931c44483","impliedFormat":1},{"version":"b9aa4ed5dc603ad443dac26b9c27b0680b1cf4614f321b8d3663e26c1b7ef552","impliedFormat":1},{"version":"8613d707dc7f47e2d344236136010f32440bebfdf8d750baccfb9fad895769ee","impliedFormat":1},{"version":"59ebb6007bce20a540e273422e64b83c2d6cddfd263837ddcbadbbb07aa28fcc","impliedFormat":1},{"version":"23d8df00c021a96d2a612475396e9b7995e0b43cd408e519a5fb7e09374b9359","impliedFormat":1},{"version":"9a3c859c8d0789fd17d7c2a9cd0b4d32d2554ce8bb14490a3c43aba879d17ffb","impliedFormat":1},{"version":"431dc894a90414a26143bbf4ca49e75b15be5ee2faa8ba6fcc9815e0ce38dd51","impliedFormat":1},{"version":"5d5af5ceb55b5ec182463fe0ffb28c5c0c757417cbed081f4afd258c53a816c5","impliedFormat":1},{"version":"f43eee09ead80ae4dcfc55ba395fe3988d8eb490770080d0c8f1c55b1bd1ef67","impliedFormat":1},{"version":"eec377e6bfd366a64f9641e80ff1e7ab5fa58963364a9d6a76a11365dccd87d3","impliedFormat":1},{"version":"4c9784ca0ab39916b498c54db858ea27c929777f161a2450f8712a27cec1b017","impliedFormat":1},{"version":"9c92db9255eab1e3d218bdeca593b99355bbf41fa2a73a9c508ad232a76cda96","impliedFormat":1},{"version":"bf2cc5b962f3823a8af297abe2e849227dbfb3a39a7f7301c2be1c0a2ecb8d32","impliedFormat":1},{"version":"eaed6473e830677fd1b883d81c51110fcb5e8c87a3da7a0f326e9d01bf1812ff","impliedFormat":1},{"version":"3ac0952821b7a43a494a093b77190a3945c12f6b34b19f2392f20c644ac8d234","impliedFormat":1},{"version":"ed5877de964660653409f2561c5d0a1440777b2ef49df2d145332c31d56b4144","impliedFormat":1},{"version":"c05da4dd89702a3cc3247b839824bdf00a3b6d4f76577fcb85911f14c17deae5","impliedFormat":1},{"version":"f91967f4b1ff12d26ad02b1589535ebe8f0d53ec318c57c34029ee68470ad4a3","impliedFormat":1},{"version":"f6ac182bf5439ec39b1d9e32a73d23e10a03fe7ec48c8c9ace781b464ecc57c3","impliedFormat":1},{"version":"eec377e6bfd366a64f9641e80ff1e7ab5fa58963364a9d6a76a11365dccd87d3","impliedFormat":1},{"version":"687b26db97685fcadeb8e575b6bc252ea621fef8217acd2bb788ce781a4b05b3","impliedFormat":1},{"version":"e4a88ca598bf561ec253c0701eea34a9487766c69a8d8e1b80cf67e60dcc10d7","impliedFormat":1},{"version":"281cf6513fcf7b7d88f2d69e433ebbd9248d1e1f7571715dd54ca15676be482e","impliedFormat":1},{"version":"dc9f827f956827ec240cec3573e7215dc08ed812c907363c6653a874b0f5cabb","impliedFormat":1},{"version":"baa40541bd9b31a6f6b311d662252e46bad8927d1233d67e105b291d62ace6e6","impliedFormat":1},{"version":"d3fa2e4b6160be0ab7f1bc4501bf0c969faa59c6b0f765dc8ca1000ca8172b18","impliedFormat":1},{"version":"cf24c5c94e5e14349df49a69fb963bee9cd2df39f29ddd1d4d153d7a22dfb23f","impliedFormat":1},{"version":"18a20ae79049147b460771dfd6b63b3b477772d763c26b367efa499c98e9fb5f","impliedFormat":1},{"version":"c5ad2bd5f2243c6fade8a71a752b4333b0ba85ae3ea97d5323f7d938b743cb26","impliedFormat":1},{"version":"cf1e804f283ae1ca710f90dba66404c397b7b39682dbdfa436a6b8cc0b52b0ab","impliedFormat":1},{"version":"25fd641b32d4f7d6811cec4b00c0c9a74cb8822ec216f3b74bae205a32b1de08","impliedFormat":1},{"version":"658f07f1b7c327ecc8b18ed95ada19a90f9fc3f0282d536ca9d6cd2d597631f4","impliedFormat":1},{"version":"35c8e20c61bffc19a0391f42db2fe8f7bb77caa414bd2145a8891826bfdb9667","impliedFormat":1},{"version":"658f07f1b7c327ecc8b18ed95ada19a90f9fc3f0282d536ca9d6cd2d597631f4","impliedFormat":1},{"version":"b3279a079db8ea0c8b76f7f3098f4b10266c3bb24fa21e5838fe6008e3d40043","impliedFormat":1},{"version":"803e5b05c612513cf773d7826c8556eb30ff4a92ba33e9c9dde5ab4cfc342cf9","impliedFormat":1},{"version":"8aec152ae554311c39f87fc5ec3c1f4c5d5d44e1145704782a4fdd6b16c2f1d7","impliedFormat":1},{"version":"9b4a1b563bc6d3d02a4a9d3e72bf699d486a6b117fdcf29199d49d3650abe122","impliedFormat":1},{"version":"803e87c5c27720886ff9f591a47e3281b02bf737f6c67964d72a4d8e7b905a21","impliedFormat":1},{"version":"ce762eb7d3137473f6b50c2cd5e5f44be81334550d9eb624dadb553342e9c6ed","impliedFormat":1},{"version":"3a4d63e0d514e2b34487f84356984bd4720a2f496e0b77231825a14086fb05c1","impliedFormat":1},{"version":"22856706f994dec08d66fcbf303a763f351bc07394fb9e1375f0f36847f6d7a5","impliedFormat":1},{"version":"1f2b07381e5e78133e999e7711b84a5d65b1ab50413f99a17ffccfc95b3f5847","impliedFormat":1},{"version":"39aa109cb3f83642b99d9f47bf18824f74eaaa04f2664395b0875a03d4fc429a","impliedFormat":1},{"version":"15ca7cf99d213ac6a059a5f81ff17dd2c0d4e31260821719ef7e78ea6163f518","impliedFormat":1},{"version":"ee130bd48bc1fb67a0be58ab5708906f8dc836a431b0e3f48732a82ad546792e","impliedFormat":1},{"version":"9d32f274f0b2388e27a83b6b88b33616a4b73b4d045c00d814e942c07a5c9a57","impliedFormat":1},{"version":"06a6defbd61ec1f028c44c647c7b8a5424d652b3330ff4f6e28925507e8fde35","impliedFormat":1},{"version":"9d32f274f0b2388e27a83b6b88b33616a4b73b4d045c00d814e942c07a5c9a57","impliedFormat":1},{"version":"15ca7cf99d213ac6a059a5f81ff17dd2c0d4e31260821719ef7e78ea6163f518","impliedFormat":1},{"version":"9df4d5273810ea069628b1efd0ea6ca9932af9694bfbc8dcea17c8253f1790c2","impliedFormat":1},{"version":"9b3ca716ad96d961aa8f2bab5fbd6752637af2da898f54c8d4021ef8ab2607d2","impliedFormat":1},{"version":"60d53d724e5854f545fd4753881466043628eb886159a73568878f18b3020afe","impliedFormat":1},{"version":"c53d0b758384bd45cd3a051a5227805b57eae8f2142e906d65ae97c8868fd45f","impliedFormat":1},{"version":"a844bbf1cb0bb844743b2d78eee9bdc78df80a98989deab32ff8cd3228b41289","impliedFormat":1},{"version":"b641f9357511425b12ad981f9ba66d964fc114b78a5761ead8595599f036a22f","impliedFormat":1},{"version":"3537c3f024e3bed94fedcce3444fca3c1bce744942912a5a4857f7050ab25429","impliedFormat":1},{"version":"96a5c70389556c62902487f56bb34259ef57439a4cba6c9bdbbbb55225b32e63","impliedFormat":1},{"version":"54895ba2b529f7c369600228dbb88c842c311d1fb7de4ccbc43123b357c26a90","impliedFormat":1},{"version":"9d0050ae8481d6e0731ed80b55f6b475ae3a1cffbc61140e92816a0933dba206","impliedFormat":1},{"version":"68867d1d1560d31165f817de3fceb4b2bedbd41e39acdf7ae9af171cdc056c47","impliedFormat":1},{"version":"1c193e68e159296fded0267475b7172231c94e66b3d2f6f4eb42ffde67111cc5","impliedFormat":1},{"version":"f025c51bcc3c7dacbedb4b9a398815f4d5c6f4c645db40880cee4ac6f89588de","impliedFormat":1},{"version":"b94704c662a31e0d061abb006d38f6211ade97422f0ae45d751ef33d46ce3042","impliedFormat":1},{"version":"c3e2f2b328bd55ae9a401673bd33f86d25a7d53a4f5e1fad216f5071c86c0b79","impliedFormat":1},{"version":"5f6e56ac166b7a5bde756afd2e573af1e38fdd5f10ddb72e46bc44f3c0a42369","impliedFormat":1},{"version":"9b65fd7edfcf3c4c6538d735d269647edc14856dc062e9dde80412c45ff2cf29","impliedFormat":1},{"version":"fbb26af430ebc8743161f6026a0722a4cee3df8c08bdc2610a1d037f733fa823","impliedFormat":1},{"version":"65de396834768bf2b3548447b84b774310f83f33d00f9fb951c1b338dd9b5395","impliedFormat":1},{"version":"58c97efc183a6465be046e3c59ff1164b9930c25f080f5462d4b103760757d97","impliedFormat":1},{"version":"75b022f6a48640ca4e048da35132eef2cb9445680c7e1080021ccc15f4d2bf59","impliedFormat":1},{"version":"ea7c9f9c4b1cd2573d49dd628d446fa7611052e00ea1a3aa385a83a7b07c7fbb","impliedFormat":1},{"version":"a74eec58a6011f6ba3d6bbe4eacea0935f7fce9ad34f8c8bd8ed8872ae68f826","impliedFormat":1},{"version":"6bd326162475f1661612f9bb68aa7833e548c7a726940f042e354086cd9b7c2d","impliedFormat":1},{"version":"4b3d55b3d962f8773ea297be1b7f04093a5e5f0ea71cb8b28cef89d3d66f39b0","impliedFormat":1},{"version":"39d7517763d726ce19f25aacf1ccb48ec4f1339978c529abdf88c863418b9316","impliedFormat":1},{"version":"4ce8ae09e963394e7ffe3a5189007f00a54e2b18295585bb0dae31c7d55c1b3f","impliedFormat":1},{"version":"b29b65017a631dff06b789071cdf7a69f67be35238b79f05e5f33523e178feaf","impliedFormat":1},{"version":"58cb40faa82010f10f754e9839e009766e4914586bdb7a4cceff83765fa5e46c","impliedFormat":1},{"version":"efa190d15d9b3f8a75496c9f7c95905fca255a7ce554f4f0b91ba917b61c3b7e","impliedFormat":1},{"version":"303fd31bbed55c8cdf2d3d9851668f4e67746f0a79861a3b4d947a6c1c9e35c5","impliedFormat":1},{"version":"0fe6e8d738df018108bd3ca0e208dfa771d4e34641242b45423eca7d7ade80a7","impliedFormat":1},{"version":"8210e3bdbeeb9f747efdf7dad7c0ed6db9d13cd0acd9a31aa9db59ddbbac5a15","impliedFormat":1},{"version":"d6791734d0fce30014c94846a05cb43560bce15cfdc42827a4d42c0c5dafa416","impliedFormat":1},{"version":"e2898fa86354ef00ff2c0967a79b4f809477ec4471528aa96e192251b9f81d0c","impliedFormat":1},{"version":"58c97efc183a6465be046e3c59ff1164b9930c25f080f5462d4b103760757d97","impliedFormat":1},{"version":"58c97efc183a6465be046e3c59ff1164b9930c25f080f5462d4b103760757d97","impliedFormat":1},{"version":"8c4f5b888d7d2fc1283b7ce16164817499c58180177989d4b2bd0c3ebd0197f7","impliedFormat":1},{"version":"58c97efc183a6465be046e3c59ff1164b9930c25f080f5462d4b103760757d97","impliedFormat":1},{"version":"ea7c9f9c4b1cd2573d49dd628d446fa7611052e00ea1a3aa385a83a7b07c7fbb","impliedFormat":1},{"version":"3108920603f7f0bbf0cebce04bcaf90595131c9170adb84dc797e3948f7b6d06","impliedFormat":1},{"version":"8aded022b77ae3c07af72765bca9421f2d990814e0f4bfca0aa97395aa4c9010","impliedFormat":1},{"version":"f817987f543a452afa3035a00aa92800dbd7ff3246fcbe4cecb29bc18552b081","impliedFormat":1},{"version":"6ab1e8b5d0a0f4123b82158ea498222a5eacbffa1354abe8770030ba722c13b7","impliedFormat":1},{"version":"3cda89b540ed1ea9a3d1e302a489a4157a98b62b71c7abb34f8f15c13da9717a","impliedFormat":1},{"version":"a1ebece06e1ac47fb3a1b07997e57aa2e6a8f5ece26ea3c4a4fcb591e05d1e05","impliedFormat":1},{"version":"8aded022b77ae3c07af72765bca9421f2d990814e0f4bfca0aa97395aa4c9010","impliedFormat":1},{"version":"fb3b5ff3f5fe7767c07b755f2c22ce73ba46d98e6bc4a4603fde8888eed14e19","impliedFormat":1},{"version":"41c53632da296cf700f8553a48522e993949ea8499ceac4a483d1813beed3017","impliedFormat":1},{"version":"03b97deb8a168b27af94dca96eba747e19faf077445102d52c618210829cb85f","impliedFormat":1},{"version":"6a3589af6b9ec75cd87d9516ccfb9b06ab6be6f938790aeb4b1cd4dbaef92c45","impliedFormat":1},{"version":"722a667fe3b290be746d3ea6db20965ec669614e1f6f2558da3d922f4559d9c4","impliedFormat":1},{"version":"0f1c68ddd4573b2e135748377c3705a96d6a6c123910b00d0c7e8dc2edcd7f6b","impliedFormat":1},{"version":"a63781a8662205b9b6d2c7c5f3bad1747a28e2327804477463ebb15e506508e1","impliedFormat":1},{"version":"0f1c68ddd4573b2e135748377c3705a96d6a6c123910b00d0c7e8dc2edcd7f6b","impliedFormat":1},{"version":"80d8f42128925d6f1c82268a3f0119f64fd522eec706c5925b389325fb5256de","impliedFormat":1},{"version":"b4c189c9be8cf4a7cce177fc49678e29d170e67279195207f36a4f4d184d60f2","impliedFormat":1},{"version":"d16a18dfc505a7174b98f598d1b02b0bf518c8a9c0f5131d2bd62cfcaaa50051","impliedFormat":1},{"version":"b4c189c9be8cf4a7cce177fc49678e29d170e67279195207f36a4f4d184d60f2","impliedFormat":1},{"version":"d3ceb0f254de2c13ffe0059a9a01ab295ccf80941c5429600ffdbaaec57410a7","impliedFormat":1},{"version":"8e172ba46195a56e4252721b0b2b780bf8dc9e06759d15bc6c9ad4b5bb23401d","impliedFormat":1},{"version":"41c53632da296cf700f8553a48522e993949ea8499ceac4a483d1813beed3017","impliedFormat":1},{"version":"0fe5f22bc0361f3e8eacf2af64b00d11cfa4ed0eacbf2f4a67e5805afd2599bc","impliedFormat":1},{"version":"e2898fa86354ef00ff2c0967a79b4f809477ec4471528aa96e192251b9f81d0c","impliedFormat":1},{"version":"226dc98afab126f5b99f016ec709f74c3bcc5c0275958613033e527a621ad062","impliedFormat":1},{"version":"ec7197e94ffb2c4506d476df56c2e33ff52d4455373ecb95e472bb4cedb87a65","impliedFormat":1},{"version":"343865d96df4ab228ff8c1cc83869b54d55fa764155bea7db784c976704e93ec","impliedFormat":1},{"version":"f3f8a9b59a169e0456a69f5c188fb57982af2d79ec052bf3115c43600f5b09e4","impliedFormat":1},{"version":"e2898fa86354ef00ff2c0967a79b4f809477ec4471528aa96e192251b9f81d0c","impliedFormat":1},{"version":"15ddffc9b89470a955c0db3a04aec1f844d3f67e430b244236171877bdb40e50","impliedFormat":1},{"version":"7ca1ed0b7bd39d6912d810562413fb0dad45300d189521c3ca9641a5912119a5","impliedFormat":1},{"version":"30af3be0483da0faf989c428587c526597b80c1e368d85281a3fbc95e360987e","impliedFormat":1},{"version":"74766ac445b27ae31cc47f8338fd0d316a103dd4d9eb766d54b468cb9aacbf0e","impliedFormat":1},{"version":"65873070c21b3ce2ccdf220fe9790d8a053035a25c189f686454353d00d660f9","impliedFormat":1},{"version":"d767c3cc8b1e117a3416dda1d088c35b046b82a8a7df524a177814b315bde2e3","impliedFormat":1},{"version":"bf834cd64464f9217cb642a48c2f5f5f1cd509e13088adac6773715fb8536212","impliedFormat":1},{"version":"40258ea27675f7891614c8bd2b3e4ee69416731718f35ec28c0b1a68f6d86cd6","impliedFormat":1},{"version":"bf834cd64464f9217cb642a48c2f5f5f1cd509e13088adac6773715fb8536212","impliedFormat":1},{"version":"c61aa5b694977909ef7e4a3fdad86b3c8cd413c8d8e05b74a2def595165ba7ce","impliedFormat":1},{"version":"bfef3048352341739d810997dcd32f78527c3c426fac1bbb2b8c14293e1fa505","impliedFormat":1},{"version":"1dd31462ed165900a141c2e159157be0e8701ce2a2ed0977636f1d021894887d","impliedFormat":1},{"version":"872321f2e59009fad1f2efde489b20508a3631e16a86860740044e9c83d4b149","impliedFormat":1},{"version":"fa381c11f336210a8c10d442c270c35165dcf6e76492618ee468dba325a3fc98","impliedFormat":1},{"version":"857857dbb4d949686de80a138aeab8e669d23397100dc1e645190ff8be5787de","impliedFormat":1},{"version":"d6a9fe9c13a14a8d930bb90f3461dc50945fa7152e1a20a1f5d740d32f50b313","impliedFormat":1},{"version":"4162a1f26148c75d9c007dd106bd81f1da7975256f99c64f5e1d860601307dad","impliedFormat":1},{"version":"63f1d9ad68e55d988c46dab1cbc2564957fcbd01f6385958a6b6f327a67d5ff4","impliedFormat":1},{"version":"8df3b96fbafb9324e46b2731bb267e274e516951fbf6c26165a894cae6fd0142","impliedFormat":1},{"version":"822e61c3598579070f6da4275624f34db9eb4af4c27a2f152a467b4a54f4302f","impliedFormat":1},{"version":"a8f83bf864a5dea43d30c9035d74069b1820f0c49824960764cf21d6bfbb8e66","impliedFormat":1},{"version":"f9449f2b807f14c9ff9db943e322385875cca5faa26775f64a137e4d1a21b158","impliedFormat":1},{"version":"8855c7125e06a2001f726b4f2f9905e916d122377f7d938936fb49606ccb55c5","impliedFormat":1},{"version":"8855c7125e06a2001f726b4f2f9905e916d122377f7d938936fb49606ccb55c5","impliedFormat":1},{"version":"d24f0b133a979dc915411e1c76d2dada47e3624b42d5838e9d6b9eef1f067cc7","impliedFormat":1},{"version":"755611714dbab5b9b351b51e7875195f83bb26169ae6b31486dcb1e6654ed14c","impliedFormat":1},{"version":"a82213450f0f56aab5e498eaae787cf0071c5296ea4847e523cf7754a6239c99","impliedFormat":1},{"version":"f2882c5afda246fa0c63489d1c1dff62bf4ddf66c065b4285935d03edaec3e71","impliedFormat":1},{"version":"d38c1b0fd8bc7e301fd467a2afd6d32b2457813c48c16afabc06d2ca5b6bda41","impliedFormat":1},{"version":"d38c1b0fd8bc7e301fd467a2afd6d32b2457813c48c16afabc06d2ca5b6bda41","impliedFormat":1},{"version":"4ed8f12983c82690e8fecd9b24f143d4a7c86d3156be7b2bff73e0761f820c8c","impliedFormat":1},{"version":"1d920699becb8e60a0cbbc916d8559a3579b204dd21655dd242c98fd8ae986ea","impliedFormat":1},{"version":"c278288183ec3690f63e50eb8b550ef0aa5a7f526337df62474f47efea57382b","impliedFormat":1},{"version":"3c0486004f75de2873a34714069f34d6af431b9b335fa7d003be61743ecb1d0a","impliedFormat":1},{"version":"99300e785760d84c7e16773ee29ac660ed92b73120545120c31b72166099a0e4","impliedFormat":1},{"version":"8056212dad7fd2da940c54aeb7dfbf51f1eb3f0d4fe1e7e057daa16f73c3e840","impliedFormat":1},{"version":"e58efb03ad4182311950d2ee203807913e2ee298b50e5e595729c181f4c07ce3","impliedFormat":1},{"version":"67b16e7fa0ef44b102cc4c10718a97687dabfa1a4c0ba5afe861d6d307400e00","impliedFormat":1},{"version":"30af3be0483da0faf989c428587c526597b80c1e368d85281a3fbc95e360987e","impliedFormat":1},{"version":"f29c608ba395980d345144c0052c6513615c0ab0528b67d74cacbfac2639f1d4","impliedFormat":1},{"version":"e094afe0a81b08444016e3532fbf8fae9f406cdb9da8dbe8199ba936e859ced7","impliedFormat":1},{"version":"e4bcab0b250b3beb978b4a09539a9dfe866626a78b6df03f21ae6be485bc06e2","impliedFormat":1},{"version":"a89246c1a4c0966359bbbf1892f4437ff9159b781482630c011bb2f29c69638f","impliedFormat":1},{"version":"0a87a56e75de872e21997cec18ecda36abb5cac0d18690659b588e271099b589","impliedFormat":1},{"version":"0a87a56e75de872e21997cec18ecda36abb5cac0d18690659b588e271099b589","impliedFormat":1},{"version":"0a87a56e75de872e21997cec18ecda36abb5cac0d18690659b588e271099b589","impliedFormat":1},{"version":"98ca77869347d75cd0bb3d657b6dcd082798ef2419f1ab629ccf8c900f82d371","impliedFormat":1},{"version":"73acfe8f7f57f1976d448d9569b345f907a6cf1027a08028fe5b8bb905ef8718","impliedFormat":1},{"version":"ed8a781d8b568d8a425869029379d8abc967c7f74d6fe78c53600d6a5da73413","impliedFormat":1},{"version":"90ead73acfd0f21314e8cbef2b99658d88cc82124cfc20f565d0bdda35e3310a","impliedFormat":1},{"version":"8ecfec0e00878d6d26a496cf5afc715b72c3da465494081851da85269b0aef8e","impliedFormat":1},{"version":"4c78fccd1c5cd8eebde42cc078e7332f3d9b4eb1a542d9a5ec66899dfd71b93e","impliedFormat":1},{"version":"4c78fccd1c5cd8eebde42cc078e7332f3d9b4eb1a542d9a5ec66899dfd71b93e","impliedFormat":1},{"version":"e54b165a2a5a5fbcf4bcd09176e4388b514ca70a20635841937f1cc36e37fbef","impliedFormat":1},{"version":"6eb0dcefcf4cc9088174209028db705572e7fb7e38f3f93275bf6778afa2cd19","impliedFormat":1},{"version":"fa572fa0d1b1b1a7d356d5942b1d57f342880a68d1bf1ab5d00490221c471c18","impliedFormat":1},{"version":"17694dd0223346fa0a17e87e9ce00335569166368357b9963571aa623c5e3c27","impliedFormat":1},{"version":"207d46e6e557df62460be9021502fc3af96c927cef0cc5add32cb6f2d60b2e23","impliedFormat":1},{"version":"cf0cf6556adc9178a6251d9b12837e5d514b805cebe8de6d7a16e1e4248ec1ef","impliedFormat":1},{"version":"3d3d28a294ca0d5caea84d58eec474891dd1df7015f8fb2ee4dabf96d938333c","impliedFormat":1},{"version":"0b5b95f3b76e6cc9b716e08274d0f7486bee9d99e42dd6a99c55e4cb4ff5569e","impliedFormat":1},{"version":"94fb6c136acee366e3a4893df5ddbecadde49738de3c4d61a2923c6ada93e917","impliedFormat":1},{"version":"95669998e1e807d41471cebed41ede155911da4b63511345571f5b7e13cbef9c","impliedFormat":1},{"version":"48cca9861e6f91bde2435e5336b18bdc9ed3e83a6e7ea4cf6561e7f2fee4bad6","impliedFormat":1},{"version":"b6b8be8a70f487d6a2fd80b17c4b524b632f25c6c19e76e45a19ad1130209d64","impliedFormat":1},{"version":"76d7fadbb4ff94093be6dd97ea81a0b330a3a41fc840c84a2a127b32311200e6","impliedFormat":1},{"version":"856a8b0060b0e835bccba7909190776f14d8871b8170b186d507d3e12688086d","impliedFormat":1},{"version":"e39aaeef0aea93bdda6f00d27ca9ebda885f233ecc52b40e32db459916f24183","impliedFormat":1},{"version":"14f3c0b1b5e6adac892607ecefc1d053c50bc8a5f14d05f24e89e87073d2f7e3","impliedFormat":1},{"version":"f877dcc12cc620dede9c200625692cf614b06aadc026f6b59e5967cd2e30cbc4","impliedFormat":1},{"version":"5a37547f8a18bc0738e670b5043819321ae96aee8b6552266f26d8ce8f921d17","impliedFormat":1},{"version":"4d3e13a9f94ac21806a8e10983abcf8f5b8c2d62a02e7621c88815a3a77b55ae","impliedFormat":1},{"version":"938cb78a2ad0894a22e7d7ebd98cdc1719ee180235c4390283b279ea8616e2a9","impliedFormat":1},{"version":"84ba4c2edb231b1568dae0820f82aca1256a04599d398ec526615c8a066f69ec","impliedFormat":1},{"version":"cd80a8f16c92fe9f03899f19c93783dce3775ef4c8cdf927ac6313354765a4f2","impliedFormat":1},{"version":"25df98970954ccd743fe5e68c99b47d0e02720e2bf6584a6de60e805395b6bf7","impliedFormat":1},{"version":"251983cb99df8c624ca1abd6335ca5d44d0dd7cdcab3ef9c765b4acc79fae8fb","impliedFormat":1},{"version":"7c4965812974ebd1333cb09f95c4a3669e19008dfbb1e931321e08ae1f7cff09","impliedFormat":1},{"version":"31d3f4757bece74c888df52c8bdc4373e3f58deb518000051cadb5e85deb54de","impliedFormat":1},{"version":"a2be4cad298b3b474a0a71c1dd78a8bfc70b322f44704cf4329aecb873687a3a","impliedFormat":1},{"version":"ca8b04bea4ba551b47ddea18e385e76e555a9f7ff823dcae668d05e255fdc241","impliedFormat":1},{"version":"de0d160ecc8e643727bb93018015ae89510d59b7bdad4550f4318fba0a0ce2e6","impliedFormat":1},{"version":"acf3fff2afb5ceb54bd5ddb697b1d337338e3c23b93385f100a2046cfa700184","impliedFormat":1},{"version":"a2be4cad298b3b474a0a71c1dd78a8bfc70b322f44704cf4329aecb873687a3a","impliedFormat":1},{"version":"15c7f60f69f663374a7bc57afe164e70e3b6310bd1ee476ba911646b09c7852b","impliedFormat":1},{"version":"d71becf074ceaa0e91558fe51ed8640fa83a0fbf45a31e8069716edbf38de99a","impliedFormat":1},{"version":"ef681b070e9f3b9b28f1886bbe67faa12237c8d4691604a1f1cba614a10ef2e1","impliedFormat":1},{"version":"b15f5e077245fef1ecf45327fd94aa67fc4da288bfd42bf1b8a80f297afd561e","impliedFormat":1},{"version":"b7091d79a6e7be7bb10ca9477b6c71db4cf7b44f155912266ecfba92c1a126c1","impliedFormat":1},{"version":"e585a113e0abcaf3022f5cf1318e17f299f0935d7b389a23dcad9074c3922946","impliedFormat":1},{"version":"ae545310dfa53a7b33f574e621b14f423373dea930218d2ad290b4da0c5e8e50","impliedFormat":1},{"version":"ae545310dfa53a7b33f574e621b14f423373dea930218d2ad290b4da0c5e8e50","impliedFormat":1},{"version":"4428e4d440e1914859e8aee558f90b4829c6a45b717078490dfc2d297dcef46c","impliedFormat":1},{"version":"ad205fc7116808509e19ee71277d8da74157751d7388f0134d91c009b987f69f","impliedFormat":1},{"version":"4428e4d440e1914859e8aee558f90b4829c6a45b717078490dfc2d297dcef46c","impliedFormat":1},{"version":"8900bf61f4ce9517567cc6c9e41638a5bd0c4a0e9cc094190bc07644bbeedf24","impliedFormat":1},{"version":"cf5414a97c345c8f3294e0513a7613f5a263e1b56b3a61b810ba8279716fd38c","impliedFormat":1},{"version":"7778bc213be81351a01867789728c7780467c84e3ec94cfcef53a4e2dccf1b57","impliedFormat":1},{"version":"41a934d2efbb6cb08b205a76206fb015ebda692db4d78382ec5bec9689d6f4ac","impliedFormat":1},{"version":"916f418ab5b86c0b271b02123b90f1acfd27a448c2d158489be0590cceaa5a50","impliedFormat":1},{"version":"59d2d5aaa5b66629a6db420aa56277529fac6c1ebf428556f494e4effbfbff7c","signature":"3eb7193b4b3f2451b427a24f7a6bbfae3889524d13f905521d5991c2b0ba5536","impliedFormat":1},{"version":"b3101e269543b53d7359ab000edae717554ac35881913ff890e125df91f48d83","impliedFormat":1},{"version":"6a05833d2d21f8200d8085a676f5739cce99dc5279592709435ca99f01d59f3b","impliedFormat":1},{"version":"2fa9f60a45e0b7dadaeee0ba80b4333809275c498d49984955d35a9180547aa4","impliedFormat":1},{"version":"ded9eefedc8c3154f737fe096668dafa8e32ed7ddaed3e88d3ded3bd24c59ca7","impliedFormat":1},{"version":"0414fad4b25d51ef95f9759a8565eb59bd6399d4d5e39d2172866c936d5b4ed8","impliedFormat":1},{"version":"c05b3f603c7dd86660a43899822921f901bcd62c5fdcd2f7b5305b9a7f912c51","impliedFormat":1},{"version":"60c32c376879916fb52e0bfde19a82ffd761ea7d66024721a989862b9018304a","impliedFormat":1},{"version":"fabf8e6c99552d3381e8cfe5ade928a1463af385967f036339d8c4dfa1d38752","impliedFormat":1},{"version":"897fde3ea0a80a6af5dfa558c2c7a834031632594d74f0096167266b1f4767fa","impliedFormat":1},{"version":"08818d4fd607f4244b90b5720840a74c62166e2587785401d203102015575b9c","impliedFormat":1},{"version":"e12ad3c7e488922ae3fccc5a7ed5b1bb60231cbd8807c2464ece69411e0967cc","impliedFormat":1},{"version":"db68ef1372a3a92e70771eadbc5526983ce5c229f4d4a73ea773a1aed7ef7190","impliedFormat":1},{"version":"e520c4ae2af1d19ae3cd4d1d9e3e33ad84a4942c5250db522c8c66cb1cdb77f8","impliedFormat":1},{"version":"b5c6a12d7d129a93aa8f463dc988bff3e25a18cd0982993897b3aa3e6c426ff0","impliedFormat":1},{"version":"5f9926a62e7e572d71061a61738cb31d2eff6801b9d39fd7c6fe25064520ad50","impliedFormat":1},{"version":"f03f74fb56dc0d157f1fe0291544f21c78173f3cbc30d76fdf5da96313cffc4f","impliedFormat":1},{"version":"2450dea4e92a09b385ab8defb7633ee889edb77c983c2a859f593866e651518d","impliedFormat":1},{"version":"eeaaa1beb0f23cf8219c33ee0c946dd02d1c02339ca7ee25968bd3696e542c7d","impliedFormat":1},{"version":"22e3e8e4b1c9573af15206568e117f2cfe05ab71c8106156d8a0377bdf6a72f2","impliedFormat":1},{"version":"a072b0712443216b6465c5386a52c3e1fbc727b09097e89f5fb00efa60b5cbc2","impliedFormat":1},{"version":"cd21ad08f58d1aa37d03ec3ab3e1e106f36919936917f7b30807dacfebec32a5","impliedFormat":1},{"version":"b649f3763b4e1eb076afc97c5a803473dca61bea070c2ace4c706c88c1765851","impliedFormat":1},{"version":"358b37e3f6aa1093f4081903fa17c256880bfc70a4319bd92e64451fb9eae300","impliedFormat":1},{"version":"e650c878f4bb888b7c6fef26549cb8299b9db3a3b1ef8e9d09a5200392c5561d","impliedFormat":1},{"version":"09231b2cad09763a867e433bb3e24cc31de17fe1765feee8facfd9f71f504e6c","impliedFormat":1},{"version":"7ad258a085ed8216038633c3c48091700147cd6d70fdf359d9c0635f2536495b","impliedFormat":1},{"version":"e53113fc8293b7386e3e9153c3f439e3af67163d3f9d2a8f4dca59ca3f61acbe","impliedFormat":1},{"version":"1561ed2bae8c7d5b45e84b16d560bab332c6f46c08fa7c5d1139b30b34186da6","impliedFormat":1},{"version":"9dc82dc8cb11d282285d5f760c9980ad6caae31fb373058e881a1f32a1bd023d","impliedFormat":1},{"version":"b266e9eefba5bccb94c4f39834ffb5cc920913b1657f5a69cb6f81534c8f8b00","impliedFormat":1},{"version":"7a2839eb654924aa1a26189390b0c92155c8a67331216e676674457ab4f18bd3","impliedFormat":1},{"version":"51858cf75bd4be8891737456f4ac99d1097de66b04159b02dce3239967596934","impliedFormat":1},{"version":"30eb6213e324d4e456aa4fdefbbe2f7e2e8948dd00c8dfa219f59990e37b7ff7","impliedFormat":1},{"version":"af6c2662ba676e481c02e0447d32c325269c1637b4505d8e5cf6606348240f9d","impliedFormat":1},{"version":"75f94dd62ee42a92bf9c8834f759f6843e03f028b7837a7e06e261dfd03f3a9d","impliedFormat":1},{"version":"469b71b0dcce3c824d4b5e798da0720695255c63945c3a0add673b92c7da1e01","impliedFormat":1},{"version":"cc3af08add12c1437a90cea4405dbe184c1837f6040dea7d29e6aa32ab0562e7","impliedFormat":1},{"version":"d51f6ec1296bef8a2e850aaf50a5060cb7f9b69eb47d7bb073fc2c994a262140","impliedFormat":1},{"version":"885fc0e8712ec6a395048812258762639c66a00f939c48c9b011c52b9150973d","impliedFormat":1},{"version":"f09cfaffc598c4f4076842d81be8b6125ba7813c9b39940265db30276b912294","signature":"49ce8fb1a9e500d269915cdb4c5f3038a6d88f6e49592c43adf9931547ea62ea","impliedFormat":1},{"version":"29d40381e7ec2946d98dee55c50473dc4408aeb8ff4c92a45720c028bb64e3f9","impliedFormat":1},{"version":"44e45e8a3f2659e1144ba0eb92ceefef274766f77ef6abbf4de2d0502f9c7316","impliedFormat":1},{"version":"5ed7678b7db469793dc0218205e1762d91513dab3487eaffa0e7aba652453b45","impliedFormat":1},{"version":"b4980f0b1a4458a73b25a001afb26c8612625419d12a595be6f01f12e195b157","impliedFormat":1},{"version":"48daaf9475dfef1b3b49b47bac12ae313a0370cec805c314800ebe780a298dba","signature":"27831d6d1739f4d90234f57b8730f5733515177170a0ba4338ea18e8683ab4e4","impliedFormat":1},{"version":"ad73043db4026cd70cd5ede49e2ee2a42c8b43c2e7987425cda8d6bd9cc487db","signature":"9aa4fdc54f3f474ac41909c921c0f3f1f29e6c28bc62613d9ff6ab9fdebaa7ca","impliedFormat":1},{"version":"2f70db32ce6635af62c91b875f8ef7cc516570dfb2f6963d42947e24289f1a9e","signature":"8e1362551efae0f8e693fff3c00b3fdfc2ad8662590803cfdf153a38db09045c","impliedFormat":1},{"version":"88e918c882e625a97300bde94b27dd9cd2fb923d22737c58b998524228399105","impliedFormat":1},{"version":"6772d6fc4c6ec8ea4fc94afa1269cd0dc34d5fae3cba659245195a314175ef7f","impliedFormat":1},{"version":"aed6e49afbe174365a08701565f45237af3ab4aba84f5e610f45ec80a177626c","impliedFormat":1},{"version":"df01ee2c7247ddf9982f89266115c82f061811fb1d593bbb6bb22b7b459739af","impliedFormat":1},{"version":"973c4f424ef636dfe74ffd1210c3255b01f04839412b276e56b9e9be25ba71f0","impliedFormat":1},{"version":"47c83d8f96c59af8c874db3611cf0c4fb64e648a0329afdf74265373fe3ea4b7","impliedFormat":1},{"version":"d72049f19cd24f1017c4409c844f508a0a97044906b952721155f878d02947ef","impliedFormat":1},{"version":"c5a3d49e411c08020bb712cbd8d818de9ed25209dacd2ce947b942776334a47a","impliedFormat":1},{"version":"20c6bdf81b08b461f95323e3aed339a877f9aa7b6475699d06063f909457972b","impliedFormat":1},{"version":"9063bd95bf4fe06fe71b4f1abd4dce7d41b684d9036ff4afae6e079eb252b19e","impliedFormat":1},{"version":"bb0c5cb27578678fe7a8479404efd988ceab67ff93238baf16cef721610658f7","impliedFormat":1},{"version":"69cedc9a0b038abafcb4678030574d409b3438e7e095ab889aef2689b0c9bf50","impliedFormat":1},{"version":"185e36f4d19e13d3d7847d1b988a89d9c1970ef84a9c140794a1b4d0c03994bb","impliedFormat":1},{"version":"b40885a4e39fb67eb251fb009bf990f3571ccf7279dccad26c2261b4e5c8ebcd","impliedFormat":1},{"version":"2d0e63718a9ab15554cca1ef458a269ff938aea2ad379990a018a49e27aadf40","impliedFormat":1},{"version":"530e5c7e4f74267b7800f1702cf0c576282296a960acbdb2960389b2b1d0875b","impliedFormat":1},{"version":"1c483cc60a58a0d4c9a068bdaa8d95933263e6017fbea33c9f99790cf870f0a8","impliedFormat":1},{"version":"07863eea4f350458f803714350e43947f7f73d1d67a9ddf747017065d36b073a","impliedFormat":1},{"version":"396c2c14fa408707235d761a965bd84ce3d4fc3117c3b9f1404d6987d98a30d6","impliedFormat":1},{"version":"9ae7df67c30dc5f52b7b21e8bb36fd9ff05e7ed10e514e2d9ed879b4547c4cd3","impliedFormat":1},{"version":"5d3e656baf210f702e4006949a640730d6aef8d6afc3de264877e0ff76335f39","impliedFormat":1},{"version":"a42db31dacd0fa00d7b13608396ca4c9a5494ae794ad142e9fb4aa6597e5ca54","impliedFormat":1},{"version":"4d2b263907b8c03c5b2df90e6c1f166e9da85bd87bf439683f150afc91fce7e7","impliedFormat":1},{"version":"c70e38e0f30b7c0542af9aa7e0324a23dd2b0c1a64e078296653d1d3b36fa248","impliedFormat":1},{"version":"b7521b70b7fbcf0c3d83d6b48404b78b29a1baead19eb6650219e80fd8dcb6e1","impliedFormat":1},{"version":"b7b881ced4ed4dee13d6e0ccdb2296f66663ba6b1419767271090b3ff3478bb9","impliedFormat":1},{"version":"b70bd59e0e52447f0c0afe7935145ef53de813368f9dd02832fa01bb872c1846","impliedFormat":1},{"version":"63c36aa73242aa745fae813c40585111ead225394b0a0ba985c2683baa6b0ef9","impliedFormat":1},{"version":"3e7ffc7dd797e5d44d387d0892bc288480493e73dcab9832812907d1389e4a98","impliedFormat":1},{"version":"db011ec9589fd51995cbd0765673838e38e6485a6559163cc53dcf508b480909","impliedFormat":1},{"version":"e1a4253f0cca15c14516f52a2ad36c3520b140b5dfb3b3880a368cd75d45d6d9","impliedFormat":1},{"version":"159af954f2633a12fdee68605009e7e5b150dbeb6d70c46672fd41059c154d53","impliedFormat":1},{"version":"a1b36a1f91a54daf2e89e12b834fa41fb7338bc044d1f08a80817efc93c99ee5","impliedFormat":1},{"version":"8bb4a5b632dd5a868f3271750895cb61b0e20cff82032d87e89288faee8dd6e2","impliedFormat":1},{"version":"55ac6eb880722b04fed6b1ad0bae86f57856c7985575ba76a31013515e009316","impliedFormat":1},{"version":"017de6fdabea79015d493bf71e56cbbff092525253c1d76003b3d58280cd82a0","impliedFormat":1},{"version":"ab9ea2596cb7800bd79d1526930c785606ec4f439c275adbca5adc1ddf87747d","impliedFormat":1},{"version":"6b7fcccc9beebd2efadc51e969bf390629edce4d0a7504ee5f71c7655c0127b7","impliedFormat":1},{"version":"6745b52ab638aaf33756400375208300271d69a4db9d811007016e60a084830f","impliedFormat":1},{"version":"90ee466f5028251945ee737787ee5e920ee447122792ad3c68243f15efa08414","impliedFormat":1},{"version":"02ea681702194cfc62558d647243dbd209f19ee1775fb56f704fe30e2db58e08","impliedFormat":1},{"version":"1d567a058fe33c75604d2f973f5f10010131ab2b46cf5dddd2f7f5ee64928f07","impliedFormat":1},{"version":"5af5ebe8c9b84f667cd047cfcf1942d53e3b369dbd63fbea2a189bbf381146c6","impliedFormat":1},{"version":"a64e1daa4fc263dff88023c9e78bf725d7aba7def44a89a341c74c647afe80cc","impliedFormat":1},{"version":"f444cfd9eb5bcbc86fba3d7ca76d517e7d494458b4f04486090c6ccd40978ce7","impliedFormat":1},{"version":"5099990c9e11635f284bde098176e2e27e5afc562d98f9e4258b57b2930c5ea6","impliedFormat":1},{"version":"cf7dc8abfb13444c1756bbac06b2dd9f03b5bc90c0ebc1118796dae1981c12e6","impliedFormat":1},{"version":"3cc594d4e993618dc6a84d210b96ac1bd589a5a4b772fd2309e963132cb73cca","impliedFormat":1},{"version":"f189f28612dfeac956380eccea5be2f44dcac3d9a06cf55d41d23b7e99959387","impliedFormat":1},{"version":"b3f82681e61a3e1f4592c1554361a858087cd04ee3112ce73186fc79deeeabde","impliedFormat":1},{"version":"e647d13de80e1b6b4e1d94363ea6f5f8f77dfb95d562748b488a7248af25aabf","impliedFormat":1},{"version":"1567dbd347b2917ba5a386f713e45c346a15b0e1e408d4a83f496d6a3481768b","impliedFormat":1},{"version":"219a25474e58a8161b242776856ec5f6960839b63e74809445e51cadbfc18096","impliedFormat":1},{"version":"2f77672836c646d02dd1fb6c8d24e9cd8c63131c5e9c37e72f30856b1d740e62","impliedFormat":1},{"version":"6309a45fc3c03d3c4d56228e995d51974f53009a842374695b34f3607877e5a3","impliedFormat":1},{"version":"bef94eba81ae2c09059c0d9abdb1ae1b7090314f70550f3c8cd5d7ead4a4f212","impliedFormat":1},{"version":"48b787ad458be9b524fa5fdfef34f68798074132d4b8cfe6a6fe9c2bf334c532","impliedFormat":1},{"version":"37280465f8f9b2ea21d490979952b18b7f4d1f0d8fab2d627618fb2cfa1828e3","impliedFormat":1},{"version":"cefa33b76df8d9af73edcf02d9b03effbeec54b8200e97669ad454d770aee9ba","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f3f85dc43cb93c5a797f1ff0fa948d0e17843a443ae11a20cc032ccdf1b9997","impliedFormat":1},{"version":"581843e855d92557cbe9dfe242de4e53badae5e9096ca593b50788f7c89c37f2","impliedFormat":1},{"version":"869010bc679df668137cb3b78a3cb8196e97acf285208a57f6156ceac894a2f7","impliedFormat":1},{"version":"bcae62618c23047e36d373f0feac5b13f09689e4cd08e788af13271dbe73a139","impliedFormat":1},{"version":"2c49c6d7da43f6d21e2ca035721c31b642ebf12a1e5e64cbf25f9e2d54723c36","impliedFormat":1},{"version":"5ae003688265a1547bbcb344bf0e26cb994149ac2c032756718e9039302dfac8","impliedFormat":1},{"version":"02cf4ede9c240d5bf0d9ef2cb9454db2efe7db36692c7fe7ad53d92a08c26b8f","impliedFormat":1},{"version":"a86053981218db1594bd4839bde0fb998e342ecf04967622495434a8f52a4041","impliedFormat":1},{"version":"5c317403752871838140f70879b09509e37422e92e7364b4363c7b179310ee44","impliedFormat":1},{"version":"7b270dc53f35dd0b44bfa619ad4d351fffd512e14053c3688323ed007eda3f6d","impliedFormat":1},{"version":"3bfde94a5dab40b51ff3511a41cfb706d57f9584a15e938d243a0e36861e86fe","impliedFormat":1},{"version":"e86ad029224d4f2af3e188be8b5e9badf8c7083247572069bac7bd2193131fc7","impliedFormat":1},{"version":"057cac07c7bc5abdcfba44325fcea4906dff7919a3d7d82d4ec40f8b4c90cf2f","impliedFormat":1},{"version":"d94034601782f828aa556791279c86c37f09f7034a2ab873eefe136f77a6046b","impliedFormat":1},{"version":"105ae3dd61531488194f412386ba8c2b786f1389ac3415098cc47c712800da29","impliedFormat":1},{"version":"e3acb4eb63b7fc659d7c2ac476140f7c85842a516b98d0e8698ba81650a1abd4","impliedFormat":1},{"version":"4ee905052d0879e667444234d1462540107789cb1c80bd26e328574e4f3e4724","impliedFormat":1},{"version":"80e71af1e94ba805e791b9e8e03ff18dec32e8f483db3dca958441d284047d59","impliedFormat":1},{"version":"445fe49dc52d5d654a97d142b143fa2fb1dc16a86906545619b521b1561df501","impliedFormat":1},{"version":"c0c0b22cefd1896b92d805556fcabda18720d24981b8cb74e08ffea1f73f96c2","impliedFormat":1},{"version":"ceec94a0cd2b3a121166b6bfe968a069f33974b48d9c3b45f6158e342396e6b2","impliedFormat":1},{"version":"49e35a90f8bd2aa4533286d7013d9c9ff4f1d9f2547188752c4a88c040e42885","impliedFormat":1},{"version":"09043c4926b04870c1fdfdea3f5fcf40a1c9912304a757326e505bebe04a6d5c","impliedFormat":1},{"version":"cc5dfb7ddc9ab17cf793506f342fffdcb2b6d1d7a9c0e7c8339772fee42b7f91","impliedFormat":1},{"version":"88c34f554b5926f4988d9ff26f84c4f18a4d010f261dac2ed52055eefb9e3c65","impliedFormat":1},{"version":"a7aec47aa991ef5080126c3e2732a8488c13fd846099f89b0d24dc35c0f790d3","impliedFormat":1},{"version":"35085777eb17b745911d00a75be17096fe28a8766081cbd644ef15b4ba756aa2","impliedFormat":1},{"version":"cb498c53a9d35ac1cf9a3515f3835d48b4626a612cf7540c5bfb99542c9ab1a5","impliedFormat":1},{"version":"0ace3010fe4a0e820155e3ccb0172375a01162e528ffc22eec2fa33d697bff24","impliedFormat":1},{"version":"a1b64f86e1279835a2edc6125121dff74b04ef116d0230c20995b013ba37150e","impliedFormat":1},{"version":"39121347a4fa76cf47e67e1259fb0136325528a22bd54b1af6dbec353edf4b01","impliedFormat":1},{"version":"f3c3f17825c6a78681186da04c2f3a0f1c60cfa95f3d4b82bbbd6ebd57214a6a","impliedFormat":1},{"version":"eb45a1782ef50423c1ffac4d2a89c60004f4e2d25ed8e7dcb9e24e6cf984ccdb","impliedFormat":1},{"version":"07c333db8a26594bf2b80cf7b0ef0a83c42c28cb31cc727040f20061558df819","impliedFormat":1},{"version":"e5151e18c3e8d5d2f83ac60a4f4117f9bee54f643b64335858ceaa818e35d364","impliedFormat":1},{"version":"b52b0da52d2fee96d855936e9f3de93ea57e893677e776a46fc6eca96373d3be","impliedFormat":1},{"version":"03b7428a52323f9d455380f00da4f4b0798acb4f5f1c77525b48cb97ad9bc83c","impliedFormat":1},{"version":"6c3cf6de27512969bf59a541bd8e845ba1233e101e14c844e87d81e921fffa53","impliedFormat":1},{"version":"19207ec935fb6b0c022cdfd038ceffef1c948510394f249bde982170d4e57067","impliedFormat":1},{"version":"5276cc934ad4e253f53cf2331268451a66ebf711a027e71f4535af8642055bf8","impliedFormat":1},{"version":"185c55e63eec9da8263b4b1cf447d2ebe2fd7b892e5a0a5571e7e97b3c767bbb","impliedFormat":1},{"version":"f842cd4c63a3b077cf04f7d37ca163ab716f70f60ca5c5eed5c16b09a4c50c3a","impliedFormat":1},{"version":"00abe3d3cd26fcaf76ffeb6fde4ff7d6c8ad8154ac6c5ba41e05b4572fcd152b","impliedFormat":1},{"version":"49b3c93485a6c4cbc837b1959b07725541da298ef24d0e9e261f634a3fd34935","impliedFormat":1},{"version":"abf39cc833e3f8dfa67b4c8b906ac8d8305cf1050caed6c68b69b4b88f3f6321","impliedFormat":1},{"version":"dbbe2af77238c9c899b5369eca17bc950e4b010fa00bc2d340b21fa1714b8d54","impliedFormat":1},{"version":"c73d2f60d717b051a01b24cb97736e717d76863e7891eca4951e9f7f3bf6a0e6","impliedFormat":1},{"version":"2b79620ef917502a3035062a2fd0e247d21a22fef2b2677a2398b1546c93fb64","impliedFormat":1},{"version":"a54f60678f44415d01a810ca27244e04b4dde3d9b6d9492874262f1a95e56c7d","impliedFormat":1},{"version":"84058607d19ac1fdef225a04832d7480478808c094cbaedbceda150fa87c7e25","impliedFormat":1},{"version":"415d60633cf542e700dc0d6d5d320b31052efbdc519fcd8b6b30a1f992ef6d5c","impliedFormat":1},{"version":"901c640dced9243875645e850705362cb0a9a7f2eea1a82bb95ed53d162f38dd","impliedFormat":1},{"version":"ebb0d92294fe20f62a07925ce590a93012d6323a6c77ddce92b7743fa1e9dd20","impliedFormat":1},{"version":"b499f398b4405b9f073b99ad853e47a6394ae6e1b7397c5d2f19c23a4081f213","impliedFormat":1},{"version":"ef2cbb05dee40c0167de4e459b9da523844707ab4b3b32e40090c649ad5616e9","impliedFormat":1},{"version":"068a22b89ecc0bed7182e79724a3d4d3d05daacfe3b6e6d3fd2fa3d063d94f44","impliedFormat":1},{"version":"3f2009badf85a479d3659a735e40607d9f00f23606a0626ae28db3da90b8bf52","impliedFormat":1},{"version":"2c70425bd71c6c25c9765bc997b1cc7472bdc3cb4db281acda4b7001aec6f86f","impliedFormat":1},{"version":"8ed892f4b45c587ed34be88d4fc24cb9c72d1ed8675e4b710f7291fcba35d22a","impliedFormat":1},{"version":"d32b5a3d39b581f0330bd05a5ef577173bd1d51166a7fff43b633f0cc8020071","impliedFormat":1},{"version":"3f6af667357384c1f582ef006906ba36668dd87abe832f4497fffb315c160be9","impliedFormat":1},{"version":"363dd28f6a218239fbd45bbcc37202ad6a9a40b533b3e208e030137fa8037b03","impliedFormat":1},{"version":"c6986e90cf95cf639f7f55d8ca49c7aaf0d561d47e6d70ab6879e40f73518c8d","impliedFormat":1},{"version":"bb9918dbd22a2aa56203ed38b7e48d171262b09ce690ff39bae8123711b8e84a","impliedFormat":1},{"version":"1518707348d7bd6154e30d49487ba92d47b6bd9a32d320cd8e602b59700b5317","impliedFormat":1},{"version":"ede55f9bac348427d5b32a45ad7a24cc6297354289076d50c68f1692add61bce","impliedFormat":1},{"version":"d53a7e00791305f0bd04ea6e4d7ea9850ccc3538877f070f55308b3222f0a793","impliedFormat":1},{"version":"4ea5b45c6693288bb66b2007041a950a9d2fe765e376738377ba445950e927f6","impliedFormat":1},{"version":"7f25e826bfabe77a159a5fec52af069c13378d0a09d2712c6373ff904ba55d4b","impliedFormat":1},{"version":"ea2de1a0ec4c9b8828154a971bfe38c47df2f5e9ec511f1a66adce665b9f04b0","impliedFormat":1},{"version":"63c0926fcd1c3d6d9456f73ab17a6affcdfc41f7a0fa5971428a57e9ea5cf9e0","impliedFormat":1},{"version":"c30b346ad7f4df2f7659f5b3aff4c5c490a1f4654e31c44c839292c930199649","impliedFormat":1},{"version":"4ef0a17c5bcae3d68227136b562a4d54a4db18cfa058354e52a9ac167d275bbb","impliedFormat":1},{"version":"042b80988f014a04dd5808a4545b8a13ca226c9650cb470dc2bf6041fc20aca2","impliedFormat":1},{"version":"64269ed536e2647e12239481e8287509f9ee029cbb11169793796519cc37ecd4","impliedFormat":1},{"version":"c06fd8688dd064796b41170733bba3dcacfaf7e711045859364f4f778263fc7b","impliedFormat":1},{"version":"b0a8bf71fea54a788588c181c0bffbdd2c49904075a7c9cb8c98a3106ad6aa6d","impliedFormat":1},{"version":"434c5a40f2d5defeede46ae03fb07ed8b8c1d65e10412abd700291b24953c578","impliedFormat":1},{"version":"c5a6184688526f9cf53e3c9f216beb2123165bfa1ffcbfc7b1c3a925d031abf7","impliedFormat":1},{"version":"cd548f9fcd3cebe99b5ba91ae0ec61c3eae50bed9bc3cfd29d42dcfc201b68b5","affectsGlobalScope":true,"impliedFormat":1},{"version":"14a8ec10f9faf6e0baff58391578250a51e19d2e14abcc6fc239edb0fb4df7c5","impliedFormat":1},{"version":"81b0cf8cd66ae6736fd5496c5bbb9e19759713e29c9ed414b00350bd13d89d70","impliedFormat":1},{"version":"4992afbc8b2cb81e0053d989514a87d1e6c68cc7dedfe71f4b6e1ba35e29b77a","impliedFormat":1},{"version":"f15480150f26caaccf7680a61c410a07bd4c765eedc6cbdca71f7bca1c241c32","impliedFormat":1},{"version":"1c390420d6e444195fd814cb9dc2d9ca65e86eb2df9c1e14ff328098e1dc48ae","impliedFormat":1},{"version":"ec8b45e83323be47c740f3b573760a6f444964d19bbe20d34e3bca4b0304b3ad","impliedFormat":1},{"version":"ab8b86168ceb965a16e6fc39989b601c0857e1fd3fd63ff8289230163b114171","impliedFormat":1},{"version":"62d2f0134c9b53d00823c0731128d446defe4f2434fb84557f4697de70a62789","impliedFormat":1},{"version":"02c7b5e50ac8fb827c9cdcd22e3e57e8ebd513f0670d065349bef3b417f706f8","impliedFormat":1},{"version":"9a197c04325f5ffb91b81d0dca917a656d29542b7c54c6a8092362bad4181397","impliedFormat":1},{"version":"e6c3141ae9d177716b7dd4eee5571eb76d926144b4a7349d74808f7ff7a3dee0","impliedFormat":1},{"version":"d8d48515af22cb861a2ac9474879b9302b618f2ed0f90645f0e007328f2dbb90","impliedFormat":1},{"version":"e9ad7a5fecd647e72338a98b348540ea20639dee4ea27846cbe57c744f78ec2d","impliedFormat":1},{"version":"2c531043b1d58842c58e0a185c7bd5ce31e9a708667398373d6b113938629f90","impliedFormat":1},{"version":"5304a80e169ba8fe8d9c77806e393db1f708333afc1f95dede329fdbd84e29c7","impliedFormat":1},{"version":"7f0f90d0ffdd54875c464b940afaa0f711396f65392f20e9ffafc0af12ccbf14","impliedFormat":1},{"version":"2e93bb867fefffaecf9a54a91dbf271787e007ec2fe301d3dce080944c5518e5","impliedFormat":1},{"version":"3ab58250eb2968101cb0f3698aab0faa603660bc2d41d30ae13eaa22d75900d1","impliedFormat":1},{"version":"1f18ceea8d29b75099cc85f357622e87d6a2e0793486f89ab6da32cf9e434feb","impliedFormat":1},{"version":"c280ec77789efcf60ea1f6fd7159774422f588104dae9dfa438c9c921f5ab168","impliedFormat":1},{"version":"2826b3526af4f0e2c8f303e7a9a9a6bb8632e4a96fece2c787f2df286a696cea","impliedFormat":1},{"version":"3ec6d90ec9586e6e96120ff558429cac6ca656d81eb644ce703f736a316a0cd6","impliedFormat":1},{"version":"453b07099526a6d20fd30f357059d413677f919df8abf7346fab7c9abfec43fa","impliedFormat":1},{"version":"485f7d76af9e2b5af78aac874b0ac5563c2ae8c0a7833f62b24d837df8561fb9","impliedFormat":1},{"version":"8bdf41d41ff195838a5f9e92e5cb3dfcdc4665bcca9882b8d2f82a370a52384e","impliedFormat":1},{"version":"0a3351a5b3c74e9b822ade0e87a866bc7c010c1618bcde4243641817883fb8df","impliedFormat":1},{"version":"fe8a3e5492c807cc5cfc8dda4e6464aff0f991dc54db09be5d620fb4968ba101","impliedFormat":1},{"version":"03742d13572a69af40e24e742f3c40e58dc817aa51776477cf2757ee106c6c89","impliedFormat":1},{"version":"414f9c021dde847ee2382c4086f7bd3a49a354be865f8db898ee89214b2d2ced","impliedFormat":1},{"version":"bbbc43627abe35080c1ab89865ec63645977025d0161bc5cc2121dfd8bc8bc2e","impliedFormat":1},{"version":"0be66c79867b62eabb489870ba9661c60c32a5b7295cce269e07e88e7bee5bf3","impliedFormat":1},{"version":"5766c26941ae00aa889335bcccc1ecb28271b774be92aede801354c9797074bb","impliedFormat":1},{"version":"3a19286bcc9303c9352c03d68bb4b63cecbf5c9b7848465847bb6c9ceafa1484","impliedFormat":1},{"version":"c573fef34c2e5cc5269fd9c95fe73a1eb9db17142f5d8f36ffe4a686378b8660","impliedFormat":1},{"version":"d97e30dd93590392fed422f2b27325d10ab007d034faaaf61e28e9ddc9d3825b","impliedFormat":1},{"version":"d1f8a829c5e90734bb47a1d1941b8819aeee6e81a2a772c3c0f70b30e3693fa9","impliedFormat":1},{"version":"be1dfacee25a14d79724ba21f1fde67f966b46e2128c68fed2e48c6e1e9822c5","impliedFormat":1},{"version":"19b3d0c212d241c237f79009b4cd0051e54971747fd89dc70a74f874d1192534","impliedFormat":1},{"version":"d6a0db08bed9312f7c4245ee3db068a96c4893ea7df69863eb9dd9c0af5b28f7","impliedFormat":1},{"version":"f17963b9935dd2142c08b006da53afeeaca2c9a600485f6eb9c018b96687275b","impliedFormat":1},{"version":"6671e036f299eda709114347015eb9cf2da8f9ea158871da9c21e9056f7e26ac","impliedFormat":1},{"version":"8375cf1206fa01c23097e5293405d442c83fd03109e938d1bf3d9784f84c2dbc","impliedFormat":1},{"version":"585516c0e8cfe3f12497eb1fd57c56c79f22bb7d729a2c0a32c458c93af68b03","impliedFormat":1},{"version":"a797a41988e5ba36b6707939953b0c0395ed92b91c1189359d384ca66e8fa0ab","impliedFormat":1},{"version":"2b1945f9ee3ccab0ecfed15c3d03ef5a196d62d0760cffab9ec69e5147f4b5aa","impliedFormat":1},{"version":"96f215cefc7628ac012e55c7c3e4e5ce342d66e83826777a28e7ed75f7935e10","impliedFormat":1},{"version":"82b4045609dc0918319f835de4f6cb6a931fd729602292921c443a732a6bb811","impliedFormat":1},{"version":"0fd70ca1eaef1e2dd6f48f16886df4838664821d992fd8076d07fc15e83c8498","impliedFormat":1},{"version":"ba30e6d2f1d20c707566cf485167331a10c539802a79040ced055b62a7aae53e","impliedFormat":1},{"version":"b129f3db6f7f63e3e0cafeb9ee9fc57ceede840577725dcdb01fe89b9d32cf2b","impliedFormat":1},{"version":"4ddd9b092c76bce6b8516c0c4d156de63af024994c2d1305a4812b6d64858f93","impliedFormat":1},{"version":"537a2b61594512c5e75fad7e29d25c23922e27e5a1506eb4fce74fe858472a6e","impliedFormat":1},{"version":"311ca94091f3db783c0874128808d0f93ab5d7be82abc20ceb74afe275315d4a","impliedFormat":1},{"version":"7c07838da165fd43759a54d2d490461315e977f9f37c046e0e357623c657fc42","impliedFormat":1},{"version":"b311d973a0028d6bc19dfbaae891ad3f7c5057684eb105cfbeec992ab71fbc13","impliedFormat":1},{"version":"115c8691bd8fac390f6f6eef5b356543d716da7cffa4c2f70f288d56c5b06aeb","impliedFormat":1},{"version":"e91516e66f9fbf39c978a4092c16ffda3bb0b32158fca6def75aae9fab358153","impliedFormat":1},{"version":"abd4563a6a7668fa6f8f5e5a425a0900b80fc2309fec5186e2cae67f3ce92663","impliedFormat":1},{"version":"cb48f3011e72efef9d5a5b312f4a956f699b8d423bf9f2772724cdded496bd50","impliedFormat":1},{"version":"9aed07904079877252e6c0aedf1d2cf1935ed91d4abc16f726c76b61ea453919","impliedFormat":1},{"version":"6621af294bd4af8f3f9dd9bd99bd83ed8d2facd16faa6690a5b02d305abd98ab","impliedFormat":1},{"version":"5eada4495ab95470990b51f467c78d47aecfccc42365df4b1e7e88a2952af1a3","impliedFormat":1},{"version":"ba87016094bafb7adef4665c2ae4bea1d93da4c02e439b26ea147f5e16c56107","impliedFormat":1},{"version":"40e9c2028b34c6c1e3281818d062f7008705254ee992d9857d051c603391e0f4","impliedFormat":1},{"version":"52d6b690b6e3ccd2ffeab9c9b4edf11883f3466d29a0c5b9f06b1e048227c280","impliedFormat":1},{"version":"4a34de405e3017bf9e153850386aacdf6d26bbcd623073d13ab3c42c2ae7314c","impliedFormat":1},{"version":"fe2d1251f167d801a27f0dfb4e2c14f4f08bf2214d9784a1b8c310fdfdcdaaea","impliedFormat":1},{"version":"2a1182578228dc1faad14627859042d59ea5ab7e3ac69cb2a3453329aaaa3b83","impliedFormat":1},{"version":"dfa99386b9a1c1803eb20df3f6d3adc9e44effc84fa7c2ab6537ed1cb5cc8cfb","impliedFormat":1},{"version":"79b0d5635af72fb87a2a4b62334b0ab996ff7a1a14cfdb895702e74051917718","impliedFormat":1},{"version":"5f00b052713bfe8e9405df03a1bbe406006b30ec6b0c2ce57d207e70b48cf4e9","impliedFormat":1},{"version":"7abcae770f21794b5ffbc3186483c3dbcf8b0c8e37d3ef3ed6277ece5c5dd4be","impliedFormat":1},{"version":"4720efe0341867600b139bca9a8fa7858b56b3a13a4a665bd98c77052ca64ea4","impliedFormat":1},{"version":"566fc645642572ec1ae3981e3c0a7dc976636976bd7a1d09740c23e8521496e5","impliedFormat":1},{"version":"66182e2432a30468eb5e2225063c391262b6a6732928bbc8ee794642b041dd87","impliedFormat":1},{"version":"11792ab82e35e82f93690040fd634689cad71e98ab56e0e31c3758662fc85736","impliedFormat":1},{"version":"0b2095c299151bc492b6c202432cb456fda8d70741b4fd58e86220b2b86e0c30","impliedFormat":1},{"version":"6c53c05df974ece61aca769df915345dc6d5b7649a01dc715b7da1809ce00a77","impliedFormat":1},{"version":"18c505381728b8cc6ea6986728403c1969f0d81216ed04163a867780af89f839","impliedFormat":1},{"version":"d121a48de03095d7dd5cd09d39e1a1c4892b520dad4c1d9c339c5d5008cfb536","impliedFormat":1},{"version":"3592c16d8a782be215356cb78cc3f6fad6132e802d157a874c1942d163151dcc","impliedFormat":1},{"version":"480ea50ea1ee14d243ea72e09d947488300ac6d82e98d6948219f47219511b8b","impliedFormat":1},{"version":"d575bcf7ebd470d7accf5787a0cf0f3c88c33ca7c111f277c03ebbe6d0e8b0b5","impliedFormat":1},{"version":"72141538e52e99ca6e7a02d80186ba8c877ff47a606fea613be1b7a3439c2b90","impliedFormat":1},{"version":"b43a0693d7162abf3a5b3b9e78acfafd0d4713af4d54d1778900e30c11bc4f83","impliedFormat":1},{"version":"115b155584649eaf75d50bdc8aaa9a0f528b60fade90f0cf78137c875ff7de7c","impliedFormat":1},{"version":"98d88eefab45da6b844d2bee8f6efa8d20c879f6dc870c17b90608a4ac0ad527","impliedFormat":1},{"version":"4eb2ca099a3febd21e98c36e29b3a9472458a1e76e888bf6499614c895ba6be7","impliedFormat":1},{"version":"f4dc28fbbba727722cb1fd82f51a7b9540fbe410ed04ddf35cab191d6aa2ba10","impliedFormat":1},{"version":"b8101e982968b04cfaabfc9613dc8f8244e0a8607007bba3537c1f7cbb2a9242","impliedFormat":1},{"version":"ed3e176bc769725ebc1d93f1d6890fc3d977b9155ae5d03be96ec2d49b303370","impliedFormat":1},{"version":"e2dc16f882661fe5e9e6cde0a9c3e6f18f56ce7243ab0a168e68bfab6a5b9830","impliedFormat":1},{"version":"fc5221aedb3b5c52b4fbdf7b940c2115bde632f6cba52e05599363d5cd31019e","impliedFormat":1},{"version":"0289a27db91cb5a004dcf1e6192a09a1f9e8ff8ce606ff8fd691d42de5752123","impliedFormat":1},{"version":"307c6b2de09a621629cef5b7d0ec0ccabe72a3cd1a8f3ee189229d9035f52051","impliedFormat":1},{"version":"3c196d2ef49db4ad0e33a2a7e515ae622106b06ee8479957303601fd3e00f4f8","impliedFormat":1},{"version":"7933769d84f5ae16546aef06537ca578f1c8d7cca0708452a00613050ac1f265","impliedFormat":1},{"version":"4a48a731413b6fae34620c2e458d0adf2f74083073544a72b1b3a96c32775b2f","impliedFormat":1},{"version":"d405963c5f69955e95c30ef121c7a3309f214f21ef09dceb5d7ac69557cbe0fa","impliedFormat":1},{"version":"0c03b1120ddb2fa74809f5d06516beb5b4a3b3561ee93619f1e1c98fdb74a660","impliedFormat":1},{"version":"c3dc147af5ef951e14797da29b2dcaf1fdddabb0175d538e1bedf64a34690b9e","impliedFormat":1},{"version":"77e6933a0f1e4e5d355175c6d5c517398002a3eb74f2218b7670a29814259e3a","impliedFormat":1},{"version":"f8ce447bbda4f75da74cecd866cc1ff9bdde62189ac9d8dc14a16c48b3d702fa","impliedFormat":1},{"version":"68969a0efd9030866f60c027aedbd600f66ea09e1c9290853cc24c2dcc92000f","impliedFormat":1},{"version":"757f7967151a9b1f043aba090f09c1bdb0abe54f229efd3b7a656eb6da616bf4","impliedFormat":1},{"version":"786691c952fe3feac79aca8f0e7e580d95c19afc8a4c6f8765e99fb756d8d9d7","impliedFormat":1},{"version":"c3b259ee9684c6680bd68159d47bf36b0f5f32ea3b707197bcd6921cf25bde36","impliedFormat":1},{"version":"ab0926fedbd1f97ec02ed906cf4b1cf74093ab7458a835c3617dba60f1950ba3","impliedFormat":1},{"version":"3e642f39da9ad0a4cd16ccbd7f363b6b5ad5fa16a5c6d44753f98fc1e3be9d96","impliedFormat":1},{"version":"7f5a6eac3d3d334e2f2eba41f659e9618c06361958762869055e22219f341554","impliedFormat":1},{"version":"e6773ee69d14a45b44efa16a473a6366d07f61cd4f131b9fea7cd2e5b36a265c","impliedFormat":1},{"version":"67f2cd6e208e68fdfa366967d1949575df6ccf90c104fc9747b3f1bdb69ad55a","impliedFormat":1},{"version":"4093c47f69ea7acf0931095d5e01bfe1a0fa78586dbf13f4ae1142f190d82cc4","impliedFormat":1},{"version":"4fc9939c86a7d80ab6a361264e5666336d37e080a00d831d9358ad83575267da","impliedFormat":1},{"version":"f4ba385eedea4d7be1feeeac05aaa05d6741d931251a85ab48e0610271d001ce","impliedFormat":1},{"version":"52ae1d7a4eb815c20512a1662ca83931919ac3bb96da04c94253064291b9d583","impliedFormat":1},{"version":"6fa6ceb04be38c932343d6435eb6a4054c3170829993934b013b110273fe40af","impliedFormat":1},{"version":"0e8536310d6ed981aa0d07c5e2ca0060355f1394b19e98654fdd5c4672431b70","impliedFormat":1},{"version":"e71d84f5c649e283b31835f174df2afe6a01f4ef2cb1aafca5726b7d2b73a2e4","impliedFormat":1},{"version":"6d26bc11d906309e5c3b12285f94d9ef8edd8529ddee60042aba8470280b8b55","impliedFormat":1},{"version":"8f2644578a3273f43fd700803b89b842d2cd09c1fba2421db45737357e50f5b1","impliedFormat":1},{"version":"639f94fe145a72ce520d3d7b9b3b6c9049624d90cbf85cff46fb47fb28d1d8fe","impliedFormat":1},{"version":"8327a51d574987a2b0f61ea40df4adddf959f67bc48c303d4b33d47ba3be114a","impliedFormat":1},{"version":"00e1da5fce4ae9975f7b3ca994dcb188cf4c21aee48643e1d6d4b44e72df21ee","impliedFormat":1},{"version":"976d20bb5533077a2135f456a2b48b7adb7149e78832b182066930bad94f053a","impliedFormat":1},{"version":"4d250e905299144850c6f8e74dad1ee892d847643bacf637e89adcce013f0700","impliedFormat":1},{"version":"51b4ab145645785c8ced29238192f870dbb98f1968a7c7ef2580cd40663b2940","impliedFormat":1},{"version":"589713fefe7282fd008a2672c5fbacc4a94f31138bae6a03db2c7b5453dc8788","impliedFormat":1},{"version":"26f7f55345682291a8280c99bb672e386722961063c890c77120aaca462ac2f9","impliedFormat":1},{"version":"100802c3378b835a3ce31f5d108de149bd152b45b555f22f50c2cafb3a962ead","impliedFormat":1},{"version":"fd4fef81d1930b60c464872e311f4f2da3586a2a398a1bdf346ffc7b8863150f","impliedFormat":1},{"version":"354f47aa8d895d523ebc47aea561b5fedb44590ac2f0eae94b56839a0f08056a","impliedFormat":1},{"version":"62b753ed351fba7e0f6b57103529ce90f2e11b949b8fc69c39464fe958535c25","impliedFormat":1},{"version":"514321f6616d04f0c879ac9f06374ed9cb8eac63e57147ac954e8c0e7440ce00","impliedFormat":1},{"version":"ce7b928daedd974205daf616493c6eb358069ed740ed9552c5f4e66da19fd4bf","impliedFormat":1},{"version":"3d59b606bca764ce06d7dd69130c48322d4a93a3acb26bb2968d4e79e1461c3c","impliedFormat":1},{"version":"0231f8c8413370642c1c061e66b5a03f075084edebf22af88e30f5ce8dbf69f4","impliedFormat":1},{"version":"474d9ca594140dffc0585ce4d4acdcfba9d691f30ae2cafacc86c97981101f5c","impliedFormat":1},{"version":"e9ae721d2f9df91bc707ea47ddd590b04328654cfea11e79a57e5aef832709ff","impliedFormat":1},{"version":"0e2a6b2eeadafbc7a27909527af46705d47e93c652d656f09cc3ef460774291b","impliedFormat":1},{"version":"ed56810efb2b1e988af16923b08b056508755245a2f8947e6ad491c5133664ed","impliedFormat":1},{"version":"ed012a19811c4010cb7d8920378f6dd50f22e1cf2842ecb44a157030667b165e","impliedFormat":1},{"version":"26a19453ef691cc08d257fbcbcc16edb1a2e78c9b116d5ee48ed69e473c8ff76","impliedFormat":1},{"version":"90f08678b00c7b7aaaad0c84fb6525a11b5c35dad624b59dcadd3d279a4366c4","impliedFormat":1},{"version":"97ba9ccb439e5269a46562c6201063fbf6310922012fd58172304670958c21f6","impliedFormat":1},{"version":"d037b771e89ef6dd81c71de92cc644d68b1b5d1ce25dbce9c2cfe407dd0b5796","impliedFormat":1},{"version":"25091d25f74760301f1e094456e2e6af52ceb6ef1ece48910463528e499992d8","impliedFormat":1},{"version":"853d02f4f46ca9700fefd0d45062f5b82c9335ba2224ca4d7bd34d6ae4fc4a7f","impliedFormat":1},{"version":"b3d1c579771490011614a16be1f6951aec87248fdc928dd46b682523edb8e503","impliedFormat":1},{"version":"b3cc1bb7311f35569b531e781d4a42d2b91f8dfd8bc194cc310c8b61011d6e43","impliedFormat":1},{"version":"cf6dc8f18bc5ee063dc1a37bccd3031dc0769f11622399018c375aacfcbda7c9","impliedFormat":1},{"version":"8ca2d01f5f3d4d4067aadea230570afa4c91e24e485fbe2e9d53ead3b33f80d0","impliedFormat":1},{"version":"3d9f0abd05c056232c7f7f77bff1695fb07974106d0296e1b895badba20d805b","impliedFormat":1},{"version":"c7ddf2aa89f4541979c8337682b6bc278e5535be0f1fac98c778e222ef357703","impliedFormat":1},{"version":"dcf067993ca6e8af8050ebb538f3db1d9ab49fc1d8392ab2a9e2db50919e7337","impliedFormat":1},{"version":"9a0f11cc9d5419a5bf8387793c174c0d93fa2fd04a572be61bf0e35bf9d78639","impliedFormat":1},{"version":"401b83ed6f8a1a084c92f79feadeb76540a8a1945d7d000ffea91610430fd3e4","impliedFormat":1},{"version":"c00c2491442a7b9b888f403d160186c942da151bd671dcf37977d10de1d32498","impliedFormat":1},{"version":"4646966d560ddc09853c7cb1a1a418f262a579e390cc307f1dd353434938fde6","impliedFormat":1},{"version":"e9862a3b7eaeaa91829d2cf89f33e6f7245a2db3458b694ff64c85542521a01d","impliedFormat":1},{"version":"8fca3d2b2a6da9bb079ec8802926f72ce5ba8f12b10e7918590b4f2b877e960e","impliedFormat":1},{"version":"481ec2dd48f98df6c8567571b3d7aee76ffcaa6ac22c26bcdf92552d4bd9b7b1","impliedFormat":1},{"version":"f21e4cdf26ed143e67a8c7310620bd7878978040360c22c891f5dbb01b00b257","impliedFormat":1},{"version":"a53a62ef9b7ffeafee6861dc047b967c6e0bf42a2a67033fada7b6e52e1bc615","impliedFormat":1},{"version":"35bc256273c304ef5bf203e0706ed0ed6fa9de40fad8a30eebbeee0b853dcc92","impliedFormat":1},{"version":"774adcddeb41ed22be4d1ab586c762ddb2948a84a7a3f9867d2cd4af1d837ffd","impliedFormat":1},{"version":"cfaee3e42970c0fb51fbcd015db5f9ae663b8969d5e54f7d88e3c96246517f69","impliedFormat":1},{"version":"d712053dc1acb3fa4773202ea88f378c663bc1f163abe266afe0d599b4536511","impliedFormat":1},{"version":"82af9a77dfc85173fa56109f08d66f6fe5485d7011c5c1d174fb1d5f39b0ffef","impliedFormat":1},{"version":"065e7ba3dc90e6adb698c206897c875c208e86d765480ae5e4c190b5fb4c7a39","impliedFormat":1},{"version":"940494b72aa9bbd6b99249cb12713c719c7df220c3290fb355dae5f54d2ea5d9","impliedFormat":1},{"version":"025eb899a885dd305be2fb16f38a1564a95ddd25d9e5e8017829304265999025","impliedFormat":1},{"version":"f44708ba63ee4af745ce9a3307d4f20e686ec2d075c2bc9188f9101b7fe97288","impliedFormat":1},{"version":"1dd37c37187e7f71a82262aaa9e2db4ea4ab5a504326324c08724ab7f51e1b63","impliedFormat":1},{"version":"c822a1e1245f4aebe787b381ec31e7573c859579a93023c8b00be3d9a49b66d6","impliedFormat":1},{"version":"a25494aaa1b278f80f73ff79bdf00107c051727162e01aa931c90331bb8ebd8f","impliedFormat":1},{"version":"567cfab6fb2c86ba22b6738188b33f104f23e2a7407c098a3b3970e362b83075","impliedFormat":1},{"version":"1e73ecd4da907926b4feee7474f7999ba70cd586d0efa981e113eb68ffa0d22d","impliedFormat":1},{"version":"e937fe62b1339e08caa7e22acec57be49ae83010947443512005c710cb59ec84","impliedFormat":1},{"version":"848eaa9d6fc56f31a6abaedb61f0825121b0cda122b58262fec156e7c4184fa5","impliedFormat":1},{"version":"eb2c2ecde33a819fd65ae4d123b02920f52bcc4d48752fbeb9b645334b8905c7","impliedFormat":1},{"version":"0b9382de2576798f08286e25704785a244279fc86ecec0b900608be9a508e9fd","impliedFormat":1},{"version":"2d8a2dfb6c54a41df1deaac48a7c1ddee9712c4a64219f3bde7e200e013e044b","impliedFormat":1},{"version":"b61c1ceb88b79b0cfa7e8de1595e236b87ce4c6bb8ab0808d721e8fb70004759","impliedFormat":1},{"version":"d93370427cc358d66a7e014d9a03d36965c73b30a0c6ad52848adf65178243c3","impliedFormat":1},{"version":"4132bdfdeffebfcf8e2a41ed0d10150bed6599765e545dae09b2776240d14cf7","impliedFormat":1},{"version":"fac9b3c65250edb55982f08e82fc59335a28262202865426f8838c2307620a75","impliedFormat":1},{"version":"2703b5b6d024695ef877be342c8f28dd09e15881df56cb44daa042b381285e96","impliedFormat":1},{"version":"75cfa7274d43596af9a3adc2c284a3a7c5459c0d911b65ec6fd8d5a63beaff6b","impliedFormat":1},{"version":"54d7240da9eda456c661e89ca15703a8471d37c355b6eee2f50dd25f86649d8c","impliedFormat":1},{"version":"3ef49ccf913afdf87923b04eaeb900d67e85c52d3cffe1985f6b89a1345ab426","impliedFormat":1},{"version":"4c827b71b26b6167b7f002be5367c59234b92e61e195c72389d3f20ef1e681f7","impliedFormat":1},{"version":"359d1d4984ff40b89626799c824a8e61d473551b910286ed07a60d2f13b66c18","impliedFormat":1},{"version":"23908bd6e9ea709ab7f44bd7ad40907d819d0ee04c09a94019231156e96d9a67","impliedFormat":1},{"version":"e039c0572e83a8613e9d1f5faf1f50d66ea6a73e9c90e299193de8c3b3555f0d","impliedFormat":1},{"version":"16db34e3e82865e6b4bef71bbfe7e671cc8345ba5ae67c8ca20e50bcb18d0a6c","impliedFormat":1},{"version":"80b230becfd8a35955f13f6022e8fd59af9612a3ef83e14159cc918b3be0faea","impliedFormat":1},{"version":"32eb807d06018bfb2b05fe61eb6a90fe47c97c4ae23ba5af029921963a354d9e","impliedFormat":1},{"version":"3dcab336869307408255710db852dd809b99bdce8bd95856e5f97ebd8d7bfee2","impliedFormat":1},{"version":"437cb230543cdc5e9df94a25ca6b863c7f5549a10d017f4bf9691e9577a184db","impliedFormat":1},{"version":"68c13f0ab6f831d13681c3d483b43cfa4437ed5302e296205117d30a06f3598c","impliedFormat":1},{"version":"85d5fdfaaa0bf8825bdd6c77814b4f2d8b388e6c9b2ad385f609d3fa5e0c134c","impliedFormat":1},{"version":"3843e45df93d241bd5741524a814d16912fe47732401002904e6306d7c8f5683","impliedFormat":1},{"version":"5dc8d344618336fcce1b101465249c758b87ba0ac3f806a4ed9ef4a1660b29a0","impliedFormat":1},{"version":"fb0af5e73c6abdb54d9429ba72380bd69de0c9cf71f3380500ddca02229a7447","impliedFormat":1},{"version":"a40b3b560a57ff2597377c8bd977fe34e7e825994962367127e685f2f4911cd8","impliedFormat":1},{"version":"46cdcbef9616adf45cf9303b6ee16297a7ee0437d39fa6821f33a70cd500c5c9","impliedFormat":1},{"version":"60434c3d79638cea7bbb79e0edd4baca1e18d2cd828c7d4af7711e4dedee9cb8","impliedFormat":1},{"version":"24ecf0e691a8cb8b2f352d85fa9e42a067408ecc35d7fa1dc6dec3424870c64c","impliedFormat":1},{"version":"c5053ebc1c7a583a088706d64d5ba31bad79af910d9850585213a55926362d30","impliedFormat":1},{"version":"2e2655be5c5db990f66408139609199d1ffdea1434b8296276c3dfee6bfbebcc","impliedFormat":1},{"version":"32fc14ee35ddb9184f1ef4456ba697e872d757b67dd77841f7b6d8e72652f7ec","impliedFormat":1},{"version":"bd2bfacf748ee0bdb9f814b979ef6c5c2428c0b60c5fbf11dd03cf67fb710d52","impliedFormat":1},{"version":"d62dd90cb65049f765bc40783a32eb84b1ffb45348a7dcc8c15fbda3a1dc0ffb","impliedFormat":1},{"version":"79ffccc0cac5b0e3d24ee7b2c51d10754ecac9f214e8d6b25c58dc86fc798933","impliedFormat":1},{"version":"b383818f7fcacf139ae443ce7642226f70a0b709b9c0b504f206b11588bffeed","impliedFormat":1},{"version":"8bb7d512629dbe653737c3ac8a337e7f609cc0adc9a4a88c45af29073b1cbeb0","impliedFormat":1},{"version":"46e546c6e82f49bb98764312ebdaf52780d5045e3488aac049bff718cec16c33","impliedFormat":1},{"version":"35ae7e125a111d694986fe5839a3fae42e4db22375ec4021bc03ae4d46e91bd9","impliedFormat":1},{"version":"cd7528a6781095d286ae440e770fb62c7c279b0549279e73f1c8c0fd4b8ab950","impliedFormat":1},{"version":"0fe8670d5422c7ef468f40d6cfd71f924e1efb1bcb4646f19f480a2352d6122d","impliedFormat":1},{"version":"56bee1fe33c0082e81e0f113a423d9a9309410af210f0af103436caa98bb6143","impliedFormat":1},{"version":"5b7da74907652cfdc3089806009e04b60b74873a8f77ed9d64b546aa3532a019","impliedFormat":1},{"version":"469539760d3f55be43eb0742666d0b2b9ad7802d1d7c1bffd4c01ff4572badb4","impliedFormat":1},{"version":"1605b9b88099e0f3f4a823406753e8560f21e87801f5405514c0eee550621376","impliedFormat":1},{"version":"a4941e0aaec1ad9734f8beaf7d01dfc3a7b4c7cbf05be0d12f30e5dafe7c5a3e","impliedFormat":1},{"version":"5d41ebf1f7941e35fc43fbf125872c898660bdab951b191429c47753c8efbeed","impliedFormat":1},{"version":"d033a8beed48cd201a547a97e09cfd6e0ec21f3db87b34e4d5b01efdd54f5761","impliedFormat":1},{"version":"7c2342b0b4c053b2d8bc7496d2f9e5f95c1b87331208d48123763fc167bef797","impliedFormat":1},{"version":"38da2d1117c1c165bbf4557a0a3865022fb7289fe02cf05972e48b5011822346","impliedFormat":1},{"version":"efae928a1e9ba387ed6e67dabe5e4b69ca6a3ba6d9386d634a4c1c3edafe4249","impliedFormat":1},{"version":"cc73c691dd51a49ef04f26df601784517a27072738a967a9ab4539f29bf41f5f","impliedFormat":1},{"version":"06d3411fd086a7728ecca93ecd576d98b2bc6cb5201bb7e696d78c393efa6f24","impliedFormat":1},{"version":"4838f6c57405fce22bf94c92663d18a2abd224ef67ded862253e9e46b7df4b18","impliedFormat":1},{"version":"01b0a0ca88ac71ee4f00915929f7ff1313edc0f10f4ac73c7717d0eef0aca2e0","impliedFormat":1},{"version":"42f22bb3d66d119f3c640f102d56f6ee6ea934e2a957d9d3fa9947358d544d3b","impliedFormat":1},{"version":"3345acf9dff50c4a4a953dc46d556f1d51c779d706aed07700ce5bceb5bb041e","impliedFormat":1},{"version":"3f814edf8366775fdb84158146316cd673ecfdc9a59856a125266177192f31c8","impliedFormat":1},{"version":"99115d05f0b4bff983067f39e78b4fe8fa60b6326d72ad582b339367fa59f583","impliedFormat":1},{"version":"fbdca9b41a452b8969a698ba0d21991d7e4b127a6a70058f256ff8f718348747","impliedFormat":1},{"version":"b625fbbf0d991a7b41c078f984899dcddf842cfb663c4e404448c8541b241d0b","impliedFormat":1},{"version":"7854a975d47bf9025f945a6ea685761dedf9e9cd1dad8c40176b74583c5e3d71","impliedFormat":1},{"version":"28bbf6b287a5d264377fdf8692e1650039ae8085cb360908ae5351809a8c0f6e","impliedFormat":1},{"version":"48a4f60d88d0bbf4947be49f8f97a6862cebae06844a04b10a79153c528f1301","impliedFormat":1},{"version":"a7967c8321e8a51ec5b77cf2644f929fa221e97c8b53ea30f2f5e3d81e56f177","impliedFormat":1},{"version":"a471d6a0eafcdff19e50b0d4597b5cef87a542a6213194ae929cdeffbc0e02c0","impliedFormat":1},{"version":"5abf64e067319de07b5e25ffcc75fba5d00bcb579cdc69325a1ad3f3b3664284","impliedFormat":1},{"version":"56536d7f1073fa03399662e97d012bc70d62c31b763d0bea0e0040e6f1609ad6","impliedFormat":1},{"version":"7b9e8561139aa30959113ef793e059e0933b50335aecaef8cdcf81e03a9984ae","impliedFormat":1},{"version":"5b1e11bcea7e4e25725574b10a00ad65222d5db7ae354012b3f2df0291e482ca","impliedFormat":1},{"version":"884f646d3dd1551e36427c1fcfb9205225de21c4eb5a65d6b2c4d372ec36bd63","impliedFormat":1},{"version":"955819a952aed955630ac562fca9c65f651c4ba7adab784a3b52e111c2888cf4","impliedFormat":1},{"version":"a7b85d40ed2c654e6fa84f49ff2bc06e0f3d98910039394cd7799dc32db00146","impliedFormat":1},{"version":"26a810c5da97af4bcd593900738d422de02949dd230e5f255bc3f7ef82950c57","impliedFormat":1},{"version":"94d33075935c462c52917b3075d604f970c27c799c5092194a664ede114ffb8f","impliedFormat":1},{"version":"d2ef66c3f5d3401bd95d48492fb7861f3f8e8992a17543c75f5bfb904e07d932","impliedFormat":1},{"version":"af4ad02f3a1457af2e2331399229a7d70e1cb1198b1aecc0bc18aa3b3b695bbc","impliedFormat":1},{"version":"52b6c07b8f8b1b46bf85c2129e0c4cf233203c199837d4a17e914459d09e986a","impliedFormat":1},{"version":"b7cfc15401a7a1e368c3a70b29e24e376b54f99dfc3a1611992f853159230f04","impliedFormat":1},{"version":"525430edcbdeef71abd84bb64e35a5cf23e1def38579b656d18a4c94ff1f58f5","impliedFormat":1},{"version":"8b1d35f7add4e38a0f88704782a0905c2ae237364c9b9bd9ddd29cc358ee59cc","impliedFormat":1},{"version":"615ad07ab7542be91ec72aa0656fd8daed4feac15a2459aaa7c36dfc32f4e37d","impliedFormat":1},{"version":"df12cb709574b860f8e33c022e9561f339ba71794cd5d4b0d22b8be3ea509f52","impliedFormat":1},{"version":"31ff5aebab2436465c61de78fcf94b7d6d03915951310e0cfb6dc61b1e3ed751","impliedFormat":1},{"version":"d2745be767c32464627abc322a88f5076df5802a16a260d7ccf13600ad0a615e","impliedFormat":1},{"version":"aa73259de07ff85e39d2b49fbd233847690ff8ad4875d0023805d2a015f4ea43","impliedFormat":1},{"version":"74a907fa14655328575b29e4dbdf58440dd07c081d9d245f785c4143d10510c8","impliedFormat":1},{"version":"fbcdb2ccec93060304b878e7f65246b6b2c992e896774e9eaf7744f58a9cd8a6","impliedFormat":1},{"version":"935094dc19b20214f20677d5b871aa34e0e3280e6c852dd57b6a118134a15764","impliedFormat":1},{"version":"ea99aa2e537966df22f8192e99929ee81719c1cf0b9d9d83d0c6fed53325ccc6","impliedFormat":1},{"version":"c624b65789f71d3fe13d03b599adbaaf8b17644382f519510097537736df461b","impliedFormat":1},{"version":"3fbeaff576ce5b8035224fbcb98ec13b7cdd16cdbbf8ee7b4052d3d6330683fb","impliedFormat":1},{"version":"cc8eac1829ee2ec61323b3af1967790ceb9d0815ef8c40c340bc8090c17a9064","impliedFormat":1},{"version":"5947f213795a08df7324841661f27341937a5603edcd63fa2d2d66fb11864ec9","impliedFormat":1},{"version":"2d9f4d58554a246616eeaa090a2fb0dddccf412e88617975138389fb15770ca9","impliedFormat":1},{"version":"9d5e2347ea0d666f938644fdd4ea2bd48abd70b69e68db435b0e9d82c21debe3","impliedFormat":1},{"version":"74eeab10497f9b660c5faa35a4c798985d501f4c6ac59ec0a4f5bf1e9e22f8d5","impliedFormat":1},{"version":"f5784612187dad5542233e5f1fb909d845bca88ef3c873f624befa8cdb83a8a6","impliedFormat":1},{"version":"0c144ea2d770452cf3b9fa26af04717685bd96666ed455cc7a6f3f6927fea853","impliedFormat":1},{"version":"5556cb5a70fbd19a0ec9b1f2bb07b03d75b09db16092cdfaff12bb1c2d61e664","impliedFormat":1},{"version":"dc0a2b1055da16b360301fd6fbb5c50a9069e14ff290442e281ff35c0a422c87","impliedFormat":1},{"version":"537f44e770e50d7af6d8f88dc5aee5737c1ad37f749a23e48b0fa6588b578da3","impliedFormat":1},{"version":"8a11bfd37e6d5afb1bbf1b27d19f8b15aa1ba825a8693ac1d17b28390542cf6f","impliedFormat":1},{"version":"30611ab4b710838c7a918caa643efd70f7b6b833d7e711dd7fcf0692507782a8","impliedFormat":1},{"version":"2d86e8349f88dd333376e06fc6fe0f19b80486b60b63035c1c87500efe87ec84","impliedFormat":1},{"version":"9e899ee1a77d202eb3347b6f01e55e91f24af899c783aa5cc521ce6981fd29a0","impliedFormat":1},{"version":"14baf77440c62a113667c181ff1d428936e0a7f20fbcb95b486985343279f9db","impliedFormat":1},{"version":"c6a5e3ed00a6925bf151e08c1fa792a218f2e4c47115fdcf8b07b5aa622b4762","impliedFormat":1},{"version":"8af7b227cab639a41ef63408492dc72b53e925ec3fe010f8e2be7df9dd5125fb","impliedFormat":1},{"version":"a491419d41434b24313b51c189ba9d86d965b1cc5f5b2eaa11f7a19ca0cf704d","impliedFormat":1},{"version":"a17c4ce878cfd2313bf11a0f6cd1f5a4b9cc2713d4ee64392478685bad7e36fb","impliedFormat":1},{"version":"10d586b0736bb19e792f4585c1cffbfe86934fec0c66d7bbdc0304dc6450fcfb","impliedFormat":1},{"version":"383ada033596ec4d70358db5e893602f35bc9a6370522dfbf252d0639d5116fa","impliedFormat":1},{"version":"90e2663543bd59df84cea61fbcf801e6fa25c3aea00d60805523b183b2ce70d1","impliedFormat":1},{"version":"9e6892d1e275f3287336e52916bd0936862367cbd3d92ed38b86715a2c14a9ee","impliedFormat":1},{"version":"dbfc0ee9cafbdf0867b342cffead435f4f0805af059ef0aff66211e6a8f4dfbf","impliedFormat":1},{"version":"f373f30dae525b1c4fbd0a32f4509b84ed4d03e56b5421ffa80fbc07f1062a73","impliedFormat":1},{"version":"4f11cd8d38c92ff4bc80daf537207130f4ed4e85242347b07012a476c0169792","impliedFormat":1},{"version":"17e1131cd659b53d7799b1a4edc59ce44f3c8167af5a2e7fadd1163f26c58b9a","impliedFormat":1},{"version":"ff08e1379bbaa6978bd7ffebaab2505918cc883109d39bb6cd417c87a2e80be4","signature":"857aef4641a5f4177194170e0e7e9ab04e1c4be056d29ccc42d49938b12a6ae4","impliedFormat":1},{"version":"eb29806b34866751b40cc665b1e5886e3fe83a931f06774d8f85b99527f6f99d","impliedFormat":1},{"version":"a84066be5114f0430601c0f598770e67a092d21ae7fb0a0b41d580d654d1083a","impliedFormat":1},{"version":"c8a688faf2a1fdb8a94eaa91391764e619fa2efd7c293da1ceca85f2d6d7335c","impliedFormat":1},{"version":"cb6f7ed489510b1ff4a6aac6d34b366c93ea7a2e574abc7e07fdcfd2bf9ec56a","signature":"abc218704ab31f5a90a06f2d4076488f3ec5ab983b978a2da898986c45b7007c","impliedFormat":1},{"version":"f85e70f2c81d9f86ec66fcce6b99d621f09aff82c9967790f5d2d77176ee8e93","signature":"bd7829038ce6e60c2e3d6b0963b7c24f743caee63bf3f51b0f220f040d2428ea","impliedFormat":1},{"version":"d38ea459b3ae060d3df1b243e3f6c715fd03c18428d72497b7a1e965051b22c6","impliedFormat":1},{"version":"cd4c43cfede08ef7195b36520029063fcee42b04efd4401b2e0045024a38eb7c","impliedFormat":1},{"version":"6975c7c77644d06ed95b46e5285e9914ea8605db97c48bf0587fe0f6dab7c00a","impliedFormat":1},{"version":"d66a8574cfb1046c00f54ed918f6955d221fc4d41109925073f23a2ff2804e35","impliedFormat":1},{"version":"e1c47ab3e725199bf65a974d0e160ef2bcff0cf680ed90efdfe192a717c01012","impliedFormat":1},{"version":"ef5a5a729f91caa12e8e72431cdfbb02a3ed7f2c5cda5f7ecedbb68bcfb3687f","impliedFormat":1},{"version":"c61a6e254e033484e5930d0117ebe5133fb7498f2000810efcd90abaff3711ce","impliedFormat":1},{"version":"3df1e71d13525c45c2688a97d8279c44542dab0d1df51f99ea843c9556f43223","impliedFormat":1},{"version":"6728baf6b0ce4ae66d0f855d5029f3f60e40cf522ec1cbe990c9b9069133506d","signature":"1b30b58ddfa7a4e4ec768d60a9ef8cb55a899d6144ca7b17dba804c94250ed1d","impliedFormat":1},{"version":"69b6301da5f85a63b6d66dc079dc9ca8202c380c09c51ae9bf6776d87783f73e","signature":"2401e3e44968308532397a4db3140b5fd335f47c452e27dff8f3826a6e4b32a4","impliedFormat":1},{"version":"38b66d66439ff13a921fe8eecaa25b7fe46ee3f7f4157a8dd02ee0c4f3c4cb81","impliedFormat":1},{"version":"438257a2c9bbc158fec27c97fdadcf4fd065f939a5907165ca63cc37f8c4cc44","impliedFormat":1},{"version":"586b2aa20c6439799ee9ba9d1345459fd0d0e74ec277050b2741d19483061c32","signature":"1d50dd86cf1a63b0691bf8ebfec48874553702d506b6a3517f984128044e3c8b","impliedFormat":1},{"version":"5c12feff855d84e35b88cb4814d063ffcbcb37b65dad88e21a9082ecb4a418e6","impliedFormat":1},{"version":"9e7f3124996e68c03677c00597c005f706bfce9dc9cc04b0c1c19dbc29cd395f","impliedFormat":1},{"version":"61c88125ef48d45c4ba2e60e3cdd7c2040cf8bf0cb17c4f14c9ace617b211707","impliedFormat":1},{"version":"ba7b1391ad3bc19d047e8e65705d2b509f19682589adb0868e7c6b4f2ac29160","signature":"c3b7b6511d4633aea77d7a0c071260b389b4aa3b10c1f4aaee4f721a2f8dd837","impliedFormat":1},{"version":"35e3901b66118ea040490eeb1b9fe8ddfd429e9aee01599ce830ac8409f62e90","signature":"41e927dccd6da76f1b990c7ae8294ced31775992bbf492cfaedef5577ae9bb09","impliedFormat":1},{"version":"188f08f0955ca3336d7da4a0028d68d9e9fc556e945e02653bf6392707a65292","impliedFormat":1},{"version":"b170af61fdbd152c7f292926f955e5eee2ed578b54dfeba9187d875796015177","impliedFormat":1},{"version":"46746d76e647234473298f4c4af8415d246ccc5e3b2901d62c62a1e77712b93c","signature":"9836e22928a70aea2ad3b587eeea52424d7146341ab7e816643e3a4dac08ba9a","impliedFormat":1},{"version":"8e31771128d3b9847d5f9fa93ee8f9574035f6ee92df17a96c12717829d65a4b","impliedFormat":1},{"version":"fd47ad7961bd4f2c07467ffeb9326f94b8f1227c68f9da60ff9140689d02c23e","signature":"551cba98ecf637f30bf2363ecfcebd2f096d644ac60ee6861fe789ed06c70adc","impliedFormat":1},{"version":"12ea42a1c3e3ddbeef30860bfd068891c87024e1f48985d2ece2075b647df2ae","impliedFormat":1},{"version":"fe31b4904d0c367a925e03bee683b947653ee08f3391ec13f5586e9cf9df832c","impliedFormat":1},{"version":"12d2902850baa7c8469715aba610063c391d5a34f5ca35c86f2d5b86ca7136e4","impliedFormat":1},{"version":"2e1b685c75880150821827af7929809ce3e887d455c7bb03f720ebab06e80861","impliedFormat":1},{"version":"aeb30d54e251c2a825ade2af84b6e4ab0724d1d76fa8d95ce56658aca1fad577","impliedFormat":1},{"version":"0e07e0e89289fb4ce39ec9904bc659143d55636aaee2c0937755836a059f15ab","impliedFormat":1},{"version":"23e8d919fe6bd6a9d81d8407611369a5ba583926d3a631b2088097401e00598a","impliedFormat":1},{"version":"4692a755de93e05809c494276612b370e2278a7d4be55acb37a49cc18d49171e","impliedFormat":1},{"version":"b6705c59e3e46e4bba219ca6e98c7ce1a169bc602c3c6e0eb823af0a287190a8","impliedFormat":1},{"version":"71aeb6cd11938da49350a2d0f1006f35bc6346850f888f9a2b634cfef29f27d1","impliedFormat":1},{"version":"aac2d5d2274e0e82f8d35456ef18e9d0fbc1a83f3eb8a24076a41cd3299c6aed","signature":"58233ac346abac147f653028c86207fab1196e26170b8d59c1af87d0fa677567","impliedFormat":1},{"version":"f6824d5b0b16ad2315338e6d47bc0d80be5226d293ab5070d4fc5c450d1f8081","signature":"4fcb9a8ff999fe250a58712454305c0c522f4be5e965e89d7a67fe382abce747","impliedFormat":1},{"version":"d96cda443e8cc5412878264a0d56facb26cfdc5a0c363a1b527cda7993fa9247","impliedFormat":1},{"version":"d6dd814840a11da9a5633c750344432f6c64b32ec819be9fae34f7df354e1a5d","signature":"9be0520a91afcc961c887d3687e64e42cb1f859c346aeaf41b84a7590499cbe2","impliedFormat":1},{"version":"06447449c22b48f45e8f1af5ff9a3e389e829281b6f80737a27c12d922dd7c2a","impliedFormat":1},{"version":"5a93adb225359a84c6f7dff5bb512a60bb9c7cd64df1098c26cb36a91307bd8e","signature":"f3a2102ca5215a25837f70fdcd8991d4b68f35616da68199b4e6cf783bfaebe5","impliedFormat":1},{"version":"005f10cafe0939ae8d6a98e19c4ddf8b59faf3f9ae38dfa5907b82b9a6cb4de9","impliedFormat":1},{"version":"089c056ad8ecb34ee72cb831491ab72c214d8fb7ecf94b96a1b4736ab54397a1","impliedFormat":1},{"version":"e643ef3093cba63af26396ae8dc58dc542c241027749dcdf715f3d3209f79a03","impliedFormat":1},{"version":"f40e6338b8137033a5b4efbe01de45a4399f2c304648eace01d852cd05eb861e","impliedFormat":1},{"version":"89d879fae02696e226dbcb7444d6153158fa264bb646071988f19a2e422b314f","impliedFormat":1},{"version":"57de3f0b1730cf8439c8aa4686f78f38b170a9b55e7a8393ae6f8a524bb3ba5a","impliedFormat":1},{"version":"e933bd300ea4f6c724d222bf2d93a0ae2b1e748baa1db09cb71d67d563794b2d","impliedFormat":1},{"version":"c43d0df83d8bb68ab9e2795cf1ec896ff1b5fab2023c977f3777819bc6b5c880","impliedFormat":1},{"version":"bf810d50332562d1b223a7ce607e5f8dc42714d8a3fa7bf39afe33830e107bf7","impliedFormat":1},{"version":"f025aff69699033567ebb4925578dedb18f63b4aa185f85005451cfd5fc53343","impliedFormat":1},{"version":"3d36c36df6ce6c4c3651a5f804ab07fe1c9bb8ce7d40ef4134038c364b429cb3","impliedFormat":1},{"version":"e9243dd3c92d2c56a2edf96cbce8faf357caf9397b95acaa65e960ad36cb7235","impliedFormat":1},{"version":"a24a9c59b7baecbb85c0ace2c07c9c5b7c2330bb5a2ae5d766f6bbf68f75e727","impliedFormat":1},{"version":"3c264d6a0f6be4f8684cb9e025f32c9b131cca7199c658eea28f0dae1f439124","impliedFormat":1},{"version":"d3cd789b0eebd5cebde1404383fd32c610bec782c74a415aa05ab3593abc35c8","impliedFormat":1},{"version":"8c1babb42f52952a6593b678f4cfb4afea5dc91e5cfaf3ca922cdd2d23b1277a","impliedFormat":1},{"version":"04ebb965333800caba800cabd1e18b02e0e69ab6a6f8948f2d53211df00a193c","impliedFormat":1},{"version":"f8e2be107b3e756e0a1c4f5e195e69dce69d38d0ff5c0b0509933e970c6d915b","impliedFormat":1},{"version":"309e580094520f9675a85c406ab5d1de4735f74a38f36690d569dbc5341f36a8","impliedFormat":1},{"version":"c2fa79fd37e4b0e4040de9d8db1b79accb1f8f63b3458cd0e5dac9d4f9e6f3f1","impliedFormat":1},{"version":"4f0d1a7e2a5a8b85d69f60a7be2a6223827f5fec473ba2142279841a54e8a845","impliedFormat":1},{"version":"ae2fb62b3647083fe8299e95dbfab2063c8301e9a626f42be0f360a57e434797","impliedFormat":1},{"version":"f53d803d9c9c8acdbb82ef5c6b8f224d42be50e9ab8bc09c8a9a942717214f9a","impliedFormat":1},{"version":"d2d70166533a2233aa35977eecea4b08c2f0f2e6e7b56c12a1c613c5ebf2c384","impliedFormat":1},{"version":"1097820fae2d12eb60006de0b5d057105e60d165cf8a6e6125f9876e6335cde7","impliedFormat":1},{"version":"8f62905f50830a638fd1a5ff68d9c8f2c1347ff046908eeb9119d257e8e8ae4a","impliedFormat":1},{"version":"8b4d34279952175f972f1aa62e136248311889148eb40a3e4782b244cece09f3","impliedFormat":1},{"version":"d3c3cc0840704fe524dbe8a812290bfd303e43d3bd43dcaac83ee682d2e15be0","impliedFormat":1},{"version":"71725ba9235f9d2aa02839162b1df2df59fd9dd91c110a54ea02112243d7a4d9","impliedFormat":1},{"version":"80af0c272dcb64518f7768428cdf91d21966a7f24ed0dfc69fad964d4c2ed8c1","impliedFormat":1},{"version":"1dc9702aa16e3ada78c84aa96868a7e5502001c402918b6d85ed25acbe80fd51","impliedFormat":1},{"version":"35f891c1bc36c97469df06316c65a718956515c8b3bdbeb146b468c02493ef13","impliedFormat":1},{"version":"2e9b05d7db853315f44d824e13840e6fdf17d615d13170b5f5cf830442018dcd","impliedFormat":1},{"version":"21967f0d1beb4f3d9ad091a989e04bdccd02836bcc3a59d1c73b15f8189b4312","signature":"c3c56e6f685f3f348c7919fc9b01245ee54607a75ebf2df3ccb100ec41083088","impliedFormat":1},{"version":"e344e2aae592e4879b1267c8384e64e87471c11684eb8b0fb0bd21e02692e7b8","impliedFormat":1},{"version":"e2fa4cc24c0993c61d5a4b959fc0d0ca142e279a812156fc35a7e256ce17e3a2","signature":"6da8d1a17003df1a4983c11efb10f79268bb93cfa00fdfbf18cd1bea30e17384","impliedFormat":1},{"version":"11a929e9e3ca2f35aaaa80f42027f42cc4c2721f6b03389ca42421d777ce6163","impliedFormat":1},{"version":"b7587e5697d696d93fd850ba89515a6457e6baef2cef6cf5c8f10825d9bc8ad6","signature":"1f6708a8036fcd5ae9948df4e3a7ed040b78757da8def8a63c72fa0315582abc","impliedFormat":1},{"version":"90e77999845154070f2a8409bb1fc0d6ffd1a3349d4e35abd6b97e06a6ad5b03","impliedFormat":1},{"version":"ed3c8a2b495a3764a0e0f6e3b48c9e25b7c791857102c3732e47e7b8a2b4146a","impliedFormat":1},{"version":"17136473401873bc6aa2f0b2a4a013a3f97b8a0ccb04b6b91bcbec04f129e268","impliedFormat":1},{"version":"4a11cc90a414090db16abf3418aeb9201e6ecf2a9e36829f6db71c0d79923ca5","impliedFormat":1},{"version":"0861e74d08cf22266af113dc692e1d7620aece2364e08457bf60c23946cd1b1b","impliedFormat":1},{"version":"81ca60e78e5eedc5db95cf594644426f47aef429acfbcc802e5effc54a456a49","impliedFormat":1},{"version":"21c6f9e65eb3a5f071932e3c014aad040b137738068303c11a6d9454027cf342","impliedFormat":1},{"version":"fb53a7a9fccd80252e6c9b79af7d13edef0b18a54122d16ab1002d338e7bb695","impliedFormat":1},{"version":"5f5be01596111e4d7ce1e65ff527abe2e43ddc788802d91c38a8759d096a2bde","signature":"109a22daf466984516cb4c3e5759936b51ca2f828d961beefc66665b56127f41","impliedFormat":1},{"version":"2f19d0cad724100dc10333207e0257de3b74092ad25f00b2894d5fee63f6f6d9","impliedFormat":1},{"version":"412c709af7dacb3551cf5b426f57126bad53c025ce39baa5cca187179cdce5d8","impliedFormat":1},{"version":"8e7c72981753c9d80b212afb36f4690c285f6031475f80153d8b4731ac5c2b99","impliedFormat":1},{"version":"b1f9175f75d4ef199c975d18851ebd0b77439cf66d1db7c4f13dec81f6751677","impliedFormat":1},{"version":"292003d4f9d8ba2a90f0e6aca5db4ff011976998a90baf6f70b045857b314e0d","impliedFormat":1},{"version":"9eb47d432ae6d41da4356574ee068b76c3c217be7e7c101f9c7be5b722e3a155","impliedFormat":1},{"version":"30d6273619d7d6ed26735fee9d485cec27f97366435b965110d9c2d10149a8d0","impliedFormat":1},{"version":"0573f68432d73714164d7a7d855200be9fbe82a7800f885c4bfcf840b2346b20","impliedFormat":1},{"version":"451406b0ea5e9ef63364d77cf90254bc3fa6c974b18697423b15045c9e8dd750","impliedFormat":1},{"version":"3a6ea580527115112f7fac44fc75bd85bee5d1b9369b84e02f05239c869c7d3d","impliedFormat":1},{"version":"11594292a0ac93a6a3afbb9945160f9731c93bbd55b3ff53a85ba9126e4fd920","impliedFormat":1},{"version":"bbe68ef69b54d3cb9c3eaff2c80d0af2b5f80bccf91438d4a8cf8b53d9a14c4b","impliedFormat":1},{"version":"70e345d53cc00be14d6f3024838bbff3ef0613d56b71ae3f796d7b2a0d473b07","affectsGlobalScope":true,"impliedFormat":1},{"version":"ca08566bc7d9e0020a62bae0197b61929a1bb34f97e96982635be275f6dbc502","impliedFormat":1},{"version":"e827c2264d1540ea9288fb9383e5cb02ab769f23353ab76f1c12ed5a809ed300","impliedFormat":1},{"version":"db9fe1ae275c223f25bbfbcdd790ae88c925e15c784f2bc6e5f56d4bcdca8a4e","impliedFormat":1},{"version":"89b8d0fe5aec9c37b98f126e4f4315225d801e1bd157de17ad995200d16b2f1e","impliedFormat":1},{"version":"a319096f8d5fe4d8284f9711b9a001f8015d5e6494b8e74082ca1a75719de048","impliedFormat":1},{"version":"78edd37f688f282d853955069c730d89f8e0ccba3df6b6226d3327a5d98d2aeb","impliedFormat":1},{"version":"ca3393209096361c6ea9ad5783671d5609703d5d00a5ec2c71246c4b3872a291","affectsGlobalScope":true,"impliedFormat":1},{"version":"61d367271627485c4027f496782d72781d0d2dd90d759664f7b0083d513da6a7","impliedFormat":1},{"version":"4cc81a94c5e8f0ba3a73445f32a1c011c197c376b8f6bbdb08d3b1ab44bb2e95","impliedFormat":1},{"version":"a2999ed84296a880c3f8ad4adc1c8c07617007cc55a2b6ad362b142a6fed9af0","impliedFormat":1},{"version":"a9f672caa1c5631a744b05f69c28b4cfdbcb35e16112b2596ad88c90d1491e90","impliedFormat":1},{"version":"8d36f5b65e38d64c7370a80cdd26d2b0eea3b200c90b4b1fa5b594de262b5adf","impliedFormat":1},{"version":"2d5094424c7e06500d51088d6182e1324704010c54e4df440cf687da6d196ca1","impliedFormat":1},{"version":"8d1722eddb71400b416698dc4a4faf61d38f3c5fb191412b487877c12f92f5ce","impliedFormat":1},{"version":"69333b916a0a4329de4fed1191ec176b476bf419d5c56b3d66c2736ce1e6a4de","impliedFormat":1},{"version":"a955a5652fac7e3f6adc1ad7f4c22774e08251f06091779d48db944c32d54b9c","impliedFormat":1},{"version":"133fd0be181d7c21fceeccfa59efeaabf949502d37288326ffe6b0383fdc0b9e","impliedFormat":1},{"version":"15eee289dbd1369243ce767502b3d48bbdf50638249df90555c0f02f5b2107b6","impliedFormat":1},{"version":"633f7c4ebb6f3a3ab186b8ad44af6b7a41355b19e4125bd378899a50ba5991e7","impliedFormat":1},{"version":"84c4d64fb67c31aed9ddeae64207d62046dcd525906c6ccf7166264ae5347252","impliedFormat":1},{"version":"8b3449c5b0bcc0f9b82cfd611179453444576ddc31ecfa0df32b94bba23c7962","impliedFormat":1},{"version":"28f13eae6f1c2e2c0b09b3a5899695881f586050cdc5e26ea70b84d53e245c53","impliedFormat":1},{"version":"eeb3eeaf375fc738138043ecc239471c0d4c1798e5426dadda6a370a6e430313","impliedFormat":1},{"version":"030915a009d241680518f74a8bde60a8fb05f9a33e3974ef7661c55377936108","impliedFormat":1},{"version":"53ae98cb8a690dcb13ff08468cd532817ceec23301cd2fbd1638a4509c75fb5a","impliedFormat":1},{"version":"284b8250a6fdaf36c9f789e211a420bd417873997c3347dfbc999ac9b9c4617c","impliedFormat":1},{"version":"5d303981e2efe7b75e303b9ba0b149f7dc52b60a716a37366d15c0ee7e06d71c","impliedFormat":1},{"version":"66f11f0455e2ddcd1d861ccb6222c9287ccdf5a4f775288ba4e84588c9f6e7d4","impliedFormat":1},{"version":"566d39c79490d7d3c0edf99528a27ddbc190a43187de9c6903c539310dc32876","impliedFormat":1},{"version":"f6d629d05333c4f6097d2e8d43622930677cfaa0d04451c19d149da012fb024e","impliedFormat":1},{"version":"37ff372218ab7f5fe97a3ea0d889aa22a9cf856f49f3c071b285bb57f61126a4","impliedFormat":1},{"version":"0697562c198ad4887ee0c6ba87c81674415bf08622c38761a35ce284f79000a6","impliedFormat":1},{"version":"ec298fb58b43841e59e9cf74e5c4da1b28211549a111361d1b814b6cf9846ba3","impliedFormat":1},{"version":"f6af127f8f33c31698e4162dc44e27faa32213c8029b01a75ec8d337e8a29d98","impliedFormat":1},{"version":"f2d25ffb9fa1ea3b6c4461d749fffb2943d89365ae492b5da914082e373ef319","impliedFormat":1},{"version":"033ff83964da431641bb12966218670b067eb875f40b867a2f13eccbd22d2ad0","impliedFormat":1},{"version":"b29fca8647befa819e15522effef648208d240212705b5eea931107f252c2cd4","impliedFormat":1},{"version":"e2c0e97358d22f3139d4a26d93c7120014171ef31993440a8b3b69f4bb877fcc","impliedFormat":1},{"version":"90efedb2afa77beb63a1df83ab098109e796e08538e8157840c0b50e1da81a09","impliedFormat":1},{"version":"f72866fd4b0f2ea1c088065c4d6445095d5d8204b5d47bcb567865ba807d0a13","impliedFormat":1},{"version":"2292b8ede5c530d2c30f5a6ea14b455612b85eaf7c817da5bf79daa245068041","impliedFormat":1},{"version":"a6f12f14dbcb3fa60e7972637c7fd2ebee8ecaa320f88e4a6ea0233c77037d98","impliedFormat":1},{"version":"9514002fe1f72b3049408f9d6ca86e3cb961652f0e537d46f9b5452d577bb8cd","impliedFormat":1},{"version":"212bf5658e5e9a5c2339c6c4ed1a9b26048de14f21869e2df1bb7edcd730c54d","impliedFormat":1},{"version":"54de542e1f492d0b9df28493e771f7967c46d0285024f053ac6d81b8e24c05cb","impliedFormat":1},{"version":"a5b04b41838cd784ac841c351ae2c626a45a4d6b7981f805f41c0f332f632e0b","impliedFormat":1},{"version":"cb11accd47db05613ce31bcf360fe9357c25df8d50c3a7f0e953b7569ea4bee5","impliedFormat":1},{"version":"17810264cbbdc018764b9cbd0125892d47245d818d595ec94ddf23079bfeb732","impliedFormat":1},{"version":"04b32b104bf086362811496726a9a761a93ef1051e56107582433eeabb05216c","impliedFormat":1},{"version":"2d2c3ff10f8825d2a7120cb43addefb64111be064e35d270f662cde6ad1c8d5c","impliedFormat":1},{"version":"4752749fa062c4b02e46a60143a0e13ef404ad6ea3282d1aacc7016a17f66369","impliedFormat":1},{"version":"89aff3abdf4a99430d0e8e90c51ee4ca7c63aa5add8c159f922f7e7e7864ca55","impliedFormat":1},{"version":"ee1c930e3da09a2296ed5518b4ee1538e9788ac34b0a60ac33e0a0a2badd76e3","impliedFormat":1},{"version":"9349ef8829763a15785c41e115eb77440570effcaff9b9482c1e6178c8c6f368","impliedFormat":1},{"version":"14affb15c4923cd38b98dda994a6338109067c6f94615ba21db4b8c20c9b2c67","impliedFormat":1},{"version":"f5b3ebeb467837dd6593e4fe8f1de9b7598fb23981e02b32b7e72b81c04164da","impliedFormat":1},{"version":"68a75a201a5d1322df462c133020e5c639809c94a6698e3cc46363e56c174b30","impliedFormat":1},{"version":"265a4739974854eb43539419a6c86faab7e161b1133496c62f8bf2725542244d","impliedFormat":1},{"version":"a1accfaac01020c1b866634f7a698fdd48612caccf305e16844665cb7ecac399","impliedFormat":1},{"version":"ec00441ae4838b8d595acfe3b2750750e4335802b06ba1f41fb03453c2c776b5","impliedFormat":1},{"version":"ac1689d264991e5f58deb5a82ee44940f091a709b8ca815b38d5a7cb1305ce9f","impliedFormat":1},{"version":"8dca1366d02c160f39732f1a9ff2a882489903cd034e9c9c3f0ebfe9fa90f7ae","impliedFormat":1},{"version":"c548226db013facd262a4bc1c32c44a13eda7e1181aa6f569f9bdd531c95b0d5","impliedFormat":1},{"version":"37db669ef9a2ff2244d8e13aa8df9237fe3135c24facf0d62e7751fd49832386","impliedFormat":1},{"version":"543f461070fbd4b33bd05a5ba3e472e1297bb1db3c3101092bd69bfdddd3b1a1","impliedFormat":1},{"version":"929540ba3980906ac3f38e8567233028233c1c7e4d8921c1ce19604357028600","impliedFormat":1},{"version":"de5512f2a4c42776474808db1a6a8f12374be84392eeb649ad306330df41d0b3","impliedFormat":1},{"version":"7e96277aa5d7be6cddfdb78db26d986e00308e63f0202fb0d9fa39c826597dd4","impliedFormat":1},{"version":"3745762b83e5d49983a4183821125e3417473f992c4bf1d6dd6cea91efb4166f","impliedFormat":1},{"version":"ade458e350eda79fa74ecb678d9c51cc17f592d56df3e47286ef28e71401a989","impliedFormat":1},{"version":"695d23d7fb1f989d4d385001d8d8029f2f1a65dd91b4e47078e2586b8cdc4999","impliedFormat":1},{"version":"d73236e868cf6537240359fc4bea5733728567444ec7d2768e78ccc06ef22088","impliedFormat":1},{"version":"279c2ed4f57d90587de8e8dbadcb58b2ce2a0f6f7466ca07de24ad2cd50b6d12","impliedFormat":1},{"version":"02a711dc0da3eb73b8fae269ea1603cceaf395a7288429fdd724986974fa0ffa","impliedFormat":1},{"version":"cec41f4ba1a759fd9913cf418f17fe6a9dd6379cffd6923bb7f7f5efdcab4dda","impliedFormat":1},{"version":"caebb18abe3f02c23f8a16a2ee40ca5e26ac77f952cb15c660ff653cbad52144","impliedFormat":1},{"version":"49bddd70b375e6ba2b0f6e8dca81608dff0e9496dc28a87b79a622b8d1d4b41f","impliedFormat":1},{"version":"fd6d1d663e9ffe474e0b340ca3960c5b1acd4a72c464a0eacfd035c4d178e10d","impliedFormat":1},{"version":"4359e8ba73374bb7d25c0d4181c4e9f9fd6174569897788596feac600ec69639","impliedFormat":1},{"version":"2b31eaeb5ecf87fb46dc532da7b187a6711eb13bd58791d0470eb8ff16281991","impliedFormat":1},{"version":"d4fe178cd599f1de33b0a18107fbaca86f23d0cee832a8b69aa76b8e991d2a94","impliedFormat":1},{"version":"2ec208888d9293ae84c7729ef4b1e90a81cdc022afb1ac25a49155e6783c7bf8","impliedFormat":1},{"version":"b21366779c846ce32d31e2af08d40f9a37961e4dfb7a20c16c37fe752047db5d","impliedFormat":1},{"version":"4130c2c57580e214060025c2df1460313ba070d3d6906c957755f10fc3b23ae0","impliedFormat":1},{"version":"5c56d077a2581c84910c8f9f0fad30ae45b2ca0a8cd78c7cf49ef6fe969bb809","impliedFormat":1},{"version":"0d81a9fdbcbe694d70175a1848a8be1c9281810a19d9c61ae197364149e4a8c0","impliedFormat":1},{"version":"2aede4f826e1717895a9b9b72afa7ace796267a37c2b36ce320366c84e3c540d","impliedFormat":1},{"version":"16f8e713001d58b9ee1bdcc52b43215c42ccd15da02fb639c32b942449244957","impliedFormat":1},{"version":"f86e6fa947feda6a87db6dac122d7308b6060687adfec373e7a4f62249a42cf9","impliedFormat":1},{"version":"64cd53feac77ca70c7ac520a67e8bd0331c64bb0faca28aa572d826f00527f98","impliedFormat":1},{"version":"ffdb36fdaa921ab5d6dd94414eb1a8bfcd71472aecd2476bce3c40a082ccaa2c","impliedFormat":1},{"version":"fe8e12d5151d3c526e5fd493757c9d3534c9b42338e7b4ac62a45c088b9a2e64","impliedFormat":1},{"version":"66181539572954871da89df777217a2feb17640a32c993fd25f9a004ff4bd1b2","impliedFormat":1},{"version":"8e20b585eed1b1afb844f5d1f32e726b1ef00a829ac408ca118b7bfbadd2dea9","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"aa5524e0509c2168c9493604acf51ef97d2027f03f3b38da097802d3aa719dc8","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"c5213e770282e93d685de14181bee1486b556a1a90c7697529a86af375f4608d","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"299fd0c281633d8dbfbe5f44c5f2850fe37392da6fd3b9cca3cb4e10cda16432","impliedFormat":1},{"version":"fcd49e75e303b11506c91b618b5f50aa2d027e0c4219a016a4406a2fd6f6ea61","impliedFormat":1},{"version":"bdd94485f193af1db099a949bf16f5b06f87ed2fdfeeb8081ff75b16d74c182e","impliedFormat":1},{"version":"3aa236d922d6447e405f662a789dfe99052a33e971eeda03c34982d636ae119a","impliedFormat":1},{"version":"367546a9101d0516f076a316b42788d4100c4b11ba8ab524e43da449ce427f1a","impliedFormat":1},{"version":"6aba139b8a0aa60886f7c23c92de8a0cdae3e6a82c757cd11108c0b2daaccb64","impliedFormat":1},{"version":"bc640c39437752657c123ec9810ac440d3d3e5bf707a53e55218f56120f7db2f","impliedFormat":1},{"version":"37b99f63f79793a05914411edae8a537cae4780c9ade9cdfb48df7c7601fa8e6","impliedFormat":1},{"version":"6e26f485793d941cf911662e25f0b9d99a348685173a34d78a993480e76a3769","impliedFormat":1},{"version":"cfb1f2ab6cca32a805793447998afe2f3b9a08c29db75b4e59be6321eb563e84","impliedFormat":1},{"version":"ec7d4589f63f2c9812b18acad1df70acf39b4c9f2d0f1112a1ef9406dd0f7a9a","impliedFormat":1},{"version":"324d67a62e4cc5cd98d0e9ecb409d1b7d96ce3cc66c2a321c71e9128d126a4aa","impliedFormat":1},{"version":"125abdba5ca8b77794169ed6926065c0e951ae3def02973bc5888a18a6b214ee","impliedFormat":1},{"version":"3ed8335945b3c2faaf53adfaf8462bfc26bde8112e8809594bebb176127911c2","impliedFormat":1},{"version":"6854bb9110ef44d24ca050420f4d1e54cc917abe3b6bbbe2303f897c31b82074","impliedFormat":1},{"version":"8ff6bf72724791d4574c5bd36feae6262103f77868bfdecc5236248559067967","impliedFormat":1},{"version":"4051adaa9a530c5f7221dca665465923bc519c0d401f101e3c9c4a321ccfc8d7","impliedFormat":1},{"version":"ad7fd8bf7db5e096d30f8e4cb34d95e0b12617ddac293da34ab3ba424b8de2f5","impliedFormat":1},{"version":"3ab09bcac44f42d3941121bf1851122c724652749871a5284b8c3441c7b59735","impliedFormat":1},{"version":"a69d48b82af6e71dd90d7f76a468078c26acac0043829984b78c9f34b0d12cbf","impliedFormat":1},{"version":"a0c8c0303b249e6ec68c87932221dcd287d112afd4f501da03b3770ab2bec948","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"db70313a715ae3ac5d0f62130917152eda06cee5750993c9d510fc70b7e9b7f1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8aff6e6b79709ea981bcd3aa64f92fc28b718633dd34d7ccde28a08c600ef9de","impliedFormat":1},{"version":"6b188cce44cb3e33467038c562b23e97371af1957c8bc8dc6d47e5e06eb832f0","impliedFormat":1},{"version":"394e23ee72a6518a40261183eab2561c156c923d967aa4c7bd8bb4ea8d11ef6a","impliedFormat":1},{"version":"2cf3dbd7f40a37310e151602dbb66cbb675d30a5d1a549620b5cbf7e3fc79ed7","impliedFormat":1},{"version":"a084d2e55a213bea2923f51f1e8082a9d9ce24191986a9a36738fdf541c773ff","impliedFormat":1},{"version":"38d85ebae37e4412ad64866a34e9bee857be9d799b77d6e06df7b98670a87207","impliedFormat":1},{"version":"2e6c6a7c3fd4cca6143e0136b13667ccb7230056808605dbcb97f2df4cd9f0d6","impliedFormat":1},{"version":"77cb94aba09fbafadd9e9e8f70eb1429511f00f192325b890b84ade36954c4a4","impliedFormat":1},{"version":"39106c32bb7022a3261eed5f11049e39fd3242c7a4031f65c1434022049bd088","impliedFormat":1},{"version":"bef95fb8a8f883052a530a6ccd2b4aa204c5876a87c325e0a76f0e40fb9b0e58","impliedFormat":1},{"version":"ab8a3c5e68a2a1172caf06aee8f800d2879acc3daa5f2dc49909f06169718c4a","impliedFormat":1},{"version":"c4e3e811a45154400d95a8e1a973ce595acdcb375089423608cde7bcc2393234","impliedFormat":1},{"version":"ce5fb4e56737f1de89a457c4e653b526d5e682355c1298cc10369423c172ebde","impliedFormat":1},{"version":"eef204f061321360559bd19235ea32a9d55b3ec22a362cc78d14ef50d4db4490","affectsGlobalScope":true,"impliedFormat":1},{"version":"bae8d023ef6b23df7da26f51cea44321f95817c190342a36882e93b80d07a960","impliedFormat":1},{"version":"26a770cec4bd2e7dbba95c6e536390fffe83c6268b78974a93727903b515c4e7","impliedFormat":1},{"version":"035a5df183489c2e22f3cf59fc1ed2b043d27f357eecc0eb8d8e840059d44245","impliedFormat":1},{"version":"0d14fa22c41fdc7277e6f71473b20ebc07f40f00e38875142335d5b63cdfc9d2","impliedFormat":1},{"version":"a4809f4d92317535e6b22b01019437030077a76fec1d93b9881c9ed4738fcc54","impliedFormat":1},{"version":"5f53fa0bd22096d2a78533f94e02c899143b8f0f9891a46965294ee8b91a9434","impliedFormat":1},{"version":"c085e9aa62d1ae1375794c1fb927a445fa105fed891a7e24edbb1c3300f7384a","impliedFormat":1},{"version":"f315e1e65a1f80992f0509e84e4ae2df15ecd9ef73df975f7c98813b71e4c8da","impliedFormat":1},{"version":"e00243d23c495ca2170c9b9e20b5c92331239100b51efdc2b4401cdad859bbef","impliedFormat":1},{"version":"cdcc132f207d097d7d3aa75615ab9a2e71d6a478162dde8b67f88ea19f3e54de","impliedFormat":1},{"version":"5b9586e9b0b6322e5bfbd2c29bd3b8e21ab9d871f82346cb71020e3d84bae73e","impliedFormat":1},{"version":"3e70a7e67c2cb16f8cd49097360c0309fe9d1e3210ff9222e9dac1f8df9d4fb6","impliedFormat":1},{"version":"ab68d2a3e3e8767c3fba8f80de099a1cfc18c0de79e42cb02ae66e22dfe14a66","impliedFormat":1},{"version":"d96cc6598148bf1a98fb2e8dcf01c63a4b3558bdaec6ef35e087fd0562eb40ec","impliedFormat":1},{"version":"ac5f598a09eed39b957ae3d909b88126f3faf605bd4589c19e9ae85d23ef71e3","impliedFormat":1},{"version":"29f72ec1289ae3aeda78bf14b38086d3d803262ac13904b400422941a26a3636","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab82804a14454734010dcdcd43f564ff7b0389bee4c5692eec76ff5b30d4cf66","impliedFormat":1},{"version":"6fa5d56af71f07dc276aae3f6f30807a9cccf758517fb39742af72e963553d80","impliedFormat":1},{"version":"253b95673c4e01189af13e855c76a7f7c24197f4179954521bf2a50db5cfe643","impliedFormat":1},{"version":"afe73051ff6a03a9565cbd8ebb0e956ee3df5e913ad5c1ded64218aabfa3dcb5","impliedFormat":1},{"version":"31f24e33f22172ba0cc8cdc640779fb14c3480e10b517ad1b4564e83fa262a2b","impliedFormat":1},{"version":"0fd641a3b3e3ec89058051a284135a3f30b94a325fb809c4e4159ec5495b5cdc","impliedFormat":1},{"version":"7b20065444d0353a2bc63145481e519e02d9113a098a2db079da21cb60590ef0","impliedFormat":1},{"version":"a85c0cc21ceba6efb2676a89a53ec0661e53f5ac4ae27a754536e203e0180af5","impliedFormat":1},{"version":"c2d085b981ebe5d70fc7e63cb3d612067c1a3b34b29e4e25f0fc7139d355b116","impliedFormat":1},{"version":"26d39c57a451087f27e40238c0e7786f94b5ea5adaa149cfc48dc1515730b51e","affectsGlobalScope":true,"impliedFormat":1},{"version":"94323c0a30f5d387d0c2451300966450ce5d37b1658530a14ccfac7d56a1d7a9","impliedFormat":1},{"version":"1d23257136778ab9697d651e31c8c68c6b92bc82c84317e9a99f6f4e1611920f","signature":"2580ecc85ad919be7e5cda10a9cb9f403a013b21dbae0730ef58c39440e69897","impliedFormat":1},{"version":"08273bb6ab2f8cee7ef55ec9753e2a35834f06f6115b737d5a1bbc1d32f1b43c","signature":"2f5d58c42cf374422fbc46b681e88df3ae264a1ef571d496149e2144381b796e","impliedFormat":1},{"version":"5cf1472b98dafc58490649d74ead93d116b46be5e59f3b830c0db0c8e0196706","signature":"2f5d58c42cf374422fbc46b681e88df3ae264a1ef571d496149e2144381b796e","impliedFormat":1},{"version":"cfd0267ca4fe43780b63cc46f8fdb35345919c0a303a5a55a6aadf097144144c","signature":"2f5d58c42cf374422fbc46b681e88df3ae264a1ef571d496149e2144381b796e","impliedFormat":1},{"version":"4185ef95d27057caf4bee8b1c9005dfbe39d8b0492596cfa63c1617f67254d50","signature":"2f5d58c42cf374422fbc46b681e88df3ae264a1ef571d496149e2144381b796e","impliedFormat":1},{"version":"678544a4638b667a73c18bb43472cef924c73e8937f70c18339aed3dc4186254","signature":"2f5d58c42cf374422fbc46b681e88df3ae264a1ef571d496149e2144381b796e","impliedFormat":1},{"version":"58924bb4b371e98b365ea4e3adac24d131b9a2c370e3da8dc10ebf6d0929b696","impliedFormat":1},{"version":"97b1504588b445418ab0baea475636971c35ef57ff3a7534e90dc9b290e8536b","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","impliedFormat":1},{"version":"e03cd9e692576524cd6e3783f82987fd99251039bf35388a80d3ecc5515ab660","impliedFormat":1},{"version":"e2222a63ed77f5987919d96934803ff6c6e6783a5b30cac5f7ee232bf1b42e42","signature":"2f5d58c42cf374422fbc46b681e88df3ae264a1ef571d496149e2144381b796e","impliedFormat":1},{"version":"cab25963245a0f2c435c2e85d345ff36a7494e3eb9bb61e9b6c2c299fa06fb38","impliedFormat":1},{"version":"54ddeea26803be1cba47b9e46484b7474f00a26f33e325b06f4809e65d27ba18","impliedFormat":1},{"version":"3e897b4587ebc003b246764254ede69721b6b5957ed816bf0fd048169f232ff4","affectsGlobalScope":true,"impliedFormat":1},{"version":"117816592ad26d78651f5e8322ea571fd8d413d8d3b7d79944d27468e2636989","impliedFormat":1},{"version":"4841ce19e6b12792e1ed58f92b80bb8ff2cd091589e02241354697199f2ece7a","impliedFormat":1},{"version":"d53680fc777b669b1b825916ac91db019b1ffda3b10b8e3f75d938db1f86d1c6","impliedFormat":1},{"version":"8947d5058fdd11acd8222809bbcd5f10e7894825632ebdccf7847de86c3b3698","impliedFormat":1},{"version":"3ff8d0215efd46a590dd6659e2872d3e77db4d2ac929176897f777cc058b0da1","impliedFormat":1},{"version":"33e8fef0313198707cbb6b6230cbe25f517274b57b17b7a57d20c797ab477b6a","impliedFormat":1},{"version":"900db5e483501a46262a0611de3985f6ff8a2885b6906d52d8b22d51f711b10f","impliedFormat":1},{"version":"e9706d49d3ebc158c09fec91641c7315f4c7f10cb47f14c7f148158a3c0026fd","impliedFormat":1},{"version":"d3328e52896da6262527ff6995c06818e51b2ef098b40aab651cdc6917171af6","impliedFormat":1},{"version":"02a444677cfb588937ad736bec0b849230318a6836d637796925dfa62566316c","impliedFormat":1},{"version":"6abbb08edb3b713b9c452ef035c5e2d688af88ffeba30e871caf0ad6c90e9c11","impliedFormat":1},{"version":"ca1dc421c0354f91760f8d33058c373a89e3af91be1ccc41392877ddb5e27f4a","impliedFormat":1},{"version":"b1ff9d16f15d1dd9aee18b968f4202284a259e381e4ca91ec0569e3d1e1a1994","impliedFormat":1},{"version":"085cc49551fcee796ac0af079edcdd6bc949c6e3b1fe3a6166dfc5f87f09d767","impliedFormat":1},{"version":"3b11690933c38e03db56cb7cc44c5635daddf614fdb2345d978d3c291a81939e","impliedFormat":1},{"version":"ac92dc258be07ad6df1042e30af4fea0e4d472bc5fd04c327901e0f46840b0ff","impliedFormat":1},{"version":"4f6ef174b7b21377d4b28fcd51cd851a6404bccc4d708989ddfcbc0db50aa3fd","impliedFormat":1},{"version":"c26d87fface45a3f3be65bd20ef8d868aa94ca45c4afa04ff413bff23ebd91d7","impliedFormat":1},{"version":"4f17e141a1787ad01e296a79af34dac6e5d06d13fda536f61d0cc2ff5ec45c69","impliedFormat":1},{"version":"69a31c70fc512bb2869473bf68ffae4f60dbc871228bb616d56b0a86da49da62","impliedFormat":1},{"version":"4d1ee2e4d4bf2af194011f4fda677576a8d74401068fb8606cae79376ccfcee4","impliedFormat":1},{"version":"aa58ee9f756e035fb4e8458f4c63ec7ed300c4fdbcafb302cd07a9d57c2a37e8","impliedFormat":1},{"version":"15c86795cd22b205e679bfb5c42ed2383f98268f9dff67a44c4f8f04e8ab2e0d","impliedFormat":1},{"version":"790c9f52fc4cb04847d1024972cc7a09404351b13faea4f1b906188c0aa3cb94","impliedFormat":1},{"version":"aadcf59329c6f0f8978cfa1810dab147e0b67f241a39c965c4904459fcc98c27","impliedFormat":1}],"root":[[160,171],[174,196],[204,210],435,436,438,[951,956],[970,993],[995,1008],1011,1012,[1421,1430],[1438,1482],[1516,1533],1540,[1543,1551],[1682,1684],[1687,1711],[1739,1745],[1747,1749]],"options":{"allowSyntheticDefaultImports":true,"esModuleInterop":true,"module":100,"skipDefaultLibCheck":true,"skipLibCheck":true,"sourceMap":true,"strict":true,"target":7},"referencedMap":[[160,1],[1698,2],[169,3],[1699,4],[189,5],[1700,6],[171,2],[1462,2],[1463,7],[1705,2],[1706,8],[1423,9],[1702,10],[1011,2],[168,11],[170,12],[1703,2],[1424,2],[190,13],[188,14],[162,6],[180,15],[181,15],[182,15],[183,16],[184,6],[187,1],[185,1],[186,1],[179,17],[175,18],[176,19],[1711,20],[1709,21],[1710,22],[1707,23],[1708,24],[1003,4],[1448,25],[1465,4],[174,26],[1701,2],[1704,27],[194,28],[191,2],[167,29],[192,30],[161,2],[193,31],[1455,2],[165,32],[195,33],[164,2],[166,2],[163,2],[178,34],[207,35],[204,2],[205,36],[206,37],[1001,2],[1432,38],[1431,2],[1398,39],[1397,40],[1394,41],[1292,42],[1295,43],[1296,43],[1297,43],[1298,43],[1299,43],[1300,43],[1301,43],[1302,43],[1303,43],[1304,43],[1305,43],[1306,43],[1307,43],[1308,43],[1309,43],[1310,43],[1311,43],[1312,43],[1313,43],[1314,43],[1315,43],[1316,43],[1318,43],[1317,43],[1319,43],[1320,43],[1321,43],[1322,43],[1323,43],[1324,43],[1325,43],[1326,43],[1327,43],[1328,43],[1329,43],[1330,43],[1331,43],[1332,43],[1333,43],[1334,43],[1335,43],[1336,43],[1337,43],[1338,43],[1339,43],[1340,43],[1341,43],[1342,43],[1343,43],[1344,43],[1345,43],[1346,43],[1347,43],[1348,43],[1349,43],[1350,43],[1351,43],[1352,43],[1353,43],[1354,43],[1355,43],[1356,43],[1357,43],[1358,43],[1361,43],[1359,43],[1360,43],[1362,43],[1363,43],[1364,43],[1365,43],[1367,44],[1368,44],[1369,44],[1370,44],[1371,44],[1372,44],[1373,44],[1374,44],[1375,44],[1376,44],[1377,44],[1378,44],[1379,44],[1380,44],[1381,44],[1382,44],[1383,44],[1384,44],[1385,44],[1386,44],[1387,44],[1388,44],[1389,44],[1390,44],[1391,44],[1392,44],[1393,44],[1399,45],[1291,46],[1395,47],[1415,48],[1293,49],[1414,50],[1294,51],[1366,52],[1400,53],[1401,54],[1402,55],[1403,56],[1404,57],[1405,58],[1396,59],[1413,60],[1409,61],[1410,61],[1411,62],[1412,62],[1290,63],[1274,2],[1277,64],[1275,65],[1276,65],[1280,66],[1279,67],[1281,68],[1283,69],[1278,70],[1282,71],[1284,72],[1285,2],[1289,73],[1286,2],[1287,46],[1288,46],[1092,74],[1093,74],[1095,75],[1091,2],[1094,46],[1097,76],[1096,76],[1098,76],[1099,77],[1101,78],[1100,75],[1102,46],[1103,46],[1182,79],[1105,80],[1104,46],[1106,46],[1149,81],[1148,82],[1151,83],[1164,71],[1165,68],[1177,84],[1166,85],[1178,86],[1147,65],[1150,87],[1179,88],[1180,46],[1181,89],[1183,46],[1185,90],[1184,91],[1107,46],[1108,46],[1109,46],[1110,46],[1111,46],[1112,46],[1113,46],[1122,92],[1123,46],[1124,2],[1125,46],[1126,46],[1127,46],[1128,46],[1116,2],[1129,2],[1130,46],[1115,93],[1117,94],[1114,46],[1118,93],[1119,46],[1120,95],[1146,96],[1131,46],[1132,94],[1133,46],[1134,46],[1135,2],[1136,46],[1137,46],[1138,46],[1139,46],[1140,46],[1141,46],[1142,97],[1143,46],[1144,46],[1121,46],[1145,46],[1634,98],[1635,2],[1636,2],[1632,99],[1676,100],[1633,2],[1678,101],[1435,102],[1433,2],[1434,103],[1436,2],[1731,104],[1722,2],[1720,105],[1735,106],[1721,107],[802,108],[803,2],[804,108],[805,2],[806,109],[807,110],[808,108],[809,108],[810,2],[811,2],[812,2],[813,2],[814,2],[815,2],[816,2],[817,110],[818,108],[819,108],[820,2],[821,108],[822,108],[823,2],[829,111],[824,111],[825,110],[826,2],[827,2],[828,112],[853,113],[830,110],[844,114],[831,114],[832,114],[833,114],[834,110],[835,114],[836,114],[837,114],[838,114],[839,110],[840,110],[841,110],[842,114],[843,115],[845,110],[846,110],[847,2],[848,2],[850,2],[849,2],[851,110],[852,2],[854,116],[801,117],[791,118],[788,119],[796,120],[794,121],[790,122],[789,123],[798,124],[797,125],[800,126],[799,127],[439,2],[442,110],[443,110],[444,110],[445,110],[446,110],[447,110],[448,110],[450,110],[449,110],[451,110],[452,110],[453,110],[454,110],[566,110],[455,110],[456,110],[457,110],[458,110],[567,110],[568,2],[569,128],[570,110],[571,109],[572,109],[574,129],[575,110],[576,130],[577,110],[579,131],[580,109],[581,132],[459,122],[460,110],[461,110],[462,2],[464,2],[463,110],[465,133],[466,122],[467,122],[468,122],[469,110],[470,122],[471,110],[472,122],[473,110],[475,109],[476,2],[477,2],[478,2],[479,110],[480,109],[481,2],[482,2],[483,2],[484,2],[485,2],[486,2],[487,2],[488,2],[489,2],[490,134],[491,2],[492,135],[493,2],[494,2],[495,2],[496,2],[497,2],[498,110],[504,109],[499,110],[500,110],[501,110],[502,109],[503,110],[505,108],[506,2],[507,2],[508,110],[582,109],[509,2],[583,110],[584,110],[585,110],[510,110],[586,110],[511,110],[588,108],[589,108],[590,108],[587,108],[591,110],[592,109],[593,109],[594,110],[512,2],[596,108],[595,108],[513,2],[514,136],[515,110],[516,110],[517,110],[518,110],[520,109],[519,109],[521,110],[522,110],[523,110],[597,109],[598,109],[599,110],[600,110],[603,109],[607,109],[609,137],[605,109],[606,138],[608,137],[610,139],[601,109],[602,140],[604,139],[611,109],[613,141],[612,141],[614,110],[615,109],[616,110],[617,110],[618,110],[619,110],[620,110],[524,142],[621,109],[622,110],[623,143],[624,110],[625,110],[626,109],[627,110],[628,110],[629,110],[630,110],[631,110],[632,110],[633,143],[634,143],[635,110],[636,110],[637,110],[638,144],[639,145],[640,109],[641,146],[642,110],[643,109],[644,110],[645,110],[646,110],[647,110],[648,110],[649,110],[525,2],[526,110],[527,2],[528,2],[529,110],[530,2],[531,110],[650,122],[652,147],[651,147],[653,148],[654,110],[655,110],[656,110],[657,109],[573,109],[532,110],[659,110],[658,110],[660,110],[661,149],[662,110],[663,110],[664,110],[665,110],[666,110],[667,110],[533,2],[534,2],[535,2],[536,2],[537,2],[668,110],[669,142],[538,2],[539,2],[540,2],[541,108],[670,110],[671,150],[672,110],[673,110],[674,110],[675,110],[676,109],[677,109],[678,109],[679,110],[680,109],[681,110],[682,110],[542,110],[683,110],[684,110],[685,110],[543,2],[544,2],[545,110],[546,110],[547,110],[548,110],[549,2],[550,2],[686,110],[687,109],[551,2],[552,2],[688,110],[553,2],[690,110],[691,110],[689,110],[692,110],[693,110],[694,110],[554,110],[555,109],[695,2],[556,2],[557,109],[558,2],[559,2],[560,2],[696,110],[697,110],[701,110],[702,109],[703,110],[704,109],[705,110],[561,2],[698,110],[699,110],[700,110],[706,109],[707,110],[708,109],[709,109],[712,109],[710,109],[711,109],[713,110],[714,110],[715,110],[716,151],[717,110],[718,109],[719,110],[720,110],[721,110],[562,2],[563,2],[722,110],[723,110],[724,110],[725,110],[564,2],[565,2],[726,110],[727,110],[728,110],[729,109],[730,152],[731,109],[732,153],[733,110],[734,110],[735,109],[736,110],[737,109],[738,110],[739,110],[740,110],[741,109],[742,110],[744,110],[743,110],[745,109],[746,109],[747,109],[748,109],[749,110],[750,110],[751,109],[752,110],[753,110],[754,110],[756,110],[755,154],[757,109],[758,110],[760,110],[761,110],[759,155],[762,110],[578,109],[763,109],[764,109],[765,156],[766,109],[767,157],[768,110],[769,158],[770,159],[771,110],[773,110],[774,110],[775,160],[776,110],[772,161],[777,110],[778,110],[779,110],[780,110],[781,110],[782,110],[783,109],[784,109],[785,110],[787,110],[786,162],[474,110],[441,163],[792,110],[440,110],[793,164],[855,2],[856,2],[857,2],[858,2],[859,2],[860,2],[861,165],[862,166],[863,2],[864,167],[865,168],[866,169],[867,170],[868,170],[869,170],[870,2],[871,170],[872,2],[873,2],[874,2],[875,2],[876,171],[877,170],[878,170],[879,171],[880,170],[881,170],[882,2],[883,2],[884,2],[885,170],[886,2],[887,2],[888,2],[889,172],[890,170],[893,173],[894,174],[895,2],[896,2],[897,2],[892,175],[898,2],[899,2],[900,175],[901,110],[902,176],[903,110],[904,110],[905,2],[906,2],[907,175],[908,2],[909,110],[912,177],[911,178],[910,173],[913,179],[914,2],[915,2],[916,108],[917,2],[918,180],[919,180],[920,181],[921,2],[922,2],[923,110],[924,2],[891,2],[925,182],[926,183],[927,184],[928,185],[929,185],[930,184],[931,186],[932,186],[933,2],[934,186],[935,186],[936,184],[937,187],[938,184],[939,186],[940,188],[944,186],[945,186],[946,186],[947,186],[941,186],[942,186],[943,186],[948,189],[949,184],[1677,2],[1552,190],[1680,2],[1719,2],[1186,68],[1187,68],[1190,191],[1189,192],[1188,46],[1200,193],[1191,68],[1193,194],[1192,46],[1195,195],[1194,2],[1196,196],[1197,196],[1198,197],[1199,198],[1241,199],[1242,2],[1245,200],[1243,84],[1244,2],[1201,46],[1202,201],[1205,202],[1207,203],[1206,46],[1208,202],[1209,202],[1210,204],[1203,46],[1204,2],[1221,205],[1220,206],[1222,70],[1223,2],[1227,207],[1224,46],[1225,46],[1226,208],[1219,46],[1089,209],[1077,46],[1087,210],[1088,46],[1090,211],[1172,46],[1173,212],[1170,213],[1171,214],[1169,215],[1167,46],[1168,46],[1176,216],[1174,2],[1175,46],[1078,2],[1079,2],[1080,2],[1081,2],[1086,217],[1082,46],[1083,46],[1084,218],[1085,46],[1153,219],[1152,46],[1154,2],[1160,46],[1155,46],[1156,46],[1157,46],[1161,46],[1163,220],[1158,46],[1159,46],[1162,46],[1264,46],[1228,46],[1246,221],[1247,222],[1248,2],[1249,223],[1250,2],[1251,2],[1252,2],[1253,2],[1254,46],[1255,221],[1256,46],[1258,224],[1259,225],[1257,46],[1260,2],[1261,2],[1273,226],[1262,2],[1263,2],[1265,2],[1266,2],[1267,2],[1268,221],[1269,2],[1270,2],[1271,2],[1272,2],[1013,227],[1014,228],[1016,2],[1029,229],[1030,230],[1027,231],[1028,232],[1015,2],[1031,233],[1034,234],[1036,235],[1037,236],[1019,237],[1038,2],[1042,238],[1040,239],[1041,2],[1035,2],[1044,240],[1020,241],[1046,242],[1047,243],[1049,244],[1048,245],[1050,246],[1045,247],[1043,248],[1051,249],[1052,250],[1056,251],[1057,252],[1055,253],[1033,254],[1021,2],[1024,255],[1058,256],[1059,257],[1060,257],[1017,2],[1062,258],[1061,257],[1076,259],[1022,2],[1026,260],[1063,261],[1064,2],[1018,2],[1054,262],[1065,263],[1053,264],[1066,265],[1067,266],[1068,234],[1069,234],[1070,267],[1039,2],[1072,268],[1073,269],[1032,2],[1074,270],[1071,2],[1023,271],[1025,248],[1075,227],[1212,272],[1214,273],[1215,274],[1213,46],[1216,2],[1217,2],[1218,275],[1211,2],[1229,2],[1231,46],[1230,276],[1232,277],[1233,278],[1234,276],[1235,276],[1236,279],[1240,280],[1237,281],[1238,282],[1239,2],[1407,283],[1408,284],[1406,46],[1010,285],[1009,2],[200,2],[153,286],[1712,2],[197,2],[152,287],[144,287],[1542,2],[1751,288],[1750,2],[149,289],[154,290],[1752,2],[1732,291],[150,2],[1715,2],[1717,292],[1718,293],[1753,2],[199,294],[1685,295],[145,2],[1728,2],[198,2],[155,296],[994,297],[92,298],[93,298],[94,299],[57,300],[95,301],[96,302],[97,303],[52,2],[55,304],[53,2],[54,2],[98,305],[99,306],[100,307],[101,308],[102,309],[103,310],[104,310],[106,27],[105,311],[107,312],[108,313],[109,314],[91,315],[56,2],[110,316],[111,317],[112,318],[143,319],[113,320],[114,321],[115,322],[116,323],[117,324],[118,325],[119,326],[120,327],[121,328],[122,329],[123,329],[124,330],[125,331],[127,332],[126,333],[128,334],[129,335],[130,279],[131,336],[132,337],[133,338],[134,339],[135,340],[136,341],[137,342],[138,343],[139,344],[140,345],[141,346],[142,347],[1541,287],[1774,348],[1754,2],[1766,349],[1770,350],[1765,351],[1767,352],[1768,353],[1769,354],[1773,355],[1772,356],[1771,2],[1764,357],[1763,358],[1762,359],[1755,2],[1761,360],[1757,361],[1758,361],[1759,361],[1756,2],[1760,361],[147,2],[148,2],[146,362],[151,363],[1775,2],[1777,364],[1776,365],[1729,2],[1686,2],[156,2],[437,366],[1713,2],[1714,367],[1675,2],[201,2],[58,2],[1716,2],[1734,368],[1626,2],[1627,369],[1553,2],[1555,370],[1601,371],[1600,372],[1602,373],[1603,374],[1604,375],[1605,371],[1606,375],[1607,371],[1599,376],[1608,373],[1609,377],[1610,378],[1611,371],[1613,379],[1614,380],[1615,381],[1612,382],[1616,383],[1617,384],[1618,385],[1598,386],[1619,387],[1620,388],[1621,389],[1597,390],[1623,391],[1567,392],[1563,383],[1624,393],[1559,394],[1625,395],[1562,396],[1564,397],[1596,398],[1622,399],[1568,400],[1569,383],[1560,2],[1557,383],[1570,401],[1571,402],[1565,403],[1561,402],[1572,402],[1594,404],[1558,403],[1595,403],[1566,405],[1554,2],[1573,406],[1574,407],[1575,405],[1577,408],[1578,405],[1579,385],[1580,409],[1581,410],[1593,411],[1583,412],[1584,405],[1585,413],[1586,405],[1576,413],[1587,405],[1588,405],[1589,385],[1590,414],[1591,405],[1592,405],[1582,415],[1628,413],[1629,416],[1556,2],[1630,385],[1631,417],[1681,418],[1679,419],[203,420],[968,421],[967,2],[969,422],[959,423],[958,423],[961,424],[964,423],[966,423],[963,425],[965,426],[962,426],[960,427],[957,2],[1726,428],[1536,429],[1537,430],[1539,431],[1534,2],[1535,429],[1538,429],[1483,432],[1485,433],[1486,434],[1484,435],[1508,2],[1509,436],[795,295],[1491,437],[1503,438],[1502,439],[1500,440],[1510,441],[1488,2],[1513,442],[1495,2],[1506,443],[1505,444],[1507,445],[1511,2],[1501,446],[1494,447],[1499,448],[1512,449],[1497,450],[1492,2],[1493,451],[1514,452],[1504,453],[1498,449],[1489,2],[1515,454],[1487,439],[1490,2],[1496,439],[1724,455],[1733,456],[1725,457],[1730,458],[1727,459],[1420,460],[1417,461],[1418,461],[1416,291],[1419,461],[1738,462],[1737,463],[1736,464],[202,465],[1437,2],[173,466],[157,287],[159,467],[1723,468],[950,469],[158,295],[172,2],[316,470],[220,471],[317,472],[221,473],[318,474],[222,475],[319,476],[223,477],[320,478],[224,479],[321,480],[322,481],[225,482],[323,483],[226,484],[324,485],[325,486],[227,487],[326,488],[327,489],[228,490],[328,491],[229,492],[329,493],[330,494],[331,495],[332,496],[230,497],[333,498],[231,499],[334,500],[335,501],[232,502],[336,503],[233,504],[337,505],[338,506],[234,507],[339,508],[340,509],[341,510],[342,511],[235,512],[343,513],[344,514],[236,515],[345,516],[237,517],[215,518],[218,519],[346,520],[238,521],[347,522],[239,523],[348,524],[349,525],[350,526],[240,527],[351,528],[241,529],[352,530],[353,531],[354,532],[242,533],[355,534],[243,535],[356,536],[357,537],[244,538],[358,539],[245,540],[359,541],[246,542],[360,543],[361,544],[247,545],[362,546],[248,547],[363,548],[249,549],[364,550],[250,551],[365,552],[251,553],[366,554],[252,555],[367,556],[253,557],[368,558],[369,559],[370,560],[254,561],[216,562],[371,563],[255,564],[372,565],[256,566],[373,567],[257,568],[374,569],[258,570],[375,571],[259,572],[376,573],[260,574],[377,575],[378,576],[261,577],[379,578],[380,579],[262,580],[381,581],[263,582],[382,583],[264,584],[383,585],[265,586],[384,587],[266,588],[385,589],[267,590],[386,591],[268,592],[387,593],[269,594],[388,595],[270,596],[389,597],[271,598],[390,599],[391,600],[272,601],[392,602],[273,603],[393,604],[274,605],[394,606],[275,607],[395,608],[276,609],[396,610],[397,611],[398,612],[277,613],[399,614],[278,615],[400,616],[279,617],[401,618],[280,619],[402,620],[403,621],[281,622],[404,623],[282,624],[405,625],[406,626],[283,627],[407,628],[284,629],[408,630],[409,631],[410,632],[285,633],[411,634],[286,635],[412,636],[287,637],[413,638],[288,639],[414,640],[289,641],[290,642],[291,643],[292,644],[293,645],[294,646],[295,647],[415,648],[296,649],[297,650],[298,651],[299,652],[300,653],[301,654],[416,655],[302,656],[417,657],[303,658],[418,659],[419,660],[304,661],[420,662],[305,663],[421,664],[306,665],[422,666],[423,667],[307,668],[424,669],[308,670],[425,671],[309,672],[426,673],[310,674],[427,675],[311,676],[428,677],[312,678],[429,679],[313,680],[430,681],[314,682],[219,683],[431,684],[432,685],[433,686],[315,687],[217,688],[212,689],[434,690],[211,691],[213,692],[214,693],[49,2],[50,2],[10,2],[8,2],[9,2],[14,2],[13,2],[2,2],[15,2],[16,2],[17,2],[18,2],[19,2],[20,2],[21,2],[22,2],[3,2],[23,2],[24,2],[4,2],[25,2],[29,2],[26,2],[27,2],[28,2],[30,2],[31,2],[32,2],[5,2],[33,2],[34,2],[35,2],[36,2],[6,2],[40,2],[37,2],[38,2],[39,2],[41,2],[7,2],[42,2],[51,2],[47,2],[48,2],[43,2],[44,2],[45,2],[46,2],[1,2],[12,2],[11,2],[74,694],[81,695],[73,694],[88,696],[65,697],[64,698],[87,134],[82,699],[85,700],[67,701],[66,702],[62,703],[61,134],[84,704],[63,705],[68,706],[69,2],[72,706],[59,2],[90,707],[89,706],[76,708],[77,709],[79,710],[75,711],[78,712],[83,134],[70,713],[71,714],[80,715],[60,279],[86,716],[1674,717],[1652,718],[1662,719],[1651,718],[1672,720],[1643,721],[1642,698],[1671,134],[1665,722],[1670,723],[1645,724],[1659,725],[1644,726],[1668,727],[1640,728],[1639,134],[1669,729],[1641,730],[1646,731],[1647,2],[1650,731],[1637,2],[1673,732],[1663,733],[1654,734],[1655,735],[1657,736],[1653,737],[1656,738],[1666,134],[1648,739],[1649,740],[1658,741],[1638,279],[1661,742],[1660,731],[1664,2],[1667,743],[1460,744],[1441,745],[1442,746],[1446,747],[1464,748],[1444,749],[1445,750],[1449,751],[1450,752],[1451,2],[1452,753],[1453,754],[1443,755],[1447,756],[1454,757],[1439,758],[996,759],[1456,760],[1457,761],[1440,762],[177,763],[1458,764],[1521,765],[1531,766],[1000,767],[1523,768],[1522,769],[1526,770],[1524,771],[1525,768],[993,772],[1543,773],[1480,774],[1533,775],[1476,776],[1004,777],[1002,778],[1005,779],[1006,780],[1007,781],[1429,782],[1478,783],[1477,784],[1430,785],[1459,786],[1466,787],[1467,785],[1475,788],[1481,789],[1532,790],[1426,791],[1545,792],[1529,793],[1540,794],[1479,795],[1544,796],[1547,797],[1425,798],[1528,799],[1461,800],[1527,801],[1421,802],[1516,803],[1519,804],[1520,805],[995,806],[1517,807],[1518,808],[1482,809],[1530,810],[196,811],[951,812],[953,813],[952,814],[955,815],[954,816],[438,817],[1548,818],[1549,819],[1550,820],[208,821],[981,822],[991,823],[435,824],[436,825],[209,826],[987,827],[992,828],[956,829],[989,830],[986,831],[984,830],[983,832],[998,833],[982,834],[988,835],[985,836],[990,837],[997,838],[210,839],[1551,798],[1682,840],[1683,841],[1688,842],[1689,843],[1690,842],[1691,844],[1692,842],[971,845],[977,846],[1694,847],[970,2],[976,848],[1695,2],[1696,2],[1697,2],[980,849],[1693,850],[978,851],[975,852],[974,2],[973,853],[979,854],[972,2],[1427,855],[1428,856],[1012,857],[1422,858],[1008,859],[999,860],[1684,2],[1546,861],[1687,862],[1438,863],[1473,864],[1469,865],[1474,866],[1472,867],[1470,868],[1468,869],[1471,870],[1741,871],[1739,872],[1742,873],[1743,874],[1744,875],[1745,876],[1747,877],[1748,878],[1749,879],[1740,880],[1746,2]],"version":"5.8.3"} \ No newline at end of file +{"fileNames":["./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es5.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.dom.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.dom.asynciterable.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.webworker.importscripts.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.scripthost.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.full.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/compatibility/disposable.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/compatibility/indexable.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/compatibility/iterators.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/compatibility/index.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/globals.typedarray.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/buffer.buffer.d.ts","./node_modules/.pnpm/buffer@5.7.1/node_modules/buffer/index.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/header.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/readable.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/file.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/fetch.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/formdata.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/connector.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/client.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/errors.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/dispatcher.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/global-dispatcher.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/global-origin.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/pool-stats.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/pool.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/handlers.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/balanced-pool.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/agent.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/mock-interceptor.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/mock-agent.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/mock-client.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/mock-pool.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/mock-errors.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/proxy-agent.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/api.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/cookies.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/patch.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/filereader.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/diagnostics-channel.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/websocket.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/content-type.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/cache.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/interceptors.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/index.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/globals.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/assert.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/assert/strict.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/async_hooks.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/buffer.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/child_process.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/cluster.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/console.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/constants.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/crypto.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/dgram.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/dns.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/dns/promises.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/domain.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/dom-events.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/events.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/fs.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/fs/promises.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/http.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/http2.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/https.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/inspector.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/module.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/net.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/os.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/path.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/perf_hooks.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/process.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/punycode.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/querystring.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/readline.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/readline/promises.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/repl.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/stream.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/stream/promises.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/stream/consumers.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/stream/web.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/string_decoder.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/test.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/timers.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/timers/promises.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/tls.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/trace_events.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/tty.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/url.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/util.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/v8.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/vm.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/wasi.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/worker_threads.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/zlib.d.ts","./node_modules/.pnpm/@types+node@18.19.100/node_modules/@types/node/index.d.ts","./node_modules/.pnpm/@types+cors@2.8.18/node_modules/@types/cors/index.d.ts","./node_modules/.pnpm/@types+mime@1.3.5/node_modules/@types/mime/index.d.ts","./node_modules/.pnpm/@types+send@0.17.4/node_modules/@types/send/index.d.ts","./node_modules/.pnpm/@types+qs@6.9.18/node_modules/@types/qs/index.d.ts","./node_modules/.pnpm/@types+range-parser@1.2.7/node_modules/@types/range-parser/index.d.ts","./node_modules/.pnpm/@types+express-serve-static-core@4.19.6/node_modules/@types/express-serve-static-core/index.d.ts","./node_modules/.pnpm/@types+http-errors@2.0.4/node_modules/@types/http-errors/index.d.ts","./node_modules/.pnpm/@types+serve-static@1.15.7/node_modules/@types/serve-static/index.d.ts","./node_modules/.pnpm/@types+connect@3.4.38/node_modules/@types/connect/index.d.ts","./node_modules/.pnpm/@types+body-parser@1.19.5/node_modules/@types/body-parser/index.d.ts","./node_modules/.pnpm/@types+express@4.17.21/node_modules/@types/express/index.d.ts","./node_modules/.pnpm/@types+multer@1.4.12/node_modules/@types/multer/index.d.ts","./node_modules/.pnpm/@types+uuid@9.0.8/node_modules/@types/uuid/index.d.ts","./node_modules/.pnpm/pino-std-serializers@6.2.2/node_modules/pino-std-serializers/index.d.ts","./node_modules/.pnpm/sonic-boom@3.8.1/node_modules/sonic-boom/types/index.d.ts","./node_modules/.pnpm/pino@8.21.0/node_modules/pino/pino.d.ts","./common/adapters.ts","./common/types/memory.ts","./common/presets/claude.ts","./common/types/ui.ts","./common/types/sprite.ts","./common/types/saga.ts","./common/types/texttospeech-schema.ts","./common/types/index.ts","./common/memory.ts","./common/characters.ts","./common/mode-templates.ts","./common/presets/charluv.ts","./common/grammar.ts","./node_modules/.pnpm/source-map-generator@0.8.0/node_modules/source-map-generator/source-map.d.ts","./node_modules/.pnpm/peggy@3.0.2/node_modules/peggy/lib/peg.d.ts","./common/template-parser.ts","./common/prompt-order.ts","./common/xplevel.ts","./common/progression.ts","./common/event.ts","./common/prompt.ts","./srv/adapter/type.ts","./common/util.ts","./common/presets/templates.ts","./common/presets/horde.ts","./common/presets/kobold.ts","./common/presets/ooba.ts","./common/presets/openai.ts","./common/default-preset.ts","./common/presets.ts","./common/types/image-schema.ts","./common/types/library.ts","./common/types/presets.ts","./common/types/admin.ts","./common/types/schema.ts","./srv/api/wrap.ts","./node_modules/.pnpm/@types+chance@1.1.6/node_modules/@types/chance/index.d.ts","./node_modules/.pnpm/@types+ms@2.1.0/node_modules/@types/ms/index.d.ts","./node_modules/.pnpm/@types+jsonwebtoken@9.0.9/node_modules/@types/jsonwebtoken/index.d.ts","./node_modules/.pnpm/@types+bcryptjs@2.4.6/node_modules/@types/bcryptjs/index.d.ts","./node_modules/.pnpm/bson@5.5.1/node_modules/bson/bson.d.ts","./node_modules/.pnpm/mongodb@5.9.2/node_modules/mongodb/mongodb.d.ts","./node_modules/.pnpm/dotenv@16.5.0/node_modules/dotenv/lib/main.d.ts","./common/valid/types.ts","./common/valid/util.ts","./common/valid/validate.ts","./common/valid/index.ts","./srv/config.ts","./srv/db/client.ts","./srv/db/util.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/lib.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/crypto/crypto.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/net/net.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/shared.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Errors.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/OAuth.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Webhooks.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/EventTypes.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/UpcomingInvoices.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/AccountLinksResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/AccountSessionsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/AccountsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/ApplePayDomainsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/ApplicationFeesResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Apps/SecretsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/BalanceResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/BalanceTransactionsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/BillingPortal/ConfigurationsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/BillingPortal/SessionsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/ChargesResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Checkout/SessionsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/CountrySpecsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/CouponsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/CreditNotesResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/CustomersResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/DisputesResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/EphemeralKeysResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/EventsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/ExchangeRatesResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/FileLinksResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/FilesResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/FinancialConnections/AccountsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/FinancialConnections/SessionsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Identity/VerificationReportsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Identity/VerificationSessionsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/InvoiceItemsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/InvoicesResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Issuing/AuthorizationsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Issuing/CardholdersResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Issuing/CardsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Issuing/DisputesResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Issuing/TokensResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Issuing/TransactionsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/MandatesResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/PaymentIntentsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/PaymentLinksResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/PaymentMethodConfigurationsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/PaymentMethodDomainsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/PaymentMethodsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/PayoutsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/PlansResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/PricesResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/ProductsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/PromotionCodesResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/QuotesResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Radar/EarlyFraudWarningsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Radar/ValueListItemsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Radar/ValueListsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/RefundsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Reporting/ReportRunsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Reporting/ReportTypesResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/ReviewsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/SetupAttemptsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/SetupIntentsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/ShippingRatesResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Sigma/ScheduledQueryRunsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/SourcesResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/SubscriptionItemsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/SubscriptionSchedulesResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/SubscriptionsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Tax/CalculationsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Tax/SettingsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Tax/TransactionsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/TaxCodesResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/TaxRatesResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Terminal/ConfigurationsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Terminal/ConnectionTokensResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Terminal/LocationsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Terminal/ReadersResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/TestHelpers/CustomersResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/TestHelpers/Issuing/AuthorizationsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/TestHelpers/Issuing/CardsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/TestHelpers/Issuing/TransactionsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/TestHelpers/RefundsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/TestHelpers/Terminal/ReadersResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/TestHelpers/TestClocksResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/TestHelpers/Treasury/InboundTransfersResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/TestHelpers/Treasury/OutboundPaymentsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/TestHelpers/Treasury/OutboundTransfersResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/TestHelpers/Treasury/ReceivedCreditsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/TestHelpers/Treasury/ReceivedDebitsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/TokensResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/TopupsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/TransfersResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Treasury/CreditReversalsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Treasury/DebitReversalsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Treasury/FinancialAccountsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Treasury/InboundTransfersResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Treasury/OutboundPaymentsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Treasury/OutboundTransfersResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Treasury/ReceivedCreditsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Treasury/ReceivedDebitsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Treasury/TransactionEntriesResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Treasury/TransactionsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/WebhookEndpointsResource.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/AccountLinks.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/AccountSessions.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Accounts.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/ApplePayDomains.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/ApplicationFees.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Applications.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Apps/Secrets.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Balance.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/BalanceTransactionSources.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/BalanceTransactions.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/BankAccounts.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/BillingPortal/Configurations.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/BillingPortal/Sessions.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Capabilities.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Cards.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/CashBalances.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Charges.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Checkout/Sessions.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/ConnectCollectionTransfers.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/CountrySpecs.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Coupons.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/CreditNoteLineItems.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/CreditNotes.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/CustomerBalanceTransactions.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/CustomerCashBalanceTransactions.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/CustomerSources.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Customers.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Discounts.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Disputes.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/EphemeralKeys.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Events.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/ExchangeRates.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/ExternalAccounts.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/FeeRefunds.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/FileLinks.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Files.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/FinancialConnections/AccountOwners.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/FinancialConnections/AccountOwnerships.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/FinancialConnections/Accounts.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/FinancialConnections/Sessions.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/FundingInstructions.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Identity/VerificationReports.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Identity/VerificationSessions.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/InvoiceItems.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/InvoiceLineItems.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Invoices.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Issuing/Authorizations.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Issuing/Cardholders.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Issuing/Cards.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Issuing/Disputes.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Issuing/Tokens.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Issuing/Transactions.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/LineItems.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/LoginLinks.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Mandates.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/PaymentIntents.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/PaymentLinks.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/PaymentMethodConfigurations.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/PaymentMethodDomains.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/PaymentMethods.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Payouts.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Persons.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Plans.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/PlatformTaxFees.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Prices.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Products.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/PromotionCodes.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Quotes.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Radar/EarlyFraudWarnings.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Radar/ValueListItems.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Radar/ValueLists.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Refunds.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Reporting/ReportRuns.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Reporting/ReportTypes.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/ReserveTransactions.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Reviews.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/SetupAttempts.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/SetupIntents.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/ShippingRates.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Sigma/ScheduledQueryRuns.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/SourceMandateNotifications.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/SourceTransactions.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Sources.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/SubscriptionItems.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/SubscriptionSchedules.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Subscriptions.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Tax/CalculationLineItems.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Tax/Calculations.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Tax/Settings.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Tax/TransactionLineItems.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Tax/Transactions.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/TaxCodes.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/TaxDeductedAtSources.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/TaxIds.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/TaxRates.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Terminal/Configurations.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Terminal/ConnectionTokens.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Terminal/Locations.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Terminal/Readers.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/TestHelpers/TestClocks.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Tokens.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Topups.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/TransferReversals.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Transfers.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Treasury/CreditReversals.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Treasury/DebitReversals.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Treasury/FinancialAccountFeatures.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Treasury/FinancialAccounts.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Treasury/InboundTransfers.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Treasury/OutboundPayments.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Treasury/OutboundTransfers.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Treasury/ReceivedCredits.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Treasury/ReceivedDebits.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Treasury/TransactionEntries.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/Treasury/Transactions.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/UsageRecordSummaries.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/UsageRecords.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/WebhookEndpoints.d.ts","./node_modules/.pnpm/stripe@13.11.0/node_modules/stripe/types/index.d.ts","./srv/db/characters.ts","./srv/db/chats.ts","./node_modules/.pnpm/@types+ws@8.18.1/node_modules/@types/ws/index.d.ts","./srv/api/ws/types.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/command-options.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/lua-script.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/index.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ACL_CAT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ACL_DELUSER.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ACL_DRYRUN.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ACL_GENPASS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ACL_GETUSER.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ACL_LIST.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ACL_LOAD.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ACL_LOG_RESET.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ACL_LOG.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ACL_SAVE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ACL_SETUSER.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ACL_USERS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ACL_WHOAMI.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ASKING.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/AUTH.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/BGREWRITEAOF.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/BGSAVE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLIENT_CACHING.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLIENT_GETNAME.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLIENT_GETREDIR.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLIENT_ID.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLIENT_KILL.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLIENT_INFO.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLIENT_LIST.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLIENT_NO-EVICT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLIENT_NO-TOUCH.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLIENT_PAUSE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLIENT_SETNAME.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLIENT_TRACKING.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLIENT_TRACKINGINFO.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLIENT_UNPAUSE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLUSTER_ADDSLOTS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/generic-transformers.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLUSTER_ADDSLOTSRANGE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLUSTER_BUMPEPOCH.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLUSTER_COUNT-FAILURE-REPORTS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLUSTER_COUNTKEYSINSLOT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLUSTER_DELSLOTS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLUSTER_DELSLOTSRANGE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLUSTER_FAILOVER.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLUSTER_FLUSHSLOTS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLUSTER_FORGET.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLUSTER_GETKEYSINSLOT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLUSTER_INFO.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLUSTER_KEYSLOT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLUSTER_LINKS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLUSTER_MEET.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLUSTER_MYID.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLUSTER_MYSHARDID.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLUSTER_NODES.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLUSTER_REPLICAS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLUSTER_REPLICATE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLUSTER_RESET.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLUSTER_SAVECONFIG.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLUSTER_SET-CONFIG-EPOCH.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLUSTER_SETSLOT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CLUSTER_SLOTS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/COMMAND_COUNT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/COMMAND_GETKEYS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/COMMAND_GETKEYSANDFLAGS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/COMMAND_INFO.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/COMMAND_LIST.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/COMMAND.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CONFIG_GET.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CONFIG_RESETSTAT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CONFIG_REWRITE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/CONFIG_SET.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/DBSIZE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/DISCARD.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ECHO.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/FAILOVER.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/FLUSHALL.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/FLUSHDB.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/FUNCTION_DELETE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/FUNCTION_DUMP.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/FUNCTION_FLUSH.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/FUNCTION_KILL.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/FUNCTION_LIST_WITHCODE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/FUNCTION_LIST.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/FUNCTION_LOAD.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/FUNCTION_RESTORE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/FUNCTION_STATS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HELLO.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/INFO.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/KEYS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/LASTSAVE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/LATENCY_DOCTOR.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/LATENCY_GRAPH.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/LATENCY_HISTORY.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/LATENCY_LATEST.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/LOLWUT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/MEMORY_DOCTOR.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/MEMORY_MALLOC-STATS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/MEMORY_PURGE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/MEMORY_STATS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/MEMORY_USAGE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/MODULE_LIST.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/MODULE_LOAD.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/MODULE_UNLOAD.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/MOVE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/PING.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/PUBSUB_CHANNELS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/PUBSUB_NUMPAT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/PUBSUB_NUMSUB.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/PUBSUB_SHARDCHANNELS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/PUBSUB_SHARDNUMSUB.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/RANDOMKEY.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/READONLY.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/READWRITE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/REPLICAOF.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/RESTORE-ASKING.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ROLE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SAVE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SCAN.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SCRIPT_DEBUG.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SCRIPT_EXISTS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SCRIPT_FLUSH.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SCRIPT_KILL.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SCRIPT_LOAD.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SHUTDOWN.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SWAPDB.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/TIME.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/UNWATCH.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/WAIT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/APPEND.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/BITCOUNT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/BITFIELD.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/BITFIELD_RO.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/BITOP.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/BITPOS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/BLMOVE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/LMPOP.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/BLMPOP.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/BLPOP.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/BRPOP.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/BRPOPLPUSH.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZMPOP.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/BZMPOP.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/BZPOPMAX.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/BZPOPMIN.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/COPY.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/DECR.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/DECRBY.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/DEL.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/DUMP.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/EVAL_RO.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/EVAL.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/EVALSHA.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/EVALSHA_RO.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/EXISTS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/EXPIRE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/EXPIREAT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/EXPIRETIME.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/FCALL_RO.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/FCALL.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/GEOADD.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/GEODIST.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/GEOHASH.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/GEOPOS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/GEORADIUS_RO.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/GEORADIUS_RO_WITH.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/GEORADIUS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/GEORADIUS_WITH.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/GEORADIUSBYMEMBER_RO.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/GEORADIUSBYMEMBER_RO_WITH.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/GEORADIUSBYMEMBER.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/GEORADIUSBYMEMBER_WITH.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/GEORADIUSBYMEMBERSTORE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/GEORADIUSSTORE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/GEOSEARCH.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/GEOSEARCH_WITH.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/GEOSEARCHSTORE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/GET.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/GETBIT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/GETDEL.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/GETEX.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/GETRANGE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/GETSET.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HDEL.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HEXISTS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HEXPIRE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HEXPIREAT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HEXPIRETIME.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HGET.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HGETALL.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HINCRBY.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HINCRBYFLOAT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HKEYS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HLEN.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HMGET.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HPERSIST.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HPEXPIRE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HPEXPIREAT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HPEXPIRETIME.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HPTTL.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HRANDFIELD.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HRANDFIELD_COUNT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HRANDFIELD_COUNT_WITHVALUES.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HSCAN.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HSCAN_NOVALUES.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HSET.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HSETNX.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HSTRLEN.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HTTL.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/HVALS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/INCR.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/INCRBY.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/INCRBYFLOAT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/LCS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/LCS_IDX_WITHMATCHLEN.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/LCS_IDX.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/LCS_LEN.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/LINDEX.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/LINSERT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/LLEN.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/LMOVE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/LPOP_COUNT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/LPOP.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/LPOS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/LPOS_COUNT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/LPUSH.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/LPUSHX.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/LRANGE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/LREM.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/LSET.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/LTRIM.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/MGET.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/MIGRATE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/MSET.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/MSETNX.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/OBJECT_ENCODING.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/OBJECT_FREQ.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/OBJECT_IDLETIME.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/OBJECT_REFCOUNT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/PERSIST.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/PEXPIRE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/PEXPIREAT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/PEXPIRETIME.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/PFADD.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/PFCOUNT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/PFMERGE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/PSETEX.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/PTTL.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/PUBLISH.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/RENAME.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/RENAMENX.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/RESTORE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/RPOP_COUNT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/RPOP.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/RPOPLPUSH.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/RPUSH.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/RPUSHX.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SADD.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SCARD.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SDIFF.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SDIFFSTORE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SINTER.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SINTERCARD.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SINTERSTORE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SET.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SETBIT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SETEX.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SETNX.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SETRANGE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SISMEMBER.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SMEMBERS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SMISMEMBER.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SMOVE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SORT_RO.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SORT_STORE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SORT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SPOP.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SPUBLISH.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SRANDMEMBER.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SRANDMEMBER_COUNT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SREM.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SSCAN.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/STRLEN.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SUNION.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/SUNIONSTORE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/TOUCH.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/TTL.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/TYPE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/UNLINK.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/WATCH.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/XACK.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/XADD.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/XAUTOCLAIM.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/XAUTOCLAIM_JUSTID.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/XCLAIM.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/XCLAIM_JUSTID.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/XDEL.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/XGROUP_CREATE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/XGROUP_CREATECONSUMER.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/XGROUP_DELCONSUMER.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/XGROUP_DESTROY.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/XGROUP_SETID.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/XINFO_CONSUMERS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/XINFO_GROUPS.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/XINFO_STREAM.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/XLEN.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/XPENDING_RANGE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/XPENDING.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/XRANGE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/XREAD.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/XREADGROUP.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/XREVRANGE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/XSETID.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/XTRIM.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZADD.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZCARD.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZCOUNT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZDIFF.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZDIFF_WITHSCORES.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZDIFFSTORE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZINCRBY.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZINTER.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZINTER_WITHSCORES.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZINTERCARD.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZINTERSTORE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZLEXCOUNT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZMSCORE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZPOPMAX.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZPOPMAX_COUNT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZPOPMIN.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZPOPMIN_COUNT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZRANDMEMBER.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZRANDMEMBER_COUNT.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZRANDMEMBER_COUNT_WITHSCORES.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZRANGE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZRANGE_WITHSCORES.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZRANGEBYLEX.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZRANGEBYSCORE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZRANGEBYSCORE_WITHSCORES.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZRANGESTORE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZRANK.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZREM.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZREMRANGEBYLEX.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZREMRANGEBYRANK.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZREMRANGEBYSCORE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZREVRANK.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZSCAN.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZSCORE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZUNION.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZUNION_WITHSCORES.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/commands/ZUNIONSTORE.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/client/commands.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/client/socket.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/client/pub-sub.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/client/commands-queue.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/errors.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/multi-command.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/client/multi-command.d.ts","./node_modules/.pnpm/generic-pool@3.9.0/node_modules/generic-pool/index.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/client/index.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/cluster/commands.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/cluster/cluster-slots.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/cluster/multi-command.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/lib/cluster/index.d.ts","./node_modules/.pnpm/@redis+client@1.6.1/node_modules/@redis/client/dist/index.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/bloom/ADD.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/bloom/CARD.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/bloom/EXISTS.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/bloom/INFO.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/bloom/INSERT.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/bloom/LOADCHUNK.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/bloom/MADD.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/bloom/MEXISTS.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/bloom/RESERVE.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/bloom/SCANDUMP.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/count-min-sketch/INCRBY.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/count-min-sketch/INFO.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/count-min-sketch/INITBYDIM.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/count-min-sketch/INITBYPROB.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/count-min-sketch/MERGE.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/count-min-sketch/QUERY.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/cuckoo/ADD.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/cuckoo/ADDNX.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/cuckoo/COUNT.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/cuckoo/DEL.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/cuckoo/EXISTS.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/cuckoo/INFO.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/cuckoo/INSERTNX.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/cuckoo/LOADCHUNK.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/cuckoo/RESERVE.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/cuckoo/SCANDUMP.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/cuckoo/index.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/cuckoo/INSERT.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/t-digest/ADD.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/t-digest/BYREVRANK.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/t-digest/CDF.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/t-digest/CREATE.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/t-digest/INFO.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/t-digest/MAX.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/t-digest/MERGE.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/t-digest/MIN.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/t-digest/QUANTILE.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/t-digest/RANK.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/t-digest/RESET.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/t-digest/REVRANK.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/t-digest/TRIMMED_MEAN.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/t-digest/index.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/t-digest/BYRANK.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/top-k/ADD.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/top-k/COUNT.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/top-k/INCRBY.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/top-k/INFO.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/top-k/LIST_WITHCOUNT.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/top-k/LIST.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/top-k/QUERY.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/top-k/RESERVE.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/commands/index.d.ts","./node_modules/.pnpm/@redis+bloom@1.2.0_@redis+client@1.6.1/node_modules/@redis/bloom/dist/index.d.ts","./node_modules/.pnpm/@redis+graph@1.1.1_@redis+client@1.6.1/node_modules/@redis/graph/dist/commands/CONFIG_GET.d.ts","./node_modules/.pnpm/@redis+graph@1.1.1_@redis+client@1.6.1/node_modules/@redis/graph/dist/commands/CONFIG_SET.d.ts","./node_modules/.pnpm/@redis+graph@1.1.1_@redis+client@1.6.1/node_modules/@redis/graph/dist/commands/DELETE.d.ts","./node_modules/.pnpm/@redis+graph@1.1.1_@redis+client@1.6.1/node_modules/@redis/graph/dist/commands/EXPLAIN.d.ts","./node_modules/.pnpm/@redis+graph@1.1.1_@redis+client@1.6.1/node_modules/@redis/graph/dist/commands/LIST.d.ts","./node_modules/.pnpm/@redis+graph@1.1.1_@redis+client@1.6.1/node_modules/@redis/graph/dist/commands/PROFILE.d.ts","./node_modules/.pnpm/@redis+graph@1.1.1_@redis+client@1.6.1/node_modules/@redis/graph/dist/commands/QUERY.d.ts","./node_modules/.pnpm/@redis+graph@1.1.1_@redis+client@1.6.1/node_modules/@redis/graph/dist/commands/RO_QUERY.d.ts","./node_modules/.pnpm/@redis+graph@1.1.1_@redis+client@1.6.1/node_modules/@redis/graph/dist/commands/SLOWLOG.d.ts","./node_modules/.pnpm/@redis+graph@1.1.1_@redis+client@1.6.1/node_modules/@redis/graph/dist/commands/index.d.ts","./node_modules/.pnpm/@redis+graph@1.1.1_@redis+client@1.6.1/node_modules/@redis/graph/dist/graph.d.ts","./node_modules/.pnpm/@redis+graph@1.1.1_@redis+client@1.6.1/node_modules/@redis/graph/dist/index.d.ts","./node_modules/.pnpm/@redis+json@1.0.7_@redis+client@1.6.1/node_modules/@redis/json/dist/commands/ARRAPPEND.d.ts","./node_modules/.pnpm/@redis+json@1.0.7_@redis+client@1.6.1/node_modules/@redis/json/dist/commands/ARRINDEX.d.ts","./node_modules/.pnpm/@redis+json@1.0.7_@redis+client@1.6.1/node_modules/@redis/json/dist/commands/ARRINSERT.d.ts","./node_modules/.pnpm/@redis+json@1.0.7_@redis+client@1.6.1/node_modules/@redis/json/dist/commands/ARRLEN.d.ts","./node_modules/.pnpm/@redis+json@1.0.7_@redis+client@1.6.1/node_modules/@redis/json/dist/commands/ARRPOP.d.ts","./node_modules/.pnpm/@redis+json@1.0.7_@redis+client@1.6.1/node_modules/@redis/json/dist/commands/ARRTRIM.d.ts","./node_modules/.pnpm/@redis+json@1.0.7_@redis+client@1.6.1/node_modules/@redis/json/dist/commands/DEBUG_MEMORY.d.ts","./node_modules/.pnpm/@redis+json@1.0.7_@redis+client@1.6.1/node_modules/@redis/json/dist/commands/DEL.d.ts","./node_modules/.pnpm/@redis+json@1.0.7_@redis+client@1.6.1/node_modules/@redis/json/dist/commands/FORGET.d.ts","./node_modules/.pnpm/@redis+json@1.0.7_@redis+client@1.6.1/node_modules/@redis/json/dist/commands/GET.d.ts","./node_modules/.pnpm/@redis+json@1.0.7_@redis+client@1.6.1/node_modules/@redis/json/dist/commands/MERGE.d.ts","./node_modules/.pnpm/@redis+json@1.0.7_@redis+client@1.6.1/node_modules/@redis/json/dist/commands/MGET.d.ts","./node_modules/.pnpm/@redis+json@1.0.7_@redis+client@1.6.1/node_modules/@redis/json/dist/commands/MSET.d.ts","./node_modules/.pnpm/@redis+json@1.0.7_@redis+client@1.6.1/node_modules/@redis/json/dist/commands/NUMINCRBY.d.ts","./node_modules/.pnpm/@redis+json@1.0.7_@redis+client@1.6.1/node_modules/@redis/json/dist/commands/NUMMULTBY.d.ts","./node_modules/.pnpm/@redis+json@1.0.7_@redis+client@1.6.1/node_modules/@redis/json/dist/commands/OBJKEYS.d.ts","./node_modules/.pnpm/@redis+json@1.0.7_@redis+client@1.6.1/node_modules/@redis/json/dist/commands/OBJLEN.d.ts","./node_modules/.pnpm/@redis+json@1.0.7_@redis+client@1.6.1/node_modules/@redis/json/dist/commands/RESP.d.ts","./node_modules/.pnpm/@redis+json@1.0.7_@redis+client@1.6.1/node_modules/@redis/json/dist/commands/SET.d.ts","./node_modules/.pnpm/@redis+json@1.0.7_@redis+client@1.6.1/node_modules/@redis/json/dist/commands/STRAPPEND.d.ts","./node_modules/.pnpm/@redis+json@1.0.7_@redis+client@1.6.1/node_modules/@redis/json/dist/commands/STRLEN.d.ts","./node_modules/.pnpm/@redis+json@1.0.7_@redis+client@1.6.1/node_modules/@redis/json/dist/commands/TYPE.d.ts","./node_modules/.pnpm/@redis+json@1.0.7_@redis+client@1.6.1/node_modules/@redis/json/dist/commands/index.d.ts","./node_modules/.pnpm/@redis+json@1.0.7_@redis+client@1.6.1/node_modules/@redis/json/dist/index.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/_LIST.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/ALTER.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/AGGREGATE.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/AGGREGATE_WITHCURSOR.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/ALIASADD.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/ALIASDEL.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/ALIASUPDATE.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/CONFIG_GET.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/CONFIG_SET.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/CREATE.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/CURSOR_DEL.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/CURSOR_READ.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/DICTADD.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/DICTDEL.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/DICTDUMP.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/DROPINDEX.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/EXPLAIN.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/EXPLAINCLI.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/INFO.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/SEARCH.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/PROFILE_SEARCH.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/PROFILE_AGGREGATE.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/SEARCH_NOCONTENT.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/SPELLCHECK.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/SUGADD.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/SUGDEL.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/SUGGET.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/SUGGET_WITHPAYLOADS.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/SUGGET_WITHSCORES.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/SUGGET_WITHSCORES_WITHPAYLOADS.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/SUGLEN.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/SYNDUMP.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/SYNUPDATE.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/TAGVALS.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/commands/index.d.ts","./node_modules/.pnpm/@redis+search@1.2.0_@redis+client@1.6.1/node_modules/@redis/search/dist/index.d.ts","./node_modules/.pnpm/@redis+time-series@1.1.0_@redis+client@1.6.1/node_modules/@redis/time-series/dist/commands/ADD.d.ts","./node_modules/.pnpm/@redis+time-series@1.1.0_@redis+client@1.6.1/node_modules/@redis/time-series/dist/commands/ALTER.d.ts","./node_modules/.pnpm/@redis+time-series@1.1.0_@redis+client@1.6.1/node_modules/@redis/time-series/dist/commands/CREATE.d.ts","./node_modules/.pnpm/@redis+time-series@1.1.0_@redis+client@1.6.1/node_modules/@redis/time-series/dist/commands/CREATERULE.d.ts","./node_modules/.pnpm/@redis+time-series@1.1.0_@redis+client@1.6.1/node_modules/@redis/time-series/dist/commands/DECRBY.d.ts","./node_modules/.pnpm/@redis+time-series@1.1.0_@redis+client@1.6.1/node_modules/@redis/time-series/dist/commands/DEL.d.ts","./node_modules/.pnpm/@redis+time-series@1.1.0_@redis+client@1.6.1/node_modules/@redis/time-series/dist/commands/DELETERULE.d.ts","./node_modules/.pnpm/@redis+time-series@1.1.0_@redis+client@1.6.1/node_modules/@redis/time-series/dist/commands/GET.d.ts","./node_modules/.pnpm/@redis+time-series@1.1.0_@redis+client@1.6.1/node_modules/@redis/time-series/dist/commands/INCRBY.d.ts","./node_modules/.pnpm/@redis+time-series@1.1.0_@redis+client@1.6.1/node_modules/@redis/time-series/dist/commands/INFO.d.ts","./node_modules/.pnpm/@redis+time-series@1.1.0_@redis+client@1.6.1/node_modules/@redis/time-series/dist/commands/INFO_DEBUG.d.ts","./node_modules/.pnpm/@redis+time-series@1.1.0_@redis+client@1.6.1/node_modules/@redis/time-series/dist/commands/MADD.d.ts","./node_modules/.pnpm/@redis+time-series@1.1.0_@redis+client@1.6.1/node_modules/@redis/time-series/dist/commands/MGET.d.ts","./node_modules/.pnpm/@redis+time-series@1.1.0_@redis+client@1.6.1/node_modules/@redis/time-series/dist/commands/MGET_WITHLABELS.d.ts","./node_modules/.pnpm/@redis+time-series@1.1.0_@redis+client@1.6.1/node_modules/@redis/time-series/dist/commands/QUERYINDEX.d.ts","./node_modules/.pnpm/@redis+time-series@1.1.0_@redis+client@1.6.1/node_modules/@redis/time-series/dist/commands/RANGE.d.ts","./node_modules/.pnpm/@redis+time-series@1.1.0_@redis+client@1.6.1/node_modules/@redis/time-series/dist/commands/REVRANGE.d.ts","./node_modules/.pnpm/@redis+time-series@1.1.0_@redis+client@1.6.1/node_modules/@redis/time-series/dist/commands/MRANGE.d.ts","./node_modules/.pnpm/@redis+time-series@1.1.0_@redis+client@1.6.1/node_modules/@redis/time-series/dist/commands/MRANGE_WITHLABELS.d.ts","./node_modules/.pnpm/@redis+time-series@1.1.0_@redis+client@1.6.1/node_modules/@redis/time-series/dist/commands/MREVRANGE.d.ts","./node_modules/.pnpm/@redis+time-series@1.1.0_@redis+client@1.6.1/node_modules/@redis/time-series/dist/commands/MREVRANGE_WITHLABELS.d.ts","./node_modules/.pnpm/@redis+time-series@1.1.0_@redis+client@1.6.1/node_modules/@redis/time-series/dist/commands/index.d.ts","./node_modules/.pnpm/@redis+time-series@1.1.0_@redis+client@1.6.1/node_modules/@redis/time-series/dist/index.d.ts","./node_modules/.pnpm/redis@4.7.1/node_modules/redis/dist/index.d.ts","./srv/api/ws/bus.ts","./srv/queue/presence.ts","./srv/api/ws/handlers.ts","./srv/api/ws/handle.ts","./srv/api/ws/setup.ts","./srv/api/ws/index.ts","./srv/db/invite.ts","./node_modules/.pnpm/evtstore@12.0.1/node_modules/evtstore/src/types.ts","./node_modules/.pnpm/evtstore@12.0.1/node_modules/evtstore/src/common.ts","./node_modules/.pnpm/evtstore@12.0.1/node_modules/evtstore/provider/util.ts","./node_modules/.pnpm/evtstore@12.0.1/node_modules/evtstore/src/event-handler.ts","./node_modules/.pnpm/evtstore@12.0.1/node_modules/evtstore/src/create-aggregate.ts","./node_modules/.pnpm/evtstore@12.0.1/node_modules/evtstore/src/domain.ts","./node_modules/.pnpm/evtstore@12.0.1/node_modules/evtstore/src/create-handler.ts","./node_modules/.pnpm/evtstore@12.0.1/node_modules/evtstore/src/create-bookmark.ts","./node_modules/.pnpm/evtstore@12.0.1/node_modules/evtstore/src/domain-v2.ts","./node_modules/.pnpm/evtstore@12.0.1/node_modules/evtstore/src/create-command.ts","./node_modules/.pnpm/evtstore@12.0.1/node_modules/evtstore/provider/error.ts","./node_modules/.pnpm/evtstore@12.0.1/node_modules/evtstore/index.d.ts","./node_modules/.pnpm/evtstore@12.0.1/node_modules/evtstore/provider/mongo.ts","./srv/domains/billing/types.ts","./srv/domains/billing/agg.ts","./srv/domains/subs/types.ts","./srv/domains/subs/agg.ts","./srv/domains/patreons/types.ts","./srv/domains/patreons/index.ts","./srv/domains/domain.ts","./srv/domains/billing/cmd.ts","./srv/domains/patreons/cmd.ts","./srv/domains/subs/cmd.ts","./srv/domains/index.ts","./common/publish.ts","./srv/db/admin.ts","./srv/db/presets.ts","./srv/db/messages.ts","./srv/db/memory.ts","./srv/db/shop.ts","./srv/db/matches.ts","./srv/db/reports.ts","./srv/db/subscriptions.ts","./srv/db/credits.ts","./srv/db/scenario.ts","./srv/db/announcements.ts","./srv/db/promo.ts","./srv/db/notifications.ts","./srv/db/index.ts","./srv/api/billing/stripe.ts","./node_modules/.pnpm/@types+needle@3.3.0/node_modules/@types/needle/index.d.ts","./srv/api/user/patreon.ts","./srv/adapter/register.ts","./srv/db/user.ts","./srv/db/oauth.ts","./srv/middleware.ts","./srv/api/auth.ts","./srv/api/chat/create.ts","./common/requests/util.ts","./srv/api/chat/common.ts","./srv/api/chat/edit.ts","./srv/api/chat/get.ts","./srv/api/chat/guest-msg.ts","./srv/image/types.ts","./node_modules/.pnpm/@types+adm-zip@0.5.7/node_modules/@types/adm-zip/util.d.ts","./node_modules/.pnpm/@types+adm-zip@0.5.7/node_modules/@types/adm-zip/index.d.ts","./common/image.ts","./srv/image/novel.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/abort-handler.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/abort.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/auth/auth.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/auth/HttpApiKeyAuth.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/identity/identity.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/response.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/command.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/endpoint.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/feature-ids.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/logger.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/uri.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/http.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/util.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/middleware.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/auth/HttpSigner.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/auth/IdentityProviderConfig.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/auth/HttpAuthScheme.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/auth/HttpAuthSchemeProvider.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/auth/index.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/transform/exact.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/externals-check/browser-externals-check.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/blob/blob-payload-input-types.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/crypto.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/checksum.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/client.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/connection/config.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/transfer.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/connection/manager.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/connection/pool.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/connection/index.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/eventStream.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/encode.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/endpoints/shared.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/endpoints/EndpointRuleObject.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/endpoints/ErrorRuleObject.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/endpoints/TreeRuleObject.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/endpoints/RuleSetObject.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/endpoints/index.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/extensions/checksum.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/extensions/defaultClientConfiguration.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/shapes.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/retry.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/extensions/retry.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/extensions/defaultExtensionConfiguration.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/extensions/index.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/http/httpHandlerInitialization.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/identity/apiKeyIdentity.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/identity/awsCredentialIdentity.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/identity/tokenIdentity.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/identity/index.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/pagination.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/profile.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/serde.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/signature.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/stream.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/streaming-payload/streaming-blob-common-types.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/streaming-payload/streaming-blob-payload-input-types.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/streaming-payload/streaming-blob-payload-output-types.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/transform/type-transform.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/transform/client-method-transforms.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/transform/client-payload-blob-type-narrow.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/transform/no-undefined.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/waiter.d.ts","./node_modules/.pnpm/@smithy+types@4.2.0/node_modules/@smithy/types/dist-types/index.d.ts","./node_modules/.pnpm/@smithy+node-config-provider@4.1.1/node_modules/@smithy/node-config-provider/dist-types/fromEnv.d.ts","./node_modules/.pnpm/@smithy+shared-ini-file-loader@4.0.2/node_modules/@smithy/shared-ini-file-loader/dist-types/getHomeDir.d.ts","./node_modules/.pnpm/@smithy+shared-ini-file-loader@4.0.2/node_modules/@smithy/shared-ini-file-loader/dist-types/getProfileName.d.ts","./node_modules/.pnpm/@smithy+shared-ini-file-loader@4.0.2/node_modules/@smithy/shared-ini-file-loader/dist-types/getSSOTokenFilepath.d.ts","./node_modules/.pnpm/@smithy+shared-ini-file-loader@4.0.2/node_modules/@smithy/shared-ini-file-loader/dist-types/getSSOTokenFromFile.d.ts","./node_modules/.pnpm/@smithy+shared-ini-file-loader@4.0.2/node_modules/@smithy/shared-ini-file-loader/dist-types/loadSharedConfigFiles.d.ts","./node_modules/.pnpm/@smithy+shared-ini-file-loader@4.0.2/node_modules/@smithy/shared-ini-file-loader/dist-types/loadSsoSessionData.d.ts","./node_modules/.pnpm/@smithy+shared-ini-file-loader@4.0.2/node_modules/@smithy/shared-ini-file-loader/dist-types/parseKnownFiles.d.ts","./node_modules/.pnpm/@smithy+shared-ini-file-loader@4.0.2/node_modules/@smithy/shared-ini-file-loader/dist-types/types.d.ts","./node_modules/.pnpm/@smithy+shared-ini-file-loader@4.0.2/node_modules/@smithy/shared-ini-file-loader/dist-types/index.d.ts","./node_modules/.pnpm/@smithy+node-config-provider@4.1.1/node_modules/@smithy/node-config-provider/dist-types/fromSharedConfigFiles.d.ts","./node_modules/.pnpm/@smithy+node-config-provider@4.1.1/node_modules/@smithy/node-config-provider/dist-types/fromStatic.d.ts","./node_modules/.pnpm/@smithy+node-config-provider@4.1.1/node_modules/@smithy/node-config-provider/dist-types/configLoader.d.ts","./node_modules/.pnpm/@smithy+node-config-provider@4.1.1/node_modules/@smithy/node-config-provider/dist-types/index.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-flexible-checksums@3.806.0/node_modules/@aws-sdk/middleware-flexible-checksums/dist-types/constants.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-flexible-checksums@3.806.0/node_modules/@aws-sdk/middleware-flexible-checksums/dist-types/NODE_REQUEST_CHECKSUM_CALCULATION_CONFIG_OPTIONS.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-flexible-checksums@3.806.0/node_modules/@aws-sdk/middleware-flexible-checksums/dist-types/NODE_RESPONSE_CHECKSUM_VALIDATION_CONFIG_OPTIONS.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-flexible-checksums@3.806.0/node_modules/@aws-sdk/middleware-flexible-checksums/dist-types/crc64-nvme-crt-container.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-flexible-checksums@3.806.0/node_modules/@aws-sdk/middleware-flexible-checksums/dist-types/configuration.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-flexible-checksums@3.806.0/node_modules/@aws-sdk/middleware-flexible-checksums/dist-types/flexibleChecksumsMiddleware.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-flexible-checksums@3.806.0/node_modules/@aws-sdk/middleware-flexible-checksums/dist-types/flexibleChecksumsInputMiddleware.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-flexible-checksums@3.806.0/node_modules/@aws-sdk/middleware-flexible-checksums/dist-types/flexibleChecksumsResponseMiddleware.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-flexible-checksums@3.806.0/node_modules/@aws-sdk/middleware-flexible-checksums/dist-types/getFlexibleChecksumsPlugin.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-flexible-checksums@3.806.0/node_modules/@aws-sdk/middleware-flexible-checksums/dist-types/resolveFlexibleChecksumsConfig.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-flexible-checksums@3.806.0/node_modules/@aws-sdk/middleware-flexible-checksums/dist-types/index.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-host-header@3.804.0/node_modules/@aws-sdk/middleware-host-header/dist-types/index.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-sdk-s3@3.806.0/node_modules/@aws-sdk/middleware-sdk-s3/dist-types/check-content-length-header.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-sdk-s3@3.806.0/node_modules/@aws-sdk/middleware-sdk-s3/dist-types/region-redirect-middleware.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-sdk-s3@3.806.0/node_modules/@aws-sdk/middleware-sdk-s3/dist-types/region-redirect-endpoint-middleware.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-sdk-s3@3.806.0/node_modules/@aws-sdk/middleware-sdk-s3/dist-types/s3-expires-middleware.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/abort.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/auth.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/blob/blob-types.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/checksum.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/client.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/command.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/connection.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/identity/Identity.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/identity/AnonymousIdentity.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/feature-ids.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/identity/AwsCredentialIdentity.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/identity/LoginIdentity.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/identity/TokenIdentity.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/identity/index.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/util.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/credentials.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/crypto.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/dns.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/encode.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/endpoint.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/eventStream.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/extensions/index.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/function.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/http.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/logger.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/middleware.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/pagination.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/profile.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/request.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/response.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/retry.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/serde.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/shapes.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/signature.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/stream.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/token.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/transfer.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/uri.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/waiter.d.ts","./node_modules/.pnpm/@aws-sdk+types@3.804.0/node_modules/@aws-sdk/types/dist-types/index.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-sdk-s3@3.806.0/node_modules/@aws-sdk/middleware-sdk-s3/dist-types/s3-express/interfaces/S3ExpressIdentity.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-sdk-s3@3.806.0/node_modules/@aws-sdk/middleware-sdk-s3/dist-types/s3-express/classes/S3ExpressIdentityCacheEntry.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-sdk-s3@3.806.0/node_modules/@aws-sdk/middleware-sdk-s3/dist-types/s3-express/classes/S3ExpressIdentityCache.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-sdk-s3@3.806.0/node_modules/@aws-sdk/middleware-sdk-s3/dist-types/s3-express/interfaces/S3ExpressIdentityProvider.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-sdk-s3@3.806.0/node_modules/@aws-sdk/middleware-sdk-s3/dist-types/s3-express/classes/S3ExpressIdentityProviderImpl.d.ts","./node_modules/.pnpm/@smithy+signature-v4@5.1.0/node_modules/@smithy/signature-v4/dist-types/SignatureV4Base.d.ts","./node_modules/.pnpm/@smithy+signature-v4@5.1.0/node_modules/@smithy/signature-v4/dist-types/SignatureV4.d.ts","./node_modules/.pnpm/@smithy+signature-v4@5.1.0/node_modules/@smithy/signature-v4/dist-types/constants.d.ts","./node_modules/.pnpm/@smithy+signature-v4@5.1.0/node_modules/@smithy/signature-v4/dist-types/getCanonicalHeaders.d.ts","./node_modules/.pnpm/@smithy+signature-v4@5.1.0/node_modules/@smithy/signature-v4/dist-types/getCanonicalQuery.d.ts","./node_modules/.pnpm/@smithy+signature-v4@5.1.0/node_modules/@smithy/signature-v4/dist-types/getPayloadHash.d.ts","./node_modules/.pnpm/@smithy+signature-v4@5.1.0/node_modules/@smithy/signature-v4/dist-types/moveHeadersToQuery.d.ts","./node_modules/.pnpm/@smithy+signature-v4@5.1.0/node_modules/@smithy/signature-v4/dist-types/prepareRequest.d.ts","./node_modules/.pnpm/@smithy+signature-v4@5.1.0/node_modules/@smithy/signature-v4/dist-types/credentialDerivation.d.ts","./node_modules/.pnpm/@smithy+signature-v4@5.1.0/node_modules/@smithy/signature-v4/dist-types/headerUtil.d.ts","./node_modules/.pnpm/@smithy+signature-v4@5.1.0/node_modules/@smithy/signature-v4/dist-types/signature-v4a-container.d.ts","./node_modules/.pnpm/@smithy+signature-v4@5.1.0/node_modules/@smithy/signature-v4/dist-types/index.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-sdk-s3@3.806.0/node_modules/@aws-sdk/middleware-sdk-s3/dist-types/s3-express/classes/SignatureV4S3Express.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-sdk-s3@3.806.0/node_modules/@aws-sdk/middleware-sdk-s3/dist-types/s3-express/constants.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-sdk-s3@3.806.0/node_modules/@aws-sdk/middleware-sdk-s3/dist-types/s3-express/functions/s3ExpressMiddleware.d.ts","./node_modules/.pnpm/@smithy+protocol-http@5.1.0/node_modules/@smithy/protocol-http/dist-types/httpRequest.d.ts","./node_modules/.pnpm/@smithy+protocol-http@5.1.0/node_modules/@smithy/protocol-http/dist-types/httpResponse.d.ts","./node_modules/.pnpm/@smithy+protocol-http@5.1.0/node_modules/@smithy/protocol-http/dist-types/httpHandler.d.ts","./node_modules/.pnpm/@smithy+protocol-http@5.1.0/node_modules/@smithy/protocol-http/dist-types/extensions/httpExtensionConfiguration.d.ts","./node_modules/.pnpm/@smithy+protocol-http@5.1.0/node_modules/@smithy/protocol-http/dist-types/extensions/index.d.ts","./node_modules/.pnpm/@smithy+protocol-http@5.1.0/node_modules/@smithy/protocol-http/dist-types/Field.d.ts","./node_modules/.pnpm/@smithy+protocol-http@5.1.0/node_modules/@smithy/protocol-http/dist-types/Fields.d.ts","./node_modules/.pnpm/@smithy+protocol-http@5.1.0/node_modules/@smithy/protocol-http/dist-types/isValidHostname.d.ts","./node_modules/.pnpm/@smithy+protocol-http@5.1.0/node_modules/@smithy/protocol-http/dist-types/types.d.ts","./node_modules/.pnpm/@smithy+protocol-http@5.1.0/node_modules/@smithy/protocol-http/dist-types/index.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-sdk-s3@3.806.0/node_modules/@aws-sdk/middleware-sdk-s3/dist-types/s3-express/functions/s3ExpressHttpSigningMiddleware.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-sdk-s3@3.806.0/node_modules/@aws-sdk/middleware-sdk-s3/dist-types/s3-express/index.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-sdk-s3@3.806.0/node_modules/@aws-sdk/middleware-sdk-s3/dist-types/s3Configuration.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-sdk-s3@3.806.0/node_modules/@aws-sdk/middleware-sdk-s3/dist-types/throw-200-exceptions.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-sdk-s3@3.806.0/node_modules/@aws-sdk/middleware-sdk-s3/dist-types/validate-bucket-name.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-sdk-s3@3.806.0/node_modules/@aws-sdk/middleware-sdk-s3/dist-types/index.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-user-agent@3.806.0/node_modules/@aws-sdk/middleware-user-agent/dist-types/configurations.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-user-agent@3.806.0/node_modules/@aws-sdk/middleware-user-agent/dist-types/user-agent-middleware.d.ts","./node_modules/.pnpm/@aws-sdk+middleware-user-agent@3.806.0/node_modules/@aws-sdk/middleware-user-agent/dist-types/index.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/abort-handler.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/abort.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/auth/auth.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/auth/HttpApiKeyAuth.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/identity/identity.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/response.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/command.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/endpoint.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/feature-ids.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/logger.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/uri.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/http.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/util.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/middleware.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/auth/HttpSigner.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/auth/IdentityProviderConfig.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/auth/HttpAuthScheme.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/auth/HttpAuthSchemeProvider.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/auth/index.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/transform/exact.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/externals-check/browser-externals-check.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/blob/blob-payload-input-types.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/crypto.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/checksum.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/client.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/connection/config.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/transfer.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/connection/manager.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/connection/pool.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/connection/index.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/eventStream.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/encode.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/endpoints/shared.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/endpoints/EndpointRuleObject.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/endpoints/ErrorRuleObject.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/endpoints/TreeRuleObject.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/endpoints/RuleSetObject.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/endpoints/index.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/extensions/checksum.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/extensions/defaultClientConfiguration.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/shapes.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/retry.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/extensions/retry.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/extensions/defaultExtensionConfiguration.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/extensions/index.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/http/httpHandlerInitialization.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/identity/apiKeyIdentity.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/identity/awsCredentialIdentity.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/identity/tokenIdentity.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/identity/index.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/pagination.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/profile.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/serde.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/schema/sentinels.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/schema/static-schemas.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/schema/traits.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/schema/schema.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/schema/schema-deprecated.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/signature.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/stream.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/streaming-payload/streaming-blob-common-types.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/streaming-payload/streaming-blob-payload-input-types.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/streaming-payload/streaming-blob-payload-output-types.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/transform/type-transform.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/transform/client-method-transforms.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/transform/client-payload-blob-type-narrow.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/transform/mutable.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/transform/no-undefined.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/waiter.d.ts","./node_modules/.pnpm/@smithy+types@4.15.0/node_modules/@smithy/types/dist-types/index.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/config/property-provider/ProviderError.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/config/property-provider/CredentialsProviderError.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/config/property-provider/TokenProviderError.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/config/property-provider/chain.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/config/property-provider/fromValue.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/config/property-provider/memoize.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/config/util-config-provider/types.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/config/util-config-provider/booleanSelector.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/config/util-config-provider/numberSelector.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/config/shared-ini-file-loader/getHomeDir.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/config/shared-ini-file-loader/getProfileName.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/config/shared-ini-file-loader/getSSOTokenFilepath.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/config/shared-ini-file-loader/getSSOTokenFromFile.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/config/shared-ini-file-loader/constants.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/config/shared-ini-file-loader/loadSharedConfigFiles.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/config/shared-ini-file-loader/loadSsoSessionData.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/config/shared-ini-file-loader/parseKnownFiles.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/config/shared-ini-file-loader/externalDataInterceptor.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/config/shared-ini-file-loader/types.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/config/shared-ini-file-loader/readFile.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/config/node-config-provider/fromEnv.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/config/node-config-provider/fromSharedConfigFiles.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/config/node-config-provider/fromStatic.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/config/node-config-provider/configLoader.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/config/config-resolver/endpointsConfig/NodeUseDualstackEndpointConfigOptions.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/config/config-resolver/endpointsConfig/NodeUseFipsEndpointConfigOptions.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/config/config-resolver/endpointsConfig/resolveEndpointsConfig.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/config/config-resolver/endpointsConfig/resolveCustomEndpointsConfig.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/config/config-resolver/regionConfig/config.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/config/config-resolver/regionConfig/resolveRegionConfig.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/config/config-resolver/regionInfo/EndpointVariantTag.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/config/config-resolver/regionInfo/EndpointVariant.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/config/config-resolver/regionInfo/PartitionHash.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/config/config-resolver/regionInfo/RegionHash.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/config/config-resolver/regionInfo/getRegionInfo.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/client/middleware-stack/MiddlewareStack.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/transport/getSmithyContext.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/transport/httpRequest.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/transport/httpResponse.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/transport/isValidHostLabel.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/transport/isValidHostname.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/transport/normalizeProvider.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/transport/parseQueryString.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/transport/parseUrl.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/transport/toEndpointV1.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/transport/index.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/client/invalid-dependency/invalidFunction.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/client/invalid-dependency/invalidProvider.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/client/util-waiter/waiter.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/client/util-waiter/createWaiter.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/client/smithy-client/client.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/client/smithy-client/command.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/client/smithy-client/constants.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/client/smithy-client/create-aggregated-client.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/client/smithy-client/default-error-handler.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/client/smithy-client/defaults-mode.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/client/smithy-client/emitWarningIfUnsupportedVersion.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/client/smithy-client/exceptions.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/client/smithy-client/extensions/checksum.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/client/smithy-client/extensions/retry.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/client/smithy-client/extensions/defaultExtensionConfiguration.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/client/smithy-client/get-array-if-single-item.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/client/smithy-client/get-value-from-text-node.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/client/smithy-client/is-serializable-header-value.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/client/smithy-client/NoOpLogger.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/client/smithy-client/object-mapping.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/client/smithy-client/schemaLogFilter.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/client/smithy-client/ser-utils.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/client/smithy-client/serde-json.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/client/index.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/config/defaults-mode/resolveDefaultsModeConfig.d.ts","./node_modules/.pnpm/@smithy+core@3.25.1/node_modules/@smithy/core/dist-types/submodules/config/index.d.ts","./node_modules/.pnpm/@smithy+config-resolver@4.6.1/node_modules/@smithy/config-resolver/dist-types/index.d.ts","./node_modules/.pnpm/@smithy+eventstream-serde-config-resolver@4.1.0/node_modules/@smithy/eventstream-serde-config-resolver/dist-types/EventStreamSerdeConfig.d.ts","./node_modules/.pnpm/@smithy+eventstream-serde-config-resolver@4.1.0/node_modules/@smithy/eventstream-serde-config-resolver/dist-types/index.d.ts","./node_modules/.pnpm/@smithy+middleware-endpoint@4.1.4/node_modules/@smithy/middleware-endpoint/dist-types/resolveEndpointConfig.d.ts","./node_modules/.pnpm/@smithy+middleware-endpoint@4.1.4/node_modules/@smithy/middleware-endpoint/dist-types/types.d.ts","./node_modules/.pnpm/@smithy+middleware-endpoint@4.1.4/node_modules/@smithy/middleware-endpoint/dist-types/adaptors/getEndpointFromInstructions.d.ts","./node_modules/.pnpm/@smithy+middleware-endpoint@4.1.4/node_modules/@smithy/middleware-endpoint/dist-types/adaptors/toEndpointV1.d.ts","./node_modules/.pnpm/@smithy+middleware-endpoint@4.1.4/node_modules/@smithy/middleware-endpoint/dist-types/adaptors/index.d.ts","./node_modules/.pnpm/@smithy+middleware-endpoint@4.1.4/node_modules/@smithy/middleware-endpoint/dist-types/endpointMiddleware.d.ts","./node_modules/.pnpm/@smithy+middleware-endpoint@4.1.4/node_modules/@smithy/middleware-endpoint/dist-types/getEndpointPlugin.d.ts","./node_modules/.pnpm/@smithy+middleware-endpoint@4.1.4/node_modules/@smithy/middleware-endpoint/dist-types/index.d.ts","./node_modules/.pnpm/@smithy+util-retry@4.0.3/node_modules/@smithy/util-retry/dist-types/types.d.ts","./node_modules/.pnpm/@smithy+util-retry@4.0.3/node_modules/@smithy/util-retry/dist-types/AdaptiveRetryStrategy.d.ts","./node_modules/.pnpm/@smithy+util-retry@4.0.3/node_modules/@smithy/util-retry/dist-types/StandardRetryStrategy.d.ts","./node_modules/.pnpm/@smithy+util-retry@4.0.3/node_modules/@smithy/util-retry/dist-types/ConfiguredRetryStrategy.d.ts","./node_modules/.pnpm/@smithy+util-retry@4.0.3/node_modules/@smithy/util-retry/dist-types/DefaultRateLimiter.d.ts","./node_modules/.pnpm/@smithy+util-retry@4.0.3/node_modules/@smithy/util-retry/dist-types/config.d.ts","./node_modules/.pnpm/@smithy+util-retry@4.0.3/node_modules/@smithy/util-retry/dist-types/constants.d.ts","./node_modules/.pnpm/@smithy+util-retry@4.0.3/node_modules/@smithy/util-retry/dist-types/index.d.ts","./node_modules/.pnpm/@smithy+middleware-retry@4.1.5/node_modules/@smithy/middleware-retry/dist-types/types.d.ts","./node_modules/.pnpm/@smithy+middleware-retry@4.1.5/node_modules/@smithy/middleware-retry/dist-types/StandardRetryStrategy.d.ts","./node_modules/.pnpm/@smithy+middleware-retry@4.1.5/node_modules/@smithy/middleware-retry/dist-types/AdaptiveRetryStrategy.d.ts","./node_modules/.pnpm/@smithy+middleware-retry@4.1.5/node_modules/@smithy/middleware-retry/dist-types/configurations.d.ts","./node_modules/.pnpm/@smithy+middleware-retry@4.1.5/node_modules/@smithy/middleware-retry/dist-types/delayDecider.d.ts","./node_modules/.pnpm/@smithy+middleware-retry@4.1.5/node_modules/@smithy/middleware-retry/dist-types/omitRetryHeadersMiddleware.d.ts","./node_modules/.pnpm/@smithy+middleware-retry@4.1.5/node_modules/@smithy/middleware-retry/dist-types/retryDecider.d.ts","./node_modules/.pnpm/@smithy+middleware-retry@4.1.5/node_modules/@smithy/middleware-retry/dist-types/retryMiddleware.d.ts","./node_modules/.pnpm/@smithy+middleware-retry@4.1.5/node_modules/@smithy/middleware-retry/dist-types/index.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/client.d.ts","./node_modules/.pnpm/@smithy+util-stream@4.2.0/node_modules/@smithy/util-stream/dist-types/blob/Uint8ArrayBlobAdapter.d.ts","./node_modules/.pnpm/@smithy+util-stream@4.2.0/node_modules/@smithy/util-stream/dist-types/checksum/ChecksumStream.d.ts","./node_modules/.pnpm/@smithy+util-stream@4.2.0/node_modules/@smithy/util-stream/dist-types/checksum/ChecksumStream.browser.d.ts","./node_modules/.pnpm/@smithy+util-stream@4.2.0/node_modules/@smithy/util-stream/dist-types/checksum/createChecksumStream.browser.d.ts","./node_modules/.pnpm/@smithy+util-stream@4.2.0/node_modules/@smithy/util-stream/dist-types/checksum/createChecksumStream.d.ts","./node_modules/.pnpm/@smithy+util-stream@4.2.0/node_modules/@smithy/util-stream/dist-types/createBufferedReadable.d.ts","./node_modules/.pnpm/@smithy+util-stream@4.2.0/node_modules/@smithy/util-stream/dist-types/getAwsChunkedEncodingStream.d.ts","./node_modules/.pnpm/@smithy+util-stream@4.2.0/node_modules/@smithy/util-stream/dist-types/headStream.d.ts","./node_modules/.pnpm/@smithy+util-stream@4.2.0/node_modules/@smithy/util-stream/dist-types/sdk-stream-mixin.d.ts","./node_modules/.pnpm/@smithy+util-stream@4.2.0/node_modules/@smithy/util-stream/dist-types/splitStream.d.ts","./node_modules/.pnpm/@smithy+util-stream@4.2.0/node_modules/@smithy/util-stream/dist-types/stream-type-check.d.ts","./node_modules/.pnpm/@smithy+util-stream@4.2.0/node_modules/@smithy/util-stream/dist-types/index.d.ts","./node_modules/.pnpm/@smithy+core@3.3.1/node_modules/@smithy/core/dist-types/submodules/protocols/collect-stream-body.d.ts","./node_modules/.pnpm/@smithy+core@3.3.1/node_modules/@smithy/core/dist-types/submodules/protocols/extended-encode-uri-component.d.ts","./node_modules/.pnpm/@smithy+core@3.3.1/node_modules/@smithy/core/dist-types/submodules/protocols/requestBuilder.d.ts","./node_modules/.pnpm/@smithy+core@3.3.1/node_modules/@smithy/core/dist-types/submodules/protocols/resolve-path.d.ts","./node_modules/.pnpm/@smithy+core@3.3.1/node_modules/@smithy/core/dist-types/submodules/protocols/index.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/collect-stream-body.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/command.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/constants.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/create-aggregated-client.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/date-utils.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/default-error-handler.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/defaults-mode.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/emitWarningIfUnsupportedVersion.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/exceptions.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/extended-encode-uri-component.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/extensions/checksum.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/extensions/retry.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/extensions/defaultExtensionConfiguration.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/extensions/index.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/get-array-if-single-item.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/get-value-from-text-node.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/is-serializable-header-value.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/lazy-json.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/NoOpLogger.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/object-mapping.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/parse-utils.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/quote-header.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/resolve-path.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/ser-utils.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/serde-json.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/split-every.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/split-header.d.ts","./node_modules/.pnpm/@smithy+smithy-client@4.2.4/node_modules/@smithy/smithy-client/dist-types/index.d.ts","./node_modules/.pnpm/@aws-sdk+core@3.806.0/node_modules/@aws-sdk/core/dist-types/submodules/client/emitWarningIfUnsupportedVersion.d.ts","./node_modules/.pnpm/@aws-sdk+core@3.806.0/node_modules/@aws-sdk/core/dist-types/submodules/client/setCredentialFeature.d.ts","./node_modules/.pnpm/@aws-sdk+core@3.806.0/node_modules/@aws-sdk/core/dist-types/submodules/client/setFeature.d.ts","./node_modules/.pnpm/@aws-sdk+core@3.806.0/node_modules/@aws-sdk/core/dist-types/submodules/client/index.d.ts","./node_modules/.pnpm/@aws-sdk+core@3.806.0/node_modules/@aws-sdk/core/dist-types/submodules/httpAuthSchemes/aws_sdk/resolveAwsSdkSigV4AConfig.d.ts","./node_modules/.pnpm/@aws-sdk+core@3.806.0/node_modules/@aws-sdk/core/dist-types/submodules/httpAuthSchemes/aws_sdk/AwsSdkSigV4Signer.d.ts","./node_modules/.pnpm/@aws-sdk+core@3.806.0/node_modules/@aws-sdk/core/dist-types/submodules/httpAuthSchemes/aws_sdk/AwsSdkSigV4ASigner.d.ts","./node_modules/.pnpm/@aws-sdk+core@3.806.0/node_modules/@aws-sdk/core/dist-types/submodules/httpAuthSchemes/aws_sdk/NODE_AUTH_SCHEME_PREFERENCE_OPTIONS.d.ts","./node_modules/.pnpm/@aws-sdk+core@3.806.0/node_modules/@aws-sdk/core/dist-types/submodules/httpAuthSchemes/aws_sdk/resolveAwsSdkSigV4Config.d.ts","./node_modules/.pnpm/@aws-sdk+core@3.806.0/node_modules/@aws-sdk/core/dist-types/submodules/httpAuthSchemes/aws_sdk/index.d.ts","./node_modules/.pnpm/@aws-sdk+core@3.806.0/node_modules/@aws-sdk/core/dist-types/submodules/httpAuthSchemes/index.d.ts","./node_modules/.pnpm/@aws-sdk+core@3.806.0/node_modules/@aws-sdk/core/dist-types/submodules/protocols/coercing-serializers.d.ts","./node_modules/.pnpm/@aws-sdk+core@3.806.0/node_modules/@aws-sdk/core/dist-types/submodules/protocols/json/awsExpectUnion.d.ts","./node_modules/.pnpm/@aws-sdk+core@3.806.0/node_modules/@aws-sdk/core/dist-types/submodules/protocols/json/parseJsonBody.d.ts","./node_modules/.pnpm/@aws-sdk+core@3.806.0/node_modules/@aws-sdk/core/dist-types/submodules/protocols/xml/parseXmlBody.d.ts","./node_modules/.pnpm/@aws-sdk+core@3.806.0/node_modules/@aws-sdk/core/dist-types/submodules/protocols/index.d.ts","./node_modules/.pnpm/@aws-sdk+core@3.806.0/node_modules/@aws-sdk/core/dist-types/index.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/endpoint/EndpointParameters.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/auth/httpAuthSchemeProvider.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/models/S3ServiceException.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/models/models_0.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/AbortMultipartUploadCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/CompleteMultipartUploadCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/CopyObjectCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/CreateBucketCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/CreateBucketMetadataTableConfigurationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/CreateMultipartUploadCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/CreateSessionCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/DeleteBucketAnalyticsConfigurationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/DeleteBucketCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/DeleteBucketCorsCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/DeleteBucketEncryptionCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/DeleteBucketIntelligentTieringConfigurationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/DeleteBucketInventoryConfigurationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/DeleteBucketLifecycleCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/DeleteBucketMetadataTableConfigurationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/DeleteBucketMetricsConfigurationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/DeleteBucketOwnershipControlsCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/DeleteBucketPolicyCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/DeleteBucketReplicationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/DeleteBucketTaggingCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/DeleteBucketWebsiteCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/DeleteObjectCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/DeleteObjectsCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/DeleteObjectTaggingCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/DeletePublicAccessBlockCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetBucketAccelerateConfigurationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetBucketAclCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetBucketAnalyticsConfigurationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetBucketCorsCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetBucketEncryptionCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetBucketIntelligentTieringConfigurationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetBucketInventoryConfigurationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetBucketLifecycleConfigurationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetBucketLocationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetBucketLoggingCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetBucketMetadataTableConfigurationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetBucketMetricsConfigurationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetBucketNotificationConfigurationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetBucketOwnershipControlsCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetBucketPolicyCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetBucketPolicyStatusCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetBucketReplicationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetBucketRequestPaymentCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetBucketTaggingCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetBucketVersioningCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetBucketWebsiteCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetObjectAclCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetObjectAttributesCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetObjectCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetObjectLegalHoldCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetObjectLockConfigurationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetObjectRetentionCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetObjectTaggingCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetObjectTorrentCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/GetPublicAccessBlockCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/HeadBucketCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/HeadObjectCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/ListBucketAnalyticsConfigurationsCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/ListBucketIntelligentTieringConfigurationsCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/ListBucketInventoryConfigurationsCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/ListBucketMetricsConfigurationsCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/ListBucketsCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/ListDirectoryBucketsCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/ListMultipartUploadsCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/ListObjectsCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/ListObjectsV2Command.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/ListObjectVersionsCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/ListPartsCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/PutBucketAccelerateConfigurationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/PutBucketAclCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/PutBucketAnalyticsConfigurationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/models/models_1.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/PutBucketCorsCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/PutBucketEncryptionCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/PutBucketIntelligentTieringConfigurationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/PutBucketInventoryConfigurationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/PutBucketLifecycleConfigurationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/PutBucketLoggingCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/PutBucketMetricsConfigurationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/PutBucketNotificationConfigurationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/PutBucketOwnershipControlsCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/PutBucketPolicyCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/PutBucketReplicationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/PutBucketRequestPaymentCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/PutBucketTaggingCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/PutBucketVersioningCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/PutBucketWebsiteCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/PutObjectAclCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/PutObjectCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/PutObjectLegalHoldCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/PutObjectLockConfigurationCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/PutObjectRetentionCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/PutObjectTaggingCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/PutPublicAccessBlockCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/RestoreObjectCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/SelectObjectContentCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/UploadPartCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/UploadPartCopyCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/WriteGetObjectResponseCommand.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/auth/httpAuthExtensionConfiguration.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/extensionConfiguration.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/runtimeExtensions.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/S3Client.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/S3.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/commands/index.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/pagination/Interfaces.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/pagination/ListBucketsPaginator.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/pagination/ListDirectoryBucketsPaginator.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/pagination/ListObjectsV2Paginator.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/pagination/ListPartsPaginator.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/pagination/index.d.ts","./node_modules/.pnpm/@smithy+util-waiter@4.0.3/node_modules/@smithy/util-waiter/dist-types/waiter.d.ts","./node_modules/.pnpm/@smithy+util-waiter@4.0.3/node_modules/@smithy/util-waiter/dist-types/createWaiter.d.ts","./node_modules/.pnpm/@smithy+util-waiter@4.0.3/node_modules/@smithy/util-waiter/dist-types/index.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/waiters/waitForBucketExists.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/waiters/waitForBucketNotExists.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/waiters/waitForObjectExists.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/waiters/waitForObjectNotExists.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/waiters/index.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/models/index.d.ts","./node_modules/.pnpm/@aws-sdk+client-s3@3.806.0/node_modules/@aws-sdk/client-s3/dist-types/index.d.ts","./node_modules/.pnpm/mkdirp@2.1.6/node_modules/mkdirp/dist/cjs/src/opts-arg.d.ts","./node_modules/.pnpm/mkdirp@2.1.6/node_modules/mkdirp/dist/cjs/src/mkdirp-manual.d.ts","./node_modules/.pnpm/mkdirp@2.1.6/node_modules/mkdirp/dist/cjs/src/mkdirp-native.d.ts","./node_modules/.pnpm/mkdirp@2.1.6/node_modules/mkdirp/dist/cjs/src/use-native.d.ts","./node_modules/.pnpm/mkdirp@2.1.6/node_modules/mkdirp/dist/cjs/src/index.d.ts","./srv/api/upload.ts","./srv/image/stable-diffusion.ts","./common/horde-gen.ts","./common/performance.ts","./srv/api/request.ts","./srv/api/horde.ts","./srv/image/horde.ts","./srv/image/zimage.ts","./srv/queue/types.ts","./srv/queue/local.ts","./srv/queue/redis.ts","./srv/queue/gate.ts","./srv/queue/metrics.ts","./srv/queue/index.ts","./srv/image/index.ts","./srv/api/chat/image.ts","./srv/api/chat/invite.ts","./node_modules/.pnpm/@agnai+web-tokenizers@0.1.3/node_modules/@agnai/web-tokenizers/lib/tokenizers.d.ts","./node_modules/.pnpm/@agnai+web-tokenizers@0.1.3/node_modules/@agnai/web-tokenizers/lib/index.d.ts","./node_modules/.pnpm/@dqbd+tiktoken@1.0.21/node_modules/@dqbd/tiktoken/lite/tiktoken.d.ts","./node_modules/.pnpm/@dqbd+tiktoken@1.0.21/node_modules/@dqbd/tiktoken/lite/tiktoken_bg.d.ts","./node_modules/.pnpm/@dqbd+tiktoken@1.0.21/node_modules/@dqbd/tiktoken/lite/init.d.ts","./node_modules/.pnpm/@dqbd+tiktoken@1.0.21/node_modules/@dqbd/tiktoken/tiktoken.d.ts","./srv/tokenize.ts","./srv/adapter/stream.ts","./srv/adapter/chat-completion.ts","./srv/adapter/claude.ts","./srv/adapter/gate.ts","./srv/adapter/horde.ts","./srv/adapter/dispatch.ts","./srv/adapter/prompt.ts","./srv/adapter/payloads.ts","./common/sampler-order.ts","./srv/adapter/kobold.ts","./srv/adapter/openai.ts","./srv/api/chat/lock.ts","./srv/adapter/charluv.ts","./srv/api/settings.ts","./common/guidance/grammar.ts","./common/guidance/guidance-parser.ts","./node_modules/.pnpm/onnxruntime-common@1.14.0/node_modules/onnxruntime-common/dist/lib/tensor-utils.d.ts","./node_modules/.pnpm/onnxruntime-common@1.14.0/node_modules/onnxruntime-common/dist/lib/tensor.d.ts","./node_modules/.pnpm/onnxruntime-common@1.14.0/node_modules/onnxruntime-common/dist/lib/onnx-value.d.ts","./node_modules/.pnpm/onnxruntime-common@1.14.0/node_modules/onnxruntime-common/dist/lib/inference-session.d.ts","./node_modules/.pnpm/onnxruntime-common@1.14.0/node_modules/onnxruntime-common/dist/lib/backend-impl.d.ts","./node_modules/.pnpm/onnxruntime-common@1.14.0/node_modules/onnxruntime-common/dist/lib/backend.d.ts","./node_modules/.pnpm/onnxruntime-common@1.14.0/node_modules/onnxruntime-common/dist/lib/env.d.ts","./node_modules/.pnpm/onnxruntime-common@1.14.0/node_modules/onnxruntime-common/dist/lib/index.d.ts","./node_modules/.pnpm/@xenova+transformers@2.17.2/node_modules/@xenova/transformers/types/utils/maths.d.ts","./node_modules/.pnpm/@xenova+transformers@2.17.2/node_modules/@xenova/transformers/types/utils/tensor.d.ts","./node_modules/.pnpm/@xenova+transformers@2.17.2/node_modules/@xenova/transformers/types/utils/hub.d.ts","./node_modules/.pnpm/@xenova+transformers@2.17.2/node_modules/@xenova/transformers/types/utils/generation.d.ts","./node_modules/.pnpm/onnxruntime-web@1.14.0/node_modules/onnxruntime-web/types/lib/index.d.ts","./node_modules/.pnpm/@xenova+transformers@2.17.2/node_modules/@xenova/transformers/types/models.d.ts","./node_modules/.pnpm/@xenova+transformers@2.17.2/node_modules/@xenova/transformers/types/tokenizers.d.ts","./node_modules/.pnpm/@xenova+transformers@2.17.2/node_modules/@xenova/transformers/types/utils/image.d.ts","./node_modules/.pnpm/@xenova+transformers@2.17.2/node_modules/@xenova/transformers/types/processors.d.ts","./node_modules/.pnpm/@xenova+transformers@2.17.2/node_modules/@xenova/transformers/types/pipelines.d.ts","./node_modules/.pnpm/@xenova+transformers@2.17.2/node_modules/@xenova/transformers/types/env.d.ts","./node_modules/.pnpm/@xenova+transformers@2.17.2/node_modules/@xenova/transformers/types/configs.d.ts","./node_modules/.pnpm/@xenova+transformers@2.17.2/node_modules/@xenova/transformers/types/utils/audio.d.ts","./node_modules/.pnpm/@xenova+transformers@2.17.2/node_modules/@xenova/transformers/types/transformers.d.ts","./srv/memory/embed.ts","./srv/textgen.ts","./srv/memory/store.ts","./srv/adapter/generate.ts","./common/scenario.ts","./srv/adapter/director.ts","./srv/api/chat/message.ts","./srv/api/chat/remove.ts","./srv/voice/types.ts","./srv/voice/elevenlabs.ts","./srv/voice/novel.ts","./srv/voice/webspeechsynthesis.ts","./srv/voice/moderation.ts","./srv/voice/agnai.ts","./srv/voice/index.ts","./srv/api/chat/texttospeech.ts","./srv/api/chat/characters.ts","./srv/api/chat/inference.ts","./srv/api/chat/index.ts","./srv/api/memory/index.ts","./srv/api/character.ts","./srv/api/classify/index.ts","./common/abuse.ts","./srv/api/user/settings.ts","./node_modules/.pnpm/gaxios@6.7.1/node_modules/gaxios/build/src/common.d.ts","./node_modules/.pnpm/gaxios@6.7.1/node_modules/gaxios/build/src/interceptor.d.ts","./node_modules/.pnpm/gaxios@6.7.1/node_modules/gaxios/build/src/gaxios.d.ts","./node_modules/.pnpm/gaxios@6.7.1/node_modules/gaxios/build/src/index.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/transporters.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/auth/credentials.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/crypto/crypto.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/util.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/auth/authclient.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/auth/loginticket.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/auth/oauth2client.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/auth/idtokenclient.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/auth/envDetect.d.ts","./node_modules/.pnpm/gtoken@7.1.0/node_modules/gtoken/build/src/index.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/auth/jwtclient.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/auth/refreshclient.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/auth/impersonated.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/auth/baseexternalclient.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/auth/identitypoolclient.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/auth/awsrequestsigner.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/auth/awsclient.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/auth/pluggable-auth-client.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/auth/externalclient.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/auth/externalAccountAuthorizedUserClient.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/auth/googleauth.d.ts","./node_modules/.pnpm/gcp-metadata@6.1.1/node_modules/gcp-metadata/build/src/gcp-residency.d.ts","./node_modules/.pnpm/gcp-metadata@6.1.1/node_modules/gcp-metadata/build/src/index.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/auth/computeclient.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/auth/iam.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/auth/jwtaccess.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/auth/downscopedclient.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/auth/passthrough.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1/node_modules/google-auth-library/build/src/index.d.ts","./srv/api/user/auth.ts","./srv/api/user/presets.ts","./srv/api/user/services.ts","./srv/api/user/delete-user.ts","./srv/api/user/promo.ts","./srv/api/user/index.ts","./srv/api/admin.ts","./srv/api/promo.ts","./srv/api/billing/checkout.ts","./srv/api/billing/cancel.ts","./srv/api/billing/modify.ts","./srv/api/billing/resume.ts","./srv/api/billing/index.ts","./srv/api/subscriptions.ts","./srv/api/scenario/index.ts","./srv/api/json/index.ts","./srv/api/voice.ts","./srv/api/announcements.ts","./srv/api/freecredits.ts","./srv/api/match.ts","./node_modules/.pnpm/@types+paypal-rest-sdk@1.7.9/node_modules/@types/paypal-rest-sdk/index.d.ts","./node_modules/.pnpm/@types+crypto-js@4.2.2/node_modules/@types/crypto-js/index.d.ts","./srv/api/cart.ts","./srv/api/paypal.ts","./srv/api/index.ts","./srv/server.ts","./srv/api/pipeline.ts","./srv/app.ts","./srv/augment.d.ts","./srv/bin.ts","./srv/demandGPT.ts","./srv/module.d.ts","./node_modules/.pnpm/@types+throng@5.0.7/node_modules/@types/throng/index.d.ts","./srv/start.ts","./srv/domains/lock.ts","./srv/domains/billing/manager.ts","./srv/domains/gifts/agg.ts","./srv/domains/gifts/cmd.ts","./srv/domains/gifts/types.ts","./common/ambient.d.ts","./common/chat.ts","./common/dummy.ts","./node_modules/.pnpm/js-tiktoken@1.0.20/node_modules/js-tiktoken/dist/core-cb1c5044.d.ts","./node_modules/.pnpm/js-tiktoken@1.0.20/node_modules/js-tiktoken/dist/index.d.ts","./common/tokenize.ts","./common/image-prompt.ts","./common/module.d.ts","./common/typed-event-emitter.ts","./common/guidance/v2/grammar.ts","./common/guidance/v2/index.ts","./common/requests/stream.ts","./common/requests/types.ts","./common/requests/openai.ts","./common/requests/payloads.ts","./common/requests/index.ts","./common/types/replicate.ts","./node_modules/.pnpm/@types+chai@4.3.20/node_modules/@types/chai/index.d.ts","./tests/abuse.spec.ts","./node_modules/.pnpm/@types+yargs-parser@21.0.3/node_modules/@types/yargs-parser/index.d.ts","./node_modules/.pnpm/@types+yargs@17.0.33/node_modules/@types/yargs/index.d.ts","./node_modules/.pnpm/@types+istanbul-lib-coverage@2.0.6/node_modules/@types/istanbul-lib-coverage/index.d.ts","./node_modules/.pnpm/chalk@4.1.2/node_modules/chalk/index.d.ts","./node_modules/.pnpm/@types+istanbul-lib-report@3.0.3/node_modules/@types/istanbul-lib-report/index.d.ts","./node_modules/.pnpm/@types+istanbul-reports@3.0.4/node_modules/@types/istanbul-reports/index.d.ts","./node_modules/.pnpm/@sinclair+typebox@0.27.8/node_modules/@sinclair/typebox/typebox.d.ts","./node_modules/.pnpm/@jest+schemas@29.6.3/node_modules/@jest/schemas/build/index.d.ts","./node_modules/.pnpm/@jest+types@29.6.3/node_modules/@jest/types/build/index.d.ts","./node_modules/.pnpm/@jest+expect-utils@29.7.0/node_modules/@jest/expect-utils/build/index.d.ts","./node_modules/.pnpm/pretty-format@29.7.0/node_modules/pretty-format/build/index.d.ts","./node_modules/.pnpm/jest-diff@29.7.0/node_modules/jest-diff/build/index.d.ts","./node_modules/.pnpm/jest-matcher-utils@29.7.0/node_modules/jest-matcher-utils/build/index.d.ts","./node_modules/.pnpm/expect@29.7.0/node_modules/expect/build/index.d.ts","./node_modules/.pnpm/jest-snapshot@29.7.0/node_modules/jest-snapshot/build/index.d.ts","./node_modules/.pnpm/@types+mocha@10.0.10/node_modules/@types/mocha/index.d.ts","./node_modules/.pnpm/@types+stack-utils@2.0.3/node_modules/@types/stack-utils/index.d.ts","./node_modules/.pnpm/jest-message-util@29.7.0/node_modules/jest-message-util/build/index.d.ts","./node_modules/.pnpm/@jest+console@29.7.0/node_modules/@jest/console/build/index.d.ts","./node_modules/.pnpm/@types+graceful-fs@4.1.9/node_modules/@types/graceful-fs/index.d.ts","./node_modules/.pnpm/jest-haste-map@29.7.0/node_modules/jest-haste-map/build/index.d.ts","./node_modules/.pnpm/collect-v8-coverage@1.0.2/node_modules/collect-v8-coverage/index.d.ts","./node_modules/.pnpm/@jest+test-result@29.7.0/node_modules/@jest/test-result/build/index.d.ts","./node_modules/.pnpm/mocha-chai-jest-snapshot@1.1.6/node_modules/mocha-chai-jest-snapshot/dist/utils/jest-test-result-helper.d.ts","./node_modules/.pnpm/mocha-chai-jest-snapshot@1.1.6/node_modules/mocha-chai-jest-snapshot/dist/manager.d.ts","./node_modules/.pnpm/mocha-chai-jest-snapshot@1.1.6/node_modules/mocha-chai-jest-snapshot/dist/index.d.ts","./tests/init.ts","./tests/util.ts","./tests/chat-model-sample-chat.spec.ts","./tests/event.spec.ts","./tests/parser.spec.ts","./tests/placeholder.spec.ts","./tests/progression.spec.ts","./tests/promo.spec.ts","./tests/prompt.spec.ts","./tests/queue-core.spec.ts","./tests/queue-gate.spec.ts","./tests/queue-local.spec.ts","./tests/queue-metrics.spec.ts","./tests/queue-presence.spec.ts","./tests/queue-redis.spec.ts","./tests/resolve-scenario.spec.ts","./web/pages/Chat/update-gaslight.ts","./tests/system-prompt-extraction.spec.ts","./tests/trim-sentence.spec.ts","./tests/trim.spec.ts","./node_modules/.pnpm/@types+cytoscape@3.21.9/node_modules/@types/cytoscape/index.d.ts","./node_modules/.pnpm/@types+cytoscape-dagre@2.3.3/node_modules/@types/cytoscape-dagre/index.d.ts","./node_modules/.pnpm/@types+google-publisher-tag@1.20250428.0/node_modules/@types/google-publisher-tag/index.d.ts","./node_modules/.pnpm/@types+js-cookie@3.0.6/node_modules/@types/js-cookie/index.d.ts","./node_modules/.pnpm/@types+paypal__checkout-server-sdk@1.0.8/node_modules/@types/paypal__checkout-server-sdk/lib/core/access_token.d.ts","./node_modules/.pnpm/@types+paypal__paypalhttp@1.0.3/node_modules/@types/paypal__paypalhttp/lib/paypalhttp/environment.d.ts","./node_modules/.pnpm/@types+paypal__paypalhttp@1.0.3/node_modules/@types/paypal__paypalhttp/lib/paypalhttp/serializer/serializer.d.ts","./node_modules/.pnpm/@types+paypal__paypalhttp@1.0.3/node_modules/@types/paypal__paypalhttp/lib/paypalhttp/serializer/form_encoded.d.ts","./node_modules/.pnpm/@types+paypal__paypalhttp@1.0.3/node_modules/@types/paypal__paypalhttp/lib/paypalhttp/serializer/json.d.ts","./node_modules/.pnpm/@types+paypal__paypalhttp@1.0.3/node_modules/@types/paypal__paypalhttp/lib/paypalhttp/serializer/multipart.d.ts","./node_modules/.pnpm/@types+paypal__paypalhttp@1.0.3/node_modules/@types/paypal__paypalhttp/lib/paypalhttp/serializer/text.d.ts","./node_modules/.pnpm/@types+paypal__paypalhttp@1.0.3/node_modules/@types/paypal__paypalhttp/lib/paypalhttp/http_client.d.ts","./node_modules/.pnpm/@types+paypal__paypalhttp@1.0.3/node_modules/@types/paypal__paypalhttp/lib/paypalhttp/encoder.d.ts","./node_modules/.pnpm/@types+paypal__paypalhttp@1.0.3/node_modules/@types/paypal__paypalhttp/lib/paypalhttp.d.ts","./node_modules/.pnpm/@types+paypal__paypalhttp@1.0.3/node_modules/@types/paypal__paypalhttp/index.d.ts","./node_modules/.pnpm/@types+paypal__checkout-server-sdk@1.0.8/node_modules/@types/paypal__checkout-server-sdk/lib/core/paypal_environment.d.ts","./node_modules/.pnpm/@types+paypal__checkout-server-sdk@1.0.8/node_modules/@types/paypal__checkout-server-sdk/lib/core/access_token_request.d.ts","./node_modules/.pnpm/@types+paypal__checkout-server-sdk@1.0.8/node_modules/@types/paypal__checkout-server-sdk/lib/core/paypal_http_client.d.ts","./node_modules/.pnpm/@types+paypal__checkout-server-sdk@1.0.8/node_modules/@types/paypal__checkout-server-sdk/lib/core/refresh_token_request.d.ts","./node_modules/.pnpm/@types+paypal__checkout-server-sdk@1.0.8/node_modules/@types/paypal__checkout-server-sdk/lib/core/token_cache.d.ts","./node_modules/.pnpm/@types+paypal__checkout-server-sdk@1.0.8/node_modules/@types/paypal__checkout-server-sdk/lib/core/lib.d.ts","./node_modules/.pnpm/@types+paypal__checkout-server-sdk@1.0.8/node_modules/@types/paypal__checkout-server-sdk/lib/payments/lib.d.ts","./node_modules/.pnpm/@types+paypal__checkout-server-sdk@1.0.8/node_modules/@types/paypal__checkout-server-sdk/lib/orders/lib.d.ts","./node_modules/.pnpm/@types+paypal__checkout-server-sdk@1.0.8/node_modules/@types/paypal__checkout-server-sdk/lib/lib.d.ts","./node_modules/.pnpm/@types+paypal__checkout-server-sdk@1.0.8/node_modules/@types/paypal__checkout-server-sdk/index.d.ts","./node_modules/.pnpm/@types+showdown@2.0.6/node_modules/@types/showdown/index.d.ts","./node_modules/.pnpm/@types+sortablejs@1.15.8/node_modules/@types/sortablejs/plugins.d.ts","./node_modules/.pnpm/@types+sortablejs@1.15.8/node_modules/@types/sortablejs/index.d.ts"],"fileIdsList":[[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,194,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,168,194,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,167,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,162,171,184,185,186,187,194,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,160,194,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,174,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,995,1589],[57,95,174,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1718],[57,95,188,194,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1002,1013],[57,95,180,194,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1714],[57,95,167,180,189,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,160,164,182,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,160,182,188,194,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,160,167,183,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,160,183,194,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,183,194,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,182,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,167,182,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,160,167,169,170,171,175,176,177,178,179,181,182,183,189,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,181,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1005,1721,1722,1723],[57,95,160,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,997,1005,1576,1714,1720,1721],[57,95,180,182,188,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1721],[57,95,160,182,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,181,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,160,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,156,167,169,172,174,180,182,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1713],[57,95,107,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,160,163,180,192,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,161,163,164,165,166,194,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,160,161,164,166,178,180,190,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,160,183,190,191,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,183,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,160,161,163,165,166,189,190,191,192,193,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,181,194,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,203,204,205,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,203,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,203,204,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1568],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1078,1168,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1476,1477,1478,1479,1480,1481,1482,1483,1484,1485,1486,1487,1488,1489,1490,1491,1492,1493,1494,1495,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,1515,1516,1517,1518,1519,1520,1521,1522,1523,1527],[57,95,125,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1078,1103,1104,1148,1168,1178,1184,1187,1330,1332,1340,1357,1403,1421,1422,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1476,1477,1478,1479,1480,1481,1482,1483,1484,1485,1486,1487,1488,1489,1490,1491,1492,1493,1494,1495,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,1515,1516,1517,1518,1519,1520,1521,1522,1523,1526],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1078,1168,1422],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1078,1168,1420,1421,1527],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1078,1168,1340,1403,1424,1527],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1078,1168,1340,1403,1496,1527],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1476,1477,1478,1479,1480,1481,1482,1483,1484,1485,1486,1487,1488,1489,1490,1491,1492,1493,1494,1495,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,1515,1516,1517,1518,1519,1520,1521,1522,1523],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1078,1168],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1078,1148,1168,1178,1524],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1421,1423,1525,1526,1527,1528,1529,1535,1543,1544],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1403],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1424,1496],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1078,1168,1403,1423],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1078,1168,1403,1423,1424],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1078,1168,1527],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1078,1168,1486,1530],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1078,1168,1487,1530],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1078,1168,1490,1530],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1078,1168,1492,1530],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1530,1531,1532,1533,1534],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1525],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1539,1540,1541,1542],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1480,1527,1538],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1481,1527,1538],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1407,1414,1419],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1404,1405,1406],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1148],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1078,1168,1409],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1078,1168,1408],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1092],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1408,1409,1410,1411,1412],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1078,1092,1168],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1078,1148,1165,1168],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1413],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1415,1416,1417,1418],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1092,1093],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1078,1093,1168],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1078,1097,1168],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1078,1097,1098,1099,1100,1168],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1093,1094,1095,1096,1098,1101,1102],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1105,1106,1107,1108,1180,1181,1182,1183],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1078,1106,1168],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1150],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1149],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1148,1149,1151,1152],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1078,1168,1178],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1078,1148,1149,1152,1168],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1149,1150,1151,1152,1153,1166,1167,1168,1179],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1148,1149],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1078,1168,1180],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1078,1168,1181],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1185,1186],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1078,1148,1168,1185],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1078,1122,1123,1168],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1116],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1078,1118,1168],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1116,1117,1119,1120,1121],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1109,1110,1111,1112,1113,1114,1115,1118,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1122,1123],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1571],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1570],[57,95,98,137,143,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1736,1745],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1734],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1730,1736,1746,1748,1749],[57,95,143,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1729,1730,1731,1733,1735],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,473],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,473],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,473,827],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,817,818,819,820,821,822,823,824,825,826,828],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,828,829,830,831,832,833,834,835,836,837,838,839,840,841,843,844,845,846,847,848,849,850,851],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,842],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,829,830,831,832,833,834,835,836,837,838,839,840,841,843],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,852],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,439,440,473,512,700,791,795,799],[57,95,143,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,789],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786],[57,95,107,143,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,438,440,473,554,639,787,788,789,790,792,793,794],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,787,792],[57,95,143,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440],[57,95,107,115,133,143,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440],[57,95,125,143,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,789,795,799],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786],[57,95,107,143,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,789,795,796,797,798],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,792,796],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,567],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,473,572],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,574],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,473,577],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,579],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,463],[57,95,143,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,490],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,512],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,473,606],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,473,604],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,473,602],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,473,600],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,473,610],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,455],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,621],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,636],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,473,637],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,473,639],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,473,649],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,649],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,659],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,473,669],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,714],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,728],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,730],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,473,753],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,473,757],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,473,763],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,473,765],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,767],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,473,768],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,473,773],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,473,770],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,473,784],[57,95,143,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,438,439,795],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,791],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,863],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,860,863],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,854,855,856,857,858,859,860,861,862],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,795,860,861,863],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,863,864],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,888],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,888],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,924],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,892],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,924],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,893],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,892,924],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,909,924],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,909],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,916],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,916,917,918],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,890,891,892,893,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,892,909,924],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,947],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,926,947],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,947],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,935],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,938,947],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,440,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1329],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1293,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1257],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1308],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1257,1316,1317],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1306],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1281],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1257,1284],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1288],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1289],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1257,1290,1291],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1257,1327],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292,1328],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1257,1278,1279,1280],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1257,1274],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1258],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1257,1271],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1257,1272],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1264],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1294,1295,1296,1297,1298,1299,1300,1301,1302],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1078,1168,1370],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1371,1372,1373,1374],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1331],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1078,1168,1333,1334],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1335,1336],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1333,1334,1337,1338,1339],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1078,1168,1348,1350],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1078,1168,1349],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1350,1351,1352,1353,1354,1355,1356],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1078,1168,1352],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1078,1079,1089,1090,1168],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1078,1088,1168],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1079,1089,1090,1091],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1078,1168,1174],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1171],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1172],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1078,1168,1169,1170],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1169,1170,1171,1173,1174,1175,1176,1177],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1080,1081,1082,1083,1084,1085,1086,1087],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1078,1084,1168],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1078,1154,1168],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1154,1155,1156,1157,1158,1159,1160,1161,1162,1163,1164],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1375],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1078,1168,1340],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1358],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1078,1168,1386,1387],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1388],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1078,1168,1358,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1189],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1188],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1192,1201,1202,1203],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1201,1204],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1192,1199],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1192,1204],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1190,1191,1202,1203,1204,1205],[57,95,125,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1208],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1210],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1193,1194,1200,1201],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1193,1201],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1213,1215,1216],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1213,1214],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1218],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1190],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1195,1220],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1220],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1223],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1220,1221,1222],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1220,1221,1222,1223,1224],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1197],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1193,1199,1201],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1210,1211],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1226],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1226,1230],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1226,1227,1230,1231],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1200,1229],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1207],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1189,1198],[57,95,110,112,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1197,1199],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1192],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1192,1234,1235,1236],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1189,1193,1194,1195,1196,1197,1198,1199,1200,1201,1206,1209,1210,1211,1212,1214,1217,1218,1219,1225,1228,1229,1232,1233,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1253,1254,1255,1256],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1190,1194,1195,1196,1197,1200,1204],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1194,1212],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1228],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1193,1195,1201,1240,1242,1244],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1193,1195,1201,1240,1241,1242,1243],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1244],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1199,1200,1214,1244],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1193,1199],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1199,1218,1235],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1200,1210,1211],[57,95,110,125,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1208,1240],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1193,1194,1250,1251],[57,95,110,111,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1194,1199,1212,1240,1249,1250,1251,1252],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1194,1212,1228],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1199],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1016],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1015],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1019,1028,1029,1030],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1028,1031],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1019,1026],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1019,1031],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1017,1018,1029,1030,1031,1032],[57,95,125,143,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1035],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1037],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1020,1021,1027,1028],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1020,1028],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1040,1042,1043],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1040,1041],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1045],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1017],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1022,1047],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1047],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1050],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1047,1048,1049],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1047,1048,1049,1050,1051],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1024],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1020,1026,1028],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1037,1038],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1053],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1053,1057],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1053,1054,1057,1058],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1027,1056],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1034],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1016,1025],[57,95,110,112,143,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1024,1026],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1019],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1019,1061,1062,1063],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1016,1020,1021,1022,1023,1024,1025,1026,1027,1028,1033,1036,1037,1038,1039,1041,1044,1045,1046,1052,1055,1056,1059,1060,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1075,1076,1077],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1017,1021,1022,1023,1024,1027,1031],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1021,1039],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1055],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1026,1027,1041],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1020,1026],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1026,1045],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1027,1037,1038],[57,95,110,125,143,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1035,1067],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1020,1021,1072,1073],[57,95,110,111,143,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1021,1026,1039,1067,1071,1072,1073,1074],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1021,1039,1055],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1026],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1078,1168,1341],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1078,1168,1343],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1341],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1341,1342,1343,1344,1345,1346,1347],[57,95,125,143,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1078,1168],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1361],[57,95,125,143,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1360,1362],[57,95,125,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1359,1360,1363,1364,1365,1366,1367,1368,1369],[57,95,125,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1078,1168],[57,95,125,143,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1536],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1536,1537],[57,95,108,143,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1011],[57,95,110,143,152,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,110,143,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1774],[57,95,107,110,143,146,147,148,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,147,149,151,153,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,108,143,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1730],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1732],[57,95,100,143,197,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,125,154,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,110,112,143,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,92,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,94,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,100,128,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,96,107,108,115,125,136,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,96,97,107,115,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[52,53,54,57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,98,137,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,99,100,108,116,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,100,125,133,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,101,103,107,115,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,94,95,102,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,103,104,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,105,107,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,94,95,107,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,107,108,109,125,136,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,107,108,109,122,125,128,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,90,95,141,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,103,107,110,115,125,136,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,107,108,110,111,115,125,133,136,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,110,112,125,133,136,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[55,56,57,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,107,113,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,114,136,141,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,103,107,115,125,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,116,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,117,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,94,95,118,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,119,135,141,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,120,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,121,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,107,122,123,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,122,124,137,139,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,107,125,126,128,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,127,128,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,125,126,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,128,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,129,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,107,131,132,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,131,132,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,100,115,125,133,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,134,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,115,135,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,110,121,136,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,100,137,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,125,138,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,114,139,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,140,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,100,107,109,118,125,136,139,141,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,125,142,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1797],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1789],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1778,1789,1790,1791,1792,1793],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1788],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1788,1789],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1789,1790],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1778,1788],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1794,1795,1796],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1795],[57,95,143,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1787],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1779,1783,1785,1786],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1785],[57,95,110,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1779,1781,1782,1783,1784,1786],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1780,1785],[57,95,108,125,143,145,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,110,143,146,150,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1800],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1801],[57,95,107,110,112,115,125,133,136,142,143,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1728],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1601],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1598],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1600,1601,1602,1603,1612],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1600,1601,1602,1604,1605,1606,1607],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1600,1601,1606],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1600,1601],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1599,1600,1604,1605,1606,1607,1608,1609,1610,1611],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1600],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1598,1599],[57,95,113,143,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,136,143,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,957,958,961,962,963,964,965,966,967],[57,95,201,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,957,959,967],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,957],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,957,958],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,957,960],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,957,960,961],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,957,958,959],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1737,1740],[57,95,110,125,136,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,110,136,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1637,1638],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1637,1638,1639],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1637],[57,95,110,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1662],[57,95,107,143,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,107,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1640,1641,1642,1644,1647],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1644,1645,1654,1656],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1640],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1640,1641,1642,1644,1645,1647],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1640,1647],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1640,1641,1642,1645,1647],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1640,1641,1642,1645,1647,1654],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1645,1654,1655,1657,1658],[57,95,125,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1640,1641,1642,1645,1647,1648,1649,1651,1652,1653,1654,1659,1660,1669],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1644,1645,1654],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1647],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1645,1647,1648,1661],[57,95,125,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1642,1647],[57,95,125,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1642,1647,1648,1650],[57,95,121,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1640,1641,1642,1643,1645,1646],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1640,1645,1647],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1645,1654],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1640,1641,1642,1645,1646,1647,1648,1649,1651,1652,1653,1654,1655,1656,1657,1658,1659,1661,1663,1664,1665,1666,1667,1668,1669],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1738],[57,95,143,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1736,1747],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1731,1739],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1736,1744],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1736,1738,1741],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1712],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1546,1547,1548,1549],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1546],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1726,1736,1738,1742,1752],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1726,1742,1743,1751],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1742,1750],[57,95,103,107,115,125,133,143,200,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1596],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1593,1594,1595],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1592,1593,1594,1596,1597],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1593],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1592],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1591],[57,95,173,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,107,141,157,158,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1735],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,828,829,830,831,832,833,834,835,836,837,838,839,840,841,843,844,845,846,847,848,849,850,851,853,854,855,856,857,858,859,860,861,862,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887,889,890,891,892,893,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,948],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,143,210,211,212,213,214,215,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432],[57,95,110,143,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,110,143,210,211,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,67,71,95,136,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,67,95,125,136,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,62,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,64,67,95,133,136,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,115,133,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,62,95,143,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,64,67,95,115,136,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,59,60,63,66,95,107,125,136,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,59,65,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,63,67,95,128,136,143,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,83,95,143,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,61,62,95,143,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,67,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,61,62,63,64,65,66,67,68,69,71,72,73,74,75,76,77,78,79,80,81,82,84,85,86,87,88,89,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,67,74,75,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,65,67,75,76,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,66,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,59,62,67,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,67,71,75,76,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,71,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,65,67,70,95,136,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,59,64,65,67,71,74,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,62,67,83,95,141,143,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,160,167,181,182,208,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,982,989,995,999,1577,1578,1579,1584,1585,1586],[57,95,167,180,181,182,188,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,997,1013],[57,95,160,180,181,189,194,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,955,997,1002,1005,1574,1575,1576],[57,95,179,194,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1002,1616],[57,95,182,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,997],[57,95,167,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,995,1002],[57,95,160,180,181,182,183,189,191,194,195,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,955,989,995,997,1002,1553,1556,1564,1574,1587,1588,1590,1615],[57,95,167,181,207,208,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,955,995,1002,1005,1553,1556,1578],[57,95,160,181,189,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,997,1002,1005,1006,1575,1580,1581,1582,1583],[57,95,160,180,181,189,194,207,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1002,1005,1558,1574,1575,1576,1581],[57,95,180,181,182,188,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1581],[57,95,167,181,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,995],[57,95,160,167,181,207,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1002],[57,95,160,181,182,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,436,997,1002],[57,95,160,167,180,194,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1002],[57,95,154,195,206,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,950,981,995,1003],[57,95,154,195,206,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,955,995,1003],[57,95,154,195,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,995],[57,95,195,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,979,995,996],[57,95,156,195,206,207,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,979,980,995,996],[57,95,154,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,996,1003,1678,1679,1680,1681],[57,95,195,206,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,979,980,989,995,996,998,1636],[57,95,167,207,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,979,980,989,995,1002],[57,95,112,154,156,194,195,207,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,955,995,1003,1690,1691],[57,95,154,156,160,180,182,194,195,205,206,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,955,981,995,1002,1003,1551,1558,1565,1615,1616,1627,1632],[57,95,156,167,182,195,206,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,955,995,1551],[57,95,194,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1005],[57,95,160,179,195,206,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,984,995],[57,95,167,195,206,207,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,955,995,1006],[57,95,195,201,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,995],[57,95,195,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,195,206,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,995,1565],[57,95,154,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1003,1004,1007,1008,1009,1566,1567,1619,1620,1628,1629,1630],[57,95,156,160,167,170,175,189,195,206,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,955,995,1564,1586,1616],[57,95,195,206,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,955,995],[57,95,156,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,995],[57,95,154,156,178,179,180,182,194,195,206,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,955,995,1565,1574,1586,1615,1616,1617,1618],[57,95,166,195,206,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,995,1627],[57,95,154,195,207,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,997],[57,95,208,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,995],[57,95,154,160,195,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1553,1554,1555],[57,95,154,207,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1003,1556,1588,1630,1631,1632,1633,1634,1675,1676,1677,1683,1684,1685,1686,1687,1688,1689,1693],[57,95,109,117,154,156,195,207,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1551,1588],[57,95,154,156,195,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,995,1003],[57,95,154,195,206,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,995,1003],[57,95,112,154,195,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,995,1692],[57,95,154,195,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,997],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,997],[57,95,154,167,195,206,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,995,1003],[57,95,109,117,154,160,194,195,207,208,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,995,999,1556,1587],[57,95,154,189,195,206,207,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,955,995,998,1003,1682],[57,95,108,109,117,154,156,195,206,207,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,997,1545,1550],[57,95,167,195,206,207,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,995,998,1000,1635,1636,1669],[57,95,195,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,995,996],[57,95,154,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1003,1636,1670,1671,1672,1673,1674],[57,95,167,195,207,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,955,980,989,995,997,1002],[57,95,160,167,189,195,206,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,995,1583],[57,95,195,206,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,995],[57,95,160,195,206,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,995,997,999,1556,1636],[57,95,156,160,167,182,194,195,206,207,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,955,995,999,1000,1551,1555,1556,1588],[57,95,154,166,195,206,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,995,1627],[57,95,154,194,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1002],[57,95,116,182,207,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,437,949,995,1002],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,437,950,951,952],[57,95,206,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,437,950,951,995,1000],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,950,954],[57,95,110,156,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,436,437,953],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,436],[57,95,117,144,154,155,195,207,208,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,950,955,1002,1694,1695,1696],[57,95,167,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1002],[57,95,96,108,116,117,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1550],[57,95,108,117,156,160,202,206,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,194,201,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,980,981],[57,95,156,167,195,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,156,194,201,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,156,175,194,195,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434],[57,95,194,201,207,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1002],[57,95,182,195,208,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,955,989],[57,95,208,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,956,982,983,984,985,986,987,988,989,990,991,992,993,994,1000,1001],[57,95,156,194,195,208,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,435,955],[57,95,194,208,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,156,194,208,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,156,167,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,156,167,195,196,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1000],[57,95,156,194,195,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,156,167,195,208,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,990,1000],[57,95,156,194,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,156,167,208,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,194,201,208,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,156,180,182,194,195,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,955],[57,95,156,160,169,182,194,195,198,199,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,980,989,995,996,998,999,1002],[57,95,100,169,194,199,207,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,968,970],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,968,970,976],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,976],[57,95,208,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,968,969,971,973,975,1002],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,976,977,978,979],[57,95,156,208,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,976,1002],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,968,974,976],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,968,974],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,968,972],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,968,972,976,995],[57,95,207,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,955,1010,1553,1556],[57,95,156,207,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,955,989,995,1002,1010,1014,1551,1552,1557,1558,1564],[57,95,190,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,997,1010,1012,1013],[57,95,182,190,194,207,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,989,995,997,1002,1010,1013],[57,95,190,194,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1002],[57,95,100,207,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,997,1010],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1002,1612],[57,95,156,208,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1002,1613,1614],[57,95,154,156,159,182,195,207,208,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,989,1000,1001],[57,95,156,182,194,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1002,1559,1560],[57,95,207,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,950,951,955,1560,1561,1562,1563],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1559],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,997,1002],[57,95,207,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,950],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1559,1560],[57,95,110,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,116,207,208,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,955,980,995,1002,1564,1574,1697,1702],[57,95,207,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,997,1002],[57,95,108,117,160,167,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1002,1569,1572,1573,1701],[57,95,194,195,206,207,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,995,997,1621],[57,95,166,194,195,206,207,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,997,1621],[57,95,156,166,194,195,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,955,995,1002,1551,1621,1622,1623,1624,1625,1626],[57,95,195,207,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,997],[57,95,194,195,206,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,997,1621],[57,95,166,194,206,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1002],[57,95,195,206,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1635,1726],[57,95,160,181,182,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1574,1576,1726,1754,1755],[57,95,179,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1726,1754],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1726,1753],[57,95,161,167,175,180,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1574,1726,1754,1755],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1726,1754,1755],[57,95,178,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1726,1754],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,993,1726,1754],[57,95,160,180,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1574,1726,1754,1755],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1559,1726],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1560,1562,1726],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1560,1726],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1563,1726],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,951,1726],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,949,1561,1726],[57,95,180,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1726,1754,1755],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1726,1755,1770],[57,95,182,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1726],[57,95,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1005,1726,1754,1755],[57,95,175,180,194,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,1574,1711]],"fileInfos":[{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","affectsGlobalScope":true,"impliedFormat":1},{"version":"07f073f19d67f74d732b1adea08e1dc66b1b58d77cb5b43931dee3d798a2fd53","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7a3c8b952931daebdfc7a2897c53c0a1c73624593fa070e46bd537e64dcd20a","affectsGlobalScope":true,"impliedFormat":1},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true,"impliedFormat":1},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"1305d1e76ca44e30fb8b2b8075fa522b83f60c0bcf5d4326a9d2cf79b53724f8","impliedFormat":1},{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"32cb3140d0e9cee0aea7264fd6a1d297394052a18eb05ca0220d133e6c043fb5","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"7180c03fd3cb6e22f911ce9ba0f8a7008b1a6ddbe88ccf16a9c8140ef9ac1686","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"54cb85a47d760da1c13c00add10d26b5118280d44d58e6908d8e89abbd9d7725","impliedFormat":1},{"version":"3e4825171442666d31c845aeb47fcd34b62e14041bb353ae2b874285d78482aa","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"a967bfe3ad4e62243eb604bf956101e4c740f5921277c60debaf325c1320bf88","impliedFormat":1},{"version":"e9775e97ac4877aebf963a0289c81abe76d1ec9a2a7778dbe637e5151f25c5f3","impliedFormat":1},{"version":"471e1da5a78350bc55ef8cef24eb3aca6174143c281b8b214ca2beda51f5e04a","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"db3435f3525cd785bf21ec6769bf8da7e8a776be1a99e2e7efb5f244a2ef5fee","impliedFormat":1},{"version":"c3b170c45fc031db31f782e612adf7314b167e60439d304b49e704010e7bafe5","impliedFormat":1},{"version":"40383ebef22b943d503c6ce2cb2e060282936b952a01bea5f9f493d5fb487cc7","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"3a84b7cb891141824bd00ef8a50b6a44596aded4075da937f180c90e362fe5f6","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"33203609eba548914dc83ddf6cadbc0bcb6e8ef89f6d648ca0908ae887f9fcc5","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"e53a3c2a9f624d90f24bf4588aacd223e7bec1b9d0d479b68d2f4a9e6011147f","impliedFormat":1},{"version":"339dc5265ee5ed92e536a93a04c4ebbc2128f45eeec6ed29f379e0085283542c","impliedFormat":1},{"version":"9f0a92164925aa37d4a5d9dd3e0134cff8177208dba55fd2310cd74beea40ee2","impliedFormat":1},{"version":"8bfdb79bf1a9d435ec48d9372dc93291161f152c0865b81fc0b2694aedb4578d","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"d32275be3546f252e3ad33976caf8c5e842c09cb87d468cb40d5f4cf092d1acc","impliedFormat":1},{"version":"4a0c3504813a3289f7fb1115db13967c8e004aa8e4f8a9021b95285502221bd1","impliedFormat":1},{"version":"1433ccafba1ab975f1fcd3fabac5290c56fe89397f64447207e62e5df634bb4c","affectsGlobalScope":true,"impliedFormat":1},{"version":"2aadab4729954c700a3ae50977f5611a8487dc3e3dc0e7f8fcd57f40475260a8","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"75eb536b960b85f75e21490beeab53ea616646a995ad203e1af532d67a774fb6","impliedFormat":1},{"version":"befbf9d2259d0266234e6a021267b15a430efd1e1fdb8ed5c662d19e7be53763","affectsGlobalScope":true,"impliedFormat":1},{"version":"51bb58ef3a22fdc49a2d338a852050855d1507f918d4d7fa77a68d72fee9f780","impliedFormat":1},{"version":"7646ad748a9ca15bf43d4c88f83cc851c67f8ec9c1186295605b59ba6bb36dcb","impliedFormat":1},{"version":"cef8931bc129687165253f0642427c2a72705a4613b3ac461b9fa78c7cdaef32","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"47b62c294beb69daa5879f052e416b02e6518f3e4541ae98adbfb27805dd6711","impliedFormat":1},{"version":"f8375506002c556ec412c7e2a5a9ece401079ee5d9eb2c1372e9f5377fac56c7","impliedFormat":1},{"version":"e3460c2b8af8bf0fdf0994388a9e642fff700dc0bcedf6c7c0b9bed4a956b3da","impliedFormat":1},{"version":"548d9051fd6a3544216aec47d3520ce922566c2508df667a1b351658b2e46b8d","impliedFormat":1},{"version":"c175f4dd3b15b38833abfe19acb8ee38c6be2f80f5964b01a4354cafb676a428","impliedFormat":1},{"version":"b9a4824bb83f25d6d227394db2ed99985308cf2a3a35f0d6d39aa72b15473982","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"b84f34005e497dbc0c1948833818cdb38e8c01ff4f88d810b4d70aa2e6c52916","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e8e284b3832911aeede987e4d74cf0a00f2b03896b2fd3bf924344cc0f96b3c","impliedFormat":1},{"version":"37d37474a969ab1b91fc332eb6a375885dfd25279624dfa84dea48c9aedf4472","impliedFormat":1},{"version":"3210b45e363a2cbd501d5e9beaed94e31f2b642076c809a52bf0c0743aa61c4d","impliedFormat":1},{"version":"6b3c4aa0ce6eb9cf6187e61d352cd269ff0e492f333ae102dda121e76f90285c","impliedFormat":1},{"version":"565fda33feca88f4b5db23ba8e605da1fd28b6d63292d276bdbd2afe6cd4c490","impliedFormat":1},{"version":"e822320b448edce0c7ede9cbeada034c72e1f1c8c8281974817030564c63dcb1","impliedFormat":1},{"version":"ebfc5ac063aa88ab26982757a8a9e6e9299306a5f9ea3e03ea5fd78c23dc5d79","affectsGlobalScope":true,"impliedFormat":1},{"version":"16bc7fc733bade239218d2f4351b0b53d7482c5aa917e5e12cf294c688f2e1b3","impliedFormat":1},{"version":"821c79b046e40d54a447bebd9307e70b86399a89980a87bbc98114411169e274","impliedFormat":1},{"version":"17bc38afc78d40b2f54af216c0cc31a4bd0c6897a5945fa39945dfc43260be2c","impliedFormat":1},{"version":"0e6726f7ab7649f3c668f4eadb45461dcfaab2c5899dd7db1e08f8a63905eb94","affectsGlobalScope":true,"impliedFormat":1},{"version":"d44445141f204d5672c502a39c1124bcf1df225eba05df0d2957f79122be87b5","affectsGlobalScope":true,"impliedFormat":1},{"version":"de905bc5f7e7a81cb420e212b95ab5e3ab840f93e0cfa8ce879f6e7fa465d4a2","impliedFormat":1},{"version":"bc2ff43214898bc6d53cab92fb41b5309efec9cbb59a0650525980aee994de2b","impliedFormat":1},{"version":"bede3143eeddca3b8ec3592b09d7eb02042f9e195251040c5146eac09b173236","impliedFormat":1},{"version":"64a40cf4ec8a7a29db2b4bc35f042e5be8537c4be316e5221f40f30ca8ed7051","impliedFormat":1},{"version":"294c082d609e6523520290db4f1d54114ebc83643fb42abd965be5bcc5d9416b","impliedFormat":1},{"version":"5a64238d944ada60d4bec0f91ba970a064618ae3795cff27bb163c84b811284a","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"63c3208a57f10a4f89944c80a6cdb31faff343e41a2d3e06831c621788969fa7","affectsGlobalScope":true,"impliedFormat":1},{"version":"b85151402164ab7cb665e58df5c1a29aa25ea4ed3a367f84a15589e7d7a9c8ca","impliedFormat":1},{"version":"5d8cd11d44a41a6966a04e627d38efce8d214edb36daf494153ec15b2b95eee2","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc6cb10764a82f3025c0f4822b8ad711c16d1a5c75789be2d188d553b69b2d48","affectsGlobalScope":true,"impliedFormat":1},{"version":"41d510caf7ed692923cb6ef5932dc9cf1ed0f57de8eb518c5bab8358a21af674","impliedFormat":1},{"version":"2751c5a6b9054b61c9b03b3770b2d39b1327564672b63e3485ac03ffeb28b4f6","impliedFormat":1},{"version":"dc058956a93388aab38307b7b3b9b6379e1021e73a244aab6ac9427dc3a252a7","impliedFormat":1},{"version":"f33302cf240672359992c356f2005d395b559e176196d03f31a28cc7b01e69bc","impliedFormat":1},{"version":"3ce25041ff6ae06c08fcaccd5fcd9baf4ca6e80e6cb5a922773a1985672e74c2","affectsGlobalScope":true,"impliedFormat":1},{"version":"652c0de14329a834ff06af6ad44670fac35849654a464fd9ae36edb92a362c12","affectsGlobalScope":true,"impliedFormat":1},{"version":"3b1e178016d3fc554505ae087c249b205b1c50624d482c542be9d4682bab81fc","impliedFormat":1},{"version":"dae82763de98657d13112532b6f88fbf4c401d4656c4588a0cd2a95e7b35272b","impliedFormat":1},{"version":"cf45d0510b661f1da461479851ff902f188edb111777c37055eff12fa986a23a","impliedFormat":1},{"version":"cb41c174db409193c4b26e1e02b39a80f3050318a6af120cc304323f29e1ec1b","affectsGlobalScope":true,"impliedFormat":1},{"version":"37bef1064b7d015aeaa7c0716fe23a0b3844abe2c0a3df7144153ca8445fe0da","impliedFormat":1},{"version":"1a013cfc1fa53be19899330926b9e09ccdb6514b3635ef80471ad427b1bbf817","impliedFormat":1},{"version":"25be1eb939c9c63242c7a45446edb20c40541da967f43f1aa6a00ed53c0552db","impliedFormat":1},{"version":"d3f2d715f57df3f04bf7b16dde01dec10366f64fce44503c92b8f78f614c1769","impliedFormat":1},{"version":"b78cd10245a90e27e62d0558564f5d9a16576294eee724a59ae21b91f9269e4a","impliedFormat":1},{"version":"936eb43a381712a8ec1249f2afc819f6fc7ca68f10dfec71762b428dfdc53bf1","impliedFormat":1},{"version":"2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed","impliedFormat":1},{"version":"a45c25e77c911c1f2a04cade78f6f42b4d7d896a3882d4e226efd3a3fcd5f2c4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","impliedFormat":1},{"version":"0e13570a7e86c6d83dd92e81758a930f63747483e2cd34ef36fcdb47d1f9726a","impliedFormat":1},{"version":"104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","impliedFormat":1},{"version":"cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","impliedFormat":1},{"version":"5c45abf1e13e4463eacfd5dedda06855da8748a6a6cb3334f582b52e219acc04","impliedFormat":1},{"version":"d57be402cf1a3f1bd1852fc71b31ff54da497f64dcdcf8af9ad32435e3f32c1f","affectsGlobalScope":true,"impliedFormat":1},{"version":"7d2b7fe4adb76d8253f20e4dbdce044f1cdfab4902ec33c3604585f553883f7d","impliedFormat":1},{"version":"4fe80f12b1d5189384a219095c2eabadbb389c2d3703aae7c5376dbaa56061df","impliedFormat":1},{"version":"ad70fdf3826676b87e49c859035690311e6e1f27fc58c76ebfd5c714f7cee2e6","impliedFormat":1},{"version":"edd2bf117f61517d22264e2204925df0f422315f5df9be844feebb3aab4876f0","impliedFormat":1},{"version":"5da16542464bea29b45a37cc178c7374f1983ff64ee451212a02dde381fe54ea","signature":"20be6752cecedebb72d7f2dda6e6301c2c7122dea606006f8622c750e6d9f2c8","impliedFormat":1},{"version":"0701d91bf364e0b72c7540b719224b816788a97b269070d7721ae1cc3389d328","impliedFormat":1},{"version":"9897d250adde4a9402245e586185bf7e4f3c06b14a936dc97ab58ef23207caaf","signature":"0fbb6f113681ba5438e489b16df1fa98d7431753cf2239488c3e6c169c9a6e4b","impliedFormat":1},{"version":"4cdc4735ab2396c1a3e1a9c82a927bdbb8a9c60edb1698ff53b153711f57eba4","impliedFormat":1},{"version":"21be395cc8df766b54effd85c62d9b4c5f594442d79b29af8e5fd5c10828cce0","impliedFormat":1},{"version":"f7b38a05722ffd7cf982227e64501690e07d6f140ffaec9b7e87b70e7779186f","signature":"c73c805a4c9f905e389f8a6ca535201116354201fa00c01ef8b5bf180517fea2","impliedFormat":1},{"version":"8315bd9e5a7c114d473c8d1e722959bc27cbd79deef8ec0efb5fe919f44e6171","impliedFormat":1},{"version":"a235b976c63f2017014bd6247d4e508a50a651203c5394f85d0d094d48b8847d","signature":"89220cafa94bfc9f9c8ecdbd79ed2f8da59332951cb64abd874b0658a9c99800","impliedFormat":1},{"version":"f8549be40dde648ed58e8ea6e1f2b7ab61d4b8a7c6f03536710e9bdc68a67d8a","signature":"5c60bcbb80f90dac79c15484d0b50602354d9fd37057e8860c12dbeeb0bec083","impliedFormat":1},{"version":"63d2555191295eda8a4d4422e8c946f1db7a53bc57d2ab29662f20ff47853f6d","signature":"28e9631d3d36bcd9b672dca4dc2caac45abcd8501e8fb13559b6cfc79a76c272","impliedFormat":1},{"version":"3398e66fa8c1d0517e961e4998d2163f78bc2e9a45bc7904feff9cf75c27f649","signature":"489d5a4a4668be35080cb24a6e6e422cdbd5e18e0916ce29c800b51bde5f013d","impliedFormat":1},{"version":"f5d58abb802b906036607b72ec7f838587903b3acba5ef21db4863dafb0583fe","signature":"ea0f4bc754611e358cb55e9809c2a1e58393ec2b8325c36112fa50040e913b54","impliedFormat":1},{"version":"79fe3fb6f7adcdc6a4d26d9100def8a806ed62ce638d69f133864c8209d63629","impliedFormat":1},{"version":"a18360c6928d4d17f5315609558a6d8fe9b30bd129f7f4730a20a9e0a97e78ce","impliedFormat":1},{"version":"34c802e03a1ed5addbda41132b37f30b76e6873d8616f81bfbb83833b5b41ba7","impliedFormat":1},{"version":"ad437ca17654581cae7e625db3459d4869ee498f6442bb322e8d4cfbc0b6c3c7","signature":"cf913eb1e05d371a1bffd608188bd099b4c186124c8a632ea68d8fbd0ea6fd02","impliedFormat":1},{"version":"2def0e9e2121e916699bf1c3f5754ec36d97ad2e95caa6b2938be459fa9a8d23","signature":"fcd25ac16d455b144e7a59182d5224fb9b2c6713ce201a9058cb538a6537798e","impliedFormat":1},{"version":"42f71a7648605acde9b11f04214eea927f589f1794e13645e0a02103dc92942e","impliedFormat":1},{"version":"297cc3c1201ce440fefc4c74b87552ec58a5ab977ec25afdcc50c7f271d6dbc4","impliedFormat":1},{"version":"68c94d53c9bcebe02c2dba569f00400813b6824fb0ad5b924800e3f7d65ffff9","impliedFormat":1},{"version":"43a98d7241633b00b84c1251f3ce8d117739d7ca96686d4c1b4b9669751d9dc1","signature":"506868e1d9120fe2cea869c991a1020a52000264e800b0fe997217a100bd91fe","impliedFormat":1},{"version":"6a2ff0f0277ca2f6e21ceb38b4cc8faf25293da4997f3cf3e7b3047476fff8b9","signature":"ebac59e5cf631e3f489ac6f0e60d6e03dd639253e1d9c7a5ecaf7658a3981fcb","impliedFormat":1},{"version":"dfec9d491d5a5945ffb5f4d1a8d8eac5ccd59b9b65226357df2916f8c412378c","signature":"57ccf69c3e3b69a08aecfcf89b7c0cf0e61773984224463349b722f901415d34","impliedFormat":1},{"version":"47ec535c13334d4d1571f883f91070ead150b3fb48b09fe93635a04f36ff610a","signature":"f2b6fefcff7e0e0cf9c719dc9d5d07bb0bfe2c8cd96a0019e113e93798ce6228","impliedFormat":1},{"version":"017181b6c20d8a356c7fe8fb09fc79956d30423d3302461e48291b68d8ec4727","signature":"600fdf2592be9692eed46bd5b53a3db4918831142101b97ffc047f6445d39b50","impliedFormat":1},{"version":"321a31c83b071ec49fae6bafc2a77597ece408caa0d3a7751f656bd9a6b535eb","signature":"3e7b332628ac9e199efef0803273e2edc660452ce6c67e259ce4e78549c557a5","impliedFormat":1},{"version":"ec58cbebe2900cd9988530a0a0b2ecba0ea6e2117023a8280a4a9f8cb5f26c0c","signature":"6fb12878a25a88eb44491e01f261fafad2089390060a3d4b9bca1bf0e752ed21","impliedFormat":1},{"version":"733e1b9d5bdfc7f4f5e25e1b5d9fe647efc40767b41e13301d3e7737f65cd6a6","signature":"d6f232f4baa90bf2d35aebf45949dc729abef3a3977462d9e9f1f4aa6f3c51cc","impliedFormat":1},{"version":"6ac60954d7be7ff5025d73c3e9945fee6204e5e77301e93ce37def4e202ce54f","signature":"f669acb5061adad328f3405a05b0e071fdd8caf1cae7973aa6d3d0ea1f13c468","impliedFormat":1},{"version":"bb05deb9292944544c328a5d486cdf16f0e017226055e2ffc29f80f4b5ec551f","signature":"4a8d190817ff618a5697c5607a18da2f01de58a4dab10fc21222ca8cd01e9254","impliedFormat":1},{"version":"d673bdfc84bf82b9cd1069f296283dbcddc4f0a68a8f618aa59f4c74a8b522b4","impliedFormat":1},{"version":"529de5ce2387201c987fea86618ac389780bdb7bbad7c8ca0a8044d7c59c933b","signature":"25cf25d73b551db94957ca371f9b562e4afc9a20f310336c8fdeb3b3ee434090","impliedFormat":1},{"version":"15d7c79663a0f77e0777f680eca4dac42313f1a7dff5a6bb0a84e11ed7406aef","signature":"937ca43f63faaf23d7896879e9dd06d5d6f0ced4339a0a8943df5b83bca10e3a","impliedFormat":1},{"version":"380636cedad2ec9669e4752c20628b21e053f5f8c7602933b6fcf5e0cf083170","signature":"6106b2619a5aef08e59019b2d62f57c4b253ed4a7e23d4fcf8ffea55d0541a0f","impliedFormat":1},{"version":"1393148d77e9725630b5b725e4841515d71c3594853271ea90b6ba4f9430468f","signature":"f23beab622cb8086ce2da3d8c6301ce15755528822a709c7b9c5d7054f5d85f9","impliedFormat":1},{"version":"512c4d4ec514276223c561b9427f511924e50befa972f61ae347bc64cf6d213d","signature":"606b5a44017cf90119aafa46cc140ab242b6da4e62a42c8b9039e9f81c23f596","impliedFormat":1},{"version":"feb553efca1022ce1540c01b1a2f218e37c38eb3c274a059539c48892ac4695c","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb893a0dfc3c9fb0f9ca93d0648694dd95f33cbad2c0f2c629f842981dfd4e2e","impliedFormat":1},{"version":"818e7c86776c67f49dbd781d445e13297b59aa7262e54b065b1332d7dcc6f59a","impliedFormat":1},{"version":"a3d3f704c5339a36da3ca8c62b29072f87e86c783b8452d235992142ec71aa2d","impliedFormat":1},{"version":"de3367f8a20cddb78a9405a7c8836c6e9c1c66d1c585e3aea1fa75237df73df6","impliedFormat":1},{"version":"820cb01321788b520a1f287b81802cb3d7365329806af9d1b1ea67bdcf98b16c","impliedFormat":1},{"version":"f634e4c7d5cdba8e092d98098033b311c8ef304038d815c63ffdb9f78f3f7bb7","impliedFormat":1},{"version":"6c01be4bb713b1ea61dd0de16115f8033fb549cd7fe03f42dcce3ed05c056dc4","impliedFormat":1},{"version":"ae7281e0cc71368ec16c4fad9c4a63dc6c1f6c5d6a34221142683f286e30b6c5","impliedFormat":1},{"version":"73e986d8534d46ab199a49e9f939186f45401a4bc6d785c35a203c5d13c3582e","impliedFormat":1},{"version":"97c472e6baacfd32e4355d820b1aa52b03639c7789ee52b35ba2c336a0c4b70f","impliedFormat":1},{"version":"d1dfab547a8067f3dd9e34bba2c2c5665e3f41d878251feec2a91add8fc999af","signature":"e5d4da1de751f0971ccfb554ec9e536b5f017e1f32b7f6cc07e147428ae2b86f","impliedFormat":1},{"version":"219d0a148350575e2e680c5744e43ff5fc35961a3e9f7fff5bb4c6d9c1a0c39e","signature":"3e42028937df1cea51e7636acbe6686b3030b60c9299b19c8070a08d303545f6","impliedFormat":1},{"version":"53db3dfede1c043d8cea6a789696b8c0ffa80d152cd2e3cc33d1a022db29c5f5","signature":"8a82842df92849e23f3ceb8639838e3a4d812aab00de68aefb95414a1eeab134","impliedFormat":1},{"version":"af10919ddcbaa926b1369dc4c224563f9c8e3d09c44f1e20c83d987f11bc5019","impliedFormat":1},{"version":"545669924f3f3d15a1b948660a5af8c815184616e3f4f206c29fd8a1d2348459","impliedFormat":1},{"version":"195b43fb03896d064b88cb04d5f749809f6366415a6e433b70df295bc3cdbece","impliedFormat":1},{"version":"68db415f5c3001f108bd9c58dcb3ddc83054c7a155c58c3a23b6b96918ace23a","impliedFormat":1},{"version":"e474c59f6ead4f3d50bc5795cb5db657eb2ea54e11564d79d3a88b2cd2cb1ab6","impliedFormat":1},{"version":"8ad2f4ca786f17b3aa031e7474c7270e60cad48f17c0e3f4655ced6a8d22eb19","impliedFormat":1},{"version":"e9074101fae06f21d98cc6f09ec2e78a7348f4720719c94e884e36bf115ebc30","impliedFormat":1},{"version":"b5a6eafb284ffa7d5f42c49b4e37d399099200bcfa2a6a420b0ca2fb6b23a1c2","impliedFormat":1},{"version":"dffa2b8d7f35ccfa857bc50f164b9535dc04b8e3171c60d659073577ae593558","impliedFormat":1},{"version":"564f4667370930201670cac38892735e50831da838722d76a45025828a119a0c","impliedFormat":1},{"version":"4ae2399e36d7436aa239ab7bf0f95636882e9b426bc4a43fdc3c065fea42d449","impliedFormat":1},{"version":"50bc020670be08c5ccd8c384c0e48c7d39d414366818baac9ca4872d984d4706","impliedFormat":1},{"version":"04342b37fe58ab10f85a82cb095d0ac7603a38048b742856a82682e42e5374b6","impliedFormat":1},{"version":"5ef5f7aca54dd822b55f3506c15f8de386698d3853c35f866a5c666778a11514","impliedFormat":1},{"version":"bdf095a90885e0fe7b3c4107baccda7ba734a879948d8536d7f69f0142299cb4","impliedFormat":1},{"version":"aa6e5698c793e7c9f9da3dd916a969dd0e61d7a7099f9da2e199e56110509761","impliedFormat":1},{"version":"d3737589443610a1c929920b7c51e878e69be9fae5829d177efbc98a47fd1163","impliedFormat":1},{"version":"f9ae4c4e1ec34ee879c1c58062033868472091dbfd2b2a6c8058312d4017c805","impliedFormat":1},{"version":"dcd38e74e8a8e46f31fbe3d177db6a6418dbad8ee777a3da6d48875775724a26","impliedFormat":1},{"version":"66b2a14fcc0b6c47e69e483dfc218343b9dfd12926a6b943202fe4bec1f7d746","impliedFormat":1},{"version":"122768989bd1d5fa8164c661dbc81c14d205d7332fd7fe150dd33b99dadc4723","impliedFormat":1},{"version":"7318fc87ac80ab31b5da74ee7968ac0e7a208fa3347615caaafa1dc17d83499d","impliedFormat":1},{"version":"b7ad4e29b4608dcb74555bbcd889c453337d5d60dbe9c318e6ecdada4d850ebb","impliedFormat":1},{"version":"523dc52443b9a94d497e8c035ccdbe5b71a1708ad349e2d60bafb05eb9e31344","impliedFormat":1},{"version":"83aa0ee5160ac8e458d062b2a12a27fc366862d43ccfd9ae01116cf78a8b7541","impliedFormat":1},{"version":"03fe37dc9c343614de62c709600112861ea443e9000e3972db26f4337e80c794","impliedFormat":1},{"version":"ac81562b12319a11a039148b94e618c626fd338ee08df2fe916711a50893108f","impliedFormat":1},{"version":"2c83f60c7ebed64257372e6b00162b98c372c54aaad5ddf310539ea64126f214","impliedFormat":1},{"version":"c27521131d17fc8dcad6a2bbf32b1453d39163130d28db1e02d966f9fdcb0b3c","impliedFormat":1},{"version":"626f4917f67ee864977e64815911b2e420fa6338f639e0d1fad2b1f794b6d419","impliedFormat":1},{"version":"5c0ec6e0505d9972f3e20dd0d51a97a804bc89349b4bdc3a50e52ca6816e9622","impliedFormat":1},{"version":"2b4e45a5df38826571a31da96a069b782c11cc1648bf752d1a858af19f85a651","impliedFormat":1},{"version":"5d22a230719da0eb5c1db24a7b8a5e7ef3b3f29a0c1a757be0d1142699b9ae80","impliedFormat":1},{"version":"361c1a84077bf9fcdb14815421bf343d38cabef711d12b619db61b2f42a5908e","impliedFormat":1},{"version":"3c70c04308ed908c9fa921656e6f8c6f41293336e9909b3fc133e4e2fe31d113","impliedFormat":1},{"version":"baca26e8f7cce2dca7a7c038f66a976488d1e2f91d88425b35f915c5eeb46b99","impliedFormat":1},{"version":"c3a90660b74573026980751d63ce430548273955310f67bc6f900be8378914e0","impliedFormat":1},{"version":"430a86301623bf1cde8b032c0dc84e8660a5d380cee638b9a29f94df8cc3ef4e","impliedFormat":1},{"version":"959a4964dbbc7f523d842de45216707288df48ba552e680cb57b61107c149c91","impliedFormat":1},{"version":"0b1b365d4998b274bfca42745681ffb77b513df4e9128269f46fd908eeacefae","impliedFormat":1},{"version":"710e19e7386e9c023f1929ee8a8604c988b2a0859ed87ba2631e508072870556","impliedFormat":1},{"version":"0ccd836b889988f00d627fb3862dde752025c4988fa45121b7bd127ebc222ded","impliedFormat":1},{"version":"4125d11c36d4430e986018869ccbf63e33dbdc0ecea1b05ae9261af5f3855f22","impliedFormat":1},{"version":"95427c6bdbf8371f1ff39cf33d2f165b4912f80f6e4b92c1d44325df64ac151d","impliedFormat":1},{"version":"5e48bb211fa4e7cd64ef4fd23a969f8bf9374fe47611fb5fa913e45c7a9be8c5","impliedFormat":1},{"version":"eefcf3ab53e8d1c64c966d8fb2881ce8cc59956de4b1020b0cd2e73d2136aad8","impliedFormat":1},{"version":"a185a65246ace0ec3588e14831a98c373e5770fc8b4115185cebe2db087c75a4","impliedFormat":1},{"version":"01aaf2de7288e53fdc873ac317a06c62ed332b09411dceae2b632e727980284c","impliedFormat":1},{"version":"a927b1aaf0cde5d2b96b7b1fbc57af46137e7bffa553c437c22dbcb72c1eb3b7","impliedFormat":1},{"version":"055ad4860771a98de4bba3eecf5a6d99adc4a6eabc81716eabb05a1dc59a3fc2","impliedFormat":1},{"version":"95e52e5958b3d45114b3183ee8867c2fde278a13abe1429e5d463177bfea4d9a","impliedFormat":1},{"version":"b5aa3f58f8f582a4f0b137c37b61d72afd4979a51665ef59ab8b968ba7136577","impliedFormat":1},{"version":"9928bc56674696d549656d0d78ffcedad6c3b1b420041f107842e1d4480f29c8","impliedFormat":1},{"version":"e2af0c0eb4a6498c4ae98765a4ce04ae18eaa54aafe01bd7865e828553889e06","impliedFormat":1},{"version":"3f5a739ca1bcd01d899f18e201d05b0668810085efb9bbcc4b7341388dc88cf7","impliedFormat":1},{"version":"fa716439a17befb3984605fd3a0b62df36a94531ecb2d5a69ae317184efa8041","impliedFormat":1},{"version":"7e96d1ad4eb1ad0f816fd36ae822f854f8cadf30251088426018f3f13f61554b","impliedFormat":1},{"version":"907e84c5a862761ed0371710e22e0a030f9708633803d2b8241347467729dd46","impliedFormat":1},{"version":"4a7d8db387c6300e4b47ac526819589d67ea963ceae5d86222c99eaa4b339fb6","impliedFormat":1},{"version":"25f07e2d971e9c04616691331f56e884b86d238203d809a2024f74d845c02b7c","impliedFormat":1},{"version":"3c65ea8a95ce5a11f482abae178572a13a337216664fb481e151bfe696bbe9e9","impliedFormat":1},{"version":"d5c0e26a5a6313fe1ae5a5e02f5f0fc6291b6d99ced25f3bd46115888ea5f520","impliedFormat":1},{"version":"dc04dc2984778ba15a13361aea9c915182f64a1d5bcdb5b4c430168e2b154daf","impliedFormat":1},{"version":"f6f7b7ef845b6e5a80226ab598cb433950ca400fcfc8adf00dd753f095930618","impliedFormat":1},{"version":"1844c1e0ac130cace70048450871bd5006341f8f76ad8b3f6a1fdb08fa096ea2","impliedFormat":1},{"version":"1d2190bc27ec5febe38395dceed4786120cd18abcabb2621eb57d8595fec0d69","impliedFormat":1},{"version":"8ecb857929b43ad4cde4005ab49f0d73afd095005ea20aba74109251c4980a5f","impliedFormat":1},{"version":"4b8113354e0c5c3207d9cdfad5e8cda0f6c248bd514759e8b7d718ea66870697","impliedFormat":1},{"version":"f1c3453871219988b69a05921166f2e6a984005ab7cc3fdcc7703aa92b51aa5f","impliedFormat":1},{"version":"955e7e1a37a5b151899cbff84df2d0f857af4f7987f93214c472b588d33fe53d","impliedFormat":1},{"version":"18a7eb006f353ec37dc24e4aab5525d1ec5d27aad0a1bb0c2cbffebc40c6ffe2","impliedFormat":1},{"version":"cefcf164e983cfe9c73e7322ecb81149e84b2a3ab1cdc95b4d118560f1279b91","impliedFormat":1},{"version":"cc09445cf30450d0c8a052849bc24186d69dd77ed8092fbdb5caa02dd87a3ae3","impliedFormat":1},{"version":"5e3cea7a1cc38b2bb8730c66f3b3da817370ea208ef3da43e6e2a8208c32679b","impliedFormat":1},{"version":"32441703e8468a9a23d988b13e2b02f97fc0decc80072fa9f3efd2edaa70dab5","impliedFormat":1},{"version":"2f70ec4ac98558e4792fe5067446c3ba1aabab017b534bc6cd627cc0793c5be9","impliedFormat":1},{"version":"7bf8b6e7ea8c562cc790c3ab1e4930a33411ffd1933255936aab2fdd3b32467b","impliedFormat":1},{"version":"e0eeb0fc8067b402716eace1c6568785e57e957ecf96f383ab5eb4257b391d78","impliedFormat":1},{"version":"30de0a10423b959b1aa66924e4ee0986495d73f0c5661869371486120c0ce5f4","impliedFormat":1},{"version":"64b1028b92467d6e87b1bce90d012e5cdbbd4dd35dba54c5f53be19095b11b6e","impliedFormat":1},{"version":"5e54b762fbaba349fc82564220fa1028600c231277a6ae228501fed1c1e208a4","impliedFormat":1},{"version":"6e1b6505e91e8c7fc68e15cb053417ac2209c7a60729e4492bdf91a8332a3b4c","impliedFormat":1},{"version":"c5fee36f7e59a5b58e83df0c5424eee2b7cefa8464cf0985e83c6db63b7e1ec3","impliedFormat":1},{"version":"a26c924fd884bcb2e55cb5fd0008ce58113d459bbc1cb924c99847767f2a8886","impliedFormat":1},{"version":"5d9e970557883b3963e7df1461e825aec9c9057ac254e12027138e618f6e1244","impliedFormat":1},{"version":"a9ed29c4dde54a0c6da1a8092a3754e24de6b74040c68612081267506c7c14b3","impliedFormat":1},{"version":"cd2886147f367b00e24c700f7e6d6e7f4cdb27284f5d9463f412a172b094dc24","impliedFormat":1},{"version":"d11a3e4b2daebaf923b8a24e62e5b754b9e6b3faa787a3a52b1d2b245d496456","impliedFormat":1},{"version":"2fd41111477f22e3800661e38bf3ec64fe1462054108a260e70e4008309e1e49","impliedFormat":1},{"version":"89c9a7ee5c6d5ff0ed7d44ae3eb085e0f089643abd7538c646075d198f672c10","impliedFormat":1},{"version":"d42bbc524e81f662be6b34bc65f46cf4323782b581876d388fa42a89732792a8","impliedFormat":1},{"version":"0c0ef4d4ca1cb49dd9631744e183e64215499c6cf44cd57f0551a52134ea9155","impliedFormat":1},{"version":"71ce6907f7e00a0c258e61bbdc49b8a47ca987e2fc0acc065955cc05897d1ca2","impliedFormat":1},{"version":"649c341a5cf22b877a6baf3a7caaa30d494704d46df175e504e480b0df65b214","impliedFormat":1},{"version":"32497a0d6b963314a64a46a427a316aaa9891674e43f4b5409e81d00a0f5376b","impliedFormat":1},{"version":"3dee34e5d87f56f24506eb8cd1cc37d55f942c976c16b8b501e0ded32445c978","impliedFormat":1},{"version":"756b2016cdedd04aa8e583a8930872b6d422a8071f5ce1b4ef83e3a49bce5d15","impliedFormat":1},{"version":"eb950fee5f2afcd1ccd541ff892b150c22a36e682bbf7262701c97f7aa6a49cc","impliedFormat":1},{"version":"3a42d232ac28ffefbdb9edd5b488496951fc4d9f2bc4e026cf6b7a6c6329e115","impliedFormat":1},{"version":"c8810a241515f4f1ab9a38e9c904a64a9ec1a03973ebc8102f2492de4abfe47d","impliedFormat":1},{"version":"95dc4f979a9cf7a4585b70f4aac7f348748cb9188cb5817b6e248e6c7fddf8c4","impliedFormat":1},{"version":"fa66f4d1d69c409c1ea535aceeab5bb0ccb1e93d92e1b2abfe9835900d828adc","impliedFormat":1},{"version":"4bfa91d0fd398f79f68d23e479da20d5b92e44f838de96389fa7b82b55cb15ed","impliedFormat":1},{"version":"3015207cf952fd45a2bd78eb3e02f3592aa9202d2d611bafd5e0bb2f38f9d2d5","impliedFormat":1},{"version":"3da210b74d8b0d394da3c1459e9d30ded06f3a2bcb279026204c10e71de2cc04","impliedFormat":1},{"version":"9e38f76f68ee422f536b5565eb38dc8f57b56fef6f4ea498d6c2d81d243df745","impliedFormat":1},{"version":"905e27fb2136f3dfd5fd281dc0798184775a88574529e7d1ac4929edd1c84f46","impliedFormat":1},{"version":"758304fcb8cfa113019eca77bd703ef666ff24543593ffbc5f40c9663011bccc","impliedFormat":1},{"version":"b68868886ec1fdf0ebe9ac77ffc64f551d4e6fce20ed81b43ad269482635a44d","impliedFormat":1},{"version":"4f44c84a327c813dfd48b9ebb0edd6665c89bf3ef34f39ab5d854e854b923fd2","impliedFormat":1},{"version":"eeb540679fcd5c9ed3f0b0f0d2701678f6ac3048f2e06ed794ea9207036a2474","impliedFormat":1},{"version":"19d5ec8f855a2d2e98f31ff291428fe0b2257cfec3acfb1207f7e89d257888dc","impliedFormat":1},{"version":"3e444e9378777b2d52ba6e74c736938ec78f9c76a72b6d0f3577fc18b5eb2f75","impliedFormat":1},{"version":"fe555ff873aacc57fbd22772b7f0bbb8a70704fc58f9e9ff88b6f19a8b1d4a13","impliedFormat":1},{"version":"70dfa220caa510a1ee1411ba947de30f9bc7d9186f819837bb5ad3010053ee63","impliedFormat":1},{"version":"a50ae7a664d1cbaa87de5a294be6cdbc1f48bd55c9a24a1d70fbd877e7a0cbf3","impliedFormat":1},{"version":"201aea2e186f363991896c879a6317217d92c4259efe5ce55e8d8c91f532b8dd","impliedFormat":1},{"version":"c56e2b5c8d59dfb14ad86a3e8748ffb837a492cfc02bd74e6f61a30af7092722","impliedFormat":1},{"version":"0a6c3b57bb6a9cbca5ac34f7e0756e80ba79011fc431f4438b3034b1b59892b4","impliedFormat":1},{"version":"7abd883a79b153e94df23c4abe9f13bded3a44216f4e1c13c34ba00cef189f57","impliedFormat":1},{"version":"caf6506cfcf52d2a66b71503f19b70202dc13a468f9bb0faad8f900ae34f3a2c","impliedFormat":1},{"version":"268c20658ab33545068ef965e58d4e1ca14a53e39f5c0bbee66687cfdba43d9d","impliedFormat":1},{"version":"d39e2d9a2ec3a6dfbe03b59f15bdb2c74968ffa6bb9d4e544307769f0993c640","impliedFormat":1},{"version":"4717ec6b7732c61a0e7ab383a476c9817b29328b16b34156cfc5ad0b9d7d8f58","impliedFormat":1},{"version":"09fb442d1576715086c0c8bc8115fb53c46f346d28f4dc77c322ac65c6bd7f93","impliedFormat":1},{"version":"a82d3576ee20e42b53d8e45ad9465c700ef485be0c31a758d8b7e2291f9ca50d","impliedFormat":1},{"version":"82a9a680c84d4b24233310d61ed3418db7195b652ab20fc1a0b1a47aa57dc310","impliedFormat":1},{"version":"11a88787c4523067759de3933a0b8deb3f38dfefaaa4836b659b167b27275298","impliedFormat":1},{"version":"66fbb9536b031278cfa0ac5ed74d2f125da501231a2ebe22b97cdaff5e0edc39","impliedFormat":1},{"version":"2fdd12cfddf613075398c01f58690f3aacda0e926dd6c5512a6e6ef2cf6371a2","impliedFormat":1},{"version":"df53ec34e7ad7e938aad672dd08d9b75c16123464bbe1f387164a3cc78d1cc51","impliedFormat":1},{"version":"980fb4a720501947e77bf29c717a98f9625e7e56b3e633030595d081b3473514","impliedFormat":1},{"version":"83eb52c27e5844d768a09ae7c9509338635a7256f3b28d483f23a3399327a6a7","impliedFormat":1},{"version":"e938b8a60cac5f4e4a72cd9511be226bc06030d44e0f6accf3d68df18ae13040","impliedFormat":1},{"version":"ab6aa891f03df0f4369739449c0d00933e3d130a6eac0d7cfb9f665f3423ea45","impliedFormat":1},{"version":"efcabb01f314c414fc6b873615dbe0763e69487e90c4b136929cd05c6cfd1de5","impliedFormat":1},{"version":"3bb333fe459668e96758bd59642cb45886eb4d141df089c6785d35c1020433cd","impliedFormat":1},{"version":"be332510bcd8c40389283bea35e93f1f902cb9d7ef180cf2c0e927a05f085369","impliedFormat":1},{"version":"4d1a546b25a9a3ff60b1ac5e55a3878519c2dcc300dc06a04a6708d3d8e640b9","impliedFormat":1},{"version":"80a62b835bfb91609d1ccac81cf94a3276d2ed8aa9024eb99f629e9aa0f27460","impliedFormat":1},{"version":"0f51bf186354244323fc42c722b42da476e364b00b1c9280b112e6d6e61206dd","impliedFormat":1},{"version":"8dc226f7642712a4bf68991506ab095578fdb540c2da229c3abfa67f7fe4c030","impliedFormat":1},{"version":"20a143dcd7b924cafc6ab6b5b70a94a04e318e897fab3bf0a2eb21f67f67aed7","impliedFormat":1},{"version":"bc7ce3ac73c33c1d2556aad84aa06503723181ec77b603bf67c64763104dc0a0","impliedFormat":1},{"version":"aeaf848d829b37c347b27f8471ed733c8dfe9abe6883b7d5841edbdad8b9add3","impliedFormat":1},{"version":"ba31825aae74364e8f59614457e8b0211b8a2733305b4b7b552daf11193e9eea","impliedFormat":1},{"version":"8a70faa2f2ab5e0157778d325da396333b27bcfd68832e70d367e2227566448d","impliedFormat":1},{"version":"76f074eca5b7482f67f20298969025009d76d7cf62aa91d5d28f687d41edb798","impliedFormat":1},{"version":"92bfea5cd879afa636f80efc33dccca12acf823e681718127e137883a3711923","impliedFormat":1},{"version":"fccfe0d3c304089fb73ccac46334c560bc574b99080fa9a1ec25b86c69206dd6","impliedFormat":1},{"version":"557432658d74e6e06cc385c72b99e891a0a25abc2b5e481c5ad9b7b1761af6c1","impliedFormat":1},{"version":"2f776685bc0c99715c9bdd155e2cf14974445294b222d40266e3af77ac302c70","impliedFormat":1},{"version":"3dfd8259322149263de4533a74731edeb31915ceba57f1e3abc08dc920d03fee","impliedFormat":1},{"version":"033290784b31452b5d0301107fe6f14674c10533dacbf4eb303f3a3716511516","impliedFormat":1},{"version":"b9482327413f7ed1e0c3b859b30aa15e75c2db383472c1980e38cd3f1c3d8723","impliedFormat":1},{"version":"27c3e5bf46b485d141b1177dc3922c179336499e777327727008132ec3e50614","impliedFormat":1},{"version":"7c5cc7bddb7a3a1a9fc50e45b224b426a09671634e572c55c8907762dcc8bb9f","impliedFormat":1},{"version":"ff74da868ca7bfa4392d5f967dfa4d30086df765d66fabc4e29ee6a42fb592f7","impliedFormat":1},{"version":"987ee8c3f99cc4b4db7295bf86f0b571c3cf9160d6d9d8568fbb98f984370694","impliedFormat":1},{"version":"b6812be6078c34ac1cfdd89f05e0b7073a80fc5df51084345d29d97fa283ae03","impliedFormat":1},{"version":"3099729149af654a0b989c404da6017c9e682cb7fbc6603159727265b9770a0b","impliedFormat":1},{"version":"8402f665c2edf246e7bc5908bf63b496d61587b7e0f3adc862f75906804da3f7","impliedFormat":1},{"version":"532f231ec610e8af592bda8b9de5d3a90bb0d80a179a49bce4806c55cbb9aa41","impliedFormat":1},{"version":"aa6fd4f032f83a72d32fe711021edeabf3180ba86c3eb2c51675f51285181289","impliedFormat":1},{"version":"9824afe54c65346d6afa7c61036ffb5a3f5fd056e31ae2ec7d751dc5409d52b1","impliedFormat":1},{"version":"0623cf1d9e87f5c1bf34df05cbb0718e9071c6db38b9e07c98c03a47a307b9ed","impliedFormat":1},{"version":"ac7fc82281d17783ea2102e1247af1ad0cbcbe80d659b4bb7a1aff731014347f","impliedFormat":1},{"version":"3772dacfc2a47e670e4d4d2f210138e1f34e581d80d52168bb529f0e1829cc8d","impliedFormat":1},{"version":"386d173a3f776815c70a87b25cdd586bc4148bbc0e6583c36347bc508976d5a0","impliedFormat":1},{"version":"68e24b9acc1b635bc0b24d855bb8d6fb9cd35a7c04cff2669b524079e6919d98","impliedFormat":1},{"version":"3867b686b72a073d098f7c3c49a9548aa465a6e9e7a8126733c7fcd6d4aa1e5d","impliedFormat":1},{"version":"d60b6aea17f89366e00410bdc17bdbd9995d73fc1e802ab0c7a501afb4d5d10b","impliedFormat":1},{"version":"7ff1908c58e1f18c829330cd4adee4696cb90b7ea0b1f56d236dc4714cdc18c2","impliedFormat":1},{"version":"6edf9b42533a18aeeeae10a8814f4cedae8f80223baada16df13961f35864856","impliedFormat":1},{"version":"8592fe0eea7d1f67204f0b48c793be466fdba4a90a2c3ec7b1f181753d1282f0","impliedFormat":1},{"version":"3bdc4928624530a01fdbfc5273081c8e824dc0fbb3ac7327cd47210b0d34aead","impliedFormat":1},{"version":"1d1ac17655cbcb598af4ff409e9e6d70633be20f19f19d35fb514f5877898b68","impliedFormat":1},{"version":"25134baffac2b03586eda34193b974a821e567b1a5bffbc9cde61d0e16074b4f","impliedFormat":1},{"version":"a36f879f34d812bc8c5466490725b8ed9a9f9a315eee41de20a9af9b7c2a4820","impliedFormat":1},{"version":"122cfa505c7ebd278f37dc10283f4c441d150445c92a6c2bf2ba3e9176bb2f91","impliedFormat":1},{"version":"293daeff9d40177480690969b3a7c4b9b0d84b4bdbaa4950d8fffb818e74a142","impliedFormat":1},{"version":"9a4d9b1919523b597a449e256f4cd1e43ba4b60e1646df08c31538e9aedfa422","impliedFormat":1},{"version":"3bd9e9bd6a9364d82decadcf19a7c610dfea790ab07ca2b3611393f9988fb113","impliedFormat":1},{"version":"faf8d7a18645241017bd51837bffc63bd4cea01e029d88de1b2e37a407d279e5","impliedFormat":1},{"version":"b557d45c168a6a585beca8a23c5441bac7708b6a033ab6f8713116cea1118453","impliedFormat":1},{"version":"761c60844bb3c797e811a07a760fa44e61be419a1b37dfb710260cd5bc060815","impliedFormat":1},{"version":"53eb2db64558891b5dfa684e391e1c90ec47301a9f1505cf428f16f6cf7de5cf","impliedFormat":1},{"version":"e26687143e9c282921dd83b6422cf7612552e05322dc5bb50009adc68ad313a2","impliedFormat":1},{"version":"e04e7fd49f365ad6c55baea331c2c8f79552f0fa3fe61926fcc881177bc7cc25","impliedFormat":1},{"version":"7e9b6826c473e4417f6b5351f5ef054bc72ae35d090957ee67e5e2dd3e5ba6f9","impliedFormat":1},{"version":"8594866c1a04bfb01f697395e0ac3c51c0b2979da4a90b83b4b303970de817bc","impliedFormat":1},{"version":"b0ff5545b36bef2527a5444e9ff6ca4de1c74e9dc7e3ffa71b1cae738480526f","impliedFormat":1},{"version":"c81a9c6e15aaff8b5f17a6c91f34983a7b136109994312d9b25f35f3794e9f47","impliedFormat":1},{"version":"3aabf2c0f9e07c846223ac523c03e454a1656a899ecf0641594b714054092e08","impliedFormat":1},{"version":"2f91e8f141abe5e0eecf93fc5af904bbb9951748b8a5ec0554ece635f31aad9b","impliedFormat":1},{"version":"3a497b15bf7f15e70663ad041ea1d9739aa2d6765733ca95ce4f9b77f72918d0","impliedFormat":1},{"version":"b74233955e8b40025dddb55303ac2cb5189f22685b4f30dbf21ce1b1a5656ded","impliedFormat":1},{"version":"dba0925c06074e9ea94c9fce95887dd8bae26262e1522d52b769e59e90a311e5","impliedFormat":1},{"version":"a8fd2cb2353e25cbaad960507a48166f3a58c4d99de16924818fac8081baa184","impliedFormat":1},{"version":"ceb65eb1dff839acdf1f5b385ca290c32e00ccf5ba5d6df98f9075c66a39cbe2","impliedFormat":1},{"version":"3191360f1aff858dbd3e142d637035d1e5d002818aa77813ef351b87f5dd7d32","impliedFormat":1},{"version":"872fe3a7b132f8d3c6bd26bcd3e7a3c8feeed054c874488d7ae3223cbacca63d","impliedFormat":1},{"version":"54d5e3ce769fe2154d98368f2f723c8003f04aab9c2067312fc515d8a20580e5","impliedFormat":1},{"version":"cd92ddd341c2f0fb481ba03b7da90fe6d3672bed2499c44c987aacc7114bf6eb","impliedFormat":1},{"version":"6e9c7511379d87a2740bd82772e6a694afb36b18cf3a5075252b6db61846c18c","impliedFormat":1},{"version":"8e81a83a7033af65dc94636670f2192ed2d2c7c1ddc4dfc7f13a355cf93e6b9d","impliedFormat":1},{"version":"d6f8644f091f2a8fc102fcf9047754344e33b49a5dc6c96f2b155c97de8557b7","impliedFormat":1},{"version":"d6f996a2b19779b0f71152bba8b9b6659a6679b7fae83a0b5be40f7a37c17326","impliedFormat":1},{"version":"d84021ab374f116607c7b50f7c0c02c9b1dcd230b4549945cec01ace108ba004","impliedFormat":1},{"version":"0e0649c37dc6e85592933fe6f5ad004ce1853e8d21bb6ac0e3f4f9c924e6ff2e","impliedFormat":1},{"version":"68d8782bc87568b260473a027c7c6e5417e1498a5f0a38037da23e2552474546","impliedFormat":1},{"version":"5c0c825ab416ee1e9edd6b72b4ce7b13d4d4800cfd7d7de91d10755ffacc417c","impliedFormat":1},{"version":"86abf2873e0ae23aa643ee434fef70c867d54d09173fdead22b48ad024655285","impliedFormat":1},{"version":"bfc0c4e4b7d2b31eb03944fa0043b81940467a7cd94167024b8aba41e6505061","impliedFormat":1},{"version":"01ab036733fd2f44fd8f7b4cd58ca975ffaf4f5fe609e716093f9dc47f3d8994","impliedFormat":1},{"version":"10df4132355139ed4a8c1c9a40b7ffb6fc52c5ae249bad6646b4054e2c94dded","impliedFormat":1},{"version":"de43830afd606481d462bd89eae4037d7fcf455237fcdb4520c523285f4e1256","impliedFormat":1},{"version":"859f909f5246bd0f6999187febaf45a70a905061e17179fffea470d80761a5bb","impliedFormat":1},{"version":"f40c99944dcdf917a453520019184f9dcfa16194fbc43b76d0f77df23f052394","impliedFormat":1},{"version":"c6328bc1a231bd78f02b7b25136402c26010c5f8bf1253b0ba0493826a85d442","impliedFormat":1},{"version":"c380069ab6215b5c03e302aef191435e7ec855fbf70c5d4b0a424ed3197c3868","impliedFormat":1},{"version":"9e51ef8accbe8b1a3c052a95ed561b717afd6b2530de9a66c7379d2f186054ba","impliedFormat":1},{"version":"cfd3e57a42b7df68939122e7902de55f6263f3946a5391afc7fc1d3dd4beda7c","impliedFormat":1},{"version":"d66dbe78ab15123ea4a5dea6eed216ec3f1f85f0d98690f92296e2855aabfcf7","impliedFormat":1},{"version":"4a409bbbe10e610ccba8385528554ff3ddedd7e0e3bfdc537873b423f280d89b","signature":"59a3657b0b02a90ea0446af91a10afecc638c3373a3d6738af2df9fed3591d1c","impliedFormat":1},{"version":"6d2f15bd194171bc0986ee42153e628e89978feaf66132f505cc9e7f1ed9445e","signature":"f6321b962652852fc79595a558dc4a0e29756dab3e3d453d15bfecc293753f62","impliedFormat":1},{"version":"1ba59c8bbeed2cb75b239bb12041582fa3e8ef32f8d0bd0ec802e38442d3f317","impliedFormat":1},{"version":"100c0356d3458334391a9f572ac21c1bdde0119f9ef9d7e88f7b48fa76ac3bc1","impliedFormat":1},{"version":"8a90c628f293590574bbeb66092271849d180a7f4812cb05233a2c4cb30e0c04","impliedFormat":1},{"version":"d2ab468a72716e9a385b9c0188ddd17045efb781ce90fd9f00141729cdc867e6","impliedFormat":1},{"version":"c3fbb898f4185e04b223a3c406f71be2ce89b58816b95096e91bd40bf74d2a08","impliedFormat":1},{"version":"7bac41f2fcdc718cb06a0caee8796305de3f435a1c3d5a700305f9cb26ab3041","impliedFormat":1},{"version":"e46abaadffe51343e4b50115f22ec40c55efc952e1a5ad8ea83a379e68fdc41b","impliedFormat":1},{"version":"56a44eae80f744ff0ed0ae54ed2c98873d9efaeb94b23102ce3882cbf3c80c87","impliedFormat":1},{"version":"c1608564db1e63ec542694ce8a173bb84f6b6a797c5baf2fdd05de87d96a087f","impliedFormat":1},{"version":"4205f1615444f90977138e01f4c6becc1ae84e09767b84c5a22185ddea2b8ffe","impliedFormat":1},{"version":"823fcbdb4319180e3f9094bc859d85c393200b9568c66f45ba4d5596ace5641d","impliedFormat":1},{"version":"99c0975f5d575eb40fdf0b43fc3e9e8538aa89f47fdf1c20b06bdea609bafc60","impliedFormat":1},{"version":"99c0975f5d575eb40fdf0b43fc3e9e8538aa89f47fdf1c20b06bdea609bafc60","impliedFormat":1},{"version":"0972ae3e0217c3591053f8db589e40b1bab85f7c126e5cf6cc6f016e757a0d09","impliedFormat":1},{"version":"99c0975f5d575eb40fdf0b43fc3e9e8538aa89f47fdf1c20b06bdea609bafc60","impliedFormat":1},{"version":"165181dcaf69484f3a83fef9637de9d56cfa40ee31d88e1a6c3a802d349d32b2","impliedFormat":1},{"version":"823fcbdb4319180e3f9094bc859d85c393200b9568c66f45ba4d5596ace5641d","impliedFormat":1},{"version":"99c0975f5d575eb40fdf0b43fc3e9e8538aa89f47fdf1c20b06bdea609bafc60","impliedFormat":1},{"version":"8e517fddbe9660901d0c741161c1ee6674967aaa83c0c84916058a2c21a47feb","impliedFormat":1},{"version":"30f2b1e9cecf6e992ee38c89f95d41aebdb14a109164dd47d7e2aa2a97d16ea9","impliedFormat":1},{"version":"99c0975f5d575eb40fdf0b43fc3e9e8538aa89f47fdf1c20b06bdea609bafc60","impliedFormat":1},{"version":"f44bf6387b8c7ab8b6a4f9f82f0c455b33ca7abc499b950d0ef2a6b4af396c2a","impliedFormat":1},{"version":"725d0451e136578def8263b9f5631d45b7c7c54e72a6ce3b524a1fd5bf6a31f5","impliedFormat":1},{"version":"0a7a83acf2bd8ece46aff92a9dedb6c4f9319de598764d96074534927774223a","impliedFormat":1},{"version":"4f9142ccaefd919a8fe0b084b572940c7c87b39f2fd2c69ecb30ca9275666b3d","impliedFormat":1},{"version":"b80840cbfda90fd14082608e38e9b9c5fde7a0263792c544cddc0034f0247726","impliedFormat":1},{"version":"dcd34efd697cf0e0275eb0889bdd54ca2c9032a162a8b01b328358233a8bcd49","impliedFormat":1},{"version":"98ca8492ccc686190021638219e1a172236690a8b706755abb8f9ff7bb97b63e","impliedFormat":1},{"version":"b61f91617641d713f3ab4da7fdda0ecef11906664550c2487b0ffa8bfbdc7106","impliedFormat":1},{"version":"725d0451e136578def8263b9f5631d45b7c7c54e72a6ce3b524a1fd5bf6a31f5","impliedFormat":1},{"version":"725d0451e136578def8263b9f5631d45b7c7c54e72a6ce3b524a1fd5bf6a31f5","impliedFormat":1},{"version":"61cc5aabafaa95e33f20f2c7d3289cf4cab048fc139b62b8b7832c98c18de9ef","impliedFormat":1},{"version":"811273181a8489d26cfa0c1d611178ddbeef85ced1faec1a04f62202697a38a5","impliedFormat":1},{"version":"487d2e38f52af45f6c183407858ea3e0a894fb3723c972140436f40878a27e85","impliedFormat":1},{"version":"15e56c8cb8c5515fe9794c5d223ca5c37a302c62183137a595ba657f5d961527","impliedFormat":1},{"version":"fda3db70b49ad94d08ec58caf0ca052e51d38c51d0461a28669a419c67edb396","impliedFormat":1},{"version":"bb7dd4601aaf41b0313503ffc43142a566a87224cc1720cbbc39ff9e26696d55","impliedFormat":1},{"version":"5ef05c11e0fe4120fb0413b18ca56c78e7fe5843682731fe89c6d35f46d0a4ae","impliedFormat":1},{"version":"02c3a89952ea1b30a3573246649c474cd27b17a26d532abed1e152d5981a6b97","impliedFormat":1},{"version":"d2873a33f67fd7d843ead8cebaeebd51ada53f5fc70d4a61e1874c5d2e3fde4b","impliedFormat":1},{"version":"94c6e873b76d2b5094bd2fddd026db85264bc24faa9cb23db9375f1a770312b5","impliedFormat":1},{"version":"2e8e67d756f97ff13764c81f098b9de13ff91e31028890f3dabe9e8d354f7e47","impliedFormat":1},{"version":"a3476600ff22e7d4845d951dbd0548f8d118f2bfe236aaa6ccd695f041f7a1fc","impliedFormat":1},{"version":"02c3a89952ea1b30a3573246649c474cd27b17a26d532abed1e152d5981a6b97","impliedFormat":1},{"version":"a86a43e07633b88d9b015042b9ea799661fe341834f2b9b6484cfa18a3183c74","impliedFormat":1},{"version":"8994f4c217d03e50957cc4693ae5fd35fd15c60c7d77a31528d90cbeb89311df","impliedFormat":1},{"version":"f5db90ab2b03fc1bc55b4d46df4aa6d4cacdbdd1491bcba0a3cf1a73777204d7","impliedFormat":1},{"version":"9fd04134a11f62f6b1523168945b42a74c35ffe1ea94dfdb08ecddf32218c5c2","impliedFormat":1},{"version":"dbe0161c1a41397e79211136cc6d595b10117aa23ac2f17f7484702ada81bc13","impliedFormat":1},{"version":"b21e6c15895ef16c12925295ebbb39f6731a0c74116f7bfdf5a9085040178bac","impliedFormat":1},{"version":"ea9911c1ac347d631cd840485aef26a8079f0ab64019cc90ae6c97d97dd65034","impliedFormat":1},{"version":"e9ff90fbab735e28c091315b542c620141a76f91bb0d56a14178908905e51b35","impliedFormat":1},{"version":"839ebe64509ec88e2d7e48cc36bed2b0f52e68b02818478a6e18a88b041ed78a","impliedFormat":1},{"version":"6fcdcc891e7f13ad8bd34c4de33d76d96c84f06d9ab6629620c8cf08d0cc6bea","impliedFormat":1},{"version":"16a187924c639631e4aab3d6ea031492dc0a5973bae7e1026b6a34116bd9ff5c","impliedFormat":1},{"version":"cd78f65631ff21afa0d2d72f47bd7783126e48c986ff47df22d1dc31347730e5","impliedFormat":1},{"version":"f5db90ab2b03fc1bc55b4d46df4aa6d4cacdbdd1491bcba0a3cf1a73777204d7","impliedFormat":1},{"version":"ad068305ead33649eb11b390392e091dbf5f77a81a4c538e02b67b18eb2c23b3","impliedFormat":1},{"version":"8994f4c217d03e50957cc4693ae5fd35fd15c60c7d77a31528d90cbeb89311df","impliedFormat":1},{"version":"caa292653f273a1cee0b22df63ce67417dbc84b795867bf3cd69f7386bb0f73c","impliedFormat":1},{"version":"cbe901efe10faaa15e14472d89b3a47892afc862b91f7a3d6e31abeb3546a453","impliedFormat":1},{"version":"717b25e589f53597f65f42e0ccff891cd22743511c79b50d534d2fa548484937","impliedFormat":1},{"version":"79d5d086cfd15de8c973783e166e689aa29100d0906ccfef52928504949cf8c2","impliedFormat":1},{"version":"15ecea8b0870ebf135faa352b43b8385f5a809e321bb171062da7ad257c9fd08","impliedFormat":1},{"version":"df9712034821067a7a2a0cf49c7bb90778dc39907083fa47b20c3e22c4e62da5","impliedFormat":1},{"version":"6b2394ca4ae40e0a6e693ad721e59f5c64c2d64b3a6271b4f20b27fce6d3c9c2","impliedFormat":1},{"version":"27ea6d85f1ba97aa339451165cae6992c8a6a7b17d3c8468e3d8dce1c97d16cd","impliedFormat":1},{"version":"05751acbcbf5d3ff3d565e17589834a70feb5638ae7ee3077de76f6442b9e857","impliedFormat":1},{"version":"54edf55c5a377ee749d8c48ca5132944906c09f68b86d1d7db4acc53eea70d57","impliedFormat":1},{"version":"839ebe64509ec88e2d7e48cc36bed2b0f52e68b02818478a6e18a88b041ed78a","impliedFormat":1},{"version":"839ebe64509ec88e2d7e48cc36bed2b0f52e68b02818478a6e18a88b041ed78a","impliedFormat":1},{"version":"bd0923e7cd1c54c64d7396fbd284983003f0e757bd67f3d6cf3a4e5d394128d7","impliedFormat":1},{"version":"b80840cbfda90fd14082608e38e9b9c5fde7a0263792c544cddc0034f0247726","impliedFormat":1},{"version":"4628d6640af9591f1671e0737b3b7de3abe790ff92686a46d6ca5b2e867162c1","impliedFormat":1},{"version":"50145df9cc9bdb77ac65e4622d11fb896b4730f6f727ffd42337a4fdcd2346da","impliedFormat":1},{"version":"0211a096d47b00b5ba4f6a2557184c649db02cb13a8d63f671428c09818b6df8","impliedFormat":1},{"version":"d32d132c14387d64aa1b776f426a5c3ddcf8211d8764526380dda04f9f4dd776","impliedFormat":1},{"version":"af1c879f74fa27f97cf8ae59ed33421826b7d00647c601cafbbeea129ed5ef5b","impliedFormat":1},{"version":"3b47ab89a1b5a0d3943aace80a68b9af7ae671e359836679ff07536c56ada3fa","impliedFormat":1},{"version":"99c0975f5d575eb40fdf0b43fc3e9e8538aa89f47fdf1c20b06bdea609bafc60","impliedFormat":1},{"version":"ae66752cf1b4d08f0b1870dd7c848e491f078116e6395ee5171323c7ec30e92b","impliedFormat":1},{"version":"14a9ec5df1f55a6b37f36d5d91699092119dba1d81defd12151eb0069a26069d","impliedFormat":1},{"version":"ff49d78bd5a137f76e23cc9629105c1d216c43bf68f545acf3f997e838a47ba3","impliedFormat":1},{"version":"842f200637a0e0f390a6512e3e80c8f47c0193bbdff19b5700b070b6b29f1787","impliedFormat":1},{"version":"26a06ef0d60229641de4f9d0ac8566a471b99a3c124e567405a82e77116bee2a","impliedFormat":1},{"version":"f4f34cdbe509c0ae1a7830757a16c1ccb50093b3303af2c301c0007ec2ddf7e0","impliedFormat":1},{"version":"59ba962250bec0cde8c3823fd49a6a25dea113d19e23e0785b05afde795fad20","impliedFormat":1},{"version":"ea930c3c5a401f876daaec88bfc494d0f257e433eaa5f77208cc59e43d29c373","impliedFormat":1},{"version":"318ba92f9fcec5a9533d511ee430f1536e3e833ffe3ea8665d54fe73e28b1ad4","impliedFormat":1},{"version":"adc45c05969fc43d8b5eaac9d5cb96eccf87a6a1bd94498ddd675ea48f1ba450","impliedFormat":1},{"version":"5691d5365f48ff9de556f5883901586f2c9c428bcf75d6eff79615ae1fb67da6","impliedFormat":1},{"version":"839ebe64509ec88e2d7e48cc36bed2b0f52e68b02818478a6e18a88b041ed78a","impliedFormat":1},{"version":"a67a76d1886745066bd45956fdc5842812786be2a47285d2c59424882cefd6cf","impliedFormat":1},{"version":"66adf84e776d039acb0207f079934f389147264385fc8847b56481253da99fad","impliedFormat":1},{"version":"d2eee6a9d0b2f4123aba65f6e1bc4df3f973f73a7bdeaa9f76c3c0d3f369bef8","impliedFormat":1},{"version":"8f47038a38222bcbc8551a017ae2e32933ca4e6d2a4ec5cfa01179f1facfa975","impliedFormat":1},{"version":"839ebe64509ec88e2d7e48cc36bed2b0f52e68b02818478a6e18a88b041ed78a","impliedFormat":1},{"version":"839ebe64509ec88e2d7e48cc36bed2b0f52e68b02818478a6e18a88b041ed78a","impliedFormat":1},{"version":"839ebe64509ec88e2d7e48cc36bed2b0f52e68b02818478a6e18a88b041ed78a","impliedFormat":1},{"version":"73c82b8dd8ac2916e7cc44856da0dc795ca9952bb63baa220743d31f62b278e5","impliedFormat":1},{"version":"9e302a99187359decbfba11a58c6c1186722b956f90098bb34d8b161bc342a0d","impliedFormat":1},{"version":"839ebe64509ec88e2d7e48cc36bed2b0f52e68b02818478a6e18a88b041ed78a","impliedFormat":1},{"version":"9a06d96357b472809d65ea00b724b4309ba8c9bc1c73eadd3c465e1c336a1e2f","impliedFormat":1},{"version":"ac2b056c5c243b64e85fb8291efd5a1a5481f0bc246b92ea40827ed426ff408c","impliedFormat":1},{"version":"be78757555b38025ba2619c8eb9a3b2be294a2b7331f1f0c88e09bf94db54f3c","impliedFormat":1},{"version":"d68d6551207bf833d92fb7cda4d9428182f8c84eed1743d9a1e7135003e8e188","impliedFormat":1},{"version":"99394e8924c382a628f360a881171304a30e12ac3a26a82aba93c59c53a74a21","impliedFormat":1},{"version":"ed1f01a7eb4058da6d2cde3de9e8463da4351dbab110f50b55e6a7e6261e5e86","impliedFormat":1},{"version":"19ee405d4f1ae4cbacf4361f9a03092a9d69daa3b4ec147c346049d196b5656d","impliedFormat":1},{"version":"6d82ce2eadb900816fb1fa8b62eb4fcf375322bd1fe326b57ef521a0cac3c189","impliedFormat":1},{"version":"19ee405d4f1ae4cbacf4361f9a03092a9d69daa3b4ec147c346049d196b5656d","impliedFormat":1},{"version":"9d344fa3362148f3b55d059f2c03aa2650d5e030b4e8318596ee9bd083b9cf05","impliedFormat":1},{"version":"839ebe64509ec88e2d7e48cc36bed2b0f52e68b02818478a6e18a88b041ed78a","impliedFormat":1},{"version":"839ebe64509ec88e2d7e48cc36bed2b0f52e68b02818478a6e18a88b041ed78a","impliedFormat":1},{"version":"bfea7300ed7996fd03c8325ce6993eed134984b4bb994b0db8560b206c96f1f7","impliedFormat":1},{"version":"839ebe64509ec88e2d7e48cc36bed2b0f52e68b02818478a6e18a88b041ed78a","impliedFormat":1},{"version":"ca87e8ccd63c92b34fc734eee15d8ab2d64f0ffb85d762018bc0df29ca7185b4","impliedFormat":1},{"version":"4628d6640af9591f1671e0737b3b7de3abe790ff92686a46d6ca5b2e867162c1","impliedFormat":1},{"version":"a3913393d42c709b4faea550820241a262a4ba3577f9a00e2f8727eaa92be535","impliedFormat":1},{"version":"5e424456e19df83a4befc6cd24561c2564b7a846b7025a164ce7076ee43828ee","impliedFormat":1},{"version":"887dec57d4c44eaf8f5275c9f5e02721b55c0a34f21f5b6ed08a1414743d8fd9","impliedFormat":1},{"version":"2d53acf155ccbc6b7dca2cfdb01bac84e3571865d925411d2f08ff0445667ea8","impliedFormat":1},{"version":"839ebe64509ec88e2d7e48cc36bed2b0f52e68b02818478a6e18a88b041ed78a","impliedFormat":1},{"version":"a7161c3e94028388a80f7091eb2f7f60d2bdde6a58f76876ab30f66c26f6128e","impliedFormat":1},{"version":"381936e93d01e5697c8835df25019a7279b6383197b37126568b2e1dfa63bc14","impliedFormat":1},{"version":"9944093cbb81cc75243b5c779aebfb81fe859b1e465d50cd5331e35f35ef263a","impliedFormat":1},{"version":"fb19163944642017fcdcbdc61999ab21c108334c8b63377184a2a1095698889a","impliedFormat":1},{"version":"839ebe64509ec88e2d7e48cc36bed2b0f52e68b02818478a6e18a88b041ed78a","impliedFormat":1},{"version":"1bd91f5355283c8fa33ad3b3aace6c4ebb499372943a49f57276f29f55fd62c4","impliedFormat":1},{"version":"6535056b39d5e025505b36ec189302e15af7d197a6afd9a3c853187eb1bea7b5","impliedFormat":1},{"version":"34f97cabd716ba01042042f6523183149c573b8fb15a08a3a9524bf1950216ef","impliedFormat":1},{"version":"01911dee2f91c28782c46d57e2e19e250f7c9db4388f8e9945476379e9392d56","impliedFormat":1},{"version":"95ce7b12742f82bddb85134d8ee20a759c698e5d8beefd559fd6e87112fbf72f","impliedFormat":1},{"version":"0b464435da3dd6473694a2128d49f37c9cf43951455c56f0aa5a940f290c69d2","impliedFormat":1},{"version":"75a5fcf80ec969763cb4a31d2cf8b8531b076d6f1ef8699bd9dacca43d34b571","impliedFormat":1},{"version":"b27117352bfa4f1e6fa6874c3f5518252ae2ff30e345d9e505409a75a232372c","impliedFormat":1},{"version":"d21630c0cd7409e8078cc0aeebf3cf8b915888553d7c9c2d9debd918bfd4bebb","impliedFormat":1},{"version":"7e7a2691f49c7d2623b8a531c9eb4005c22daa57e7789f1982c19fe3c1bf55eb","impliedFormat":1},{"version":"80c54f1d257a28de68ec6c23ca7da374071646182d9a2d2106a91606ebc15f52","impliedFormat":1},{"version":"55ba9e8cb3701eff791fccbe92ef441d19bc267b8aab1f93d4cac0d16fffa26a","impliedFormat":1},{"version":"a40e9367d94ec1db62a406d6e1cb589107ea6ad457af08b544e18d206a6ae893","impliedFormat":1},{"version":"12b260ecee756ba93760308b75a8445f2fe6a1cff3f918cf7e256e3d6d1066cc","impliedFormat":1},{"version":"181de508acbe6fe1b6302b8c4088d15548fb553cb00456081d1e8d0e9d284a24","impliedFormat":1},{"version":"ead149a41e9675c986e6d87c9309e751a8c2d0521839a1902f05ec92b2cba50b","impliedFormat":1},{"version":"d15a8152e6df11bfad2d6813f4517aa8664f6551b0200eca7388e5c143cd200d","impliedFormat":1},{"version":"98884645b61ad1aa2a0b6b208ebaab133f9dd331077a0af4ec395e9492c8d275","impliedFormat":1},{"version":"a6add93dcdbb7c0b119b363ba421fb530d7fd68814be4a8314ec9aee486478f9","impliedFormat":1},{"version":"f660100bff4ca8c12762518ba1c1d62dd72ee1daa7ea42f7eae2f72e993bec6f","impliedFormat":1},{"version":"fd7140ce6b8fc050547d7da8696ed2bcdf4cabc4e65f40f4ac1b080f694711d8","impliedFormat":1},{"version":"8689dabe861fb0bdb3f577bdd9cca3990b14244d1d524c7bdb8d89e229c903a6","impliedFormat":1},{"version":"15d728b5790c39ce9abbd1363e0a5ed03ee6b59a38ee3c4d9d25476641baa7a5","impliedFormat":1},{"version":"95159570a0fc2b007b1a46ed8caf145ad6711030c0c4727cee979a3b770b0634","impliedFormat":1},{"version":"e5446a2b0c44d21a4e2ed885bbdb40a4e39a184f9155f13717993782e313bc7e","impliedFormat":1},{"version":"8683b5b593a5fd2cf99212195ba25106e61a546169068626c8a3745ec6e94bed","impliedFormat":1},{"version":"3f72337d957fd6c87b5c8628c85633d7314b8539cc641ea71a6f93a71f7533c2","impliedFormat":1},{"version":"5d0975641e296dba1ebaf16bb987a2b3abe0a62d18fa1396f57c9d4aaead48e8","impliedFormat":1},{"version":"7b08a55fd84cf8bbee204fa09e8ea402996a648c5af38b52d27231c60d9c8e4d","impliedFormat":1},{"version":"a6add93dcdbb7c0b119b363ba421fb530d7fd68814be4a8314ec9aee486478f9","impliedFormat":1},{"version":"60d3271e8f6a7e952844b716a5f9f71744cb8d6fbeb9adaf35f1735ff7e44aa0","impliedFormat":1},{"version":"632e473a59bfaff109a4405851b56c61aab4a82cedd2a658b37931f98f64ba91","impliedFormat":1},{"version":"178871c23f0cac1cb358aa23f0ba3b1650ec3e962f575e82d33bce7550e55cce","impliedFormat":1},{"version":"94386e32c1da2a3dbff53bfa3aca55ef89397f09bfbb7546890031f246d65716","impliedFormat":1},{"version":"2b96e9789937d863abbb5e33861c941da0d0607fa548f965cdf4e0cf984579ce","impliedFormat":1},{"version":"ea80ad7543efdaeb5ee48a3951f5a32adaa8814fb2a8b9f8296170aa31083455","impliedFormat":1},{"version":"72aad439f7b0cf1c9b28cba809c6b818c72d09f8eeb5978f626d088c2d520f18","impliedFormat":1},{"version":"40d4add4a758635ba84308ecf486090c2f04d4d3524262c13bfb86c8979fac4e","impliedFormat":1},{"version":"72aad439f7b0cf1c9b28cba809c6b818c72d09f8eeb5978f626d088c2d520f18","impliedFormat":1},{"version":"f44c61ac2e275304f62aace3ebc52b844a154c3230f9e5b5206198496128e098","impliedFormat":1},{"version":"924f76dc7507df1c4140262ea2a2d8ef99b8c31e995edefc8271928a3e4807a6","impliedFormat":1},{"version":"3ffc5226ff4a96e2f1a1b12720f0f8c97ac958ac8dd73822bedf6f3ed3c35769","impliedFormat":1},{"version":"924f76dc7507df1c4140262ea2a2d8ef99b8c31e995edefc8271928a3e4807a6","impliedFormat":1},{"version":"9df26a86871f5e0959d47f10bff32add294bf75b8d5a4f77a19dfc41694649d2","impliedFormat":1},{"version":"bfdd4ae390e0cad6e6b23f5c78b8b04daef9b19aa6bb3d4e971f5d245c15eb9a","impliedFormat":1},{"version":"369364a0984af880b8d53e7abb35d61a4b997b15211c701f7ea84a866f97aa67","impliedFormat":1},{"version":"7143d8e984680f794ba7fb0aa815749f2900837fb142436fe9b6090130437230","impliedFormat":1},{"version":"f7b9862117ae65bea787d8baf317dcc7b749c49efeada037c42199f675d56b7b","impliedFormat":1},{"version":"78a29d3f67ea404727199efc678567919ecebbfdc3f7f7951f24e1014b722b46","impliedFormat":1},{"version":"803e5b05c612513cf773d7826c8556eb30ff4a92ba33e9c9dde5ab4cfc342cf9","impliedFormat":1},{"version":"e53b2d245026cefec043621d6648fab344fd04415b47270da9eb4e6796d2a9f4","impliedFormat":1},{"version":"9560571cf48c84114027d57b34d769cd4e9a6cfaac7919bfbdcd6ad0801bc73c","impliedFormat":1},{"version":"f10a10d90bd1e3e12e1d7d027086a716dd6fa03d251597af77210e7a3081ac0b","impliedFormat":1},{"version":"b2bd6911e91dbb008938121d0fd7df51f00148652090bc9ccde4dc704f36f011","impliedFormat":1},{"version":"1bbdf84753428ed6f1533eabb066f9b467fade05180797e39cb32b4be4ba7d5d","impliedFormat":1},{"version":"e52d0f3e5073519a3a0a69fb0090c180f219fa04fc4053bb2bc5453a61296acd","impliedFormat":1},{"version":"24b30db28923568ff5274ec77c4c70c3e18a62e055f207633b95981ba94b0dee","impliedFormat":1},{"version":"e285a018fca2bcd32f25e2e048076b135086b3bd0d6215b1f72716129dce44ad","impliedFormat":1},{"version":"d9901d27accf8b30a3db21c9537e516427f55abd13ca53283c8237711bd37c16","impliedFormat":1},{"version":"46ded89297bd3856f536a6a990d64831ea69976626669e9371fe12e47a263ceb","impliedFormat":1},{"version":"823f27e48b1e7ff551b90d15351912470ab3cd0fa133bc2e1ddc22bea6c07d23","impliedFormat":1},{"version":"189abcb612878978d45a513656690710591b93860bc9cc2d2bf58c5f2ea9b3ae","impliedFormat":1},{"version":"e6251b50929025156877155e58eff37840da58c85d094e3f128b4f07e03aa66d","impliedFormat":1},{"version":"e6251b50929025156877155e58eff37840da58c85d094e3f128b4f07e03aa66d","impliedFormat":1},{"version":"4e5f8c9d9655d5cedd160d50dc0d04f78fafb2c21db87e5b0c87105050445d91","impliedFormat":1},{"version":"a6add93dcdbb7c0b119b363ba421fb530d7fd68814be4a8314ec9aee486478f9","impliedFormat":1},{"version":"657bfa91b3233a36081f7030fa35a16728be10e90b926a9e8ae218e9078a5e75","impliedFormat":1},{"version":"c6b1f54c34ab08126f8594801908410a93a64e0dff66df8a226a9b5460054f19","impliedFormat":1},{"version":"ca969c350e570c5fa395c4fb88ea52dfe50014890c445d2834e4f1fe96e93c2d","impliedFormat":1},{"version":"a6f374e4c41a9aaa10213ba98f7d1e520f4cc314c2f20770145124e2f207f11c","impliedFormat":1},{"version":"5d6ddacf1e9cc6fd92ae992eb6eb00910cfe3fe95f6e29b44f0730c710b2def5","impliedFormat":1},{"version":"5d6ddacf1e9cc6fd92ae992eb6eb00910cfe3fe95f6e29b44f0730c710b2def5","impliedFormat":1},{"version":"803e5b05c612513cf773d7826c8556eb30ff4a92ba33e9c9dde5ab4cfc342cf9","impliedFormat":1},{"version":"1481094055c14f5976d55446330cca137adf0b2a39dcae164f1d6460862e5e5b","impliedFormat":1},{"version":"914912142f2648f12b831ad10bcfacfbc02876161de095c479a1ae308067f646","impliedFormat":1},{"version":"b5f7732acfd56640a680acbd12caff991c839c3dfd5a4b48ad90bd7a730d501d","impliedFormat":1},{"version":"8b801973d33012fc9b97dcb37cfd2d5d30eed228b4d342ae3563972ba1004279","impliedFormat":1},{"version":"09c3bb9dac02114c00586e82c825655ea0c5031097667855544d436063322760","impliedFormat":1},{"version":"14e64ceb540cc27093ba1a04948aec14707da94a6ff1d9675efca976e10fea49","impliedFormat":1},{"version":"da6e2dde5747e6e71bdc00a26978fe29027a9e59afe7c375e2c040a07ef9ff25","impliedFormat":1},{"version":"5d6ddacf1e9cc6fd92ae992eb6eb00910cfe3fe95f6e29b44f0730c710b2def5","impliedFormat":1},{"version":"4e5f8c9d9655d5cedd160d50dc0d04f78fafb2c21db87e5b0c87105050445d91","impliedFormat":1},{"version":"a6add93dcdbb7c0b119b363ba421fb530d7fd68814be4a8314ec9aee486478f9","impliedFormat":1},{"version":"da20ac2b80ec650f4c36df8ebff9493625634329eb0f901a0971dd6619e0978c","impliedFormat":1},{"version":"ef51ac3ae8d6ddc8ee29937a039cbb4a9bfe6ab34267d4c9d998645e73f91237","impliedFormat":1},{"version":"cc45a177fe3864f8a5579ddb987cb5db0ee47c4d39335832635c241b5f98337e","impliedFormat":1},{"version":"3aaf74018283ef4c49f52bcab37f09cd6ec57fff27503090bc4bb75194fd68a8","impliedFormat":1},{"version":"69578d34fa63a8314823b04f6f57a60671755666055a9990b070f5403f21d417","impliedFormat":1},{"version":"c9aa17bf9f1d631f01764ad9087de52f8c7e263313d79ac023f7cd15967b85cb","impliedFormat":1},{"version":"78d05f11e878fe195255ac49d0c2414a1c7fa786b24e8d35c0659d5650d37441","impliedFormat":1},{"version":"b93a1522b0ae997d2b4dc0e058c1d34f029b34370ee110b49654deeef5829a41","impliedFormat":1},{"version":"eec377e6bfd366a64f9641e80ff1e7ab5fa58963364a9d6a76a11365dccd87d3","impliedFormat":1},{"version":"ae2104bdc52ab3722b5c0cfa26aa65b077e09d7288695f9e0ee9ffde08721b3d","impliedFormat":1},{"version":"a4038d37487d8535f99ba99adc4a01b08f038515dd939e57bd80a3743c0e5662","impliedFormat":1},{"version":"9560571cf48c84114027d57b34d769cd4e9a6cfaac7919bfbdcd6ad0801bc73c","impliedFormat":1},{"version":"483095dc7d04bc24cc55e72a807fa8d786a52981068c6f484947f63956b0fa92","impliedFormat":1},{"version":"4539884fadd3b91977560c64de4e5a2f894a656a9288882e1307ba11c47db82e","impliedFormat":1},{"version":"430016e60c428c9c8bfa340826ff7ed5988e522348838700f3c529dc48376c10","impliedFormat":1},{"version":"549f38b7fc2753d95809f16c29e8f86cf6f9d99cb17d8eb53f0132bc92192a2b","impliedFormat":1},{"version":"2e1b0586468b145f432257bfc0dc8d40a82b04ebd00c5f92efdde426d14d122b","impliedFormat":1},{"version":"976d79fce50c222b3aa23d34e4165e1c8424060c3744a4a5b5834bbc644e64a6","impliedFormat":1},{"version":"d61d7221ed4b74db0568ffae7765f6c2a48afc64a076dd627e98dfecd1ad9897","impliedFormat":1},{"version":"89ac12f3bd077e0d31abc0142b41a3dbbdb7ae510c6976f0a957a1f3ca8c46c9","impliedFormat":1},{"version":"694d279f9a6012c39bba6411e08b27706e0d31ea6049c69ff59d39a50de331cc","impliedFormat":1},{"version":"e27f95d214610d9d7831fdeccba54fbe463ae7e89bd1783d828668072c2d2c92","impliedFormat":1},{"version":"ed48328b38a82b98abf873153e939c9baed42cbd5d5289830dd832c552db5024","impliedFormat":1},{"version":"6ca43ca6b5f1794be3eee4993c66f15083c3b47ee45615163ee49f450e4b464a","impliedFormat":1},{"version":"8d8381e00cd14cf97b708210657e10683f7d53a4eddcfc3f022be2c9bdf591dd","impliedFormat":1},{"version":"a37d882a1490198571664d4d06e584d226f8c62445b25696f3f9efff776b2a0b","impliedFormat":1},{"version":"a37d882a1490198571664d4d06e584d226f8c62445b25696f3f9efff776b2a0b","impliedFormat":1},{"version":"a37d882a1490198571664d4d06e584d226f8c62445b25696f3f9efff776b2a0b","impliedFormat":1},{"version":"ec85bf4283c2ec8108b0b6161f155aeedfc770f42dca27bb6fca2cfb0abf1a8a","impliedFormat":1},{"version":"ec2ba248e2ad73cfd1989cb7f53ff1df5612f63b628e03a472308c1bab10c0f9","impliedFormat":1},{"version":"ea763067ac7adab4741f87de9fec3fc154ac1f3578b7e3bc0c64b42c6f6c912e","impliedFormat":1},{"version":"a6add93dcdbb7c0b119b363ba421fb530d7fd68814be4a8314ec9aee486478f9","impliedFormat":1},{"version":"d54fa16b15959ed42cd81ad92a09109fadbb94f748823e2f6b4ad2fbbee6e01f","impliedFormat":1},{"version":"a336b950cd64c3c3dd2503384bf2915a5ea03d694672bfedabd71fafdae34ebe","impliedFormat":1},{"version":"2e2ffb8593c9db471bac9f97c0b1f1c7ef524946a462936e5e68858ac3e71566","impliedFormat":1},{"version":"d4c081ae5c343c754ac0dd7212f6308d07f55ab398cee4586ee0a76480517ae5","impliedFormat":1},{"version":"eec377e6bfd366a64f9641e80ff1e7ab5fa58963364a9d6a76a11365dccd87d3","impliedFormat":1},{"version":"a4f2c605bbc73124b1bb76faa66be28937ccfb7f5b77c45cd8022071bd53696c","impliedFormat":1},{"version":"be4c58de8fd3ddd0e84076c26416ce5ffcf193a1238704692e495bc32e0a6ec5","impliedFormat":1},{"version":"af9491fcc19d5157b074871bdceafc18dd61972020fb8778c7d3cd789cd8186a","impliedFormat":1},{"version":"64da3dee7d98bdc4b99b24de094a08ffb2dda8aa14270cd51fc936dc8af1cdb2","impliedFormat":1},{"version":"a4038d37487d8535f99ba99adc4a01b08f038515dd939e57bd80a3743c0e5662","impliedFormat":1},{"version":"9560571cf48c84114027d57b34d769cd4e9a6cfaac7919bfbdcd6ad0801bc73c","impliedFormat":1},{"version":"152532087c2a91adb4527e96ccd7b3640f1b08c92301fa2f41ed6a53130bda67","impliedFormat":1},{"version":"549f38b7fc2753d95809f16c29e8f86cf6f9d99cb17d8eb53f0132bc92192a2b","impliedFormat":1},{"version":"549f38b7fc2753d95809f16c29e8f86cf6f9d99cb17d8eb53f0132bc92192a2b","impliedFormat":1},{"version":"6e39d03aa07f268eed05dd88e1bd493cb10429c1d2809e1aaa61fbcd33978196","impliedFormat":1},{"version":"aa7384441d37522532179359964184e5c8cf649db32a419542e7b5605208b45c","impliedFormat":1},{"version":"da31c5275a923bb601a84bd648fd24cc9009860fd5901351f32e686e69bfd432","impliedFormat":1},{"version":"36d27819ece3bf0eefe61ecda9e3aa2e86b5949c89dba79f17dd78a2c4587a61","impliedFormat":1},{"version":"da31c5275a923bb601a84bd648fd24cc9009860fd5901351f32e686e69bfd432","impliedFormat":1},{"version":"18a20ae79049147b460771dfd6b63b3b477772d763c26b367efa499c98e9fb5f","impliedFormat":1},{"version":"4c91908ebcc1b1c91f5c9cd7e9ffff83fc443e6926013b0b0082a6c2778b729e","impliedFormat":1},{"version":"ee51a4032beba0b38ff75838b386627a38c53008b8ca350bb42f192d0fb3cf58","impliedFormat":1},{"version":"b14b8756b166914ab1cb68c44bb579566833449d5e9d68655726f6ffc6d5e457","impliedFormat":1},{"version":"a09ae8631b5e442bbcdb93e3b60d6f71a54d192452af841616e2b49c5a03fb26","impliedFormat":1},{"version":"7a254103740333c7fb870f95ab9a26fb028cb298478f43e4750b8eddefafa11f","impliedFormat":1},{"version":"d54b449b0eff66bc26e09593df44512725b9e9fce4d86ea436bed9e7af721ff1","impliedFormat":1},{"version":"91991180db9a4d848bd9813c38a56d819a41376a039a53f0e7461cc3d1a83532","impliedFormat":1},{"version":"4e5f8c9d9655d5cedd160d50dc0d04f78fafb2c21db87e5b0c87105050445d91","impliedFormat":1},{"version":"637ffc16aeaadb1e822bffc463fcc2ca39691dea13f40829c1750747974c43d4","impliedFormat":1},{"version":"7955f3e66404ff9a4ac41f40b09457fe1c0e135bde49e4d77c3ea838956041bf","impliedFormat":1},{"version":"f6d23ab8669e32c22f28bdbdf0c673ba783df651cafcbdcc2ead0ff37ba9b2b5","impliedFormat":1},{"version":"c90ef12b8d68de871f4f0044336237f1393e93059d70e685a72846e6f0ebbbff","impliedFormat":1},{"version":"ecefe0dd407a894413d721b9bc8a68c01462382c4a6c075b9d4ca15d99613341","impliedFormat":1},{"version":"9ec3ba749a7d20528af88160c4f988ad061d826a6dd6d2f196e39628e488ccd8","impliedFormat":1},{"version":"71ce93d8e614b04d49be0251fb1d5102bb248777f64c08078ace07449700e207","impliedFormat":1},{"version":"9560571cf48c84114027d57b34d769cd4e9a6cfaac7919bfbdcd6ad0801bc73c","impliedFormat":1},{"version":"4818c918c84e9d304e6e23fdd9bea0e580f5f447f3c93d82a100184b018e50f5","impliedFormat":1},{"version":"6e39d03aa07f268eed05dd88e1bd493cb10429c1d2809e1aaa61fbcd33978196","impliedFormat":1},{"version":"eab3b41a54d5bc0e17a61b7b09639dc0d8640440e3b43715a3621d7fa721ae85","impliedFormat":1},{"version":"eec377e6bfd366a64f9641e80ff1e7ab5fa58963364a9d6a76a11365dccd87d3","impliedFormat":1},{"version":"da31c5275a923bb601a84bd648fd24cc9009860fd5901351f32e686e69bfd432","impliedFormat":1},{"version":"36d27819ece3bf0eefe61ecda9e3aa2e86b5949c89dba79f17dd78a2c4587a61","impliedFormat":1},{"version":"a336b950cd64c3c3dd2503384bf2915a5ea03d694672bfedabd71fafdae34ebe","impliedFormat":1},{"version":"eec377e6bfd366a64f9641e80ff1e7ab5fa58963364a9d6a76a11365dccd87d3","impliedFormat":1},{"version":"ce8eb80dad72ac672d0021c9a3e8ab202b4d8bccb08fa19ca06a6852efedd711","impliedFormat":1},{"version":"a336b950cd64c3c3dd2503384bf2915a5ea03d694672bfedabd71fafdae34ebe","impliedFormat":1},{"version":"d12e9c3d5e2686b5c82f274fb06227748fc71b3a6f58f7b3a6f88f4b8f6921fb","impliedFormat":1},{"version":"5f9a490be2c894ac65814a1a9e465b99882490ed3bce88c895362dc848f74a8d","impliedFormat":1},{"version":"2d5935948312241d3195b5e24df67775c6736dec1e1373efb1b6f04447106867","impliedFormat":1},{"version":"686ccf874ccbf999a155208a7ec8358a718d211f779980c2fe7cca176025d769","impliedFormat":1},{"version":"48bf56f3c8b3d0b27f94587996400c129773ab9c4810354d89850b0bee92b3d7","impliedFormat":1},{"version":"e6e9bdd2f65408a0b52d8e8ca9ddb7827c5f3496561788c974e4f2fb485427eb","impliedFormat":1},{"version":"193772121770797ee600739d86de128cd7244e3e3e101684473eb49590dbfce1","impliedFormat":1},{"version":"7a6208fa971deb77dbd7c59d56f7eb5b2516d76a3372a55917b75fc931c44483","impliedFormat":1},{"version":"b9aa4ed5dc603ad443dac26b9c27b0680b1cf4614f321b8d3663e26c1b7ef552","impliedFormat":1},{"version":"8613d707dc7f47e2d344236136010f32440bebfdf8d750baccfb9fad895769ee","impliedFormat":1},{"version":"59ebb6007bce20a540e273422e64b83c2d6cddfd263837ddcbadbbb07aa28fcc","impliedFormat":1},{"version":"23d8df00c021a96d2a612475396e9b7995e0b43cd408e519a5fb7e09374b9359","impliedFormat":1},{"version":"9a3c859c8d0789fd17d7c2a9cd0b4d32d2554ce8bb14490a3c43aba879d17ffb","impliedFormat":1},{"version":"431dc894a90414a26143bbf4ca49e75b15be5ee2faa8ba6fcc9815e0ce38dd51","impliedFormat":1},{"version":"5d5af5ceb55b5ec182463fe0ffb28c5c0c757417cbed081f4afd258c53a816c5","impliedFormat":1},{"version":"f43eee09ead80ae4dcfc55ba395fe3988d8eb490770080d0c8f1c55b1bd1ef67","impliedFormat":1},{"version":"eec377e6bfd366a64f9641e80ff1e7ab5fa58963364a9d6a76a11365dccd87d3","impliedFormat":1},{"version":"4c9784ca0ab39916b498c54db858ea27c929777f161a2450f8712a27cec1b017","impliedFormat":1},{"version":"9c92db9255eab1e3d218bdeca593b99355bbf41fa2a73a9c508ad232a76cda96","impliedFormat":1},{"version":"bf2cc5b962f3823a8af297abe2e849227dbfb3a39a7f7301c2be1c0a2ecb8d32","impliedFormat":1},{"version":"eaed6473e830677fd1b883d81c51110fcb5e8c87a3da7a0f326e9d01bf1812ff","impliedFormat":1},{"version":"3ac0952821b7a43a494a093b77190a3945c12f6b34b19f2392f20c644ac8d234","impliedFormat":1},{"version":"ed5877de964660653409f2561c5d0a1440777b2ef49df2d145332c31d56b4144","impliedFormat":1},{"version":"c05da4dd89702a3cc3247b839824bdf00a3b6d4f76577fcb85911f14c17deae5","impliedFormat":1},{"version":"f91967f4b1ff12d26ad02b1589535ebe8f0d53ec318c57c34029ee68470ad4a3","impliedFormat":1},{"version":"f6ac182bf5439ec39b1d9e32a73d23e10a03fe7ec48c8c9ace781b464ecc57c3","impliedFormat":1},{"version":"eec377e6bfd366a64f9641e80ff1e7ab5fa58963364a9d6a76a11365dccd87d3","impliedFormat":1},{"version":"687b26db97685fcadeb8e575b6bc252ea621fef8217acd2bb788ce781a4b05b3","impliedFormat":1},{"version":"e4a88ca598bf561ec253c0701eea34a9487766c69a8d8e1b80cf67e60dcc10d7","impliedFormat":1},{"version":"281cf6513fcf7b7d88f2d69e433ebbd9248d1e1f7571715dd54ca15676be482e","impliedFormat":1},{"version":"dc9f827f956827ec240cec3573e7215dc08ed812c907363c6653a874b0f5cabb","impliedFormat":1},{"version":"baa40541bd9b31a6f6b311d662252e46bad8927d1233d67e105b291d62ace6e6","impliedFormat":1},{"version":"d3fa2e4b6160be0ab7f1bc4501bf0c969faa59c6b0f765dc8ca1000ca8172b18","impliedFormat":1},{"version":"cf24c5c94e5e14349df49a69fb963bee9cd2df39f29ddd1d4d153d7a22dfb23f","impliedFormat":1},{"version":"18a20ae79049147b460771dfd6b63b3b477772d763c26b367efa499c98e9fb5f","impliedFormat":1},{"version":"c5ad2bd5f2243c6fade8a71a752b4333b0ba85ae3ea97d5323f7d938b743cb26","impliedFormat":1},{"version":"cf1e804f283ae1ca710f90dba66404c397b7b39682dbdfa436a6b8cc0b52b0ab","impliedFormat":1},{"version":"25fd641b32d4f7d6811cec4b00c0c9a74cb8822ec216f3b74bae205a32b1de08","impliedFormat":1},{"version":"658f07f1b7c327ecc8b18ed95ada19a90f9fc3f0282d536ca9d6cd2d597631f4","impliedFormat":1},{"version":"35c8e20c61bffc19a0391f42db2fe8f7bb77caa414bd2145a8891826bfdb9667","impliedFormat":1},{"version":"658f07f1b7c327ecc8b18ed95ada19a90f9fc3f0282d536ca9d6cd2d597631f4","impliedFormat":1},{"version":"b3279a079db8ea0c8b76f7f3098f4b10266c3bb24fa21e5838fe6008e3d40043","impliedFormat":1},{"version":"803e5b05c612513cf773d7826c8556eb30ff4a92ba33e9c9dde5ab4cfc342cf9","impliedFormat":1},{"version":"8aec152ae554311c39f87fc5ec3c1f4c5d5d44e1145704782a4fdd6b16c2f1d7","impliedFormat":1},{"version":"9b4a1b563bc6d3d02a4a9d3e72bf699d486a6b117fdcf29199d49d3650abe122","impliedFormat":1},{"version":"803e87c5c27720886ff9f591a47e3281b02bf737f6c67964d72a4d8e7b905a21","impliedFormat":1},{"version":"ce762eb7d3137473f6b50c2cd5e5f44be81334550d9eb624dadb553342e9c6ed","impliedFormat":1},{"version":"3a4d63e0d514e2b34487f84356984bd4720a2f496e0b77231825a14086fb05c1","impliedFormat":1},{"version":"22856706f994dec08d66fcbf303a763f351bc07394fb9e1375f0f36847f6d7a5","impliedFormat":1},{"version":"1f2b07381e5e78133e999e7711b84a5d65b1ab50413f99a17ffccfc95b3f5847","impliedFormat":1},{"version":"39aa109cb3f83642b99d9f47bf18824f74eaaa04f2664395b0875a03d4fc429a","impliedFormat":1},{"version":"15ca7cf99d213ac6a059a5f81ff17dd2c0d4e31260821719ef7e78ea6163f518","impliedFormat":1},{"version":"ee130bd48bc1fb67a0be58ab5708906f8dc836a431b0e3f48732a82ad546792e","impliedFormat":1},{"version":"9d32f274f0b2388e27a83b6b88b33616a4b73b4d045c00d814e942c07a5c9a57","impliedFormat":1},{"version":"06a6defbd61ec1f028c44c647c7b8a5424d652b3330ff4f6e28925507e8fde35","impliedFormat":1},{"version":"9d32f274f0b2388e27a83b6b88b33616a4b73b4d045c00d814e942c07a5c9a57","impliedFormat":1},{"version":"15ca7cf99d213ac6a059a5f81ff17dd2c0d4e31260821719ef7e78ea6163f518","impliedFormat":1},{"version":"9df4d5273810ea069628b1efd0ea6ca9932af9694bfbc8dcea17c8253f1790c2","impliedFormat":1},{"version":"9b3ca716ad96d961aa8f2bab5fbd6752637af2da898f54c8d4021ef8ab2607d2","impliedFormat":1},{"version":"60d53d724e5854f545fd4753881466043628eb886159a73568878f18b3020afe","impliedFormat":1},{"version":"c53d0b758384bd45cd3a051a5227805b57eae8f2142e906d65ae97c8868fd45f","impliedFormat":1},{"version":"a844bbf1cb0bb844743b2d78eee9bdc78df80a98989deab32ff8cd3228b41289","impliedFormat":1},{"version":"b641f9357511425b12ad981f9ba66d964fc114b78a5761ead8595599f036a22f","impliedFormat":1},{"version":"3537c3f024e3bed94fedcce3444fca3c1bce744942912a5a4857f7050ab25429","impliedFormat":1},{"version":"96a5c70389556c62902487f56bb34259ef57439a4cba6c9bdbbbb55225b32e63","impliedFormat":1},{"version":"54895ba2b529f7c369600228dbb88c842c311d1fb7de4ccbc43123b357c26a90","impliedFormat":1},{"version":"9d0050ae8481d6e0731ed80b55f6b475ae3a1cffbc61140e92816a0933dba206","impliedFormat":1},{"version":"68867d1d1560d31165f817de3fceb4b2bedbd41e39acdf7ae9af171cdc056c47","impliedFormat":1},{"version":"1c193e68e159296fded0267475b7172231c94e66b3d2f6f4eb42ffde67111cc5","impliedFormat":1},{"version":"f025c51bcc3c7dacbedb4b9a398815f4d5c6f4c645db40880cee4ac6f89588de","impliedFormat":1},{"version":"b94704c662a31e0d061abb006d38f6211ade97422f0ae45d751ef33d46ce3042","impliedFormat":1},{"version":"c3e2f2b328bd55ae9a401673bd33f86d25a7d53a4f5e1fad216f5071c86c0b79","impliedFormat":1},{"version":"5f6e56ac166b7a5bde756afd2e573af1e38fdd5f10ddb72e46bc44f3c0a42369","impliedFormat":1},{"version":"9b65fd7edfcf3c4c6538d735d269647edc14856dc062e9dde80412c45ff2cf29","impliedFormat":1},{"version":"fbb26af430ebc8743161f6026a0722a4cee3df8c08bdc2610a1d037f733fa823","impliedFormat":1},{"version":"65de396834768bf2b3548447b84b774310f83f33d00f9fb951c1b338dd9b5395","impliedFormat":1},{"version":"58c97efc183a6465be046e3c59ff1164b9930c25f080f5462d4b103760757d97","impliedFormat":1},{"version":"75b022f6a48640ca4e048da35132eef2cb9445680c7e1080021ccc15f4d2bf59","impliedFormat":1},{"version":"ea7c9f9c4b1cd2573d49dd628d446fa7611052e00ea1a3aa385a83a7b07c7fbb","impliedFormat":1},{"version":"a74eec58a6011f6ba3d6bbe4eacea0935f7fce9ad34f8c8bd8ed8872ae68f826","impliedFormat":1},{"version":"6bd326162475f1661612f9bb68aa7833e548c7a726940f042e354086cd9b7c2d","impliedFormat":1},{"version":"4b3d55b3d962f8773ea297be1b7f04093a5e5f0ea71cb8b28cef89d3d66f39b0","impliedFormat":1},{"version":"39d7517763d726ce19f25aacf1ccb48ec4f1339978c529abdf88c863418b9316","impliedFormat":1},{"version":"4ce8ae09e963394e7ffe3a5189007f00a54e2b18295585bb0dae31c7d55c1b3f","impliedFormat":1},{"version":"b29b65017a631dff06b789071cdf7a69f67be35238b79f05e5f33523e178feaf","impliedFormat":1},{"version":"58cb40faa82010f10f754e9839e009766e4914586bdb7a4cceff83765fa5e46c","impliedFormat":1},{"version":"efa190d15d9b3f8a75496c9f7c95905fca255a7ce554f4f0b91ba917b61c3b7e","impliedFormat":1},{"version":"303fd31bbed55c8cdf2d3d9851668f4e67746f0a79861a3b4d947a6c1c9e35c5","impliedFormat":1},{"version":"0fe6e8d738df018108bd3ca0e208dfa771d4e34641242b45423eca7d7ade80a7","impliedFormat":1},{"version":"8210e3bdbeeb9f747efdf7dad7c0ed6db9d13cd0acd9a31aa9db59ddbbac5a15","impliedFormat":1},{"version":"d6791734d0fce30014c94846a05cb43560bce15cfdc42827a4d42c0c5dafa416","impliedFormat":1},{"version":"e2898fa86354ef00ff2c0967a79b4f809477ec4471528aa96e192251b9f81d0c","impliedFormat":1},{"version":"58c97efc183a6465be046e3c59ff1164b9930c25f080f5462d4b103760757d97","impliedFormat":1},{"version":"58c97efc183a6465be046e3c59ff1164b9930c25f080f5462d4b103760757d97","impliedFormat":1},{"version":"8c4f5b888d7d2fc1283b7ce16164817499c58180177989d4b2bd0c3ebd0197f7","impliedFormat":1},{"version":"58c97efc183a6465be046e3c59ff1164b9930c25f080f5462d4b103760757d97","impliedFormat":1},{"version":"ea7c9f9c4b1cd2573d49dd628d446fa7611052e00ea1a3aa385a83a7b07c7fbb","impliedFormat":1},{"version":"3108920603f7f0bbf0cebce04bcaf90595131c9170adb84dc797e3948f7b6d06","impliedFormat":1},{"version":"8aded022b77ae3c07af72765bca9421f2d990814e0f4bfca0aa97395aa4c9010","impliedFormat":1},{"version":"f817987f543a452afa3035a00aa92800dbd7ff3246fcbe4cecb29bc18552b081","impliedFormat":1},{"version":"6ab1e8b5d0a0f4123b82158ea498222a5eacbffa1354abe8770030ba722c13b7","impliedFormat":1},{"version":"3cda89b540ed1ea9a3d1e302a489a4157a98b62b71c7abb34f8f15c13da9717a","impliedFormat":1},{"version":"a1ebece06e1ac47fb3a1b07997e57aa2e6a8f5ece26ea3c4a4fcb591e05d1e05","impliedFormat":1},{"version":"8aded022b77ae3c07af72765bca9421f2d990814e0f4bfca0aa97395aa4c9010","impliedFormat":1},{"version":"fb3b5ff3f5fe7767c07b755f2c22ce73ba46d98e6bc4a4603fde8888eed14e19","impliedFormat":1},{"version":"41c53632da296cf700f8553a48522e993949ea8499ceac4a483d1813beed3017","impliedFormat":1},{"version":"03b97deb8a168b27af94dca96eba747e19faf077445102d52c618210829cb85f","impliedFormat":1},{"version":"6a3589af6b9ec75cd87d9516ccfb9b06ab6be6f938790aeb4b1cd4dbaef92c45","impliedFormat":1},{"version":"722a667fe3b290be746d3ea6db20965ec669614e1f6f2558da3d922f4559d9c4","impliedFormat":1},{"version":"0f1c68ddd4573b2e135748377c3705a96d6a6c123910b00d0c7e8dc2edcd7f6b","impliedFormat":1},{"version":"a63781a8662205b9b6d2c7c5f3bad1747a28e2327804477463ebb15e506508e1","impliedFormat":1},{"version":"0f1c68ddd4573b2e135748377c3705a96d6a6c123910b00d0c7e8dc2edcd7f6b","impliedFormat":1},{"version":"80d8f42128925d6f1c82268a3f0119f64fd522eec706c5925b389325fb5256de","impliedFormat":1},{"version":"b4c189c9be8cf4a7cce177fc49678e29d170e67279195207f36a4f4d184d60f2","impliedFormat":1},{"version":"d16a18dfc505a7174b98f598d1b02b0bf518c8a9c0f5131d2bd62cfcaaa50051","impliedFormat":1},{"version":"b4c189c9be8cf4a7cce177fc49678e29d170e67279195207f36a4f4d184d60f2","impliedFormat":1},{"version":"d3ceb0f254de2c13ffe0059a9a01ab295ccf80941c5429600ffdbaaec57410a7","impliedFormat":1},{"version":"8e172ba46195a56e4252721b0b2b780bf8dc9e06759d15bc6c9ad4b5bb23401d","impliedFormat":1},{"version":"41c53632da296cf700f8553a48522e993949ea8499ceac4a483d1813beed3017","impliedFormat":1},{"version":"0fe5f22bc0361f3e8eacf2af64b00d11cfa4ed0eacbf2f4a67e5805afd2599bc","impliedFormat":1},{"version":"e2898fa86354ef00ff2c0967a79b4f809477ec4471528aa96e192251b9f81d0c","impliedFormat":1},{"version":"226dc98afab126f5b99f016ec709f74c3bcc5c0275958613033e527a621ad062","impliedFormat":1},{"version":"ec7197e94ffb2c4506d476df56c2e33ff52d4455373ecb95e472bb4cedb87a65","impliedFormat":1},{"version":"343865d96df4ab228ff8c1cc83869b54d55fa764155bea7db784c976704e93ec","impliedFormat":1},{"version":"f3f8a9b59a169e0456a69f5c188fb57982af2d79ec052bf3115c43600f5b09e4","impliedFormat":1},{"version":"e2898fa86354ef00ff2c0967a79b4f809477ec4471528aa96e192251b9f81d0c","impliedFormat":1},{"version":"15ddffc9b89470a955c0db3a04aec1f844d3f67e430b244236171877bdb40e50","impliedFormat":1},{"version":"7ca1ed0b7bd39d6912d810562413fb0dad45300d189521c3ca9641a5912119a5","impliedFormat":1},{"version":"30af3be0483da0faf989c428587c526597b80c1e368d85281a3fbc95e360987e","impliedFormat":1},{"version":"74766ac445b27ae31cc47f8338fd0d316a103dd4d9eb766d54b468cb9aacbf0e","impliedFormat":1},{"version":"65873070c21b3ce2ccdf220fe9790d8a053035a25c189f686454353d00d660f9","impliedFormat":1},{"version":"d767c3cc8b1e117a3416dda1d088c35b046b82a8a7df524a177814b315bde2e3","impliedFormat":1},{"version":"bf834cd64464f9217cb642a48c2f5f5f1cd509e13088adac6773715fb8536212","impliedFormat":1},{"version":"40258ea27675f7891614c8bd2b3e4ee69416731718f35ec28c0b1a68f6d86cd6","impliedFormat":1},{"version":"bf834cd64464f9217cb642a48c2f5f5f1cd509e13088adac6773715fb8536212","impliedFormat":1},{"version":"c61aa5b694977909ef7e4a3fdad86b3c8cd413c8d8e05b74a2def595165ba7ce","impliedFormat":1},{"version":"bfef3048352341739d810997dcd32f78527c3c426fac1bbb2b8c14293e1fa505","impliedFormat":1},{"version":"1dd31462ed165900a141c2e159157be0e8701ce2a2ed0977636f1d021894887d","impliedFormat":1},{"version":"872321f2e59009fad1f2efde489b20508a3631e16a86860740044e9c83d4b149","impliedFormat":1},{"version":"fa381c11f336210a8c10d442c270c35165dcf6e76492618ee468dba325a3fc98","impliedFormat":1},{"version":"857857dbb4d949686de80a138aeab8e669d23397100dc1e645190ff8be5787de","impliedFormat":1},{"version":"d6a9fe9c13a14a8d930bb90f3461dc50945fa7152e1a20a1f5d740d32f50b313","impliedFormat":1},{"version":"4162a1f26148c75d9c007dd106bd81f1da7975256f99c64f5e1d860601307dad","impliedFormat":1},{"version":"63f1d9ad68e55d988c46dab1cbc2564957fcbd01f6385958a6b6f327a67d5ff4","impliedFormat":1},{"version":"8df3b96fbafb9324e46b2731bb267e274e516951fbf6c26165a894cae6fd0142","impliedFormat":1},{"version":"822e61c3598579070f6da4275624f34db9eb4af4c27a2f152a467b4a54f4302f","impliedFormat":1},{"version":"a8f83bf864a5dea43d30c9035d74069b1820f0c49824960764cf21d6bfbb8e66","impliedFormat":1},{"version":"f9449f2b807f14c9ff9db943e322385875cca5faa26775f64a137e4d1a21b158","impliedFormat":1},{"version":"8855c7125e06a2001f726b4f2f9905e916d122377f7d938936fb49606ccb55c5","impliedFormat":1},{"version":"8855c7125e06a2001f726b4f2f9905e916d122377f7d938936fb49606ccb55c5","impliedFormat":1},{"version":"d24f0b133a979dc915411e1c76d2dada47e3624b42d5838e9d6b9eef1f067cc7","impliedFormat":1},{"version":"755611714dbab5b9b351b51e7875195f83bb26169ae6b31486dcb1e6654ed14c","impliedFormat":1},{"version":"a82213450f0f56aab5e498eaae787cf0071c5296ea4847e523cf7754a6239c99","impliedFormat":1},{"version":"f2882c5afda246fa0c63489d1c1dff62bf4ddf66c065b4285935d03edaec3e71","impliedFormat":1},{"version":"d38c1b0fd8bc7e301fd467a2afd6d32b2457813c48c16afabc06d2ca5b6bda41","impliedFormat":1},{"version":"d38c1b0fd8bc7e301fd467a2afd6d32b2457813c48c16afabc06d2ca5b6bda41","impliedFormat":1},{"version":"4ed8f12983c82690e8fecd9b24f143d4a7c86d3156be7b2bff73e0761f820c8c","impliedFormat":1},{"version":"1d920699becb8e60a0cbbc916d8559a3579b204dd21655dd242c98fd8ae986ea","impliedFormat":1},{"version":"c278288183ec3690f63e50eb8b550ef0aa5a7f526337df62474f47efea57382b","impliedFormat":1},{"version":"3c0486004f75de2873a34714069f34d6af431b9b335fa7d003be61743ecb1d0a","impliedFormat":1},{"version":"99300e785760d84c7e16773ee29ac660ed92b73120545120c31b72166099a0e4","impliedFormat":1},{"version":"8056212dad7fd2da940c54aeb7dfbf51f1eb3f0d4fe1e7e057daa16f73c3e840","impliedFormat":1},{"version":"e58efb03ad4182311950d2ee203807913e2ee298b50e5e595729c181f4c07ce3","impliedFormat":1},{"version":"67b16e7fa0ef44b102cc4c10718a97687dabfa1a4c0ba5afe861d6d307400e00","impliedFormat":1},{"version":"30af3be0483da0faf989c428587c526597b80c1e368d85281a3fbc95e360987e","impliedFormat":1},{"version":"f29c608ba395980d345144c0052c6513615c0ab0528b67d74cacbfac2639f1d4","impliedFormat":1},{"version":"e094afe0a81b08444016e3532fbf8fae9f406cdb9da8dbe8199ba936e859ced7","impliedFormat":1},{"version":"e4bcab0b250b3beb978b4a09539a9dfe866626a78b6df03f21ae6be485bc06e2","impliedFormat":1},{"version":"a89246c1a4c0966359bbbf1892f4437ff9159b781482630c011bb2f29c69638f","impliedFormat":1},{"version":"0a87a56e75de872e21997cec18ecda36abb5cac0d18690659b588e271099b589","impliedFormat":1},{"version":"0a87a56e75de872e21997cec18ecda36abb5cac0d18690659b588e271099b589","impliedFormat":1},{"version":"0a87a56e75de872e21997cec18ecda36abb5cac0d18690659b588e271099b589","impliedFormat":1},{"version":"98ca77869347d75cd0bb3d657b6dcd082798ef2419f1ab629ccf8c900f82d371","impliedFormat":1},{"version":"73acfe8f7f57f1976d448d9569b345f907a6cf1027a08028fe5b8bb905ef8718","impliedFormat":1},{"version":"ed8a781d8b568d8a425869029379d8abc967c7f74d6fe78c53600d6a5da73413","impliedFormat":1},{"version":"90ead73acfd0f21314e8cbef2b99658d88cc82124cfc20f565d0bdda35e3310a","impliedFormat":1},{"version":"8ecfec0e00878d6d26a496cf5afc715b72c3da465494081851da85269b0aef8e","impliedFormat":1},{"version":"4c78fccd1c5cd8eebde42cc078e7332f3d9b4eb1a542d9a5ec66899dfd71b93e","impliedFormat":1},{"version":"4c78fccd1c5cd8eebde42cc078e7332f3d9b4eb1a542d9a5ec66899dfd71b93e","impliedFormat":1},{"version":"e54b165a2a5a5fbcf4bcd09176e4388b514ca70a20635841937f1cc36e37fbef","impliedFormat":1},{"version":"6eb0dcefcf4cc9088174209028db705572e7fb7e38f3f93275bf6778afa2cd19","impliedFormat":1},{"version":"fa572fa0d1b1b1a7d356d5942b1d57f342880a68d1bf1ab5d00490221c471c18","impliedFormat":1},{"version":"17694dd0223346fa0a17e87e9ce00335569166368357b9963571aa623c5e3c27","impliedFormat":1},{"version":"207d46e6e557df62460be9021502fc3af96c927cef0cc5add32cb6f2d60b2e23","impliedFormat":1},{"version":"cf0cf6556adc9178a6251d9b12837e5d514b805cebe8de6d7a16e1e4248ec1ef","impliedFormat":1},{"version":"3d3d28a294ca0d5caea84d58eec474891dd1df7015f8fb2ee4dabf96d938333c","impliedFormat":1},{"version":"0b5b95f3b76e6cc9b716e08274d0f7486bee9d99e42dd6a99c55e4cb4ff5569e","impliedFormat":1},{"version":"94fb6c136acee366e3a4893df5ddbecadde49738de3c4d61a2923c6ada93e917","impliedFormat":1},{"version":"95669998e1e807d41471cebed41ede155911da4b63511345571f5b7e13cbef9c","impliedFormat":1},{"version":"48cca9861e6f91bde2435e5336b18bdc9ed3e83a6e7ea4cf6561e7f2fee4bad6","impliedFormat":1},{"version":"b6b8be8a70f487d6a2fd80b17c4b524b632f25c6c19e76e45a19ad1130209d64","impliedFormat":1},{"version":"76d7fadbb4ff94093be6dd97ea81a0b330a3a41fc840c84a2a127b32311200e6","impliedFormat":1},{"version":"856a8b0060b0e835bccba7909190776f14d8871b8170b186d507d3e12688086d","impliedFormat":1},{"version":"e39aaeef0aea93bdda6f00d27ca9ebda885f233ecc52b40e32db459916f24183","impliedFormat":1},{"version":"14f3c0b1b5e6adac892607ecefc1d053c50bc8a5f14d05f24e89e87073d2f7e3","impliedFormat":1},{"version":"f877dcc12cc620dede9c200625692cf614b06aadc026f6b59e5967cd2e30cbc4","impliedFormat":1},{"version":"5a37547f8a18bc0738e670b5043819321ae96aee8b6552266f26d8ce8f921d17","impliedFormat":1},{"version":"4d3e13a9f94ac21806a8e10983abcf8f5b8c2d62a02e7621c88815a3a77b55ae","impliedFormat":1},{"version":"938cb78a2ad0894a22e7d7ebd98cdc1719ee180235c4390283b279ea8616e2a9","impliedFormat":1},{"version":"84ba4c2edb231b1568dae0820f82aca1256a04599d398ec526615c8a066f69ec","impliedFormat":1},{"version":"cd80a8f16c92fe9f03899f19c93783dce3775ef4c8cdf927ac6313354765a4f2","impliedFormat":1},{"version":"25df98970954ccd743fe5e68c99b47d0e02720e2bf6584a6de60e805395b6bf7","impliedFormat":1},{"version":"251983cb99df8c624ca1abd6335ca5d44d0dd7cdcab3ef9c765b4acc79fae8fb","impliedFormat":1},{"version":"7c4965812974ebd1333cb09f95c4a3669e19008dfbb1e931321e08ae1f7cff09","impliedFormat":1},{"version":"31d3f4757bece74c888df52c8bdc4373e3f58deb518000051cadb5e85deb54de","impliedFormat":1},{"version":"a2be4cad298b3b474a0a71c1dd78a8bfc70b322f44704cf4329aecb873687a3a","impliedFormat":1},{"version":"ca8b04bea4ba551b47ddea18e385e76e555a9f7ff823dcae668d05e255fdc241","impliedFormat":1},{"version":"de0d160ecc8e643727bb93018015ae89510d59b7bdad4550f4318fba0a0ce2e6","impliedFormat":1},{"version":"acf3fff2afb5ceb54bd5ddb697b1d337338e3c23b93385f100a2046cfa700184","impliedFormat":1},{"version":"a2be4cad298b3b474a0a71c1dd78a8bfc70b322f44704cf4329aecb873687a3a","impliedFormat":1},{"version":"15c7f60f69f663374a7bc57afe164e70e3b6310bd1ee476ba911646b09c7852b","impliedFormat":1},{"version":"d71becf074ceaa0e91558fe51ed8640fa83a0fbf45a31e8069716edbf38de99a","impliedFormat":1},{"version":"ef681b070e9f3b9b28f1886bbe67faa12237c8d4691604a1f1cba614a10ef2e1","impliedFormat":1},{"version":"b15f5e077245fef1ecf45327fd94aa67fc4da288bfd42bf1b8a80f297afd561e","impliedFormat":1},{"version":"b7091d79a6e7be7bb10ca9477b6c71db4cf7b44f155912266ecfba92c1a126c1","impliedFormat":1},{"version":"e585a113e0abcaf3022f5cf1318e17f299f0935d7b389a23dcad9074c3922946","impliedFormat":1},{"version":"ae545310dfa53a7b33f574e621b14f423373dea930218d2ad290b4da0c5e8e50","impliedFormat":1},{"version":"ae545310dfa53a7b33f574e621b14f423373dea930218d2ad290b4da0c5e8e50","impliedFormat":1},{"version":"4428e4d440e1914859e8aee558f90b4829c6a45b717078490dfc2d297dcef46c","impliedFormat":1},{"version":"ad205fc7116808509e19ee71277d8da74157751d7388f0134d91c009b987f69f","impliedFormat":1},{"version":"4428e4d440e1914859e8aee558f90b4829c6a45b717078490dfc2d297dcef46c","impliedFormat":1},{"version":"8900bf61f4ce9517567cc6c9e41638a5bd0c4a0e9cc094190bc07644bbeedf24","impliedFormat":1},{"version":"cf5414a97c345c8f3294e0513a7613f5a263e1b56b3a61b810ba8279716fd38c","impliedFormat":1},{"version":"7778bc213be81351a01867789728c7780467c84e3ec94cfcef53a4e2dccf1b57","impliedFormat":1},{"version":"41a934d2efbb6cb08b205a76206fb015ebda692db4d78382ec5bec9689d6f4ac","impliedFormat":1},{"version":"32e00dde88669b9a79aeea5070fa96af06a43c47ed5de32f3e3fe720128cd040","signature":"e175c784637465441991b000c035c407064cc8314887d48464d384ea187fcbcf","impliedFormat":1},{"version":"9a8ecc1d97a39e570c0f7a4afc7fdb65d7e6abf64fcb9a9ee797feb7e9c1ec56","signature":"0de75073a1f5ee45a44a86b30773df347d475947e978b076fefde98f82a2dd2b","impliedFormat":1},{"version":"0a7231aeea36c090e7d4ba6c6975c961f631af9232032262f0674cdc3cb04d8c","signature":"96e996ece5644555faf9ae75925aaa56097b9b9b69e7044c283d3245a8f23f03","impliedFormat":1},{"version":"2997809de6c5bac24fdc84ef7f1ca75d54786b22fff74269b0abd34cdfc02bd0","signature":"104aa3da59ef7e00fe1c04aeb9298608405fe776cc3545fc963c08baa262a1e2","impliedFormat":1},{"version":"6a05833d2d21f8200d8085a676f5739cce99dc5279592709435ca99f01d59f3b","signature":"aad206d58ee5826422cd58a446a8569d88f680d2342448aa3c4ab5bb36a1b4e0","impliedFormat":1},{"version":"2fa9f60a45e0b7dadaeee0ba80b4333809275c498d49984955d35a9180547aa4","signature":"698a08a4f6c53e9d0157f96e7d0898a2bd93c8ac6ffce2abfc131facb60d3773","impliedFormat":1},{"version":"ded9eefedc8c3154f737fe096668dafa8e32ed7ddaed3e88d3ded3bd24c59ca7","signature":"a8b46ed827d72b7b6f11f2beec9655f3fbcc550b06a58379eeb992a378ac1708","impliedFormat":1},{"version":"0414fad4b25d51ef95f9759a8565eb59bd6399d4d5e39d2172866c936d5b4ed8","impliedFormat":1},{"version":"c05b3f603c7dd86660a43899822921f901bcd62c5fdcd2f7b5305b9a7f912c51","impliedFormat":1},{"version":"60c32c376879916fb52e0bfde19a82ffd761ea7d66024721a989862b9018304a","impliedFormat":1},{"version":"fabf8e6c99552d3381e8cfe5ade928a1463af385967f036339d8c4dfa1d38752","impliedFormat":1},{"version":"897fde3ea0a80a6af5dfa558c2c7a834031632594d74f0096167266b1f4767fa","impliedFormat":1},{"version":"08818d4fd607f4244b90b5720840a74c62166e2587785401d203102015575b9c","impliedFormat":1},{"version":"e12ad3c7e488922ae3fccc5a7ed5b1bb60231cbd8807c2464ece69411e0967cc","impliedFormat":1},{"version":"db68ef1372a3a92e70771eadbc5526983ce5c229f4d4a73ea773a1aed7ef7190","impliedFormat":1},{"version":"e520c4ae2af1d19ae3cd4d1d9e3e33ad84a4942c5250db522c8c66cb1cdb77f8","impliedFormat":1},{"version":"b5c6a12d7d129a93aa8f463dc988bff3e25a18cd0982993897b3aa3e6c426ff0","impliedFormat":1},{"version":"5f9926a62e7e572d71061a61738cb31d2eff6801b9d39fd7c6fe25064520ad50","impliedFormat":1},{"version":"f03f74fb56dc0d157f1fe0291544f21c78173f3cbc30d76fdf5da96313cffc4f","impliedFormat":1},{"version":"2450dea4e92a09b385ab8defb7633ee889edb77c983c2a859f593866e651518d","impliedFormat":1},{"version":"eeaaa1beb0f23cf8219c33ee0c946dd02d1c02339ca7ee25968bd3696e542c7d","impliedFormat":1},{"version":"22e3e8e4b1c9573af15206568e117f2cfe05ab71c8106156d8a0377bdf6a72f2","impliedFormat":1},{"version":"a072b0712443216b6465c5386a52c3e1fbc727b09097e89f5fb00efa60b5cbc2","impliedFormat":1},{"version":"cd21ad08f58d1aa37d03ec3ab3e1e106f36919936917f7b30807dacfebec32a5","impliedFormat":1},{"version":"b649f3763b4e1eb076afc97c5a803473dca61bea070c2ace4c706c88c1765851","impliedFormat":1},{"version":"358b37e3f6aa1093f4081903fa17c256880bfc70a4319bd92e64451fb9eae300","impliedFormat":1},{"version":"e650c878f4bb888b7c6fef26549cb8299b9db3a3b1ef8e9d09a5200392c5561d","signature":"0d92bd68a26585ec2cbc11a9b67f4775d739299bf8fd96308e71720c052eb71f","impliedFormat":1},{"version":"09231b2cad09763a867e433bb3e24cc31de17fe1765feee8facfd9f71f504e6c","signature":"6cbc7cc3587b669db4256c141ef1bddbef796ef3608e86af8c8def6f247c3de8","impliedFormat":1},{"version":"7ad258a085ed8216038633c3c48091700147cd6d70fdf359d9c0635f2536495b","signature":"e1b164e64fc7905772fab00b7f16d4e80578b202c3683eb787a77b409cd34b2a","impliedFormat":1},{"version":"e53113fc8293b7386e3e9153c3f439e3af67163d3f9d2a8f4dca59ca3f61acbe","signature":"63effdb3e0fc6c69dc464937d854e7abd3e5e96ff3ad80a830a22875fe02dae8","impliedFormat":1},{"version":"1561ed2bae8c7d5b45e84b16d560bab332c6f46c08fa7c5d1139b30b34186da6","signature":"517b4a7853300c09c639475066d58be9f29246548ae759bebf548c92dc37e534","impliedFormat":1},{"version":"d8bbabfbcfc77e79904aff99e12c281521646e41e0c91fcf970c25d017e3c073","signature":"588fbfddccd12c8feeb61116796dae4a65e6293f629c14df457bf997b82ba7e2","impliedFormat":1},{"version":"a292da2e1a38da82fa2cf6f872ee1b4345f56ed0a20d420bb1d0229a41e85464","signature":"0330afb10e17ae0b6c12be644a20c7910c3e1e9d6040cae2571f4ec59c9815aa","impliedFormat":1},{"version":"b266e9eefba5bccb94c4f39834ffb5cc920913b1657f5a69cb6f81534c8f8b00","signature":"54e49a6aa41b972d178f2ebbced831c71479f32774c659b3b8d0c14a12c58749","impliedFormat":1},{"version":"dea1e626389d183663c2c7fda977141c68e26aa3934b0349e8450882447a214e","signature":"06cb1cbd8eea3bb1c1e2a6eeb6803386dc275ea66d0000673e446cdd9aacdf8d","impliedFormat":1},{"version":"51858cf75bd4be8891737456f4ac99d1097de66b04159b02dce3239967596934","signature":"479d005119c8c6fe259a2688fdc5bc4f3621cb9d151da327930c85b7459dbc24","impliedFormat":1},{"version":"30eb6213e324d4e456aa4fdefbbe2f7e2e8948dd00c8dfa219f59990e37b7ff7","signature":"cdadaccbce4d82a46b7a8940963a4bc96f1faaa2d85bf441ad066ada7fa6a5a7","impliedFormat":1},{"version":"0aa22c02b6c83afa6e45c9f76f31f6a15a5080e526b9ab3f838699c363f7e371","signature":"6fe8628aa9ae268a9a75686596e0d8c68897348ff20b54b4cf2137b33eb4a6a1","impliedFormat":1},{"version":"2e72f1301e53efb42a81b123ef64c48204cd44751282cde42a99ccb1d98c07f1","signature":"0a3507f1eddf9a3fac508c1e0687a5410bfb3c1c786945aa649e979d41794a1c","impliedFormat":1},{"version":"f031bd0d86489d1f93860b8c5a3c1812bf46bd5c55e79967616cce2ad91c2707","signature":"2fe5473ac72526efb52b2a06544e50beed820a727751a1a9d7f73cff57384694","impliedFormat":1},{"version":"42c18213fc49d0ebd2aa89c9b752f0aa3f4a348f9be16992950eb3d9e13c0d17","signature":"97e58dc226d78395ed2ab944aa87a7a96dd6499dc8b9e1ea0f03706b1d1e9be3","impliedFormat":1},{"version":"cdb318c6299ee3568016179f1652427920c0391a2e5c3a7fe25f3a177495d436","signature":"07ddab9031e441ee0faa453cc25c95bc899c3c4f2da2b63e097bf6da02d2a140","impliedFormat":1},{"version":"885fc0e8712ec6a395048812258762639c66a00f939c48c9b011c52b9150973d","signature":"0683cf3f523994e9a53b12875f776b50f2f23de7cba29fd84eabdcdcea7894b6","impliedFormat":1},{"version":"ce3401bd40603469c06c69bdf28699dc1e3e985c8821ca6846958ed5b0b3d3a9","signature":"e5b26f28a12f4577566cdf47eaaac664ab9bf72bd323160c6ce10598ccb95110","impliedFormat":1},{"version":"064378c32076a1773bd2edb6af2547ac6a4350c2c83d88fec8316cf3bee73883","signature":"2aa23764032093898808d45eb49ac62f278e7b352336fd4343207e081da29ae3","impliedFormat":1},{"version":"2a30d5ec437779c94fffc4d6131b951747fb45407c6e93017a740455759304c6","signature":"332be6c4ee63d576dbbe7b3570542ba0003babf0b5bc940cec3a191bfca81301","impliedFormat":1},{"version":"29d40381e7ec2946d98dee55c50473dc4408aeb8ff4c92a45720c028bb64e3f9","signature":"77d82262d251cdbfe94eb34b2eef0970f4153711da82571966d19c60f34b4d8b","impliedFormat":1},{"version":"44e45e8a3f2659e1144ba0eb92ceefef274766f77ef6abbf4de2d0502f9c7316","impliedFormat":1},{"version":"f4b47dc6e9a3918505894f4469b14a64807f1c60a9cf99d3171f0775cc627f40","signature":"4b06677fe88b499728dced6044e43109306376e5cc954320208676f2481c8164","impliedFormat":1},{"version":"b4980f0b1a4458a73b25a001afb26c8612625419d12a595be6f01f12e195b157","signature":"ef7b033ba1a0b48415d63213b3bda61404dfb466eafce7b8aa25c4f3f55a070d","impliedFormat":1},{"version":"17364c0e16c0d79b1ec0c8c26611712419cf85af24b57bdeab8bed3615535f70","signature":"5d2f2bf036fc0c25d30735144d3c8a32e1faa30cd0daaf2c881b01e851f241b7","impliedFormat":1},{"version":"ad73043db4026cd70cd5ede49e2ee2a42c8b43c2e7987425cda8d6bd9cc487db","signature":"41dcd0fab39346cc3b102315dd0871517b8de3c2109d577889b457d361a0c0f3","impliedFormat":1},{"version":"2f70db32ce6635af62c91b875f8ef7cc516570dfb2f6963d42947e24289f1a9e","signature":"8e1362551efae0f8e693fff3c00b3fdfc2ad8662590803cfdf153a38db09045c","impliedFormat":1},{"version":"88e918c882e625a97300bde94b27dd9cd2fb923d22737c58b998524228399105","signature":"c3f7eaae373572c2ed95710939d7758545f7075dad682f058ca1ddf53748bd11","impliedFormat":1},{"version":"e0f87002e95b3ef04650306a24e31e3e4ce4bc06f233f887ca0ca0c19a2faa72","signature":"7115c29a55b580a4d1092beaef3828c5e578b319476cc8bc62442a11212fe9bd","impliedFormat":1},{"version":"ae85f276ac6aa83c515341d69f616a4d7d037819e78d6161f6ecdbfa6dce07b6","signature":"f42b004db865f0fc0df93a937e87b04226a9b6a1413e3121efd1496973f44714","impliedFormat":1},{"version":"973c4f424ef636dfe74ffd1210c3255b01f04839412b276e56b9e9be25ba71f0","signature":"2fc6adaaff652c170c05d22e69b165e96a9aadfe86614059d2457311edddb018","impliedFormat":1},{"version":"98f8d2aef35529c686313f6c0f2482987a81510541d2f9e75244b2027bcee9ac","impliedFormat":1},{"version":"d72049f19cd24f1017c4409c844f508a0a97044906b952721155f878d02947ef","signature":"a66c457be41ee3e0a0aed22e5c1a1d7b15405ed421098429ee78ede9656bed24","impliedFormat":1},{"version":"c5a3d49e411c08020bb712cbd8d818de9ed25209dacd2ce947b942776334a47a","signature":"04a27fbaa6f99de15af6aeb28722aaa4f89d5c951d20388e56d2f5fd104f6153","impliedFormat":1},{"version":"12f4c80f1fc22fe11ad5cfcc66216c4790a7b821557d5c55e5abb504dbacea7e","signature":"6011ff9ccca0ca513f225878b9baceb40fa6243439b89099e5f1b46541055d62","impliedFormat":1},{"version":"9063bd95bf4fe06fe71b4f1abd4dce7d41b684d9036ff4afae6e079eb252b19e","impliedFormat":1},{"version":"bb0c5cb27578678fe7a8479404efd988ceab67ff93238baf16cef721610658f7","impliedFormat":1},{"version":"69cedc9a0b038abafcb4678030574d409b3438e7e095ab889aef2689b0c9bf50","impliedFormat":1},{"version":"185e36f4d19e13d3d7847d1b988a89d9c1970ef84a9c140794a1b4d0c03994bb","signature":"6aa42b8ebbce6de8ba6cf6fe17c80cb0a99f63bd9d2b1ab5665776066933e809","impliedFormat":1},{"version":"b40885a4e39fb67eb251fb009bf990f3571ccf7279dccad26c2261b4e5c8ebcd","impliedFormat":1},{"version":"2d0e63718a9ab15554cca1ef458a269ff938aea2ad379990a018a49e27aadf40","impliedFormat":1},{"version":"530e5c7e4f74267b7800f1702cf0c576282296a960acbdb2960389b2b1d0875b","impliedFormat":1},{"version":"1c483cc60a58a0d4c9a068bdaa8d95933263e6017fbea33c9f99790cf870f0a8","impliedFormat":1},{"version":"07863eea4f350458f803714350e43947f7f73d1d67a9ddf747017065d36b073a","impliedFormat":1},{"version":"396c2c14fa408707235d761a965bd84ce3d4fc3117c3b9f1404d6987d98a30d6","impliedFormat":1},{"version":"9ae7df67c30dc5f52b7b21e8bb36fd9ff05e7ed10e514e2d9ed879b4547c4cd3","impliedFormat":1},{"version":"5d3e656baf210f702e4006949a640730d6aef8d6afc3de264877e0ff76335f39","impliedFormat":1},{"version":"a42db31dacd0fa00d7b13608396ca4c9a5494ae794ad142e9fb4aa6597e5ca54","impliedFormat":1},{"version":"4d2b263907b8c03c5b2df90e6c1f166e9da85bd87bf439683f150afc91fce7e7","impliedFormat":1},{"version":"c70e38e0f30b7c0542af9aa7e0324a23dd2b0c1a64e078296653d1d3b36fa248","impliedFormat":1},{"version":"b7521b70b7fbcf0c3d83d6b48404b78b29a1baead19eb6650219e80fd8dcb6e1","impliedFormat":1},{"version":"b7b881ced4ed4dee13d6e0ccdb2296f66663ba6b1419767271090b3ff3478bb9","impliedFormat":1},{"version":"b70bd59e0e52447f0c0afe7935145ef53de813368f9dd02832fa01bb872c1846","impliedFormat":1},{"version":"63c36aa73242aa745fae813c40585111ead225394b0a0ba985c2683baa6b0ef9","impliedFormat":1},{"version":"3e7ffc7dd797e5d44d387d0892bc288480493e73dcab9832812907d1389e4a98","impliedFormat":1},{"version":"db011ec9589fd51995cbd0765673838e38e6485a6559163cc53dcf508b480909","impliedFormat":1},{"version":"e1a4253f0cca15c14516f52a2ad36c3520b140b5dfb3b3880a368cd75d45d6d9","impliedFormat":1},{"version":"159af954f2633a12fdee68605009e7e5b150dbeb6d70c46672fd41059c154d53","impliedFormat":1},{"version":"a1b36a1f91a54daf2e89e12b834fa41fb7338bc044d1f08a80817efc93c99ee5","impliedFormat":1},{"version":"8bb4a5b632dd5a868f3271750895cb61b0e20cff82032d87e89288faee8dd6e2","impliedFormat":1},{"version":"55ac6eb880722b04fed6b1ad0bae86f57856c7985575ba76a31013515e009316","impliedFormat":1},{"version":"017de6fdabea79015d493bf71e56cbbff092525253c1d76003b3d58280cd82a0","impliedFormat":1},{"version":"ab9ea2596cb7800bd79d1526930c785606ec4f439c275adbca5adc1ddf87747d","impliedFormat":1},{"version":"6b7fcccc9beebd2efadc51e969bf390629edce4d0a7504ee5f71c7655c0127b7","impliedFormat":1},{"version":"6745b52ab638aaf33756400375208300271d69a4db9d811007016e60a084830f","impliedFormat":1},{"version":"90ee466f5028251945ee737787ee5e920ee447122792ad3c68243f15efa08414","impliedFormat":1},{"version":"02ea681702194cfc62558d647243dbd209f19ee1775fb56f704fe30e2db58e08","impliedFormat":1},{"version":"1d567a058fe33c75604d2f973f5f10010131ab2b46cf5dddd2f7f5ee64928f07","impliedFormat":1},{"version":"5af5ebe8c9b84f667cd047cfcf1942d53e3b369dbd63fbea2a189bbf381146c6","impliedFormat":1},{"version":"a64e1daa4fc263dff88023c9e78bf725d7aba7def44a89a341c74c647afe80cc","impliedFormat":1},{"version":"f444cfd9eb5bcbc86fba3d7ca76d517e7d494458b4f04486090c6ccd40978ce7","impliedFormat":1},{"version":"5099990c9e11635f284bde098176e2e27e5afc562d98f9e4258b57b2930c5ea6","impliedFormat":1},{"version":"cf7dc8abfb13444c1756bbac06b2dd9f03b5bc90c0ebc1118796dae1981c12e6","impliedFormat":1},{"version":"3cc594d4e993618dc6a84d210b96ac1bd589a5a4b772fd2309e963132cb73cca","impliedFormat":1},{"version":"f189f28612dfeac956380eccea5be2f44dcac3d9a06cf55d41d23b7e99959387","impliedFormat":1},{"version":"b3f82681e61a3e1f4592c1554361a858087cd04ee3112ce73186fc79deeeabde","impliedFormat":1},{"version":"e647d13de80e1b6b4e1d94363ea6f5f8f77dfb95d562748b488a7248af25aabf","impliedFormat":1},{"version":"1567dbd347b2917ba5a386f713e45c346a15b0e1e408d4a83f496d6a3481768b","impliedFormat":1},{"version":"219a25474e58a8161b242776856ec5f6960839b63e74809445e51cadbfc18096","impliedFormat":1},{"version":"2f77672836c646d02dd1fb6c8d24e9cd8c63131c5e9c37e72f30856b1d740e62","impliedFormat":1},{"version":"6309a45fc3c03d3c4d56228e995d51974f53009a842374695b34f3607877e5a3","impliedFormat":1},{"version":"bef94eba81ae2c09059c0d9abdb1ae1b7090314f70550f3c8cd5d7ead4a4f212","impliedFormat":1},{"version":"48b787ad458be9b524fa5fdfef34f68798074132d4b8cfe6a6fe9c2bf334c532","impliedFormat":1},{"version":"37280465f8f9b2ea21d490979952b18b7f4d1f0d8fab2d627618fb2cfa1828e3","impliedFormat":1},{"version":"cefa33b76df8d9af73edcf02d9b03effbeec54b8200e97669ad454d770aee9ba","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f3f85dc43cb93c5a797f1ff0fa948d0e17843a443ae11a20cc032ccdf1b9997","impliedFormat":1},{"version":"581843e855d92557cbe9dfe242de4e53badae5e9096ca593b50788f7c89c37f2","impliedFormat":1},{"version":"869010bc679df668137cb3b78a3cb8196e97acf285208a57f6156ceac894a2f7","impliedFormat":1},{"version":"bcae62618c23047e36d373f0feac5b13f09689e4cd08e788af13271dbe73a139","impliedFormat":1},{"version":"2c49c6d7da43f6d21e2ca035721c31b642ebf12a1e5e64cbf25f9e2d54723c36","impliedFormat":1},{"version":"5ae003688265a1547bbcb344bf0e26cb994149ac2c032756718e9039302dfac8","impliedFormat":1},{"version":"02cf4ede9c240d5bf0d9ef2cb9454db2efe7db36692c7fe7ad53d92a08c26b8f","impliedFormat":1},{"version":"a86053981218db1594bd4839bde0fb998e342ecf04967622495434a8f52a4041","impliedFormat":1},{"version":"5c317403752871838140f70879b09509e37422e92e7364b4363c7b179310ee44","impliedFormat":1},{"version":"7b270dc53f35dd0b44bfa619ad4d351fffd512e14053c3688323ed007eda3f6d","impliedFormat":1},{"version":"3bfde94a5dab40b51ff3511a41cfb706d57f9584a15e938d243a0e36861e86fe","impliedFormat":1},{"version":"e86ad029224d4f2af3e188be8b5e9badf8c7083247572069bac7bd2193131fc7","impliedFormat":1},{"version":"057cac07c7bc5abdcfba44325fcea4906dff7919a3d7d82d4ec40f8b4c90cf2f","impliedFormat":1},{"version":"d94034601782f828aa556791279c86c37f09f7034a2ab873eefe136f77a6046b","impliedFormat":1},{"version":"105ae3dd61531488194f412386ba8c2b786f1389ac3415098cc47c712800da29","impliedFormat":1},{"version":"e3acb4eb63b7fc659d7c2ac476140f7c85842a516b98d0e8698ba81650a1abd4","impliedFormat":1},{"version":"4ee905052d0879e667444234d1462540107789cb1c80bd26e328574e4f3e4724","impliedFormat":1},{"version":"80e71af1e94ba805e791b9e8e03ff18dec32e8f483db3dca958441d284047d59","impliedFormat":1},{"version":"445fe49dc52d5d654a97d142b143fa2fb1dc16a86906545619b521b1561df501","impliedFormat":1},{"version":"c0c0b22cefd1896b92d805556fcabda18720d24981b8cb74e08ffea1f73f96c2","impliedFormat":1},{"version":"ceec94a0cd2b3a121166b6bfe968a069f33974b48d9c3b45f6158e342396e6b2","impliedFormat":1},{"version":"49e35a90f8bd2aa4533286d7013d9c9ff4f1d9f2547188752c4a88c040e42885","impliedFormat":1},{"version":"09043c4926b04870c1fdfdea3f5fcf40a1c9912304a757326e505bebe04a6d5c","impliedFormat":1},{"version":"cc5dfb7ddc9ab17cf793506f342fffdcb2b6d1d7a9c0e7c8339772fee42b7f91","impliedFormat":1},{"version":"88c34f554b5926f4988d9ff26f84c4f18a4d010f261dac2ed52055eefb9e3c65","impliedFormat":1},{"version":"a7aec47aa991ef5080126c3e2732a8488c13fd846099f89b0d24dc35c0f790d3","impliedFormat":1},{"version":"35085777eb17b745911d00a75be17096fe28a8766081cbd644ef15b4ba756aa2","impliedFormat":1},{"version":"cb498c53a9d35ac1cf9a3515f3835d48b4626a612cf7540c5bfb99542c9ab1a5","impliedFormat":1},{"version":"0ace3010fe4a0e820155e3ccb0172375a01162e528ffc22eec2fa33d697bff24","impliedFormat":1},{"version":"a1b64f86e1279835a2edc6125121dff74b04ef116d0230c20995b013ba37150e","impliedFormat":1},{"version":"39121347a4fa76cf47e67e1259fb0136325528a22bd54b1af6dbec353edf4b01","impliedFormat":1},{"version":"f3c3f17825c6a78681186da04c2f3a0f1c60cfa95f3d4b82bbbd6ebd57214a6a","impliedFormat":1},{"version":"eb45a1782ef50423c1ffac4d2a89c60004f4e2d25ed8e7dcb9e24e6cf984ccdb","impliedFormat":1},{"version":"07c333db8a26594bf2b80cf7b0ef0a83c42c28cb31cc727040f20061558df819","impliedFormat":1},{"version":"e5151e18c3e8d5d2f83ac60a4f4117f9bee54f643b64335858ceaa818e35d364","impliedFormat":1},{"version":"b52b0da52d2fee96d855936e9f3de93ea57e893677e776a46fc6eca96373d3be","impliedFormat":1},{"version":"03b7428a52323f9d455380f00da4f4b0798acb4f5f1c77525b48cb97ad9bc83c","impliedFormat":1},{"version":"6c3cf6de27512969bf59a541bd8e845ba1233e101e14c844e87d81e921fffa53","impliedFormat":1},{"version":"19207ec935fb6b0c022cdfd038ceffef1c948510394f249bde982170d4e57067","impliedFormat":1},{"version":"5276cc934ad4e253f53cf2331268451a66ebf711a027e71f4535af8642055bf8","impliedFormat":1},{"version":"185c55e63eec9da8263b4b1cf447d2ebe2fd7b892e5a0a5571e7e97b3c767bbb","impliedFormat":1},{"version":"f842cd4c63a3b077cf04f7d37ca163ab716f70f60ca5c5eed5c16b09a4c50c3a","impliedFormat":1},{"version":"00abe3d3cd26fcaf76ffeb6fde4ff7d6c8ad8154ac6c5ba41e05b4572fcd152b","impliedFormat":1},{"version":"49b3c93485a6c4cbc837b1959b07725541da298ef24d0e9e261f634a3fd34935","impliedFormat":1},{"version":"abf39cc833e3f8dfa67b4c8b906ac8d8305cf1050caed6c68b69b4b88f3f6321","impliedFormat":1},{"version":"dbbe2af77238c9c899b5369eca17bc950e4b010fa00bc2d340b21fa1714b8d54","impliedFormat":1},{"version":"c73d2f60d717b051a01b24cb97736e717d76863e7891eca4951e9f7f3bf6a0e6","impliedFormat":1},{"version":"2b79620ef917502a3035062a2fd0e247d21a22fef2b2677a2398b1546c93fb64","impliedFormat":1},{"version":"a54f60678f44415d01a810ca27244e04b4dde3d9b6d9492874262f1a95e56c7d","impliedFormat":1},{"version":"84058607d19ac1fdef225a04832d7480478808c094cbaedbceda150fa87c7e25","impliedFormat":1},{"version":"415d60633cf542e700dc0d6d5d320b31052efbdc519fcd8b6b30a1f992ef6d5c","impliedFormat":1},{"version":"901c640dced9243875645e850705362cb0a9a7f2eea1a82bb95ed53d162f38dd","impliedFormat":1},{"version":"ebb0d92294fe20f62a07925ce590a93012d6323a6c77ddce92b7743fa1e9dd20","impliedFormat":1},{"version":"b499f398b4405b9f073b99ad853e47a6394ae6e1b7397c5d2f19c23a4081f213","impliedFormat":1},{"version":"ef2cbb05dee40c0167de4e459b9da523844707ab4b3b32e40090c649ad5616e9","impliedFormat":1},{"version":"068a22b89ecc0bed7182e79724a3d4d3d05daacfe3b6e6d3fd2fa3d063d94f44","impliedFormat":1},{"version":"3f2009badf85a479d3659a735e40607d9f00f23606a0626ae28db3da90b8bf52","impliedFormat":1},{"version":"2c70425bd71c6c25c9765bc997b1cc7472bdc3cb4db281acda4b7001aec6f86f","impliedFormat":1},{"version":"8ed892f4b45c587ed34be88d4fc24cb9c72d1ed8675e4b710f7291fcba35d22a","impliedFormat":1},{"version":"d32b5a3d39b581f0330bd05a5ef577173bd1d51166a7fff43b633f0cc8020071","impliedFormat":1},{"version":"3f6af667357384c1f582ef006906ba36668dd87abe832f4497fffb315c160be9","impliedFormat":1},{"version":"363dd28f6a218239fbd45bbcc37202ad6a9a40b533b3e208e030137fa8037b03","impliedFormat":1},{"version":"c6986e90cf95cf639f7f55d8ca49c7aaf0d561d47e6d70ab6879e40f73518c8d","impliedFormat":1},{"version":"bb9918dbd22a2aa56203ed38b7e48d171262b09ce690ff39bae8123711b8e84a","impliedFormat":1},{"version":"1518707348d7bd6154e30d49487ba92d47b6bd9a32d320cd8e602b59700b5317","impliedFormat":1},{"version":"ede55f9bac348427d5b32a45ad7a24cc6297354289076d50c68f1692add61bce","impliedFormat":1},{"version":"d53a7e00791305f0bd04ea6e4d7ea9850ccc3538877f070f55308b3222f0a793","impliedFormat":1},{"version":"4ea5b45c6693288bb66b2007041a950a9d2fe765e376738377ba445950e927f6","impliedFormat":1},{"version":"7f25e826bfabe77a159a5fec52af069c13378d0a09d2712c6373ff904ba55d4b","impliedFormat":1},{"version":"ea2de1a0ec4c9b8828154a971bfe38c47df2f5e9ec511f1a66adce665b9f04b0","impliedFormat":1},{"version":"63c0926fcd1c3d6d9456f73ab17a6affcdfc41f7a0fa5971428a57e9ea5cf9e0","impliedFormat":1},{"version":"c30b346ad7f4df2f7659f5b3aff4c5c490a1f4654e31c44c839292c930199649","impliedFormat":1},{"version":"4ef0a17c5bcae3d68227136b562a4d54a4db18cfa058354e52a9ac167d275bbb","impliedFormat":1},{"version":"042b80988f014a04dd5808a4545b8a13ca226c9650cb470dc2bf6041fc20aca2","impliedFormat":1},{"version":"64269ed536e2647e12239481e8287509f9ee029cbb11169793796519cc37ecd4","impliedFormat":1},{"version":"c06fd8688dd064796b41170733bba3dcacfaf7e711045859364f4f778263fc7b","impliedFormat":1},{"version":"b0a8bf71fea54a788588c181c0bffbdd2c49904075a7c9cb8c98a3106ad6aa6d","impliedFormat":1},{"version":"434c5a40f2d5defeede46ae03fb07ed8b8c1d65e10412abd700291b24953c578","impliedFormat":1},{"version":"c5a6184688526f9cf53e3c9f216beb2123165bfa1ffcbfc7b1c3a925d031abf7","impliedFormat":1},{"version":"cd548f9fcd3cebe99b5ba91ae0ec61c3eae50bed9bc3cfd29d42dcfc201b68b5","affectsGlobalScope":true,"impliedFormat":1},{"version":"14a8ec10f9faf6e0baff58391578250a51e19d2e14abcc6fc239edb0fb4df7c5","impliedFormat":1},{"version":"81b0cf8cd66ae6736fd5496c5bbb9e19759713e29c9ed414b00350bd13d89d70","impliedFormat":1},{"version":"4992afbc8b2cb81e0053d989514a87d1e6c68cc7dedfe71f4b6e1ba35e29b77a","impliedFormat":1},{"version":"f15480150f26caaccf7680a61c410a07bd4c765eedc6cbdca71f7bca1c241c32","impliedFormat":1},{"version":"1c390420d6e444195fd814cb9dc2d9ca65e86eb2df9c1e14ff328098e1dc48ae","impliedFormat":1},{"version":"ec8b45e83323be47c740f3b573760a6f444964d19bbe20d34e3bca4b0304b3ad","impliedFormat":1},{"version":"ab8b86168ceb965a16e6fc39989b601c0857e1fd3fd63ff8289230163b114171","impliedFormat":1},{"version":"62d2f0134c9b53d00823c0731128d446defe4f2434fb84557f4697de70a62789","impliedFormat":1},{"version":"02c7b5e50ac8fb827c9cdcd22e3e57e8ebd513f0670d065349bef3b417f706f8","impliedFormat":1},{"version":"9a197c04325f5ffb91b81d0dca917a656d29542b7c54c6a8092362bad4181397","impliedFormat":1},{"version":"e6c3141ae9d177716b7dd4eee5571eb76d926144b4a7349d74808f7ff7a3dee0","impliedFormat":1},{"version":"d8d48515af22cb861a2ac9474879b9302b618f2ed0f90645f0e007328f2dbb90","impliedFormat":1},{"version":"e9ad7a5fecd647e72338a98b348540ea20639dee4ea27846cbe57c744f78ec2d","impliedFormat":1},{"version":"2c531043b1d58842c58e0a185c7bd5ce31e9a708667398373d6b113938629f90","impliedFormat":1},{"version":"5304a80e169ba8fe8d9c77806e393db1f708333afc1f95dede329fdbd84e29c7","impliedFormat":1},{"version":"7f0f90d0ffdd54875c464b940afaa0f711396f65392f20e9ffafc0af12ccbf14","impliedFormat":1},{"version":"2e93bb867fefffaecf9a54a91dbf271787e007ec2fe301d3dce080944c5518e5","impliedFormat":1},{"version":"3ab58250eb2968101cb0f3698aab0faa603660bc2d41d30ae13eaa22d75900d1","impliedFormat":1},{"version":"1f18ceea8d29b75099cc85f357622e87d6a2e0793486f89ab6da32cf9e434feb","impliedFormat":1},{"version":"c280ec77789efcf60ea1f6fd7159774422f588104dae9dfa438c9c921f5ab168","impliedFormat":1},{"version":"2826b3526af4f0e2c8f303e7a9a9a6bb8632e4a96fece2c787f2df286a696cea","impliedFormat":1},{"version":"3ec6d90ec9586e6e96120ff558429cac6ca656d81eb644ce703f736a316a0cd6","impliedFormat":1},{"version":"453b07099526a6d20fd30f357059d413677f919df8abf7346fab7c9abfec43fa","impliedFormat":1},{"version":"485f7d76af9e2b5af78aac874b0ac5563c2ae8c0a7833f62b24d837df8561fb9","impliedFormat":1},{"version":"8bdf41d41ff195838a5f9e92e5cb3dfcdc4665bcca9882b8d2f82a370a52384e","impliedFormat":1},{"version":"0a3351a5b3c74e9b822ade0e87a866bc7c010c1618bcde4243641817883fb8df","impliedFormat":1},{"version":"fe8a3e5492c807cc5cfc8dda4e6464aff0f991dc54db09be5d620fb4968ba101","impliedFormat":1},{"version":"03742d13572a69af40e24e742f3c40e58dc817aa51776477cf2757ee106c6c89","impliedFormat":1},{"version":"414f9c021dde847ee2382c4086f7bd3a49a354be865f8db898ee89214b2d2ced","impliedFormat":1},{"version":"bbbc43627abe35080c1ab89865ec63645977025d0161bc5cc2121dfd8bc8bc2e","impliedFormat":1},{"version":"0be66c79867b62eabb489870ba9661c60c32a5b7295cce269e07e88e7bee5bf3","impliedFormat":1},{"version":"5766c26941ae00aa889335bcccc1ecb28271b774be92aede801354c9797074bb","impliedFormat":1},{"version":"3a19286bcc9303c9352c03d68bb4b63cecbf5c9b7848465847bb6c9ceafa1484","impliedFormat":1},{"version":"c573fef34c2e5cc5269fd9c95fe73a1eb9db17142f5d8f36ffe4a686378b8660","impliedFormat":1},{"version":"d97e30dd93590392fed422f2b27325d10ab007d034faaaf61e28e9ddc9d3825b","impliedFormat":1},{"version":"d1f8a829c5e90734bb47a1d1941b8819aeee6e81a2a772c3c0f70b30e3693fa9","impliedFormat":1},{"version":"be1dfacee25a14d79724ba21f1fde67f966b46e2128c68fed2e48c6e1e9822c5","impliedFormat":1},{"version":"19b3d0c212d241c237f79009b4cd0051e54971747fd89dc70a74f874d1192534","impliedFormat":1},{"version":"d6a0db08bed9312f7c4245ee3db068a96c4893ea7df69863eb9dd9c0af5b28f7","impliedFormat":1},{"version":"f17963b9935dd2142c08b006da53afeeaca2c9a600485f6eb9c018b96687275b","impliedFormat":1},{"version":"6671e036f299eda709114347015eb9cf2da8f9ea158871da9c21e9056f7e26ac","impliedFormat":1},{"version":"8375cf1206fa01c23097e5293405d442c83fd03109e938d1bf3d9784f84c2dbc","impliedFormat":1},{"version":"585516c0e8cfe3f12497eb1fd57c56c79f22bb7d729a2c0a32c458c93af68b03","impliedFormat":1},{"version":"a797a41988e5ba36b6707939953b0c0395ed92b91c1189359d384ca66e8fa0ab","impliedFormat":1},{"version":"2b1945f9ee3ccab0ecfed15c3d03ef5a196d62d0760cffab9ec69e5147f4b5aa","impliedFormat":1},{"version":"96f215cefc7628ac012e55c7c3e4e5ce342d66e83826777a28e7ed75f7935e10","impliedFormat":1},{"version":"82b4045609dc0918319f835de4f6cb6a931fd729602292921c443a732a6bb811","impliedFormat":1},{"version":"b40885a4e39fb67eb251fb009bf990f3571ccf7279dccad26c2261b4e5c8ebcd","impliedFormat":1},{"version":"ff7ef69bcdc52bc17d140fab1ec5a86d9ce6a47151285aef952fbe3825e44905","impliedFormat":1},{"version":"1d788363783d8bc01d046e821aa2f674cde0c20af2999d2bbc034015368fbff4","impliedFormat":1},{"version":"1c483cc60a58a0d4c9a068bdaa8d95933263e6017fbea33c9f99790cf870f0a8","impliedFormat":1},{"version":"07863eea4f350458f803714350e43947f7f73d1d67a9ddf747017065d36b073a","impliedFormat":1},{"version":"396c2c14fa408707235d761a965bd84ce3d4fc3117c3b9f1404d6987d98a30d6","impliedFormat":1},{"version":"7627a0fc528ac040ea1fb86a5cb3e66ba4de3c55947ee6a1aad89b46c2038efd","impliedFormat":1},{"version":"c475aa6e8f0a20c76b5684658e0adaf7e1ba275a088ee6a5641e1f7fe9130b8a","impliedFormat":1},{"version":"a42db31dacd0fa00d7b13608396ca4c9a5494ae794ad142e9fb4aa6597e5ca54","impliedFormat":1},{"version":"c7381606516c8b5725dd3df850263d6644f2df8d7f5e1c5956893b9afbc2f8bf","impliedFormat":1},{"version":"a8035a411d3b11d7f57bf0f1f2686cfda8f700a20d68821e32a0d6ebe5dbabf5","impliedFormat":1},{"version":"a2a91d3575d79e42bd48c24377be9dd4e3eca0ab66ce0f49933ebdb06bcfd0c7","impliedFormat":1},{"version":"1648cbd2f46b82fc3a6c612d17542b6a21ffaf0a4aae9ea9778ce9346bbdedee","impliedFormat":1},{"version":"79705d60f10a6b860afd0d76204698449b0c5374e84351c4878525de6d9ec287","impliedFormat":1},{"version":"3bdc578841f58bfd1087e14f81394ece5efd56b953362ef100bdd5bd179cd625","impliedFormat":1},{"version":"2bc15addade46dc6480df2817c6761d84794c67819b81e9880ab5ce82afb1289","impliedFormat":1},{"version":"247d6e003639b4106281694e58aa359613b4a102b02906c277e650269eaecede","impliedFormat":1},{"version":"fe37c7dc4acc6be457da7c271485fcd531f619d1e0bfb7df6a47d00fca76f19c","impliedFormat":1},{"version":"159af954f2633a12fdee68605009e7e5b150dbeb6d70c46672fd41059c154d53","impliedFormat":1},{"version":"2bb39eac4173f3db5dfb31fffdd4a97a75ed3fcffe184c93f03fe62fc5af5553","impliedFormat":1},{"version":"7245e8f6453ff36dfdab1f448bfecafb4c0eb7e627a8552135eac69272888e02","impliedFormat":1},{"version":"bb977b21c99873e5b489c0fad5ee03b6010fd09f55b88edb8a207e60e29f8b4c","impliedFormat":1},{"version":"ce31b0fa39f2fd009c02acd675c575733839055905c2beca4a3915e938347f4b","impliedFormat":1},{"version":"8d8dc0f54a9ae72bdf67b3574144d639fd1951e08aa6424415022b3fa05544e3","impliedFormat":1},{"version":"b310f4737336f11507a0ab14a3a936858334230974dda8bdbbcecb6e512ceb24","impliedFormat":1},{"version":"06921a4f3da17bed5d4bc6316658ce0ea7532658a5fc575a24aa07034c1b0d3d","impliedFormat":1},{"version":"eda0c3e4b54c8ab9cd128990455522df296de5986f4b2502a4f1fc2925cec8c6","impliedFormat":1},{"version":"34c17533b08bd962570d7bdb838fcaf5bcf7b913c903bc9241b0696a635b8115","impliedFormat":1},{"version":"1d567a058fe33c75604d2f973f5f10010131ab2b46cf5dddd2f7f5ee64928f07","impliedFormat":1},{"version":"5af5ebe8c9b84f667cd047cfcf1942d53e3b369dbd63fbea2a189bbf381146c6","impliedFormat":1},{"version":"63b3c76d46314470f92f89f8cfb6e016a055bfdf505b73f0950512b176fc776f","impliedFormat":1},{"version":"147734cfd0973548fb6ef75d1e7d2c0b56bb59aad72b280784e811d914dc47d6","impliedFormat":1},{"version":"d2594d95d465026ebbee361f4819dc7b3146f4a8b42091ffb5dd90f9ceb345ab","impliedFormat":1},{"version":"e399d54c1b272a400ed446ca35d5e43d6b820723c2e5727b188ebea261e7cc2e","impliedFormat":1},{"version":"123568587c36c9f2a75091d8cdf8f287193855ba5aa10797b4fc320c80920b7f","impliedFormat":1},{"version":"6deffa531bdb8817b363505e88d957653d0c454f42c69e31588d00102cd1a076","impliedFormat":1},{"version":"973551068756351486afe706b240eb4dc83678ab2d829a1c6b1a19871394fd5f","impliedFormat":1},{"version":"e647d13de80e1b6b4e1d94363ea6f5f8f77dfb95d562748b488a7248af25aabf","impliedFormat":1},{"version":"9b7b0209a8841f5ffa60ccdfae26f7dc70ea4e7e446a603ef4732e84f1bb1b4f","impliedFormat":1},{"version":"bfc15f3582717affb1ad4cd6a2992f7cab76c313730b4367f3312a9348c294a0","impliedFormat":1},{"version":"6e2b55943538468a63a7a627bd4f18eea7a917b9fbfea34cbdfed8d028137eda","impliedFormat":1},{"version":"87a91bc6063720dea9190f1926283368ab0ed67f4b6138ec76b02794a38fe574","impliedFormat":1},{"version":"20cf19c8028a7b958e9c2000281d0f4c4cd12502fef7d63b088d44647cdd607b","impliedFormat":1},{"version":"3ea1b33c13157aa1750a7fb70ceb35730b92bf0224636b5f17f8ce0542fa5222","impliedFormat":1},{"version":"37280465f8f9b2ea21d490979952b18b7f4d1f0d8fab2d627618fb2cfa1828e3","impliedFormat":1},{"version":"097dc096eacdaf5d3bc0ba5dfa4bd9f3ce2b40741a901fa52b3d19f7685fe0ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"a890cccdc380629c6cd9e9d92fff4ca69b9adddde84cc503296ada99429b5a3b","impliedFormat":1},{"version":"168b6da36cf7b832173d7832e017bc6c6c7b4023bf6b2de293efb991b96bca44","impliedFormat":1},{"version":"05b39d7219bb2f55f865bca39a3772e1c0a396ea562967929d6b666560c85617","impliedFormat":1},{"version":"bcae62618c23047e36d373f0feac5b13f09689e4cd08e788af13271dbe73a139","impliedFormat":1},{"version":"75e534cd013e641cf6f492167ed3e2a3569a4de54ca900d262f8d4fe7f224270","impliedFormat":1},{"version":"5ae003688265a1547bbcb344bf0e26cb994149ac2c032756718e9039302dfac8","impliedFormat":1},{"version":"8be4e0787c5587f36669f9ee1da84e02e8419ddfedfbd4386d99307308cc70e5","impliedFormat":1},{"version":"ba8a615335e3dfdf0773558357f15edfff0461db9aa0aef99c6b60ebd7c40344","impliedFormat":1},{"version":"6921769648e4b83bb10e8fcf7011ea2d8f7de5d056daacf661648935a407376e","impliedFormat":1},{"version":"dd21167f276d648aa8a6d0aacd796e205d822406a51420b7d7f5aa18a6d9d6d9","impliedFormat":1},{"version":"3dea56c1745af2c31af0c84ecc6082044dc14cfa4d7366251e5bf91693eecd8b","impliedFormat":1},{"version":"eb6360635bc14b96a243bd5134e471f3ad26b0ecaf52d9d28621e443edb56e5c","impliedFormat":1},{"version":"7537944ecb74831ad1daa2280676c6399bdacb604f13ff9dbbab7da8fa8818e2","impliedFormat":1},{"version":"13975776e2d018a450ab5ef3dfe51bda565fac4842e119e7f8df57c46c1f4362","impliedFormat":1},{"version":"3975b59c4131f8280c008a1df87d1ec209b25e2f5415be0ba2221761d4411fe0","impliedFormat":1},{"version":"1fa5ddc841b9a1b4d0240f28f676e07fce6ab79874903d115db4773ddabf3685","impliedFormat":1},{"version":"4577aa89575b73d4d335e17d9ca0b3c1455d00fe626dad648f90a9e4f0dc1d70","impliedFormat":1},{"version":"45cde71dc6212b64a86d01963c0cd260510526e7331466d9d182aaefd640e6be","impliedFormat":1},{"version":"a71bd1a65930f1a57f82dd3b674e5ea0d428d3dcf841d4da384f081418915f3b","impliedFormat":1},{"version":"9499e47767506b4774f2e58778e4cf54145a5b82d7a11dac3e58bb499daf028a","impliedFormat":1},{"version":"8175f51ec284200f7bd403cb353d578e49a719e80416c18e9a12ebf2c4021b2b","impliedFormat":1},{"version":"9871b1807440d67682ffa5381aaf8bcf79614d699c77f5d258ae221a233c14cc","impliedFormat":1},{"version":"04d4c47854061cc5cefc3089f38e006375ae283c559ab2ce00763bca2e49516b","impliedFormat":1},{"version":"6a2146116c2fa9ca4fefa5c1d3de821462fc22e5330cda1196be15d439728c51","impliedFormat":1},{"version":"b6700b24f28411b6d4903c975676715da17d689e848a52420ea811b63ccb6615","impliedFormat":1},{"version":"d421fe9a68ff83f2f318d5198e076dd9c9fd4bd69a1244a945f3e669751cc34f","impliedFormat":1},{"version":"52887898504d0dabcfd7d6aee59f04386fa1b62ceb1c742d141d64cf9820ddaa","impliedFormat":1},{"version":"43de091a9d7c45f21e51a147f914368e8aacef2a911b010a1a459e9d77d998b4","impliedFormat":1},{"version":"8207a8b85fea96f4ba38bf816159ce2f624210aedd7d829eec370b5bf2c6eb2d","impliedFormat":1},{"version":"46f482ab7bc6ff88ca10379dfbb11cb298d3a13b729af584f8fd0d0645894862","impliedFormat":1},{"version":"15e60969067d31da05b5f4fd5bfdc35f9b6a10240729cf428d6539f79c1d6bad","impliedFormat":1},{"version":"5affcbd718a136d16f7909e635c80a9d4e1f1b6e54cc5318a2be1482a1f81642","impliedFormat":1},{"version":"8960c4375d679c05a1e97cd185a7d6efa7637612fdf3723f7c6d41960464016f","impliedFormat":1},{"version":"c0c0b22cefd1896b92d805556fcabda18720d24981b8cb74e08ffea1f73f96c2","impliedFormat":1},{"version":"ceec94a0cd2b3a121166b6bfe968a069f33974b48d9c3b45f6158e342396e6b2","impliedFormat":1},{"version":"49e35a90f8bd2aa4533286d7013d9c9ff4f1d9f2547188752c4a88c040e42885","impliedFormat":1},{"version":"33b186da4b59bf76f82f9e99dee3bfe3b098456139b870887d4a1c01a216ce0e","impliedFormat":1},{"version":"7eca5b6e1cd1c28637103d2b6c44e8b89035a53e515ff31ae3babc82e6c8e1f9","impliedFormat":1},{"version":"49c9c8316d59f6175e6e0439b1d5ef1218f02ce622d1a599449de30645559eed","impliedFormat":1},{"version":"e4c48be0ffac936fb60b19394739847145674582cbc7e24000d9fd35ab037365","impliedFormat":1},{"version":"149ee951f88961c6151d764bf657b99011b3f6eae8f5dede177c7177169b086a","impliedFormat":1},{"version":"d228c7773484140fac7286c9ca4f0e04db4a62acb792a606a2dda24bef70dc21","impliedFormat":1},{"version":"8e464886b1ff36711539ffa15ec2482472220271100768c1d98acfdf355a23ba","impliedFormat":1},{"version":"fb0135c4906ff44d3064feebd84bae323ebb7b59b8ce7053d34e7283d27c9076","impliedFormat":1},{"version":"3b10140aae26eca9f0619c299921e202351c891b34e7245762e0641469864ffd","impliedFormat":1},{"version":"134d2affa5bca83e1c8d3a2fce17388d757de69b213eaee39fdb1a693565db22","impliedFormat":1},{"version":"148634fcee440c7bd8c1339b97455aaadc196b0229ffc8dc8b85965a7d65b380","impliedFormat":1},{"version":"783ffb7c8d3ba3feff3e7ae42966783e4a7dd9dab44e63de558ac02bb8704307","impliedFormat":1},{"version":"abc37ca70be4c98735e1d2d115886f15ac5861839804ef24449268024feb3176","impliedFormat":1},{"version":"b6aaea1c64e242d51eb18ffc98b78b6747f3d8b75eb04a9cfcf747cbc83fcab3","impliedFormat":1},{"version":"fe848a0485e45778a224cbc1a66af4eef5d51e07d01289b73f54bc384ae51b39","impliedFormat":1},{"version":"81785a3ea03d6db981ddfcf8fb1bd1377f985564def845c55e49e16f171deec4","impliedFormat":1},{"version":"74d0aa7bc76e9be864e25574a89218cc03fb0a5da4f6bbbadae50c2091d74be9","impliedFormat":1},{"version":"e05e03e1687d7f80f1569fdae117bb7b97feef1e839a61e1b3c61ffca8cc67c9","impliedFormat":1},{"version":"8a49e533b98d5c18a8d515cd3ae3bab9d02b6d4a9ac916e1dba9092ca0ebff15","impliedFormat":1},{"version":"fcb26ad5a6c39ce71dfac5dc16b3ed0e1a06a6dc8b9ac69112c935ad95fcad69","impliedFormat":1},{"version":"6acdef608420511aa0c9e3290b37d671bab4f719ffc2a2992c2e63a24605a657","impliedFormat":1},{"version":"291df5da0d84d1452cd68abfbcca08a3f96af610bf0e748528ba8d25784ce2b1","impliedFormat":1},{"version":"176cda558a7f76813f463a46af4607a81f10de5330c0f7a43d55982163aa0493","impliedFormat":1},{"version":"94d4a5f49b20135837d53756572e3356e7458dc699093596ed0bc5937ee0ae1d","impliedFormat":1},{"version":"67f9d293cad902d4be34e1aee30c22361d39801d73a4450474ffceb764528950","impliedFormat":1},{"version":"06eb1d62181200852eea37f2ac03000a44e1f2b406daa6ba9c6c1d41e602e832","impliedFormat":1},{"version":"cad0f26943006174f5e7508c0542873c87ef77fa71d265968e5aa1239ad4459c","impliedFormat":1},{"version":"2d55f0b72f108339a087e3c14e4c38d7d0114b26d9c6980bc4f1f06fd59ed748","impliedFormat":1},{"version":"d1f8a829c5e90734bb47a1d1941b8819aeee6e81a2a772c3c0f70b30e3693fa9","impliedFormat":1},{"version":"5ccfa8ce75725948efd6c792041adb831ee0d3629beb66d0621bb9ca7dcd0974","impliedFormat":1},{"version":"02bea5cf058a8fce7fe537b9e70d3ed506c188c3d0df132be355a2cb672c877c","impliedFormat":1},{"version":"6a3d21114b6736612210531e1a2dc7a0e58d931e43f7c21260a7e4c3e8840eab","impliedFormat":1},{"version":"7065dd99492aa108614383a0aa1f229e02e6d1bd4968473eb205350e58a4bc80","impliedFormat":1},{"version":"5220d805c94205d711898d75b0587d6dd2761a2e6a86fb5597ec32b9d5a18084","impliedFormat":1},{"version":"5f932457c501d03a68bee9ae0ab26ef9df2fa1f789a981483ec1f56c120ea5c7","impliedFormat":1},{"version":"5f892fcaaa4ec169e3fecb51fd2abb4bca5e4f481ae149147c73c77d513695b0","impliedFormat":1},{"version":"1b66942158a56dadb0a7c574d00caee3ef2fe6cc77f7445a57a53ef86a3f5102","impliedFormat":1},{"version":"1d87e15948b9a7eb98d949b51e9e2e95c0dceec106cc73251332bd6a2a7fdd86","impliedFormat":1},{"version":"9efec387c83d71bdbda5bee092cb28de1b9341f05a1afd6f21d6464ee721148c","impliedFormat":1},{"version":"fbfdf3501d765ff009eff8dc2121199a2fe3bd27e8bb35178ecffcced9912010","impliedFormat":1},{"version":"7f5a6eac3d3d334e2f2eba41f659e9618c06361958762869055e22219f341554","impliedFormat":1},{"version":"e1bead3baac08a09faac9a25157738abce07a4f5c0f623fb527ecd37e793d08c","impliedFormat":1},{"version":"62b399d376ac037dbb6cdf238e60dd829f010af81ae3efee9bfd376b85b91ca6","impliedFormat":1},{"version":"4fc9939c86a7d80ab6a361264e5666336d37e080a00d831d9358ad83575267da","impliedFormat":1},{"version":"ad4d9c273751dac976b662395f2e3d18e237ffdac6858971ba39195288c26afc","impliedFormat":1},{"version":"6bc29acebd5d030ef00b9c72cd42aad1ac7e1950b58c1a2a073d920997a65f32","impliedFormat":1},{"version":"18f7016d205b5537328a1e1598c74b9537bb4692feec6b3db6d19c845d5bbe6a","impliedFormat":1},{"version":"4116c4d61baab4676b52f2558f26fe9c9b5ca02c2792f9c36a577e7813029551","impliedFormat":1},{"version":"71b8b3d684260300dc20e4b0735322a8ffafdc07257b5d05a45dbc67b5b95bc4","impliedFormat":1},{"version":"15735f3084dc593c5bd19ecbe267a07c378703e14efedb6ad50e39962ff99d82","impliedFormat":1},{"version":"74a2ec4236b64b93319539e85d1999ef872d875ae224105db9ec5d4a24c9fb0a","impliedFormat":1},{"version":"00e1da5fce4ae9975f7b3ca994dcb188cf4c21aee48643e1d6d4b44e72df21ee","impliedFormat":1},{"version":"b991d92a0c3a48764edd073a5d28b6b4591ec9b7d4b2381067a57f36293637d0","impliedFormat":1},{"version":"baf3d8852d8f7a89e0c0be91945cab22b7999442d0a8253b204304ead6ed6de8","impliedFormat":1},{"version":"e451c032d71cb5cc0a72af939c3a00cb9e60ca9671bb5a5bc99e478456478f05","impliedFormat":1},{"version":"2bace0da26ed1e71c8bdf9ab64fe9c19fddba2a62e71391ab925c42f82774f86","impliedFormat":1},{"version":"090c41926e92dd0dae49198b8fc0061c4b33df0ebf4cc2613fc513c37a327d52","impliedFormat":1},{"version":"332615aa4988de7770834066d44c2add2be7117c7089679c38ca587dbed963c7","impliedFormat":1},{"version":"a307865123e601887b504cc04a7b9de86a05c3d6fee8bef410fb3a796c7da40c","impliedFormat":1},{"version":"44a5ebd5a6660d7f84e646d184771f78e901120fd6b5dc200500c1a039f423c5","impliedFormat":1},{"version":"42a85b809a7d5f5f68cd118a9fc3589ab877441628bac8cf4f26de826e66b4ab","impliedFormat":1},{"version":"ba87016094bafb7adef4665c2ae4bea1d93da4c02e439b26ea147f5e16c56107","impliedFormat":1},{"version":"40e9c2028b34c6c1e3281818d062f7008705254ee992d9857d051c603391e0f4","impliedFormat":1},{"version":"52d6b690b6e3ccd2ffeab9c9b4edf11883f3466d29a0c5b9f06b1e048227c280","impliedFormat":1},{"version":"4a34de405e3017bf9e153850386aacdf6d26bbcd623073d13ab3c42c2ae7314c","impliedFormat":1},{"version":"fe2d1251f167d801a27f0dfb4e2c14f4f08bf2214d9784a1b8c310fdfdcdaaea","impliedFormat":1},{"version":"2a1182578228dc1faad14627859042d59ea5ab7e3ac69cb2a3453329aaaa3b83","impliedFormat":1},{"version":"dfa99386b9a1c1803eb20df3f6d3adc9e44effc84fa7c2ab6537ed1cb5cc8cfb","impliedFormat":1},{"version":"79b0d5635af72fb87a2a4b62334b0ab996ff7a1a14cfdb895702e74051917718","impliedFormat":1},{"version":"5f00b052713bfe8e9405df03a1bbe406006b30ec6b0c2ce57d207e70b48cf4e9","impliedFormat":1},{"version":"7abcae770f21794b5ffbc3186483c3dbcf8b0c8e37d3ef3ed6277ece5c5dd4be","impliedFormat":1},{"version":"4720efe0341867600b139bca9a8fa7858b56b3a13a4a665bd98c77052ca64ea4","impliedFormat":1},{"version":"566fc645642572ec1ae3981e3c0a7dc976636976bd7a1d09740c23e8521496e5","impliedFormat":1},{"version":"66182e2432a30468eb5e2225063c391262b6a6732928bbc8ee794642b041dd87","impliedFormat":1},{"version":"11792ab82e35e82f93690040fd634689cad71e98ab56e0e31c3758662fc85736","impliedFormat":1},{"version":"0b2095c299151bc492b6c202432cb456fda8d70741b4fd58e86220b2b86e0c30","impliedFormat":1},{"version":"6c53c05df974ece61aca769df915345dc6d5b7649a01dc715b7da1809ce00a77","impliedFormat":1},{"version":"18c505381728b8cc6ea6986728403c1969f0d81216ed04163a867780af89f839","impliedFormat":1},{"version":"d121a48de03095d7dd5cd09d39e1a1c4892b520dad4c1d9c339c5d5008cfb536","impliedFormat":1},{"version":"3592c16d8a782be215356cb78cc3f6fad6132e802d157a874c1942d163151dcc","impliedFormat":1},{"version":"480ea50ea1ee14d243ea72e09d947488300ac6d82e98d6948219f47219511b8b","impliedFormat":1},{"version":"d575bcf7ebd470d7accf5787a0cf0f3c88c33ca7c111f277c03ebbe6d0e8b0b5","impliedFormat":1},{"version":"72141538e52e99ca6e7a02d80186ba8c877ff47a606fea613be1b7a3439c2b90","impliedFormat":1},{"version":"b43a0693d7162abf3a5b3b9e78acfafd0d4713af4d54d1778900e30c11bc4f83","impliedFormat":1},{"version":"115b155584649eaf75d50bdc8aaa9a0f528b60fade90f0cf78137c875ff7de7c","impliedFormat":1},{"version":"98d88eefab45da6b844d2bee8f6efa8d20c879f6dc870c17b90608a4ac0ad527","impliedFormat":1},{"version":"4eb2ca099a3febd21e98c36e29b3a9472458a1e76e888bf6499614c895ba6be7","impliedFormat":1},{"version":"f4dc28fbbba727722cb1fd82f51a7b9540fbe410ed04ddf35cab191d6aa2ba10","impliedFormat":1},{"version":"b8101e982968b04cfaabfc9613dc8f8244e0a8607007bba3537c1f7cbb2a9242","impliedFormat":1},{"version":"ed3e176bc769725ebc1d93f1d6890fc3d977b9155ae5d03be96ec2d49b303370","impliedFormat":1},{"version":"e2dc16f882661fe5e9e6cde0a9c3e6f18f56ce7243ab0a168e68bfab6a5b9830","impliedFormat":1},{"version":"fc5221aedb3b5c52b4fbdf7b940c2115bde632f6cba52e05599363d5cd31019e","impliedFormat":1},{"version":"0289a27db91cb5a004dcf1e6192a09a1f9e8ff8ce606ff8fd691d42de5752123","impliedFormat":1},{"version":"307c6b2de09a621629cef5b7d0ec0ccabe72a3cd1a8f3ee189229d9035f52051","impliedFormat":1},{"version":"3c196d2ef49db4ad0e33a2a7e515ae622106b06ee8479957303601fd3e00f4f8","impliedFormat":1},{"version":"7933769d84f5ae16546aef06537ca578f1c8d7cca0708452a00613050ac1f265","impliedFormat":1},{"version":"4a48a731413b6fae34620c2e458d0adf2f74083073544a72b1b3a96c32775b2f","impliedFormat":1},{"version":"d405963c5f69955e95c30ef121c7a3309f214f21ef09dceb5d7ac69557cbe0fa","impliedFormat":1},{"version":"0c03b1120ddb2fa74809f5d06516beb5b4a3b3561ee93619f1e1c98fdb74a660","impliedFormat":1},{"version":"c3dc147af5ef951e14797da29b2dcaf1fdddabb0175d538e1bedf64a34690b9e","impliedFormat":1},{"version":"77e6933a0f1e4e5d355175c6d5c517398002a3eb74f2218b7670a29814259e3a","impliedFormat":1},{"version":"f8ce447bbda4f75da74cecd866cc1ff9bdde62189ac9d8dc14a16c48b3d702fa","impliedFormat":1},{"version":"68969a0efd9030866f60c027aedbd600f66ea09e1c9290853cc24c2dcc92000f","impliedFormat":1},{"version":"757f7967151a9b1f043aba090f09c1bdb0abe54f229efd3b7a656eb6da616bf4","impliedFormat":1},{"version":"786691c952fe3feac79aca8f0e7e580d95c19afc8a4c6f8765e99fb756d8d9d7","impliedFormat":1},{"version":"c3b259ee9684c6680bd68159d47bf36b0f5f32ea3b707197bcd6921cf25bde36","impliedFormat":1},{"version":"ab0926fedbd1f97ec02ed906cf4b1cf74093ab7458a835c3617dba60f1950ba3","impliedFormat":1},{"version":"3e642f39da9ad0a4cd16ccbd7f363b6b5ad5fa16a5c6d44753f98fc1e3be9d96","impliedFormat":1},{"version":"7f5a6eac3d3d334e2f2eba41f659e9618c06361958762869055e22219f341554","impliedFormat":1},{"version":"e6773ee69d14a45b44efa16a473a6366d07f61cd4f131b9fea7cd2e5b36a265c","impliedFormat":1},{"version":"67f2cd6e208e68fdfa366967d1949575df6ccf90c104fc9747b3f1bdb69ad55a","impliedFormat":1},{"version":"4093c47f69ea7acf0931095d5e01bfe1a0fa78586dbf13f4ae1142f190d82cc4","impliedFormat":1},{"version":"4fc9939c86a7d80ab6a361264e5666336d37e080a00d831d9358ad83575267da","impliedFormat":1},{"version":"f4ba385eedea4d7be1feeeac05aaa05d6741d931251a85ab48e0610271d001ce","impliedFormat":1},{"version":"52ae1d7a4eb815c20512a1662ca83931919ac3bb96da04c94253064291b9d583","impliedFormat":1},{"version":"6fa6ceb04be38c932343d6435eb6a4054c3170829993934b013b110273fe40af","impliedFormat":1},{"version":"0e8536310d6ed981aa0d07c5e2ca0060355f1394b19e98654fdd5c4672431b70","impliedFormat":1},{"version":"e71d84f5c649e283b31835f174df2afe6a01f4ef2cb1aafca5726b7d2b73a2e4","impliedFormat":1},{"version":"6d26bc11d906309e5c3b12285f94d9ef8edd8529ddee60042aba8470280b8b55","impliedFormat":1},{"version":"8f2644578a3273f43fd700803b89b842d2cd09c1fba2421db45737357e50f5b1","impliedFormat":1},{"version":"639f94fe145a72ce520d3d7b9b3b6c9049624d90cbf85cff46fb47fb28d1d8fe","impliedFormat":1},{"version":"8327a51d574987a2b0f61ea40df4adddf959f67bc48c303d4b33d47ba3be114a","impliedFormat":1},{"version":"00e1da5fce4ae9975f7b3ca994dcb188cf4c21aee48643e1d6d4b44e72df21ee","impliedFormat":1},{"version":"976d20bb5533077a2135f456a2b48b7adb7149e78832b182066930bad94f053a","impliedFormat":1},{"version":"4d250e905299144850c6f8e74dad1ee892d847643bacf637e89adcce013f0700","impliedFormat":1},{"version":"51b4ab145645785c8ced29238192f870dbb98f1968a7c7ef2580cd40663b2940","impliedFormat":1},{"version":"589713fefe7282fd008a2672c5fbacc4a94f31138bae6a03db2c7b5453dc8788","impliedFormat":1},{"version":"26f7f55345682291a8280c99bb672e386722961063c890c77120aaca462ac2f9","impliedFormat":1},{"version":"100802c3378b835a3ce31f5d108de149bd152b45b555f22f50c2cafb3a962ead","impliedFormat":1},{"version":"fd4fef81d1930b60c464872e311f4f2da3586a2a398a1bdf346ffc7b8863150f","impliedFormat":1},{"version":"354f47aa8d895d523ebc47aea561b5fedb44590ac2f0eae94b56839a0f08056a","impliedFormat":1},{"version":"62b753ed351fba7e0f6b57103529ce90f2e11b949b8fc69c39464fe958535c25","impliedFormat":1},{"version":"514321f6616d04f0c879ac9f06374ed9cb8eac63e57147ac954e8c0e7440ce00","impliedFormat":1},{"version":"ce7b928daedd974205daf616493c6eb358069ed740ed9552c5f4e66da19fd4bf","impliedFormat":1},{"version":"3d59b606bca764ce06d7dd69130c48322d4a93a3acb26bb2968d4e79e1461c3c","impliedFormat":1},{"version":"0231f8c8413370642c1c061e66b5a03f075084edebf22af88e30f5ce8dbf69f4","impliedFormat":1},{"version":"474d9ca594140dffc0585ce4d4acdcfba9d691f30ae2cafacc86c97981101f5c","impliedFormat":1},{"version":"e9ae721d2f9df91bc707ea47ddd590b04328654cfea11e79a57e5aef832709ff","impliedFormat":1},{"version":"0e2a6b2eeadafbc7a27909527af46705d47e93c652d656f09cc3ef460774291b","impliedFormat":1},{"version":"ed56810efb2b1e988af16923b08b056508755245a2f8947e6ad491c5133664ed","impliedFormat":1},{"version":"ed012a19811c4010cb7d8920378f6dd50f22e1cf2842ecb44a157030667b165e","impliedFormat":1},{"version":"26a19453ef691cc08d257fbcbcc16edb1a2e78c9b116d5ee48ed69e473c8ff76","impliedFormat":1},{"version":"90f08678b00c7b7aaaad0c84fb6525a11b5c35dad624b59dcadd3d279a4366c4","impliedFormat":1},{"version":"97ba9ccb439e5269a46562c6201063fbf6310922012fd58172304670958c21f6","impliedFormat":1},{"version":"d037b771e89ef6dd81c71de92cc644d68b1b5d1ce25dbce9c2cfe407dd0b5796","impliedFormat":1},{"version":"25091d25f74760301f1e094456e2e6af52ceb6ef1ece48910463528e499992d8","impliedFormat":1},{"version":"853d02f4f46ca9700fefd0d45062f5b82c9335ba2224ca4d7bd34d6ae4fc4a7f","impliedFormat":1},{"version":"b3d1c579771490011614a16be1f6951aec87248fdc928dd46b682523edb8e503","impliedFormat":1},{"version":"b3cc1bb7311f35569b531e781d4a42d2b91f8dfd8bc194cc310c8b61011d6e43","impliedFormat":1},{"version":"cf6dc8f18bc5ee063dc1a37bccd3031dc0769f11622399018c375aacfcbda7c9","impliedFormat":1},{"version":"8ca2d01f5f3d4d4067aadea230570afa4c91e24e485fbe2e9d53ead3b33f80d0","impliedFormat":1},{"version":"3d9f0abd05c056232c7f7f77bff1695fb07974106d0296e1b895badba20d805b","impliedFormat":1},{"version":"c7ddf2aa89f4541979c8337682b6bc278e5535be0f1fac98c778e222ef357703","impliedFormat":1},{"version":"dcf067993ca6e8af8050ebb538f3db1d9ab49fc1d8392ab2a9e2db50919e7337","impliedFormat":1},{"version":"9a0f11cc9d5419a5bf8387793c174c0d93fa2fd04a572be61bf0e35bf9d78639","impliedFormat":1},{"version":"401b83ed6f8a1a084c92f79feadeb76540a8a1945d7d000ffea91610430fd3e4","impliedFormat":1},{"version":"c00c2491442a7b9b888f403d160186c942da151bd671dcf37977d10de1d32498","impliedFormat":1},{"version":"4646966d560ddc09853c7cb1a1a418f262a579e390cc307f1dd353434938fde6","impliedFormat":1},{"version":"e9862a3b7eaeaa91829d2cf89f33e6f7245a2db3458b694ff64c85542521a01d","impliedFormat":1},{"version":"8fca3d2b2a6da9bb079ec8802926f72ce5ba8f12b10e7918590b4f2b877e960e","impliedFormat":1},{"version":"481ec2dd48f98df6c8567571b3d7aee76ffcaa6ac22c26bcdf92552d4bd9b7b1","impliedFormat":1},{"version":"f21e4cdf26ed143e67a8c7310620bd7878978040360c22c891f5dbb01b00b257","impliedFormat":1},{"version":"a53a62ef9b7ffeafee6861dc047b967c6e0bf42a2a67033fada7b6e52e1bc615","impliedFormat":1},{"version":"35bc256273c304ef5bf203e0706ed0ed6fa9de40fad8a30eebbeee0b853dcc92","impliedFormat":1},{"version":"774adcddeb41ed22be4d1ab586c762ddb2948a84a7a3f9867d2cd4af1d837ffd","impliedFormat":1},{"version":"cfaee3e42970c0fb51fbcd015db5f9ae663b8969d5e54f7d88e3c96246517f69","impliedFormat":1},{"version":"d712053dc1acb3fa4773202ea88f378c663bc1f163abe266afe0d599b4536511","impliedFormat":1},{"version":"82af9a77dfc85173fa56109f08d66f6fe5485d7011c5c1d174fb1d5f39b0ffef","impliedFormat":1},{"version":"065e7ba3dc90e6adb698c206897c875c208e86d765480ae5e4c190b5fb4c7a39","impliedFormat":1},{"version":"940494b72aa9bbd6b99249cb12713c719c7df220c3290fb355dae5f54d2ea5d9","impliedFormat":1},{"version":"025eb899a885dd305be2fb16f38a1564a95ddd25d9e5e8017829304265999025","impliedFormat":1},{"version":"f44708ba63ee4af745ce9a3307d4f20e686ec2d075c2bc9188f9101b7fe97288","impliedFormat":1},{"version":"1dd37c37187e7f71a82262aaa9e2db4ea4ab5a504326324c08724ab7f51e1b63","impliedFormat":1},{"version":"c822a1e1245f4aebe787b381ec31e7573c859579a93023c8b00be3d9a49b66d6","impliedFormat":1},{"version":"a25494aaa1b278f80f73ff79bdf00107c051727162e01aa931c90331bb8ebd8f","impliedFormat":1},{"version":"567cfab6fb2c86ba22b6738188b33f104f23e2a7407c098a3b3970e362b83075","impliedFormat":1},{"version":"1e73ecd4da907926b4feee7474f7999ba70cd586d0efa981e113eb68ffa0d22d","impliedFormat":1},{"version":"e937fe62b1339e08caa7e22acec57be49ae83010947443512005c710cb59ec84","impliedFormat":1},{"version":"848eaa9d6fc56f31a6abaedb61f0825121b0cda122b58262fec156e7c4184fa5","impliedFormat":1},{"version":"eb2c2ecde33a819fd65ae4d123b02920f52bcc4d48752fbeb9b645334b8905c7","impliedFormat":1},{"version":"0b9382de2576798f08286e25704785a244279fc86ecec0b900608be9a508e9fd","impliedFormat":1},{"version":"2d8a2dfb6c54a41df1deaac48a7c1ddee9712c4a64219f3bde7e200e013e044b","impliedFormat":1},{"version":"b61c1ceb88b79b0cfa7e8de1595e236b87ce4c6bb8ab0808d721e8fb70004759","impliedFormat":1},{"version":"d93370427cc358d66a7e014d9a03d36965c73b30a0c6ad52848adf65178243c3","impliedFormat":1},{"version":"4132bdfdeffebfcf8e2a41ed0d10150bed6599765e545dae09b2776240d14cf7","impliedFormat":1},{"version":"fac9b3c65250edb55982f08e82fc59335a28262202865426f8838c2307620a75","impliedFormat":1},{"version":"2703b5b6d024695ef877be342c8f28dd09e15881df56cb44daa042b381285e96","impliedFormat":1},{"version":"75cfa7274d43596af9a3adc2c284a3a7c5459c0d911b65ec6fd8d5a63beaff6b","impliedFormat":1},{"version":"54d7240da9eda456c661e89ca15703a8471d37c355b6eee2f50dd25f86649d8c","impliedFormat":1},{"version":"3ef49ccf913afdf87923b04eaeb900d67e85c52d3cffe1985f6b89a1345ab426","impliedFormat":1},{"version":"4c827b71b26b6167b7f002be5367c59234b92e61e195c72389d3f20ef1e681f7","impliedFormat":1},{"version":"359d1d4984ff40b89626799c824a8e61d473551b910286ed07a60d2f13b66c18","impliedFormat":1},{"version":"23908bd6e9ea709ab7f44bd7ad40907d819d0ee04c09a94019231156e96d9a67","impliedFormat":1},{"version":"e039c0572e83a8613e9d1f5faf1f50d66ea6a73e9c90e299193de8c3b3555f0d","impliedFormat":1},{"version":"16db34e3e82865e6b4bef71bbfe7e671cc8345ba5ae67c8ca20e50bcb18d0a6c","impliedFormat":1},{"version":"80b230becfd8a35955f13f6022e8fd59af9612a3ef83e14159cc918b3be0faea","impliedFormat":1},{"version":"32eb807d06018bfb2b05fe61eb6a90fe47c97c4ae23ba5af029921963a354d9e","impliedFormat":1},{"version":"3dcab336869307408255710db852dd809b99bdce8bd95856e5f97ebd8d7bfee2","impliedFormat":1},{"version":"437cb230543cdc5e9df94a25ca6b863c7f5549a10d017f4bf9691e9577a184db","impliedFormat":1},{"version":"68c13f0ab6f831d13681c3d483b43cfa4437ed5302e296205117d30a06f3598c","impliedFormat":1},{"version":"85d5fdfaaa0bf8825bdd6c77814b4f2d8b388e6c9b2ad385f609d3fa5e0c134c","impliedFormat":1},{"version":"3843e45df93d241bd5741524a814d16912fe47732401002904e6306d7c8f5683","impliedFormat":1},{"version":"5dc8d344618336fcce1b101465249c758b87ba0ac3f806a4ed9ef4a1660b29a0","impliedFormat":1},{"version":"fb0af5e73c6abdb54d9429ba72380bd69de0c9cf71f3380500ddca02229a7447","impliedFormat":1},{"version":"a40b3b560a57ff2597377c8bd977fe34e7e825994962367127e685f2f4911cd8","impliedFormat":1},{"version":"46cdcbef9616adf45cf9303b6ee16297a7ee0437d39fa6821f33a70cd500c5c9","impliedFormat":1},{"version":"60434c3d79638cea7bbb79e0edd4baca1e18d2cd828c7d4af7711e4dedee9cb8","impliedFormat":1},{"version":"24ecf0e691a8cb8b2f352d85fa9e42a067408ecc35d7fa1dc6dec3424870c64c","impliedFormat":1},{"version":"c5053ebc1c7a583a088706d64d5ba31bad79af910d9850585213a55926362d30","impliedFormat":1},{"version":"2e2655be5c5db990f66408139609199d1ffdea1434b8296276c3dfee6bfbebcc","impliedFormat":1},{"version":"32fc14ee35ddb9184f1ef4456ba697e872d757b67dd77841f7b6d8e72652f7ec","impliedFormat":1},{"version":"bd2bfacf748ee0bdb9f814b979ef6c5c2428c0b60c5fbf11dd03cf67fb710d52","impliedFormat":1},{"version":"d62dd90cb65049f765bc40783a32eb84b1ffb45348a7dcc8c15fbda3a1dc0ffb","impliedFormat":1},{"version":"79ffccc0cac5b0e3d24ee7b2c51d10754ecac9f214e8d6b25c58dc86fc798933","impliedFormat":1},{"version":"b383818f7fcacf139ae443ce7642226f70a0b709b9c0b504f206b11588bffeed","impliedFormat":1},{"version":"8bb7d512629dbe653737c3ac8a337e7f609cc0adc9a4a88c45af29073b1cbeb0","impliedFormat":1},{"version":"46e546c6e82f49bb98764312ebdaf52780d5045e3488aac049bff718cec16c33","impliedFormat":1},{"version":"35ae7e125a111d694986fe5839a3fae42e4db22375ec4021bc03ae4d46e91bd9","impliedFormat":1},{"version":"cd7528a6781095d286ae440e770fb62c7c279b0549279e73f1c8c0fd4b8ab950","impliedFormat":1},{"version":"0fe8670d5422c7ef468f40d6cfd71f924e1efb1bcb4646f19f480a2352d6122d","impliedFormat":1},{"version":"56bee1fe33c0082e81e0f113a423d9a9309410af210f0af103436caa98bb6143","impliedFormat":1},{"version":"5b7da74907652cfdc3089806009e04b60b74873a8f77ed9d64b546aa3532a019","impliedFormat":1},{"version":"469539760d3f55be43eb0742666d0b2b9ad7802d1d7c1bffd4c01ff4572badb4","impliedFormat":1},{"version":"1605b9b88099e0f3f4a823406753e8560f21e87801f5405514c0eee550621376","impliedFormat":1},{"version":"a4941e0aaec1ad9734f8beaf7d01dfc3a7b4c7cbf05be0d12f30e5dafe7c5a3e","impliedFormat":1},{"version":"5d41ebf1f7941e35fc43fbf125872c898660bdab951b191429c47753c8efbeed","impliedFormat":1},{"version":"d033a8beed48cd201a547a97e09cfd6e0ec21f3db87b34e4d5b01efdd54f5761","impliedFormat":1},{"version":"7c2342b0b4c053b2d8bc7496d2f9e5f95c1b87331208d48123763fc167bef797","impliedFormat":1},{"version":"38da2d1117c1c165bbf4557a0a3865022fb7289fe02cf05972e48b5011822346","impliedFormat":1},{"version":"efae928a1e9ba387ed6e67dabe5e4b69ca6a3ba6d9386d634a4c1c3edafe4249","impliedFormat":1},{"version":"cc73c691dd51a49ef04f26df601784517a27072738a967a9ab4539f29bf41f5f","impliedFormat":1},{"version":"06d3411fd086a7728ecca93ecd576d98b2bc6cb5201bb7e696d78c393efa6f24","impliedFormat":1},{"version":"4838f6c57405fce22bf94c92663d18a2abd224ef67ded862253e9e46b7df4b18","impliedFormat":1},{"version":"01b0a0ca88ac71ee4f00915929f7ff1313edc0f10f4ac73c7717d0eef0aca2e0","impliedFormat":1},{"version":"42f22bb3d66d119f3c640f102d56f6ee6ea934e2a957d9d3fa9947358d544d3b","impliedFormat":1},{"version":"3345acf9dff50c4a4a953dc46d556f1d51c779d706aed07700ce5bceb5bb041e","impliedFormat":1},{"version":"3f814edf8366775fdb84158146316cd673ecfdc9a59856a125266177192f31c8","impliedFormat":1},{"version":"99115d05f0b4bff983067f39e78b4fe8fa60b6326d72ad582b339367fa59f583","impliedFormat":1},{"version":"fbdca9b41a452b8969a698ba0d21991d7e4b127a6a70058f256ff8f718348747","impliedFormat":1},{"version":"b625fbbf0d991a7b41c078f984899dcddf842cfb663c4e404448c8541b241d0b","impliedFormat":1},{"version":"7854a975d47bf9025f945a6ea685761dedf9e9cd1dad8c40176b74583c5e3d71","impliedFormat":1},{"version":"28bbf6b287a5d264377fdf8692e1650039ae8085cb360908ae5351809a8c0f6e","impliedFormat":1},{"version":"48a4f60d88d0bbf4947be49f8f97a6862cebae06844a04b10a79153c528f1301","impliedFormat":1},{"version":"a7967c8321e8a51ec5b77cf2644f929fa221e97c8b53ea30f2f5e3d81e56f177","impliedFormat":1},{"version":"a471d6a0eafcdff19e50b0d4597b5cef87a542a6213194ae929cdeffbc0e02c0","impliedFormat":1},{"version":"5abf64e067319de07b5e25ffcc75fba5d00bcb579cdc69325a1ad3f3b3664284","impliedFormat":1},{"version":"56536d7f1073fa03399662e97d012bc70d62c31b763d0bea0e0040e6f1609ad6","impliedFormat":1},{"version":"7b9e8561139aa30959113ef793e059e0933b50335aecaef8cdcf81e03a9984ae","impliedFormat":1},{"version":"5b1e11bcea7e4e25725574b10a00ad65222d5db7ae354012b3f2df0291e482ca","impliedFormat":1},{"version":"884f646d3dd1551e36427c1fcfb9205225de21c4eb5a65d6b2c4d372ec36bd63","impliedFormat":1},{"version":"955819a952aed955630ac562fca9c65f651c4ba7adab784a3b52e111c2888cf4","impliedFormat":1},{"version":"a7b85d40ed2c654e6fa84f49ff2bc06e0f3d98910039394cd7799dc32db00146","impliedFormat":1},{"version":"26a810c5da97af4bcd593900738d422de02949dd230e5f255bc3f7ef82950c57","impliedFormat":1},{"version":"94d33075935c462c52917b3075d604f970c27c799c5092194a664ede114ffb8f","impliedFormat":1},{"version":"d2ef66c3f5d3401bd95d48492fb7861f3f8e8992a17543c75f5bfb904e07d932","impliedFormat":1},{"version":"af4ad02f3a1457af2e2331399229a7d70e1cb1198b1aecc0bc18aa3b3b695bbc","impliedFormat":1},{"version":"52b6c07b8f8b1b46bf85c2129e0c4cf233203c199837d4a17e914459d09e986a","impliedFormat":1},{"version":"b7cfc15401a7a1e368c3a70b29e24e376b54f99dfc3a1611992f853159230f04","impliedFormat":1},{"version":"525430edcbdeef71abd84bb64e35a5cf23e1def38579b656d18a4c94ff1f58f5","impliedFormat":1},{"version":"8b1d35f7add4e38a0f88704782a0905c2ae237364c9b9bd9ddd29cc358ee59cc","impliedFormat":1},{"version":"615ad07ab7542be91ec72aa0656fd8daed4feac15a2459aaa7c36dfc32f4e37d","impliedFormat":1},{"version":"df12cb709574b860f8e33c022e9561f339ba71794cd5d4b0d22b8be3ea509f52","impliedFormat":1},{"version":"31ff5aebab2436465c61de78fcf94b7d6d03915951310e0cfb6dc61b1e3ed751","impliedFormat":1},{"version":"d2745be767c32464627abc322a88f5076df5802a16a260d7ccf13600ad0a615e","impliedFormat":1},{"version":"aa73259de07ff85e39d2b49fbd233847690ff8ad4875d0023805d2a015f4ea43","impliedFormat":1},{"version":"74a907fa14655328575b29e4dbdf58440dd07c081d9d245f785c4143d10510c8","impliedFormat":1},{"version":"fbcdb2ccec93060304b878e7f65246b6b2c992e896774e9eaf7744f58a9cd8a6","impliedFormat":1},{"version":"935094dc19b20214f20677d5b871aa34e0e3280e6c852dd57b6a118134a15764","impliedFormat":1},{"version":"ea99aa2e537966df22f8192e99929ee81719c1cf0b9d9d83d0c6fed53325ccc6","impliedFormat":1},{"version":"c624b65789f71d3fe13d03b599adbaaf8b17644382f519510097537736df461b","impliedFormat":1},{"version":"3fbeaff576ce5b8035224fbcb98ec13b7cdd16cdbbf8ee7b4052d3d6330683fb","impliedFormat":1},{"version":"cc8eac1829ee2ec61323b3af1967790ceb9d0815ef8c40c340bc8090c17a9064","impliedFormat":1},{"version":"5947f213795a08df7324841661f27341937a5603edcd63fa2d2d66fb11864ec9","impliedFormat":1},{"version":"2d9f4d58554a246616eeaa090a2fb0dddccf412e88617975138389fb15770ca9","impliedFormat":1},{"version":"9d5e2347ea0d666f938644fdd4ea2bd48abd70b69e68db435b0e9d82c21debe3","impliedFormat":1},{"version":"74eeab10497f9b660c5faa35a4c798985d501f4c6ac59ec0a4f5bf1e9e22f8d5","impliedFormat":1},{"version":"f5784612187dad5542233e5f1fb909d845bca88ef3c873f624befa8cdb83a8a6","impliedFormat":1},{"version":"0c144ea2d770452cf3b9fa26af04717685bd96666ed455cc7a6f3f6927fea853","impliedFormat":1},{"version":"5556cb5a70fbd19a0ec9b1f2bb07b03d75b09db16092cdfaff12bb1c2d61e664","impliedFormat":1},{"version":"dc0a2b1055da16b360301fd6fbb5c50a9069e14ff290442e281ff35c0a422c87","impliedFormat":1},{"version":"537f44e770e50d7af6d8f88dc5aee5737c1ad37f749a23e48b0fa6588b578da3","impliedFormat":1},{"version":"a9d044949424953796fba1d10484a74f5b9d3ff5a991de7cba593eff39708df1","signature":"782fa6e6ac719809f7f80d981da203263128dc32f9a395b4ed1073701bf416e3","impliedFormat":1},{"version":"30611ab4b710838c7a918caa643efd70f7b6b833d7e711dd7fcf0692507782a8","signature":"2541c870431a7882974f3edaa4af2f38d101319d75fd7e554880d18060ef1f17","impliedFormat":1},{"version":"22ef3fcb83322afd03547f25011827fc60eb847ded59a0fb9be2977c71c07e59","signature":"5a9b1eb2ab9ba4d95d50e142273db97e14e43162e7f30681002b1aae359c1b1f","impliedFormat":1},{"version":"9e899ee1a77d202eb3347b6f01e55e91f24af899c783aa5cc521ce6981fd29a0","impliedFormat":1},{"version":"14baf77440c62a113667c181ff1d428936e0a7f20fbcb95b486985343279f9db","impliedFormat":1},{"version":"c6a5e3ed00a6925bf151e08c1fa792a218f2e4c47115fdcf8b07b5aa622b4762","signature":"bffadf003a9d35b3f5d224d6e72313edfe5a395b289673e01f230ed57d3350e5","impliedFormat":1},{"version":"c640e18118d016545097a335e2bb09c917c1618dc6121415b211e1b7076e60f0","signature":"52ab8eda7f5c48f0a177e58006de9b01feb65ca5264ce7ebf8364124673a7849","impliedFormat":1},{"version":"7725921b96570f451bc0ffdec298b1e3222662033b4860a6049254702f81d44d","signature":"4f58706e6d7e8752b489da417fac80b61250be125752a2eddc68afdb4b9983b3","impliedFormat":1},{"version":"55aad4172761c2bdae67e4a722249695c7846fdc421ea695f1cf0f0c8bd18aaa","impliedFormat":1},{"version":"452038afa17805d59df9bb75ffa1197bf372f10e87d132f520e72bc5b61b8b50","impliedFormat":1},{"version":"a77483e0c54901099386b5a7afb8c1b20bd55fff25f5cf8c49392eeb23a086fe","impliedFormat":1},{"version":"f3b1e62189473fadd8eb8ee74cfff3ec8dc7f0e68bd781d9532f12d1783602aa","signature":"13427a263a0dfc7cea2e9907081d4bf29944e82e5a3c187c2dd3fd176332e8e6","impliedFormat":1},{"version":"486d9954e2aebd3dc51b565bac208afd650bcdb704cdb3b46aa771622525c52e","signature":"5a864ee96c6b50ed3b2ad2c0b88fdced9b1ed9a71e0653fb2cce71a8679d0d7f","impliedFormat":1},{"version":"806231fb346a61f6a5bef87446124171a0e93449143a37306669991b1e35eb33","signature":"4858f565f51b41c7f89f7e6910c5bfb819e64c13b93acc7a4da4d5e8b86498c0","impliedFormat":1},{"version":"2e4c447619c8e93efd13147115ae8e2cea87132658ebb0380539ef762de8582d","signature":"e5553bb081ed273103fd532731624b6381381c57109e0ab8d32359ef4f1830e5","impliedFormat":1},{"version":"509ddc5e9378c3d7d376eb68964df95d0400de8774275e9785ee46b8d86a69d8","signature":"44b35dac70a186528985136bb6e4ed03beaeade42077d71dac3f23b6276af4e5","impliedFormat":1},{"version":"10d586b0736bb19e792f4585c1cffbfe86934fec0c66d7bbdc0304dc6450fcfb","signature":"12bd7ef6171cf4ced72ba04aac9318b8b68d0c7b4688149476d79984362e6885","impliedFormat":1},{"version":"383ada033596ec4d70358db5e893602f35bc9a6370522dfbf252d0639d5116fa","impliedFormat":1},{"version":"90e2663543bd59df84cea61fbcf801e6fa25c3aea00d60805523b183b2ce70d1","impliedFormat":1},{"version":"9e6892d1e275f3287336e52916bd0936862367cbd3d92ed38b86715a2c14a9ee","impliedFormat":1},{"version":"dbfc0ee9cafbdf0867b342cffead435f4f0805af059ef0aff66211e6a8f4dfbf","impliedFormat":1},{"version":"f373f30dae525b1c4fbd0a32f4509b84ed4d03e56b5421ffa80fbc07f1062a73","impliedFormat":1},{"version":"4f11cd8d38c92ff4bc80daf537207130f4ed4e85242347b07012a476c0169792","impliedFormat":1},{"version":"1b9328a16833cead17dfe2106a6692d72887448d8b7990f0dd0362bcbe41b582","signature":"857aef4641a5f4177194170e0e7e9ab04e1c4be056d29ccc42d49938b12a6ae4","impliedFormat":1},{"version":"9f3c399c1df3026874c9f7a99fa00e89e8643763200ced751fcd6db024a4cdfe","signature":"64128fbc42884e1e963b9aab6399af7c62e500907a6bf01205448953da080924","impliedFormat":1},{"version":"bddad2b862cca276cab39bdb8b5f0541368527c76883020d0e0266962a91a52b","signature":"b7fe4b762b9cd1d888a28afce74346546e054632eef71e533ccc6e32bebcce19","impliedFormat":1},{"version":"cb6f7ed489510b1ff4a6aac6d34b366c93ea7a2e574abc7e07fdcfd2bf9ec56a","signature":"abc218704ab31f5a90a06f2d4076488f3ec5ab983b978a2da898986c45b7007c","impliedFormat":1},{"version":"f33bb1b53ef8849daeaceb5315bae3f7a6c7fabb1c0f8421ad3c254ce0148733","signature":"c22a0f85c09c9745d9da0be7b252e42880be0a3006e845117bc114d4a227602b","impliedFormat":1},{"version":"0370c4d6df9ee74bc65ba6b5182dc5ee577c82f39fb6c26c355f057ddf05eb10","signature":"beff84a5fcd4a2b1e4b57c938ad808c21be18d3a596f15963ba38d849e860baf","impliedFormat":1},{"version":"6975c7c77644d06ed95b46e5285e9914ea8605db97c48bf0587fe0f6dab7c00a","signature":"13a48a6fb1620ef118ffd69077e182bff01cca6aa2a81bf5f5d85d553ced7a3a","impliedFormat":1},{"version":"cc9d3e6097c955aca5beece9d67b253b7b020544f330805c53ffea513068e6f3","signature":"b0c617a877816f04653cf29e4c7ccfa37d629736d54edb46317c52fafd819b0e","impliedFormat":1},{"version":"d66a8574cfb1046c00f54ed918f6955d221fc4d41109925073f23a2ff2804e35","signature":"4704f14c965c108fb55b93330aff6cb2c26047514877bf83c5650292c4d51949","impliedFormat":1},{"version":"c8125324a6424534fbf8a11b0507bbb9a0f38502daf77382de2e20ef4c99a367","signature":"165d3979889f1e564f69ba93591476af1bd20a44746d8926fb86a3815bbd35f8","impliedFormat":1},{"version":"ef5a5a729f91caa12e8e72431cdfbb02a3ed7f2c5cda5f7ecedbb68bcfb3687f","signature":"ad92c0a5b8cb9dddf215254202d5ace2265862fee12ee29daafdc53a44f63f45","impliedFormat":1},{"version":"233eee513d5e69802e12165e7347e246d861750233f887322ec3d196f7c10b30","signature":"2401e3e44968308532397a4db3140b5fd335f47c452e27dff8f3826a6e4b32a4","impliedFormat":1},{"version":"61c88125ef48d45c4ba2e60e3cdd7c2040cf8bf0cb17c4f14c9ace617b211707","signature":"7a852610e935e44708ec6926a0caf73d72dc03be041f8486c76b40ee97ce9275","impliedFormat":1},{"version":"857685ebb7c0ad0b07d5743db4fa7a9fad7aee25b11880770d077af4c052319d","impliedFormat":1},{"version":"8fa4cd876df38af60518d22da7835fa899fe7929a851bf4496b9fb7ae13b9681","impliedFormat":1},{"version":"188f08f0955ca3336d7da4a0028d68d9e9fc556e945e02653bf6392707a65292","impliedFormat":1},{"version":"b170af61fdbd152c7f292926f955e5eee2ed578b54dfeba9187d875796015177","signature":"e99fb69acc87f964927a4eb61e1ddf2dc4dfc9cfdfc8f720753143f929f26bd8","impliedFormat":1},{"version":"1bb429b6d30739a04f6fccfdd1efa926dc7f817e69a6383cdc43652d3d8fe9b5","impliedFormat":1},{"version":"13d37e5a02b5645be4525b59f22f90088c0076059924b78e9b8bbe58a21a062b","impliedFormat":1},{"version":"82637a41ed0a2c71072fa46f0032e6910014dbe1c312ca482daeb97d67ef498b","impliedFormat":1},{"version":"e69728e4409029096a84c7fe8cb7bb19197c75cb6e381cf118dd40e8606e92e3","impliedFormat":1},{"version":"c08444f90bd4511319184f08634b7db50cb3766ac8f7e4c18afb7c7901c8055e","impliedFormat":1},{"version":"50bd18ab49fece19f9d86f6b70500af21ea87df9ff094b4b412b34bc9ed2ebb5","impliedFormat":1},{"version":"f7f3423a747e06b02e2bcc375f2ba52a601129bb56d56e63a5d5f29a4a6bdd19","impliedFormat":1},{"version":"3eccf1c5cfcf05eb5a1e507213fcb021a4dc68142749bc26960fbc44463ab1e2","impliedFormat":1},{"version":"d8ba84f7ef6e8a81e7f39bac649261668c6bf73cfc2e748e2c4ca4549f61e2d4","impliedFormat":99},{"version":"dbbc31d2e9e506d14178cdbb550a6869115fff2af40c2d50115947cd8f7cb225","impliedFormat":99},{"version":"49e23b58e6373f1dd7156a1a36c601660c5a30e4ae0c4914f87d5f452c6270e2","impliedFormat":99},{"version":"44002b38aff4208de147ff4579ebb833fb234bcf444a2bafead727c17e0acf45","impliedFormat":99},{"version":"6028c13028266847d3f97dcbd9f84b044cc069cdb742ec86c0279d525c83865f","impliedFormat":1},{"version":"c417faf00b31135e4ad954fcc7c9479870df71799570f7ef820e5928446a2755","impliedFormat":99},{"version":"4beacc4d32af2b42500dad1480ec3c0ca536ec5f13fe7873cfdef32a1b3b34f3","impliedFormat":99},{"version":"0a81da933008a136bae114f77dc1e28968f0256db072cb6861e0074fa644f735","impliedFormat":99},{"version":"085021f1df48870da68d2943ad736069594dc08a72877fcbcfa214b2ec74d7fe","impliedFormat":99},{"version":"fbe5dfe3bade6b5d07e20bf5da9cdf9210a046fa57f295a1de6c809cd1aaef8b","impliedFormat":99},{"version":"8c48167566a34eaad79fc0fdbf8aedd24051583c36d16588ebc51705e0cec654","impliedFormat":99},{"version":"7c100c9b9fd7b2dcfcf4f03e4e8803f9c45a64880479f02f8b97dc5397ca6cb3","impliedFormat":99},{"version":"14597b5326b2529bc69c7c220a5986c6cb12a69326c463ec94f0f3a419d7af2c","impliedFormat":99},{"version":"d18039cded461ecdd58db63c2ee4dbb3e2479709aed7b33688cd39837a689eaf","impliedFormat":99},{"version":"8663b8a62c1a83df327e6b199526719acdf14008b66207022270490ed742424a","signature":"ee978cee75ea1c36bd1575f355a13ba3278346c3d760f16088406a34a10462e6","impliedFormat":1},{"version":"d84a94fd89422827e80fc68823b795f591e3d25819c9bcbcd44635a98c7e3301","signature":"980276b3e17ba5c9ba1e7dd6cfdb6120e2326dc6bd6df035c9b656ef97a0971e","impliedFormat":1},{"version":"2cc828414dfd47c3b57233d1bdffb5e6a7bc0f55a98c33cc5662b16ff9995d9f","signature":"ed61a9bf027b8b2232ab2a33af73067ff0b00167c2f7181e4c7e42401f5f56bd","impliedFormat":1},{"version":"fec92416333fc1a5112e00d3276b98f4a656163190303ee264143e1966b70d55","impliedFormat":1},{"version":"8e31771128d3b9847d5f9fa93ee8f9574035f6ee92df17a96c12717829d65a4b","signature":"b58d4adda2b3a687bdb898aeac331530d2347bb0adf5f8728001a3955730726f","impliedFormat":1},{"version":"cf4111ce84a5704f277afabf70bcb29a666d94f02fdba4e0a01921615cc46433","impliedFormat":1},{"version":"8c7365e11df7d7dbe9286d9a5d0338289d3932d20ca02276367ea26d1ab37ec2","impliedFormat":1},{"version":"12ea42a1c3e3ddbeef30860bfd068891c87024e1f48985d2ece2075b647df2ae","signature":"4dd0aefb77bbebba859d770fba4e64f1f640f40edffe2af7ae3a46f59f83a8b2","impliedFormat":1},{"version":"fe31b4904d0c367a925e03bee683b947653ee08f3391ec13f5586e9cf9df832c","signature":"691100d628728fb935e72def599ad0b149e00f113606d40a28676af13df1e4bc","impliedFormat":1},{"version":"7d8654b0c82f8ace385a32e0d75a44c4a04420a7e7364386a25245d039c7b22d","signature":"c0129f35cdabbfb8bef622e3ab0257bb07116012febeb8545e748ba1fd587830","impliedFormat":1},{"version":"2e1b685c75880150821827af7929809ce3e887d455c7bb03f720ebab06e80861","signature":"0ca992eac69e4e8ffe83216319c884449ac91a7a7895d38fecaf12b5b510eac1","impliedFormat":1},{"version":"aeb30d54e251c2a825ade2af84b6e4ab0724d1d76fa8d95ce56658aca1fad577","signature":"da8b7da21d6efaa90d505d09044c8b6ebb40ae03e9b025f962fc761990e20843","impliedFormat":1},{"version":"9de0c1e705c17067e59aa0b1e6baacc8d8118533a2ba2d86b47da87614661c6c","signature":"ac6e485ab7232e68b2c59bd30374b3176a54224163ce5b7029db8d2a64884bae","impliedFormat":1},{"version":"23e8d919fe6bd6a9d81d8407611369a5ba583926d3a631b2088097401e00598a","signature":"0ca68eea63e85b96e556be7b1c92694e26951cd95674dde54126d3c01124d963","impliedFormat":1},{"version":"6588cac7ce286b464aaef6f318a08507c7d21e1bd503a22a69dec4ee44dc87a0","signature":"d022bd1d2e65657b42cf096f6487c5d8223864db0aaee2de7740571706d21758","impliedFormat":1},{"version":"b6705c59e3e46e4bba219ca6e98c7ce1a169bc602c3c6e0eb823af0a287190a8","signature":"a1dd4ca5a9b7f0a8b92dcb15c6b6d3c5561060c9cb84966b5d65367493c7c359","impliedFormat":1},{"version":"71aeb6cd11938da49350a2d0f1006f35bc6346850f888f9a2b634cfef29f27d1","signature":"04633b3e753fd6444c1e435c385ba713de25771385484f8a10ff088cda199e1e","impliedFormat":1},{"version":"d2143315b0c8da0d0b5f5f68a1e0a0f74932d2f97f82d05f43595c74541386f4","impliedFormat":1},{"version":"c7363f8f0941334a5b9e5e379424f0552d378c0afe47f226b1408acdeb373f49","impliedFormat":1},{"version":"d96cda443e8cc5412878264a0d56facb26cfdc5a0c363a1b527cda7993fa9247","signature":"35cc3c2d7cb36c057bdd2683a3b662d2a2de2b98ca446b097911fd967eb93917","impliedFormat":1},{"version":"d63ad62eeead9cf646d909ca4ca0627ee7e5650f8f2ab96ca0724f2534866eb4","impliedFormat":1},{"version":"06447449c22b48f45e8f1af5ff9a3e389e829281b6f80737a27c12d922dd7c2a","signature":"e60415e26ba7e78be0cb89f41eb298dbd5c269f67fa563197204bbaa70085d7d","impliedFormat":1},{"version":"c247ae2919e2ea07b9d382d9dc42ff9c0e0f6b8cd404ee04cda8cc7f568c1840","impliedFormat":1},{"version":"14d69fba228d9c9b161864b84c1a1432c8fb9b551c4872fadc76ab9bc4b7c069","impliedFormat":1},{"version":"005f10cafe0939ae8d6a98e19c4ddf8b59faf3f9ae38dfa5907b82b9a6cb4de9","impliedFormat":1},{"version":"089c056ad8ecb34ee72cb831491ab72c214d8fb7ecf94b96a1b4736ab54397a1","impliedFormat":1},{"version":"e643ef3093cba63af26396ae8dc58dc542c241027749dcdf715f3d3209f79a03","impliedFormat":1},{"version":"f40e6338b8137033a5b4efbe01de45a4399f2c304648eace01d852cd05eb861e","impliedFormat":1},{"version":"89d879fae02696e226dbcb7444d6153158fa264bb646071988f19a2e422b314f","impliedFormat":1},{"version":"57de3f0b1730cf8439c8aa4686f78f38b170a9b55e7a8393ae6f8a524bb3ba5a","impliedFormat":1},{"version":"e933bd300ea4f6c724d222bf2d93a0ae2b1e748baa1db09cb71d67d563794b2d","impliedFormat":1},{"version":"c43d0df83d8bb68ab9e2795cf1ec896ff1b5fab2023c977f3777819bc6b5c880","impliedFormat":1},{"version":"bf810d50332562d1b223a7ce607e5f8dc42714d8a3fa7bf39afe33830e107bf7","impliedFormat":1},{"version":"f025aff69699033567ebb4925578dedb18f63b4aa185f85005451cfd5fc53343","impliedFormat":1},{"version":"3d36c36df6ce6c4c3651a5f804ab07fe1c9bb8ce7d40ef4134038c364b429cb3","impliedFormat":1},{"version":"e9243dd3c92d2c56a2edf96cbce8faf357caf9397b95acaa65e960ad36cb7235","impliedFormat":1},{"version":"a24a9c59b7baecbb85c0ace2c07c9c5b7c2330bb5a2ae5d766f6bbf68f75e727","impliedFormat":1},{"version":"3c264d6a0f6be4f8684cb9e025f32c9b131cca7199c658eea28f0dae1f439124","impliedFormat":1},{"version":"d3cd789b0eebd5cebde1404383fd32c610bec782c74a415aa05ab3593abc35c8","impliedFormat":1},{"version":"8c1babb42f52952a6593b678f4cfb4afea5dc91e5cfaf3ca922cdd2d23b1277a","impliedFormat":1},{"version":"04ebb965333800caba800cabd1e18b02e0e69ab6a6f8948f2d53211df00a193c","impliedFormat":1},{"version":"f8e2be107b3e756e0a1c4f5e195e69dce69d38d0ff5c0b0509933e970c6d915b","impliedFormat":1},{"version":"309e580094520f9675a85c406ab5d1de4735f74a38f36690d569dbc5341f36a8","impliedFormat":1},{"version":"c2fa79fd37e4b0e4040de9d8db1b79accb1f8f63b3458cd0e5dac9d4f9e6f3f1","impliedFormat":1},{"version":"4f0d1a7e2a5a8b85d69f60a7be2a6223827f5fec473ba2142279841a54e8a845","impliedFormat":1},{"version":"ae2fb62b3647083fe8299e95dbfab2063c8301e9a626f42be0f360a57e434797","impliedFormat":1},{"version":"f53d803d9c9c8acdbb82ef5c6b8f224d42be50e9ab8bc09c8a9a942717214f9a","impliedFormat":1},{"version":"d2d70166533a2233aa35977eecea4b08c2f0f2e6e7b56c12a1c613c5ebf2c384","impliedFormat":1},{"version":"1097820fae2d12eb60006de0b5d057105e60d165cf8a6e6125f9876e6335cde7","impliedFormat":1},{"version":"8f62905f50830a638fd1a5ff68d9c8f2c1347ff046908eeb9119d257e8e8ae4a","impliedFormat":1},{"version":"8b4d34279952175f972f1aa62e136248311889148eb40a3e4782b244cece09f3","impliedFormat":1},{"version":"d3c3cc0840704fe524dbe8a812290bfd303e43d3bd43dcaac83ee682d2e15be0","impliedFormat":1},{"version":"71725ba9235f9d2aa02839162b1df2df59fd9dd91c110a54ea02112243d7a4d9","impliedFormat":1},{"version":"80af0c272dcb64518f7768428cdf91d21966a7f24ed0dfc69fad964d4c2ed8c1","impliedFormat":1},{"version":"1dc9702aa16e3ada78c84aa96868a7e5502001c402918b6d85ed25acbe80fd51","impliedFormat":1},{"version":"35f891c1bc36c97469df06316c65a718956515c8b3bdbeb146b468c02493ef13","impliedFormat":1},{"version":"2e9b05d7db853315f44d824e13840e6fdf17d615d13170b5f5cf830442018dcd","impliedFormat":1},{"version":"751cefd5914afe4a2142ad53db3b2f324b5df74fa12121621d5312b3b8245e14","impliedFormat":1},{"version":"e344e2aae592e4879b1267c8384e64e87471c11684eb8b0fb0bd21e02692e7b8","signature":"ddd83c5c9e8634e8cd153cceb2a955d31abcfb45200c3b3ead3ed4852a96e163","impliedFormat":1},{"version":"3b48bc70bd745443a5ab9ff64f4a37b1202d5871bce0ec1feeab0d81f086ebf5","impliedFormat":1},{"version":"11a929e9e3ca2f35aaaa80f42027f42cc4c2721f6b03389ca42421d777ce6163","signature":"f09eb8aa76b02c99ad5fa780e1e611731c9c993637875779769891804f77a8b5","impliedFormat":1},{"version":"0444f36b83547b24a5c23483b882d01f761fb56d2c522609293dd128e44449e9","signature":"d506e53b6341159e69525bb41b0a8e4a2e02651c11e34f618c098a1583841d43","impliedFormat":1},{"version":"c41b01c07afb317623f919c1475261fe7d1968c6fec59bd14cbf61ea086737ee","impliedFormat":1},{"version":"995a6fb9c6321065e4af09b44b7993023daf3624b6c929f06aa87c92bc27794d","signature":"2d783ebea5aa559fa6b965ff708ec0a9c9d76e827de9de0e816560a18ceaa8a6","impliedFormat":1},{"version":"85c579d46335dea7c1bda5e07165ab26bdc9fad5f2ed26de4d67780a9d6f9dc1","signature":"7c7199e2a51640a139e9d83bab0e2c60a9b14dd9208b6488e7a21f4ae1221e90","impliedFormat":1},{"version":"ed3c8a2b495a3764a0e0f6e3b48c9e25b7c791857102c3732e47e7b8a2b4146a","signature":"b08defad21be1484613ecdac8eb48d322fc11d7edf2f976dcc84e6298366237a","impliedFormat":1},{"version":"17136473401873bc6aa2f0b2a4a013a3f97b8a0ccb04b6b91bcbec04f129e268","signature":"14ec0cfe0d04d6b073961bc335643bb0c1b3a9d1a248caf66bf118275845c7d0","impliedFormat":1},{"version":"4a11cc90a414090db16abf3418aeb9201e6ecf2a9e36829f6db71c0d79923ca5","impliedFormat":1},{"version":"0861e74d08cf22266af113dc692e1d7620aece2364e08457bf60c23946cd1b1b","signature":"ba54c7f1122cbc5bdc298f8d3415744ca3131dfcc060f5c476639185acdde35d","impliedFormat":1},{"version":"81ca60e78e5eedc5db95cf594644426f47aef429acfbcc802e5effc54a456a49","impliedFormat":1},{"version":"21c6f9e65eb3a5f071932e3c014aad040b137738068303c11a6d9454027cf342","impliedFormat":1},{"version":"fb53a7a9fccd80252e6c9b79af7d13edef0b18a54122d16ab1002d338e7bb695","signature":"1eeea3d920362ebfcf653568702eb98354647106f1bc3c2ef146eaf812315f30","impliedFormat":1},{"version":"5f5be01596111e4d7ce1e65ff527abe2e43ddc788802d91c38a8759d096a2bde","impliedFormat":1},{"version":"2f19d0cad724100dc10333207e0257de3b74092ad25f00b2894d5fee63f6f6d9","signature":"2459bf1f4a0e17598d076f2e2cb9c266bc715ce0b1d456c3995e5b825cce1b9e","impliedFormat":1},{"version":"412c709af7dacb3551cf5b426f57126bad53c025ce39baa5cca187179cdce5d8","signature":"15e582a3a09d7cf5b6947bf64840ed1ca4632b80fe385d1559f0110e4d8f29b7","impliedFormat":1},{"version":"169865eccff7fb83cb08ef428bbf1471ee98e7752c2e9cc7b49d88cacc436b7a","signature":"de9c5897b2ddf7a3ec040b0a1e982a957773b4f9c92056e1765a2600ff4756b3","impliedFormat":1},{"version":"1a92b08d9df6f089c695d24c38183e3cc33df037519b08b6dd3345357e939174","signature":"a0cb78ace6dd14fad4617fdc630f5d64b9553fb3686f15f7085e2ed4819f2af6","impliedFormat":1},{"version":"bbe68ef69b54d3cb9c3eaff2c80d0af2b5f80bccf91438d4a8cf8b53d9a14c4b","impliedFormat":1},{"version":"70e345d53cc00be14d6f3024838bbff3ef0613d56b71ae3f796d7b2a0d473b07","affectsGlobalScope":true,"impliedFormat":1},{"version":"2b5ede1fd1586049cc11819996359c316aa85af009f1bd3703badb608493b1da","signature":"5ddf1d2f9c1a3d3da7a81dd6386b68a2582a13d2cf4c58106503686e49f0099e","impliedFormat":1},{"version":"7ed74c5855bcb1f870d66254a08300c17d94c7143b2129c87c3ecdad67906845","signature":"a83da35e1f7686757882692bf4bd48f1901750b2723be55f4cd65b5c000ff4df","impliedFormat":1},{"version":"86ac0cb31f99231fa8178e453269b418406b049a7db9fc08eeae08f52e05d6d7","impliedFormat":1},{"version":"89b8d0fe5aec9c37b98f126e4f4315225d801e1bd157de17ad995200d16b2f1e","impliedFormat":1},{"version":"a319096f8d5fe4d8284f9711b9a001f8015d5e6494b8e74082ca1a75719de048","signature":"712d4b5edd2da68ae7b106af87513a74abf8879ebf3d4e3e0c1b84018eddcb1d","impliedFormat":1},{"version":"210878eb6bc4e1033b173399ede442c70f9abde21d0372a3eaab4a3d04ec3142","impliedFormat":1},{"version":"ca3393209096361c6ea9ad5783671d5609703d5d00a5ec2c71246c4b3872a291","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d73ae3f8b2a2d050c7646fd5a577186111907e81583e265eb1d8101eec4a628","impliedFormat":1},{"version":"4cc81a94c5e8f0ba3a73445f32a1c011c197c376b8f6bbdb08d3b1ab44bb2e95","impliedFormat":1},{"version":"ec7d4589f63f2c9812b18acad1df70acf39b4c9f2d0f1112a1ef9406dd0f7a9a","impliedFormat":1},{"version":"125abdba5ca8b77794169ed6926065c0e951ae3def02973bc5888a18a6b214ee","impliedFormat":1},{"version":"ab7d9daaef2b282cc553f556fa8b3d541f94479ff93f2d4203a12296065c7f2d","impliedFormat":1},{"version":"a69d48b82af6e71dd90d7f76a468078c26acac0043829984b78c9f34b0d12cbf","signature":"0888d042607f785af13898e0c364bc6abd5ccb8146936802216a92c9545f8816","impliedFormat":1},{"version":"a0c8c0303b249e6ec68c87932221dcd287d112afd4f501da03b3770ab2bec948","signature":"eece742217e94bb53fddb638ebf042bcae20487f48480248681b694bc9563814","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"db70313a715ae3ac5d0f62130917152eda06cee5750993c9d510fc70b7e9b7f1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8aff6e6b79709ea981bcd3aa64f92fc28b718633dd34d7ccde28a08c600ef9de","signature":"ec24169c061f4c11a3fde4503b04bb23a213196b23da7fafe73e807b19065b4e","impliedFormat":1},{"version":"6b188cce44cb3e33467038c562b23e97371af1957c8bc8dc6d47e5e06eb832f0","signature":"c8f1d018d4d964d82315fdf72a94ee8aabf7c990f9595ce2d8ec17548fe3bdae","impliedFormat":1},{"version":"fbed22e9d96b3e4e7c20e5834777086f9a9b3128796ac7fa5a03b5268ded74e9","impliedFormat":99},{"version":"3c1f4e38bee0df08dce9ab378f41d8c43cb091cc88c7a6be7015c40223f1fe79","impliedFormat":99},{"version":"7aa1752ebb1e6a242a6256a5125ae2988a8f9551521172670493245ebe6ba862","impliedFormat":1},{"version":"5f8ac2d280a08066f181594ee9e605d25c6b52b0dee5494c13a34f4e422911dc","signature":"091b2b296664f5d55f112423767da4b8a2ab715c2b74146f179f9d6da9c81c82","impliedFormat":1},{"version":"a084d2e55a213bea2923f51f1e8082a9d9ce24191986a9a36738fdf541c773ff","impliedFormat":1},{"version":"38d85ebae37e4412ad64866a34e9bee857be9d799b77d6e06df7b98670a87207","impliedFormat":1},{"version":"2e6c6a7c3fd4cca6143e0136b13667ccb7230056808605dbcb97f2df4cd9f0d6","impliedFormat":1},{"version":"77cb94aba09fbafadd9e9e8f70eb1429511f00f192325b890b84ade36954c4a4","impliedFormat":1},{"version":"39106c32bb7022a3261eed5f11049e39fd3242c7a4031f65c1434022049bd088","signature":"aadb9fa8e862437dd8b8d7d2ebbbe8eaa7e37235df627670eb05479118c9caf5","impliedFormat":1},{"version":"bef95fb8a8f883052a530a6ccd2b4aa204c5876a87c325e0a76f0e40fb9b0e58","signature":"6af66ae2b9251455f307ea3541276073163c20f6e229cfefc544c5514aebd60d","impliedFormat":1},{"version":"ab8a3c5e68a2a1172caf06aee8f800d2879acc3daa5f2dc49909f06169718c4a","signature":"15f0e5c21bc05aecf49c1bfb18e1833111bc1a465a59c05333dc12583ff14578","impliedFormat":1},{"version":"c4e3e811a45154400d95a8e1a973ce595acdcb375089423608cde7bcc2393234","signature":"2ccfae5c16a1a05d84e2977df6e102fcf192b95f8f3aad77f3d96c8ed6857e3a","impliedFormat":1},{"version":"ce5fb4e56737f1de89a457c4e653b526d5e682355c1298cc10369423c172ebde","signature":"994052dd0e33343c058857a47d3c6d13aa6899d828106c751e737856ebd0ee4a","impliedFormat":1},{"version":"438257a2c9bbc158fec27c97fdadcf4fd065f939a5907165ca63cc37f8c4cc44","impliedFormat":1},{"version":"eef204f061321360559bd19235ea32a9d55b3ec22a362cc78d14ef50d4db4490","affectsGlobalScope":true,"impliedFormat":1},{"version":"27bf1e8fc11bdffdeadf1ed6693cad23ec1b50a08f004601247db6f476891a85","impliedFormat":1},{"version":"bae8d023ef6b23df7da26f51cea44321f95817c190342a36882e93b80d07a960","impliedFormat":1},{"version":"26a770cec4bd2e7dbba95c6e536390fffe83c6268b78974a93727903b515c4e7","impliedFormat":1},{"version":"035a5df183489c2e22f3cf59fc1ed2b043d27f357eecc0eb8d8e840059d44245","impliedFormat":1},{"version":"0d14fa22c41fdc7277e6f71473b20ebc07f40f00e38875142335d5b63cdfc9d2","impliedFormat":1},{"version":"a4809f4d92317535e6b22b01019437030077a76fec1d93b9881c9ed4738fcc54","impliedFormat":1},{"version":"5f53fa0bd22096d2a78533f94e02c899143b8f0f9891a46965294ee8b91a9434","impliedFormat":1},{"version":"c085e9aa62d1ae1375794c1fb927a445fa105fed891a7e24edbb1c3300f7384a","impliedFormat":1},{"version":"f315e1e65a1f80992f0509e84e4ae2df15ecd9ef73df975f7c98813b71e4c8da","impliedFormat":1},{"version":"e00243d23c495ca2170c9b9e20b5c92331239100b51efdc2b4401cdad859bbef","impliedFormat":1},{"version":"cdcc132f207d097d7d3aa75615ab9a2e71d6a478162dde8b67f88ea19f3e54de","impliedFormat":1},{"version":"5b9586e9b0b6322e5bfbd2c29bd3b8e21ab9d871f82346cb71020e3d84bae73e","impliedFormat":1},{"version":"3e70a7e67c2cb16f8cd49097360c0309fe9d1e3210ff9222e9dac1f8df9d4fb6","impliedFormat":1},{"version":"ab68d2a3e3e8767c3fba8f80de099a1cfc18c0de79e42cb02ae66e22dfe14a66","impliedFormat":1},{"version":"d96cc6598148bf1a98fb2e8dcf01c63a4b3558bdaec6ef35e087fd0562eb40ec","impliedFormat":1},{"version":"ac5f598a09eed39b957ae3d909b88126f3faf605bd4589c19e9ae85d23ef71e3","impliedFormat":1},{"version":"29f72ec1289ae3aeda78bf14b38086d3d803262ac13904b400422941a26a3636","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab82804a14454734010dcdcd43f564ff7b0389bee4c5692eec76ff5b30d4cf66","impliedFormat":1},{"version":"6fa5d56af71f07dc276aae3f6f30807a9cccf758517fb39742af72e963553d80","impliedFormat":1},{"version":"253b95673c4e01189af13e855c76a7f7c24197f4179954521bf2a50db5cfe643","impliedFormat":1},{"version":"afe73051ff6a03a9565cbd8ebb0e956ee3df5e913ad5c1ded64218aabfa3dcb5","impliedFormat":1},{"version":"31f24e33f22172ba0cc8cdc640779fb14c3480e10b517ad1b4564e83fa262a2b","impliedFormat":1},{"version":"0fd641a3b3e3ec89058051a284135a3f30b94a325fb809c4e4159ec5495b5cdc","impliedFormat":1},{"version":"7b20065444d0353a2bc63145481e519e02d9113a098a2db079da21cb60590ef0","impliedFormat":1},{"version":"a85c0cc21ceba6efb2676a89a53ec0661e53f5ac4ae27a754536e203e0180af5","impliedFormat":1},{"version":"c2d085b981ebe5d70fc7e63cb3d612067c1a3b34b29e4e25f0fc7139d355b116","impliedFormat":1},{"version":"26d39c57a451087f27e40238c0e7786f94b5ea5adaa149cfc48dc1515730b51e","affectsGlobalScope":true,"impliedFormat":1},{"version":"94323c0a30f5d387d0c2451300966450ce5d37b1658530a14ccfac7d56a1d7a9","impliedFormat":1},{"version":"1d23257136778ab9697d651e31c8c68c6b92bc82c84317e9a99f6f4e1611920f","signature":"2580ecc85ad919be7e5cda10a9cb9f403a013b21dbae0730ef58c39440e69897","impliedFormat":1},{"version":"08273bb6ab2f8cee7ef55ec9753e2a35834f06f6115b737d5a1bbc1d32f1b43c","signature":"2f5d58c42cf374422fbc46b681e88df3ae264a1ef571d496149e2144381b796e","impliedFormat":1},{"version":"7609f3404093b235d5eecdf98ad9ce8320ad8e4fcfa5bbf0efe1f81354797ec5","impliedFormat":1},{"version":"5cf1472b98dafc58490649d74ead93d116b46be5e59f3b830c0db0c8e0196706","signature":"2f5d58c42cf374422fbc46b681e88df3ae264a1ef571d496149e2144381b796e","impliedFormat":1},{"version":"cfd0267ca4fe43780b63cc46f8fdb35345919c0a303a5a55a6aadf097144144c","signature":"2f5d58c42cf374422fbc46b681e88df3ae264a1ef571d496149e2144381b796e","impliedFormat":1},{"version":"13e296e75fe31daea5e34b216bb3905837452ec7740e25230eb34b3bd0025051","impliedFormat":1},{"version":"3852a00f3e811f2bebd6010c8fe62ffd61d0f27d9b75a2c363a265de44e4290c","signature":"2f5d58c42cf374422fbc46b681e88df3ae264a1ef571d496149e2144381b796e","impliedFormat":1},{"version":"4185ef95d27057caf4bee8b1c9005dfbe39d8b0492596cfa63c1617f67254d50","signature":"2f5d58c42cf374422fbc46b681e88df3ae264a1ef571d496149e2144381b796e","impliedFormat":1},{"version":"85da3cb3e0763b4f3780739fbb9910985ec89c81867c8023d4d6ae80b17ff687","impliedFormat":1},{"version":"62b573c5eb2ead8f5dc267e3d073aca4489b464922d4cbbe7b549db4ae6c73ec","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","impliedFormat":1},{"version":"b563b8c8d3f6920e489cdc06cfd77b0bfc047c0c95af5133d5d88deb297e1d36","impliedFormat":1},{"version":"e4b3e32d9a4dad4fe9b84c69cfba0cf387655102548960d53ae9b096d868c8ff","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","impliedFormat":1},{"version":"7e1c42e5f887d3a450e7b921a08b1752e29ced94233f9953dcc935ce052efa1e","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","impliedFormat":1},{"version":"1a11daedcbb27bd6c3f1f45a1bff0e23f22cbdd76257c68ae56f38a08ed43149","impliedFormat":1},{"version":"26242bd67e13654491a9b42c9b33a664db968334dbd6a411487709c04f4afa76","signature":"2f5d58c42cf374422fbc46b681e88df3ae264a1ef571d496149e2144381b796e","impliedFormat":1},{"version":"58924bb4b371e98b365ea4e3adac24d131b9a2c370e3da8dc10ebf6d0929b696","impliedFormat":1},{"version":"97b1504588b445418ab0baea475636971c35ef57ff3a7534e90dc9b290e8536b","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","impliedFormat":1},{"version":"e03cd9e692576524cd6e3783f82987fd99251039bf35388a80d3ecc5515ab660","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","impliedFormat":1},{"version":"e2222a63ed77f5987919d96934803ff6c6e6783a5b30cac5f7ee232bf1b42e42","signature":"2f5d58c42cf374422fbc46b681e88df3ae264a1ef571d496149e2144381b796e","impliedFormat":1},{"version":"cab25963245a0f2c435c2e85d345ff36a7494e3eb9bb61e9b6c2c299fa06fb38","impliedFormat":1},{"version":"54ddeea26803be1cba47b9e46484b7474f00a26f33e325b06f4809e65d27ba18","impliedFormat":1},{"version":"3e897b4587ebc003b246764254ede69721b6b5957ed816bf0fd048169f232ff4","affectsGlobalScope":true,"impliedFormat":1},{"version":"117816592ad26d78651f5e8322ea571fd8d413d8d3b7d79944d27468e2636989","impliedFormat":1},{"version":"4841ce19e6b12792e1ed58f92b80bb8ff2cd091589e02241354697199f2ece7a","impliedFormat":1},{"version":"d53680fc777b669b1b825916ac91db019b1ffda3b10b8e3f75d938db1f86d1c6","impliedFormat":1},{"version":"8947d5058fdd11acd8222809bbcd5f10e7894825632ebdccf7847de86c3b3698","impliedFormat":1},{"version":"3ff8d0215efd46a590dd6659e2872d3e77db4d2ac929176897f777cc058b0da1","impliedFormat":1},{"version":"33e8fef0313198707cbb6b6230cbe25f517274b57b17b7a57d20c797ab477b6a","impliedFormat":1},{"version":"900db5e483501a46262a0611de3985f6ff8a2885b6906d52d8b22d51f711b10f","impliedFormat":1},{"version":"e9706d49d3ebc158c09fec91641c7315f4c7f10cb47f14c7f148158a3c0026fd","impliedFormat":1},{"version":"d3328e52896da6262527ff6995c06818e51b2ef098b40aab651cdc6917171af6","impliedFormat":1},{"version":"02a444677cfb588937ad736bec0b849230318a6836d637796925dfa62566316c","impliedFormat":1},{"version":"6abbb08edb3b713b9c452ef035c5e2d688af88ffeba30e871caf0ad6c90e9c11","impliedFormat":1},{"version":"ca1dc421c0354f91760f8d33058c373a89e3af91be1ccc41392877ddb5e27f4a","impliedFormat":1},{"version":"b1ff9d16f15d1dd9aee18b968f4202284a259e381e4ca91ec0569e3d1e1a1994","impliedFormat":1},{"version":"085cc49551fcee796ac0af079edcdd6bc949c6e3b1fe3a6166dfc5f87f09d767","impliedFormat":1},{"version":"3b11690933c38e03db56cb7cc44c5635daddf614fdb2345d978d3c291a81939e","impliedFormat":1},{"version":"ac92dc258be07ad6df1042e30af4fea0e4d472bc5fd04c327901e0f46840b0ff","impliedFormat":1},{"version":"4f6ef174b7b21377d4b28fcd51cd851a6404bccc4d708989ddfcbc0db50aa3fd","impliedFormat":1},{"version":"c26d87fface45a3f3be65bd20ef8d868aa94ca45c4afa04ff413bff23ebd91d7","impliedFormat":1},{"version":"4f17e141a1787ad01e296a79af34dac6e5d06d13fda536f61d0cc2ff5ec45c69","impliedFormat":1},{"version":"69a31c70fc512bb2869473bf68ffae4f60dbc871228bb616d56b0a86da49da62","impliedFormat":1},{"version":"4d1ee2e4d4bf2af194011f4fda677576a8d74401068fb8606cae79376ccfcee4","impliedFormat":1},{"version":"aa58ee9f756e035fb4e8458f4c63ec7ed300c4fdbcafb302cd07a9d57c2a37e8","impliedFormat":1},{"version":"15c86795cd22b205e679bfb5c42ed2383f98268f9dff67a44c4f8f04e8ab2e0d","impliedFormat":1},{"version":"790c9f52fc4cb04847d1024972cc7a09404351b13faea4f1b906188c0aa3cb94","impliedFormat":1},{"version":"aadcf59329c6f0f8978cfa1810dab147e0b67f241a39c965c4904459fcc98c27","impliedFormat":1}],"root":[[160,172],[175,195],[203,209],434,435,437,[950,956],[970,996],[998,1010],1013,1014,[1551,1567],[1574,1590],[1613,1636],[1670,1689],[1692,1701],[1703,1711],[1714,1725],1727,[1754,1769],[1771,1773]],"options":{"allowSyntheticDefaultImports":true,"esModuleInterop":true,"module":100,"skipDefaultLibCheck":true,"skipLibCheck":true,"sourceMap":true,"strict":true,"target":7},"referencedMap":[[1635,1],[160,2],[1709,1],[169,3],[1710,4],[188,5],[1711,6],[179,1],[172,1],[1589,1],[1590,7],[1718,1],[1719,8],[1553,9],[1715,10],[1013,1],[168,11],[170,12],[1716,1],[1554,1],[189,13],[171,14],[162,6],[184,15],[185,15],[186,16],[187,15],[183,17],[178,1],[176,18],[180,19],[981,2],[1724,20],[1722,21],[1723,22],[1720,23],[1721,24],[1005,4],[1583,25],[1617,4],[175,26],[1714,27],[1717,28],[193,29],[190,1],[167,30],[191,31],[161,1],[192,32],[1725,1],[165,33],[194,34],[164,1],[166,1],[163,1],[182,35],[206,36],[203,1],[204,37],[205,38],[177,1],[1569,39],[1568,1],[1528,40],[1527,41],[1524,42],[1422,43],[1425,44],[1426,44],[1427,44],[1428,44],[1429,44],[1430,44],[1431,44],[1432,44],[1433,44],[1434,44],[1435,44],[1436,44],[1437,44],[1438,44],[1439,44],[1440,44],[1441,44],[1442,44],[1443,44],[1444,44],[1445,44],[1446,44],[1448,44],[1447,44],[1449,44],[1450,44],[1451,44],[1452,44],[1453,44],[1454,44],[1455,44],[1456,44],[1457,44],[1458,44],[1459,44],[1460,44],[1461,44],[1462,44],[1463,44],[1464,44],[1465,44],[1466,44],[1467,44],[1468,44],[1469,44],[1470,44],[1471,44],[1472,44],[1473,44],[1474,44],[1475,44],[1476,44],[1477,44],[1478,44],[1479,44],[1480,44],[1481,44],[1482,44],[1483,44],[1484,44],[1485,44],[1486,44],[1487,44],[1488,44],[1491,44],[1489,44],[1490,44],[1492,44],[1493,44],[1494,44],[1495,44],[1497,45],[1498,45],[1499,45],[1500,45],[1501,45],[1502,45],[1503,45],[1504,45],[1505,45],[1506,45],[1507,45],[1508,45],[1509,45],[1510,45],[1511,45],[1512,45],[1513,45],[1514,45],[1515,45],[1516,45],[1517,45],[1518,45],[1519,45],[1520,45],[1521,45],[1522,45],[1523,45],[1529,46],[1421,47],[1525,48],[1545,49],[1423,50],[1544,51],[1424,52],[1496,53],[1530,54],[1531,55],[1532,56],[1533,57],[1534,58],[1535,59],[1526,60],[1543,61],[1539,62],[1540,62],[1541,63],[1542,63],[1420,64],[1404,1],[1407,65],[1405,66],[1406,66],[1410,67],[1409,68],[1411,69],[1413,70],[1408,71],[1412,72],[1414,73],[1415,1],[1419,74],[1416,1],[1417,47],[1418,47],[1094,75],[1095,75],[1097,76],[1093,1],[1096,47],[1099,77],[1098,77],[1100,77],[1101,78],[1103,79],[1102,76],[1104,47],[1105,47],[1184,80],[1107,81],[1106,47],[1108,47],[1151,82],[1150,83],[1153,84],[1166,72],[1167,69],[1179,85],[1168,86],[1180,87],[1149,66],[1152,88],[1181,89],[1182,47],[1183,90],[1185,47],[1187,91],[1186,92],[1109,47],[1110,47],[1111,47],[1112,47],[1113,47],[1114,47],[1115,47],[1124,93],[1125,47],[1126,1],[1127,47],[1128,47],[1129,47],[1130,47],[1118,1],[1131,1],[1132,47],[1117,94],[1119,95],[1116,47],[1120,94],[1121,47],[1122,96],[1148,97],[1133,47],[1134,95],[1135,47],[1136,47],[1137,1],[1138,47],[1139,47],[1140,47],[1141,47],[1142,47],[1143,47],[1144,98],[1145,47],[1146,47],[1123,47],[1147,47],[1572,99],[1570,1],[1571,100],[1573,1],[1746,101],[1737,1],[1735,102],[1750,103],[1736,104],[801,105],[802,1],[803,105],[804,1],[805,106],[806,107],[807,105],[808,105],[809,1],[810,1],[811,1],[812,1],[813,1],[814,1],[815,1],[816,107],[817,105],[818,105],[819,1],[820,105],[821,105],[822,1],[828,108],[823,108],[824,107],[825,1],[826,1],[827,109],[852,110],[829,107],[843,111],[830,111],[831,111],[832,111],[833,107],[834,111],[835,111],[836,111],[837,111],[838,107],[839,107],[840,107],[841,111],[842,112],[844,107],[845,107],[846,1],[847,1],[849,1],[848,1],[850,107],[851,1],[853,113],[800,114],[790,115],[787,116],[795,117],[793,118],[789,119],[788,120],[797,121],[796,122],[799,123],[798,124],[438,1],[441,107],[442,107],[443,107],[444,107],[445,107],[446,107],[447,107],[449,107],[448,107],[450,107],[451,107],[452,107],[453,107],[565,107],[454,107],[455,107],[456,107],[457,107],[566,107],[567,1],[568,125],[569,107],[570,106],[571,106],[573,126],[574,107],[575,127],[576,107],[578,128],[579,106],[580,129],[458,119],[459,107],[460,107],[461,1],[463,1],[462,107],[464,130],[465,119],[466,119],[467,119],[468,107],[469,119],[470,107],[471,119],[472,107],[474,106],[475,1],[476,1],[477,1],[478,107],[479,106],[480,1],[481,1],[482,1],[483,1],[484,1],[485,1],[486,1],[487,1],[488,1],[489,131],[490,1],[491,132],[492,1],[493,1],[494,1],[495,1],[496,1],[497,107],[503,106],[498,107],[499,107],[500,107],[501,106],[502,107],[504,105],[505,1],[506,1],[507,107],[581,106],[508,1],[582,107],[583,107],[584,107],[509,107],[585,107],[510,107],[587,105],[588,105],[589,105],[586,105],[590,107],[591,106],[592,106],[593,107],[511,1],[595,105],[594,105],[512,1],[513,133],[514,107],[515,107],[516,107],[517,107],[519,106],[518,106],[520,107],[521,107],[522,107],[596,106],[597,106],[598,107],[599,107],[602,106],[606,106],[608,134],[604,106],[605,135],[607,134],[609,136],[600,106],[601,137],[603,136],[610,106],[612,138],[611,138],[613,107],[614,106],[615,107],[616,107],[617,107],[618,107],[619,107],[523,139],[620,106],[621,107],[622,140],[623,107],[624,107],[625,106],[626,107],[627,107],[628,107],[629,107],[630,107],[631,107],[632,140],[633,140],[634,107],[635,107],[636,107],[637,141],[638,142],[639,106],[640,143],[641,107],[642,106],[643,107],[644,107],[645,107],[646,107],[647,107],[648,107],[524,1],[525,107],[526,1],[527,1],[528,107],[529,1],[530,107],[649,119],[651,144],[650,144],[652,145],[653,107],[654,107],[655,107],[656,106],[572,106],[531,107],[658,107],[657,107],[659,107],[660,146],[661,107],[662,107],[663,107],[664,107],[665,107],[666,107],[532,1],[533,1],[534,1],[535,1],[536,1],[667,107],[668,139],[537,1],[538,1],[539,1],[540,105],[669,107],[670,147],[671,107],[672,107],[673,107],[674,107],[675,106],[676,106],[677,106],[678,107],[679,106],[680,107],[681,107],[541,107],[682,107],[683,107],[684,107],[542,1],[543,1],[544,107],[545,107],[546,107],[547,107],[548,1],[549,1],[685,107],[686,106],[550,1],[551,1],[687,107],[552,1],[689,107],[690,107],[688,107],[691,107],[692,107],[693,107],[553,107],[554,106],[694,1],[555,1],[556,106],[557,1],[558,1],[559,1],[695,107],[696,107],[700,107],[701,106],[702,107],[703,106],[704,107],[560,1],[697,107],[698,107],[699,107],[705,106],[706,107],[707,106],[708,106],[711,106],[709,106],[710,106],[712,107],[713,107],[714,107],[715,148],[716,107],[717,106],[718,107],[719,107],[720,107],[561,1],[562,1],[721,107],[722,107],[723,107],[724,107],[563,1],[564,1],[725,107],[726,107],[727,107],[728,106],[729,149],[730,106],[731,150],[732,107],[733,107],[734,106],[735,107],[736,106],[737,107],[738,107],[739,107],[740,106],[741,107],[743,107],[742,107],[744,106],[745,106],[746,106],[747,106],[748,107],[749,107],[750,106],[751,107],[752,107],[753,107],[755,107],[754,151],[756,106],[757,107],[759,107],[760,107],[758,152],[761,107],[577,106],[762,106],[763,106],[764,153],[765,106],[766,154],[767,107],[768,155],[769,156],[770,107],[772,107],[773,107],[774,157],[775,107],[771,158],[776,107],[777,107],[778,107],[779,107],[780,107],[781,107],[782,106],[783,106],[784,107],[786,107],[785,159],[473,107],[440,160],[791,107],[439,107],[792,161],[854,1],[855,1],[856,1],[857,1],[858,1],[859,1],[860,162],[861,163],[862,1],[863,164],[864,165],[865,166],[866,167],[867,167],[868,167],[869,1],[870,167],[871,1],[872,1],[873,1],[874,1],[875,168],[876,167],[877,167],[878,168],[879,167],[880,167],[881,1],[882,1],[883,1],[884,167],[885,1],[886,1],[887,1],[888,169],[889,167],[892,170],[893,171],[894,1],[895,1],[896,1],[891,172],[897,1],[898,1],[899,172],[900,107],[901,173],[902,107],[903,107],[904,1],[905,1],[906,172],[907,1],[908,107],[911,174],[910,175],[909,170],[912,176],[913,1],[914,1],[915,105],[916,1],[917,177],[918,177],[919,178],[920,1],[921,1],[922,107],[923,1],[890,1],[924,179],[925,180],[926,181],[927,182],[928,182],[929,181],[930,183],[931,183],[932,1],[933,183],[934,183],[935,181],[936,184],[937,181],[938,183],[939,185],[943,183],[944,183],[945,183],[946,183],[940,183],[941,183],[942,183],[947,186],[948,181],[1734,1],[1330,187],[1327,188],[1304,1],[1305,189],[1293,189],[1322,189],[1308,189],[1309,189],[1310,1],[1311,190],[1312,1],[1313,1],[1314,1],[1315,189],[1316,189],[1318,191],[1317,189],[1319,1],[1320,1],[1321,1],[1323,1],[1324,189],[1325,1],[1326,1],[1307,192],[1306,189],[1282,193],[1283,193],[1285,194],[1284,189],[1286,193],[1287,189],[1289,195],[1288,1],[1290,196],[1291,196],[1292,197],[1328,198],[1329,199],[1281,200],[1278,189],[1279,201],[1280,189],[1259,202],[1258,189],[1260,202],[1261,189],[1262,189],[1263,189],[1271,1],[1275,1],[1267,1],[1268,1],[1269,1],[1270,1],[1272,203],[1273,189],[1274,204],[1277,1],[1276,189],[1265,205],[1266,205],[1264,1],[1294,189],[1295,189],[1296,189],[1303,206],[1297,1],[1298,1],[1299,189],[1300,189],[1301,189],[1302,189],[1371,207],[1372,1],[1375,208],[1373,85],[1374,1],[1331,47],[1332,209],[1335,210],[1337,211],[1336,47],[1338,210],[1339,210],[1340,212],[1333,47],[1334,1],[1351,213],[1350,214],[1352,71],[1353,1],[1357,215],[1354,47],[1355,47],[1356,216],[1349,47],[1091,217],[1079,47],[1089,218],[1090,47],[1092,219],[1174,47],[1175,220],[1172,221],[1173,222],[1171,223],[1169,47],[1170,47],[1178,224],[1176,1],[1177,47],[1080,1],[1081,1],[1082,1],[1083,1],[1088,225],[1084,47],[1085,47],[1086,226],[1087,47],[1155,227],[1154,47],[1156,1],[1162,47],[1157,47],[1158,47],[1159,47],[1163,47],[1165,228],[1160,47],[1161,47],[1164,47],[1394,47],[1358,47],[1376,229],[1377,230],[1378,1],[1379,231],[1380,1],[1381,1],[1382,1],[1383,1],[1384,47],[1385,229],[1386,47],[1388,232],[1389,233],[1387,47],[1390,1],[1391,1],[1403,234],[1392,1],[1393,1],[1395,1],[1396,1],[1397,1],[1398,229],[1399,1],[1400,1],[1401,1],[1402,1],[1188,235],[1189,236],[1191,1],[1204,237],[1205,238],[1202,239],[1203,240],[1190,1],[1206,241],[1209,242],[1211,243],[1212,244],[1194,245],[1213,1],[1217,246],[1215,247],[1216,1],[1210,1],[1219,248],[1195,249],[1221,250],[1222,251],[1224,252],[1223,253],[1225,254],[1220,255],[1218,256],[1226,257],[1227,258],[1231,259],[1232,260],[1230,261],[1208,262],[1196,1],[1199,263],[1233,264],[1234,265],[1235,265],[1192,1],[1237,266],[1236,265],[1257,267],[1197,1],[1201,268],[1238,269],[1239,1],[1193,1],[1229,270],[1245,271],[1244,272],[1241,1],[1242,273],[1243,1],[1240,274],[1228,275],[1246,276],[1247,277],[1248,242],[1249,242],[1250,278],[1214,1],[1252,279],[1253,280],[1207,1],[1254,1],[1255,281],[1251,1],[1198,282],[1200,256],[1256,235],[1015,283],[1016,284],[1018,1],[1031,285],[1032,286],[1029,287],[1030,288],[1017,1],[1033,289],[1036,290],[1038,291],[1039,292],[1021,293],[1040,1],[1044,294],[1042,295],[1043,1],[1037,1],[1046,296],[1022,297],[1048,298],[1049,299],[1051,300],[1050,301],[1052,302],[1047,303],[1045,304],[1053,305],[1054,306],[1058,307],[1059,308],[1057,309],[1035,310],[1023,1],[1026,311],[1060,312],[1061,313],[1062,313],[1019,1],[1064,314],[1063,313],[1078,315],[1024,1],[1028,316],[1065,317],[1066,1],[1020,1],[1056,318],[1067,319],[1055,320],[1068,321],[1069,322],[1070,290],[1071,290],[1072,323],[1041,1],[1074,324],[1075,325],[1034,1],[1076,326],[1073,1],[1025,327],[1027,304],[1077,283],[1342,328],[1344,329],[1345,330],[1343,47],[1346,1],[1347,1],[1348,331],[1341,1],[1359,1],[1361,47],[1360,332],[1362,333],[1363,334],[1364,332],[1365,332],[1366,335],[1370,336],[1367,337],[1368,338],[1369,1],[1537,339],[1538,340],[1536,47],[1012,341],[1011,1],[199,1],[153,342],[1726,1],[196,1],[152,343],[144,343],[1691,1],[1775,344],[1774,1],[149,345],[154,346],[1776,1],[1747,347],[150,1],[1730,1],[1732,348],[1733,349],[1777,1],[198,350],[145,1],[1743,1],[197,1],[155,351],[997,352],[92,353],[93,353],[94,354],[57,355],[95,356],[96,357],[97,358],[52,1],[55,359],[53,1],[54,1],[98,360],[99,361],[100,362],[101,363],[102,364],[103,365],[104,365],[106,28],[105,366],[107,367],[108,368],[109,369],[91,370],[56,1],[110,371],[111,372],[112,373],[143,374],[113,375],[114,376],[115,377],[116,378],[117,379],[118,380],[119,381],[120,382],[121,383],[122,384],[123,384],[124,385],[125,386],[127,387],[126,388],[128,389],[129,390],[130,335],[131,391],[132,392],[133,393],[134,394],[135,395],[136,396],[137,397],[138,398],[139,399],[140,400],[141,401],[142,402],[1690,343],[1798,403],[1778,1],[1790,404],[1794,405],[1789,406],[1791,407],[1792,408],[1793,409],[1797,410],[1796,411],[1795,1],[1788,412],[1787,413],[1786,414],[1779,1],[1785,415],[1781,416],[1782,416],[1783,416],[1780,1],[1784,416],[147,1],[148,1],[146,417],[151,418],[1799,1],[1801,419],[1800,420],[1744,1],[1702,1],[156,1],[436,421],[1728,1],[1729,422],[1610,423],[1609,424],[1604,425],[1608,426],[1607,427],[1605,428],[1612,429],[1611,1],[1602,430],[1601,1],[1606,430],[1599,1],[1600,431],[200,1],[58,1],[1731,1],[1749,432],[202,433],[968,434],[967,1],[969,435],[959,436],[958,436],[961,437],[964,436],[966,436],[963,438],[965,439],[962,439],[960,440],[957,1],[1741,441],[1637,442],[1639,443],[1640,444],[1638,445],[1662,1],[1663,446],[794,447],[1645,448],[1657,449],[1656,450],[1654,451],[1664,452],[1642,1],[1667,453],[1649,1],[1660,454],[1659,455],[1661,456],[1665,1],[1655,457],[1648,458],[1653,459],[1666,460],[1651,461],[1646,1],[1647,462],[1668,463],[1658,464],[1652,460],[1643,1],[1669,465],[1641,450],[1644,1],[1650,450],[1739,466],[1748,467],[1740,468],[1745,469],[1742,470],[1712,1],[1713,471],[1550,472],[1547,473],[1548,473],[1546,347],[1549,473],[1753,474],[1752,475],[1751,476],[201,477],[1595,478],[1596,479],[1597,1],[1598,480],[1594,481],[1593,482],[1591,482],[1592,483],[1603,424],[174,484],[157,343],[159,485],[1738,486],[949,487],[158,447],[173,1],[315,488],[219,489],[316,490],[220,491],[317,492],[221,493],[318,494],[222,495],[319,496],[223,497],[320,498],[321,499],[224,500],[322,501],[225,502],[323,503],[324,504],[226,505],[325,506],[326,507],[227,508],[327,509],[228,510],[328,511],[329,512],[330,513],[331,514],[229,515],[332,516],[230,517],[333,518],[334,519],[231,520],[335,521],[232,522],[336,523],[337,524],[233,525],[338,526],[339,527],[340,528],[341,529],[234,530],[342,531],[343,532],[235,533],[344,534],[236,535],[214,536],[217,537],[345,538],[237,539],[346,540],[238,541],[347,542],[348,543],[349,544],[239,545],[350,546],[240,547],[351,548],[352,549],[353,550],[241,551],[354,552],[242,553],[355,554],[356,555],[243,556],[357,557],[244,558],[358,559],[245,560],[359,561],[360,562],[246,563],[361,564],[247,565],[362,566],[248,567],[363,568],[249,569],[364,570],[250,571],[365,572],[251,573],[366,574],[252,575],[367,576],[368,577],[369,578],[253,579],[215,580],[370,581],[254,582],[371,583],[255,584],[372,585],[256,586],[373,587],[257,588],[374,589],[258,590],[375,591],[259,592],[376,593],[377,594],[260,595],[378,596],[379,597],[261,598],[380,599],[262,600],[381,601],[263,602],[382,603],[264,604],[383,605],[265,606],[384,607],[266,608],[385,609],[267,610],[386,611],[268,612],[387,613],[269,614],[388,615],[270,616],[389,617],[390,618],[271,619],[391,620],[272,621],[392,622],[273,623],[393,624],[274,625],[394,626],[275,627],[395,628],[396,629],[397,630],[276,631],[398,632],[277,633],[399,634],[278,635],[400,636],[279,637],[401,638],[402,639],[280,640],[403,641],[281,642],[404,643],[405,644],[282,645],[406,646],[283,647],[407,648],[408,649],[409,650],[284,651],[410,652],[285,653],[411,654],[286,655],[412,656],[287,657],[413,658],[288,659],[289,660],[290,661],[291,662],[292,663],[293,664],[294,665],[414,666],[295,667],[296,668],[297,669],[298,670],[299,671],[300,672],[415,673],[301,674],[416,675],[302,676],[417,677],[418,678],[303,679],[419,680],[304,681],[420,682],[305,683],[421,684],[422,685],[306,686],[423,687],[307,688],[424,689],[308,690],[425,691],[309,692],[426,693],[310,694],[427,695],[311,696],[428,697],[312,698],[429,699],[313,700],[218,701],[430,702],[431,703],[432,704],[314,705],[216,706],[211,707],[433,708],[210,709],[212,710],[213,711],[49,1],[50,1],[10,1],[8,1],[9,1],[14,1],[13,1],[2,1],[15,1],[16,1],[17,1],[18,1],[19,1],[20,1],[21,1],[22,1],[3,1],[23,1],[24,1],[4,1],[25,1],[29,1],[26,1],[27,1],[28,1],[30,1],[31,1],[32,1],[5,1],[33,1],[34,1],[35,1],[36,1],[6,1],[40,1],[37,1],[38,1],[39,1],[41,1],[7,1],[42,1],[51,1],[47,1],[48,1],[43,1],[44,1],[45,1],[46,1],[1,1],[12,1],[11,1],[74,712],[81,713],[73,712],[88,714],[65,715],[64,716],[87,131],[82,717],[85,718],[67,719],[66,720],[62,721],[61,131],[84,722],[63,723],[68,724],[69,1],[72,724],[59,1],[90,725],[89,724],[76,726],[77,727],[79,728],[75,729],[78,730],[83,131],[70,731],[71,732],[80,733],[60,335],[86,734],[1587,735],[1576,736],[1577,737],[1618,738],[1580,739],[1578,740],[1616,741],[1579,742],[1584,743],[1585,744],[1582,745],[1581,746],[999,747],[1575,748],[181,749],[1676,750],[1687,751],[1003,752],[1679,753],[1678,754],[1682,755],[1680,756],[1681,753],[996,757],[1692,758],[1633,759],[1629,760],[1006,761],[1004,762],[1007,763],[1008,764],[1009,765],[1566,766],[1631,767],[1630,768],[1567,769],[1586,770],[1619,771],[1620,769],[1628,772],[1634,773],[1688,774],[1556,775],[1694,776],[1685,777],[1689,778],[1632,779],[1693,780],[1696,781],[1677,779],[1555,782],[1684,783],[1588,784],[1683,785],[1551,786],[1670,787],[1673,788],[1675,789],[998,790],[1671,791],[1674,792],[1672,793],[1636,794],[1686,795],[195,796],[950,797],[953,798],[952,799],[955,800],[954,801],[437,802],[1697,803],[1698,804],[1699,805],[207,806],[982,807],[992,808],[434,809],[435,810],[208,811],[990,812],[995,813],[956,814],[987,815],[985,816],[984,809],[994,817],[1001,818],[983,819],[993,820],[988,821],[991,822],[986,823],[989,824],[1000,825],[209,826],[1700,782],[971,827],[977,828],[1705,829],[970,1],[976,830],[1706,1],[1707,1],[1708,1],[980,831],[1704,832],[978,833],[975,834],[974,1],[973,835],[979,836],[972,1],[1557,837],[1565,838],[1014,839],[1552,840],[1010,841],[1558,842],[1613,843],[1615,844],[1002,845],[1701,1],[1562,846],[1564,847],[1560,848],[1563,849],[951,850],[1561,851],[1559,1],[1695,852],[1703,853],[1614,854],[1574,855],[1626,856],[1622,857],[1627,858],[1625,859],[1623,860],[1621,861],[1624,862],[1727,863],[1756,864],[1757,865],[1754,866],[1758,867],[1759,868],[1760,869],[1761,870],[1762,871],[1763,872],[1764,873],[1765,874],[1766,875],[1767,876],[1768,877],[1769,878],[1771,879],[1772,880],[1773,881],[1755,882],[1770,1]],"affectedFilesPendingEmit":[160,169,1710,188,1711,179,1590,1553,1715,168,170,189,171,162,184,185,186,187,183,178,176,180,981,1724,1722,1723,1720,1721,1005,1583,1617,175,193,167,191,192,165,194,182,1587,1576,1577,1618,1580,1578,1616,1579,1584,1585,1582,1581,999,1575,181,1676,1687,1003,1679,1678,1682,1680,1681,996,1692,1633,1629,1006,1004,1007,1008,1009,1566,1631,1630,1567,1586,1619,1620,1628,1634,1688,1556,1694,1685,1689,1632,1693,1696,1677,1684,1588,1683,1551,1670,1673,1675,998,1671,1674,1672,1636,1686,195,950,953,952,955,954,1697,207,982,992,434,435,208,990,995,956,987,985,984,994,1001,983,993,988,991,986,989,1000,209,977,1705,976,980,1704,978,979,1557,1565,1014,1552,1010,1558,1613,1615,1002,1562,1564,1563,951,1703,1614,1574,1626,1622,1627,1625,1623,1621,1624,1756,1757,1758,1759,1760,1761,1762,1764,1766,1767,1769,1771,1772,1773,1755],"version":"5.8.3"} \ No newline at end of file diff --git a/srv/adapter/agnaistic.ts b/srv/adapter/agnaistic.ts deleted file mode 100644 index cca1d3cb..00000000 --- a/srv/adapter/agnaistic.ts +++ /dev/null @@ -1,419 +0,0 @@ -import { sendOne } from '../api/ws' -import { config } from '../config' -import { store } from '../db' -import { isConnected } from '../db/client' -import { getCachedSubscriptions } from '../db/subscriptions' -import { decryptText } from '../db/util' -import { handleClaude } from './claude' -import { handleGooseAI } from './goose' -import { handleHorde } from './horde' -import { handleThirdParty } from './kobold' -import { handleMancer } from './mancer' -import { handleNovel } from './novel' -import { handleOAI } from './openai' -import { handleOpenRouter } from './openrouter' -import { getThirdPartyPayload } from './payloads' -import { handlePetals } from './petals' -import { registerAdapter } from './register' -import { handleReplicate } from './replicate' -import { handleScale } from './scale' -import { websocketStream } from './stream' -import { ModelAdapter } from './type' -import { AIAdapter, AdapterSetting } from '/common/adapters' -import { AppSchema } from '/common/types' -import { parseStops } from '/common/util' -import { getTextgenCompletion } from './dispatch' -import { handleVenus } from './venus' -import { sanitise, sanitiseAndTrim, trimResponseV2 } from '/common/requests/util' -import { obtainLock, releaseLock } from '../api/chat/lock' -import { getServerConfiguration } from '../db/admin' - -export async function getSubscriptionPreset( - user: AppSchema.User, - guest: boolean, - gen?: Partial -) { - if (!isConnected()) return - if (!gen) return - if (gen.service !== 'agnaistic') return - - const tier = store.users.getUserSubTier(user) - const level = user.admin ? 999999 : tier?.level ?? -1 - let error: string | undefined = undefined - let warning: string | undefined = undefined - - const fallback = await store.subs.getDefaultSubscription() - const subId = gen.registered?.agnaistic?.subscriptionId - let preset = subId ? await store.subs.getSubscription(subId) : fallback - - if (guest && preset?.allowGuestUsage === false) { - error = 'Please sign in to use this model.' - } - - if (preset?.stopSequences) { - preset.stopSequences = parseStops(preset.stopSequences) - } - - if (!preset || preset.subDisabled) { - // If the subscription they're using becomes unavailable, gracefully fallback to the default and let them know - if (fallback && !fallback.subDisabled && fallback.subLevel <= level) { - preset = fallback - warning = - 'Your configured Agnaistic model is no longer available. Using a fallback. Please update your preset.' - } else { - error = 'Model selected is invalid or disabled. Try another.' - } - } - - return { level, preset, error, warning, tier: tier?.tier } -} - -export const handleAgnaistic: ModelAdapter = async function* (opts) { - const { char, members, prompt, log, gen } = opts - - if ('subscription' in opts === false) { - opts.subscription = await getSubscriptionPreset(opts.user, !!opts.guest, opts.gen) - } - - if (!opts.subscription || !opts.subscription.preset) { - yield { error: 'Subscriptions are not enabled' } - return - } - - if (opts.subscription.error) { - yield { error: opts.subscription.error } - return - } - - if (opts.subscription.warning) { - yield { warning: opts.subscription.warning } - } - - const level = opts.user.admin ? 99999 : opts.subscription.level ?? -1 - const subPreset = opts.subscription.preset - - let newLevel = await store.users.validateSubscription(opts.user) - if (newLevel === undefined) { - newLevel = -1 - } - - if (newLevel instanceof Error) { - yield { error: newLevel.message } - return - } - - if (subPreset.subLevel > -1 && subPreset.subLevel > newLevel) { - opts.log.error( - { - preset: subPreset.name, - presetLevel: subPreset.subLevel, - newLevel, - nativeLevel: opts.user.sub?.level, - patronLevel: opts.user.patreon?.sub?.level, - }, - `Subscription insufficient` - ) - yield { error: 'Your account is ineligible for this model - Subscription tier insufficient' } - return - } - - if (!subPreset.allowGuestUsage && opts.guest) { - yield { error: 'Please sign in to use this model' } - return - } - - const srv = await getServerConfiguration() - - /** - * Lock per user per model - */ - const lockId = `${opts.user._id}-${opts.subscription.preset.name}` - if (!opts.guidance && +srv.lockSeconds > 0) { - await obtainLock(lockId, srv.lockSeconds) - } - - const useRecommended = !!opts.gen.registered?.agnaistic?.useRecommended - if (useRecommended) { - const { - memoryChatEmbedLimit, - memoryContextLimit, - memoryDepth, - memoryReverseWeight, - memoryUserEmbedLimit, - ultimeJailbreak, - systemPrompt, - stopSequences, - maxTokens, - gaslight, - allowGuestUsage, - imageSettings, - temporary, - useAdvancedPrompt, - _id, - kind, - name, - ...recommended - } = subPreset - Object.assign(opts.gen, recommended) - } - - // Max tokens and max context limit are decided by the subscription preset - // We've already set the max context length prior to calling this handler - opts.gen.maxTokens = Math.min(subPreset.maxTokens, opts.gen.maxTokens || 80) - opts.gen.thirdPartyUrl = subPreset.thirdPartyUrl - opts.gen.thirdPartyFormat = subPreset.thirdPartyFormat - - const stops = - Array.isArray(subPreset.stopSequences) && opts.kind !== 'plain' - ? new Set(subPreset.stopSequences) - : new Set() - - if (Array.isArray(opts.gen.stopSequences) && opts.gen.stopSequences.length) { - for (const stop of opts.gen.stopSequences) { - stops.add(stop) - } - } - - const allStops = Array.from(stops.values()) - - const key = - (subPreset.subApiKey ? decryptText(subPreset.subApiKey) : config.auth.inferenceKey) || '' - if (subPreset.service && subPreset.service !== 'agnaistic') { - let handler = handlers[subPreset.service] - - const userKey = subPreset.subApiKey - - opts.user.oaiKey = userKey - opts.gen.thirdPartyModel = subPreset.thirdPartyModel - opts.gen.oaiModel = subPreset.thirdPartyModel || subPreset.oaiModel - - opts.user.claudeApiKey = userKey - opts.gen.claudeModel = subPreset.claudeModel - - opts.user.novelApiKey = userKey - opts.gen.novelModel = subPreset.novelModel - - opts.user.scaleApiKey = userKey - - opts.gen.replicateModelType = subPreset.replicateModelType - opts.gen.replicateModelVersion = subPreset.replicateModelVersion - // opts.user.hordeKey = userKey - - if (!opts.user.adapterConfig) { - opts.user.adapterConfig = {} - } - - if (subPreset.service === 'kobold' && subPreset.thirdPartyFormat === 'llamacpp') { - opts.gen.service = 'kobold' - handler = handleThirdParty - } - - if (subPreset.service === 'goose') { - opts.user.adapterConfig.goose = { - engine: subPreset.registered?.goose?.engine, - apiKey: userKey, - } - } - - if (subPreset.service === 'mancer') { - opts.user.adapterConfig.mancer = { - ...subPreset.registered?.mancer, - apiKey: userKey, - } - } - - if (subPreset.service === 'replicate') { - opts.user.adapterConfig.replicate = { - apiToken: userKey, - } - } - - if (subPreset.service === 'novel') { - opts.user.novelApiKey = userKey - } - - const stream = handler(opts) - for await (const value of stream) { - yield value - } - return - } - - const body = getThirdPartyPayload(opts, allStops) - - yield { prompt } - - log.debug({ ...body, prompt: null, imageData: null }, 'Agnaistic payload') - - log.debug(`Prompt:\n${prompt}`) - - const params = [ - `type=text`, - `key=${key}`, - `id=${opts.user._id}`, - `model=${subPreset.subModel}`, - `level=${level}`, - ].join('&') - - const resp = gen.streamResponse - ? await websocketStream({ - url: `${subPreset.subServiceUrl || subPreset.thirdPartyUrl}/api/v1/stream?${params}`, - body, - }) - : getTextgenCompletion( - 'Agnastic', - `${subPreset.subServiceUrl || subPreset.thirdPartyUrl}/api/v1/generate?${params}`, - body, - {} - ) - - let accumulated = '' - let result = '' - - while (true) { - let generated = await resp.next() - - // Both the streaming and non-streaming generators return a full completion and yield errors. - if (generated.done) { - break - } - - if (generated.value.meta) { - const meta = generated.value.meta - yield { meta } - if (meta.host && !opts.guest) { - sendOne(opts.user._id, { type: 'message-meta', host: meta.host }) - } - } - - if (generated.value.error) { - opts.log.error({ err: generated.value.error }, 'Agnaistic request failed') - yield generated.value - return - } - - // Only the streaming generator yields individual tokens. - if (generated.value.token) { - if (opts.guidance) accumulated = generated.value.token - else accumulated += generated.value.token - yield { partial: sanitiseAndTrim(accumulated, prompt, char, opts.characters, members) } - } - - if (typeof generated.value === 'string') { - result = generated.value - break - } - } - - if (+srv.lockSeconds > 0) { - await releaseLock(lockId) - } - - const parsed = sanitise((result || accumulated).replace(prompt, '')) - const trimmed = trimResponseV2(parsed, opts.replyAs, members, opts.characters, ['END_OF_DIALOG']) - yield trimmed || parsed -} - -const settings: AdapterSetting[] = [ - { - preset: true, - field: 'subscriptionId', - secret: false, - label: 'Level', - setting: { type: 'list', options: [] }, - }, -] - -registerAdapter('agnaistic', handleAgnaistic, { - label: 'Agnaistic', - options: [ - 'repetitionPenalty', - 'repetitionPenaltyRange', - 'repetitionPenaltySlope', - 'topA', - 'topK', - 'topP', - 'streamResponse', - 'frequencyPenalty', - 'presencePenalty', - 'mirostatLR', - 'mirostatTau', - 'typicalP', - 'tailFreeSampling', - ], - settings, - load: (user) => { - return [ - { - preset: true, - field: 'useRecommended', - secret: false, - label: 'Use Recommended Settings', - helperText: 'Use the settings provided by the subscription', - setting: { type: 'boolean' }, - }, - ] - }, -}) - -setInterval(updateRegisteredSubs, 3000) - -export async function updateRegisteredSubs() { - const subs = getCachedSubscriptions() - for (const item of settings) { - if (item.setting.type === 'list' && item.field === 'subscriptionId') { - const options = subs.map((sub) => ({ label: sub.name, value: sub._id })) - item.setting.options = options - } - } -} - -/** - * These need to be here because the Agnaistic service can invoke any other service - * Placing these in a 'common' module would cause a circular dependency graph between `generate.ts` and this module. - */ - -export const handlers: { [key in AIAdapter]: ModelAdapter } = { - novel: handleNovel, - kobold: handleThirdParty, - ooba: handleThirdParty, - horde: handleHorde, - openai: handleOAI, - scale: handleScale, - claude: handleClaude, - goose: handleGooseAI, - replicate: handleReplicate, - openrouter: handleOpenRouter, - mancer: handleMancer, - petals: handlePetals, - agnaistic: handleAgnaistic, - venus: handleVenus, -} - -export function getHandlers(settings: Partial) { - switch (settings.service!) { - case 'agnaistic': - case 'claude': - case 'goose': - case 'replicate': - case 'horde': - case 'ooba': - case 'openrouter': - case 'openai': - case 'scale': - case 'petals': - case 'mancer': - case 'novel': - case 'venus': - return handlers[settings.service] - } - - switch (settings.thirdPartyFormat!) { - case 'claude': - case 'kobold': - case 'openai': - return handlers[settings.thirdPartyFormat!] - } - - return handlers.ooba -} diff --git a/srv/adapter/charluv.ts b/srv/adapter/charluv.ts new file mode 100644 index 00000000..503f8520 --- /dev/null +++ b/srv/adapter/charluv.ts @@ -0,0 +1,239 @@ +import { store } from '../db' +import { isConnected } from '../db/client' +import { getCachedSubscriptions } from '../db/subscriptions' +import { handleClaude } from './claude' +import { handleHorde } from './horde' +import { handleThirdParty } from './kobold' +import { handleOAI } from './openai' +import { registerAdapter } from './register' +import { ModelAdapter } from './type' +import { AIAdapter, AdapterSetting } from '/common/adapters' +import { AppSchema } from '/common/types' +import { parseStops } from '/common/util' +import { obtainLock, releaseLock } from '../api/chat/lock' +import { getServerConfiguration } from '../db/admin' +import { validateGenerationGate } from './gate' + +export async function getSubscriptionPreset( + user: AppSchema.User, + guest: boolean, + gen?: Partial +) { + if (!isConnected()) return + if (!gen) return + if (gen.service !== 'charluv') return + + const tier = store.users.getUserSubTier(user) + const level = user.admin ? 999999 : tier?.level ?? -1 + let error: string | undefined = undefined + let warning: string | undefined = undefined + + // The model is no longer user-selectable. It's decided purely by the user's + // tier: premium users always get the highest model their level allows, and + // everyone else (free / non-paying) gets the default subscription. Any + // `registered.charluv.subscriptionId` left over on old presets is ignored. + const fallback = await store.subs.getDefaultSubscription() + const all = await store.subs.getSubscriptions() + const best = all + .filter((sub) => !sub.subDisabled) + .filter((sub) => (guest ? sub.allowGuestUsage !== false : true)) + .filter((sub) => (user.admin ? true : sub.subLevel <= level)) + .sort((l, r) => r.subLevel - l.subLevel)[0] + let preset = best || fallback + + if (guest && preset?.allowGuestUsage === false) { + error = 'Please sign in to use this model.' + } + + if (preset?.stopSequences) { + preset.stopSequences = parseStops(preset.stopSequences) + } + + if (!preset || preset.subDisabled) { + // If the subscription they're using becomes unavailable, gracefully fallback to the default and let them know + if (fallback && !fallback.subDisabled && fallback.subLevel <= level) { + preset = fallback + warning = + 'Your configured Charluv model is no longer available. Using a fallback. Please update your preset.' + } else { + error = 'Model selected is invalid or disabled. Try another.' + } + } + + return { level, preset, error, warning, tier: tier?.tier } +} + +export const handleCharluv: ModelAdapter = async function* (opts) { + if ('subscription' in opts === false) { + opts.subscription = await getSubscriptionPreset(opts.user, !!opts.guest, opts.gen) + } + + // openai-endpoint-only: if no subscription model is configured, generate via + // the self-hosted openai endpoint directly (ungated). Tier gating only applies + // when a subscription model exists. + if (!opts.subscription?.preset) { + opts.gen.service = 'openai' + yield* handleOAI(opts) + return + } + + const gate = await validateGenerationGate({ + user: opts.user, + guest: opts.guest, + subscription: opts.subscription, + log: opts.log, + }) + if (gate.error) { + yield { error: gate.error } + return + } + if (gate.warning) { + yield { warning: gate.warning } + } + + const subPreset = opts.subscription.preset + + const srv = await getServerConfiguration() + + /** + * Lock per user per model + */ + const lockId = `${opts.user._id}-${opts.subscription.preset.name}` + if (!opts.guidance && +srv.lockSeconds > 0) { + await obtainLock(lockId, srv.lockSeconds) + } + + const useRecommended = !!opts.gen.registered?.charluv?.useRecommended + if (useRecommended) { + const { + memoryChatEmbedLimit, + memoryContextLimit, + memoryDepth, + memoryReverseWeight, + memoryUserEmbedLimit, + ultimeJailbreak, + systemPrompt, + stopSequences, + maxTokens, + gaslight, + allowGuestUsage, + imageSettings, + temporary, + useAdvancedPrompt, + _id, + kind, + name, + ...recommended + } = subPreset + Object.assign(opts.gen, recommended) + } + + // Max tokens and max context limit are decided by the subscription preset + // We've already set the max context length prior to calling this handler + opts.gen.maxTokens = Math.min(subPreset.maxTokens, opts.gen.maxTokens || 80) + opts.gen.thirdPartyUrl = subPreset.thirdPartyUrl + opts.gen.thirdPartyFormat = subPreset.thirdPartyFormat + + const stops = + Array.isArray(subPreset.stopSequences) && opts.kind !== 'plain' + ? new Set(subPreset.stopSequences) + : new Set() + + if (Array.isArray(opts.gen.stopSequences) && opts.gen.stopSequences.length) { + for (const stop of opts.gen.stopSequences) { + stops.add(stop) + } + } + + // openai-endpoint-only: ignore the subscription model's stored service + // (production subs are 'horde') and always run the self-hosted openai + // endpoint. The subscription is used only for gating + model/limits, already + // applied above. base.server (INFERENCE_TEXT_URL) provides the endpoint+model. + opts.gen.service = 'openai' + opts.gen.oaiModel = subPreset.thirdPartyModel || subPreset.oaiModel || opts.gen.oaiModel + // Don't let a sub's third-party url/format divert us off the openai endpoint. + opts.gen.thirdPartyFormat = undefined + opts.user.koboldUrl = '' + + try { + yield* handleOAI(opts) + } finally { + if (+srv.lockSeconds > 0) { + await releaseLock(lockId) + } + } +} + +const settings: AdapterSetting[] = [ + { + preset: true, + field: 'subscriptionId', + secret: false, + label: 'Level', + setting: { type: 'list', options: [] }, + }, +] + +registerAdapter('charluv', handleCharluv, { + label: 'Charluv', + options: [ + 'repetitionPenalty', + 'repetitionPenaltyRange', + 'repetitionPenaltySlope', + 'topA', + 'topK', + 'topP', + 'streamResponse', + 'frequencyPenalty', + 'presencePenalty', + 'mirostatLR', + 'mirostatTau', + 'typicalP', + 'tailFreeSampling', + ], + settings, + load: (user) => { + return [ + { + preset: true, + field: 'useRecommended', + secret: false, + label: 'Use Recommended Settings', + helperText: 'Use the settings provided by the subscription', + setting: { type: 'boolean' }, + }, + ] + }, +}) + +setInterval(updateRegisteredSubs, 3000) + +export async function updateRegisteredSubs() { + const subs = getCachedSubscriptions() + for (const item of settings) { + if (item.setting.type === 'list' && item.field === 'subscriptionId') { + const options = subs.map((sub) => ({ label: sub.name, value: sub._id })) + item.setting.options = options + } + } +} + +/** + * These need to be here because the Charluv service can invoke any other service + * Placing these in a 'common' module would cause a circular dependency graph between `generate.ts` and this module. + */ + +export const handlers: { [key in AIAdapter]: ModelAdapter } = { + kobold: handleThirdParty, + ooba: handleThirdParty, + horde: handleHorde, + openai: handleOAI, + claude: handleClaude, + charluv: handleCharluv, +} + +export function getHandlers(settings: Partial) { + // openai-endpoint-only: direct openai, everything else via the charluv gate. + if (settings.service === 'openai') return handlers.openai + return handlers.charluv +} diff --git a/srv/adapter/chat-completion.ts b/srv/adapter/chat-completion.ts index 8b1f07e7..fd2fc3be 100644 --- a/srv/adapter/chat-completion.ts +++ b/srv/adapter/chat-completion.ts @@ -41,7 +41,10 @@ export async function toChatCompletionPayload( maxTokens: number ): Promise { if (opts.kind === 'plain') { - return [{ role: 'system', content: opts.prompt }] + // One-off utility prompts (inference/CYOA/summary/image-prompt) are a single + // blob. Send as `user` not `system`: the self-hosted endpoint rejects + // requests with no user-role message ("No user query found in messages"). + return [{ role: 'user', content: opts.prompt }] } const { lines, gen, replyAs } = opts @@ -166,7 +169,28 @@ export async function toChatCompletionPayload( if (!addedAllInserts) { await addRemainingInserts() } - return messages.concat(history.reverse()) + + const final = messages.concat(history.reverse()) + + // The self-hosted endpoint rejects requests with no user-role message ("No user + // query found in messages"). An event scene that opens on director/world + // narration alone (the human hasn't spoken yet) has none — the narration line + // is now labelled "Narrator:/Director:" (its own speaker) rather than "You:", + // so it no longer classifies as the user turn. Promote the most recent + // narration line to the user turn so the scene still sets up the reply. + if (!final.some((m) => m.role === 'user')) { + const narration = [...final] + .reverse() + .find( + (m) => + m.role !== 'system' && + typeof m.content === 'string' && + /^(Narrator|Director):/.test(m.content) + ) + if (narration) narration.role = 'user' + } + + return final } export async function splitSampleChat(opts: SplitSampleChatProps, counter: TokenCounter) { @@ -272,7 +296,15 @@ async function getPostInstruction( case 'retry': case 'send': - case 'request': { + case 'request': + // Event character replies (the director elected this speaker) are normal + // character turns: they MUST get the trailing ":" assistant cue + UJB, + // exactly like a 'send'. Without these cases they fell through the switch to + // no cue at all, so the model picked its own speaker ("Narrator:") and + // narrated the whole scene instead of replying as the elected character. + case 'send-event:world': + case 'send-event:character': + case 'send-event:hidden': { const appendName = opts.gen.prefixNameAppend ?? true const messages: CompletionItem[] = [ { diff --git a/srv/adapter/director.ts b/srv/adapter/director.ts new file mode 100644 index 00000000..6fc40186 --- /dev/null +++ b/srv/adapter/director.ts @@ -0,0 +1,146 @@ +import { AppSchema } from '../../common/types/schema' +import { AppLog } from '../middleware' +import { + buildDirectorPrompt, + buildDirectorEventPrompt, + buildDirectorEventSchema, + buildSpeakerSchema, +} from '../../common/event' +import { inferenceAsync } from './generate' + +type ElectOpts = { + user: AppSchema.User + log: AppLog + event: { location: string; description: string; when?: string; vibe?: string; note?: string } + roster: Array<{ id: string; name: string; hook: string }> + recent: Array<{ name: string; text: string }> + repliedThisTurn: string[] + /** The human participant — listed as present but never an electable speaker. */ + present?: { name: string; hook: string } +} + +/** + * One director inference: elect who speaks next in an event. Returns a present + * character id or 'none'. Any model/parse failure resolves to 'none' so a turn + * can never crash on the director. + */ +export async function electSpeaker(opts: ElectOpts): Promise { + // A character speaks at most once per turn: drop anyone who already replied + // from BOTH the roster the director sees and the schema enum, so the model + // physically cannot re-elect them (the prompt hint alone doesn't hold a small + // model at low temp — it would otherwise pick the same char every iteration). + const replied = new Set(opts.repliedThisTurn) + const roster = opts.roster.filter((r) => !replied.has(r.id)) + const ids = roster.map((r) => r.id) + if (!ids.length) return 'none' + + const prompt = buildDirectorPrompt({ + event: opts.event, + roster, + recent: opts.recent, + repliedThisTurn: opts.repliedThisTurn, + user: opts.present, + }) + + try { + const { generated } = await inferenceAsync({ + user: opts.user, + log: opts.log, + prompt, + maxTokens: 24, + temp: 0.2, + jsonSchema: buildSpeakerSchema(ids), + // Orchestration (speaker election + world beats) runs on the original Qwen + // model via the mod endpoint — it follows structured/JSON instructions far + // better than the chat finetune (tutu), which broke delegation. tutu only + // does the in-character replies. Falls back to the text endpoint if no mod + // endpoint is configured. + moderation: true, + // Clean utility system prompt: override any roleplay default baked into the + // served model's chat template (and protect against the tutu fallback when + // no mod endpoint is set) so the model does the tool task, not in-character + // prose. The schema (guided_json) still forces the output shape on top. + system: `You are a scene director that picks the next speaker. Respond only with the requested JSON. Do not roleplay or answer in character.`, + }) + + const picked = parseSpeaker(generated, ids) + return picked + } catch (err) { + opts.log.warn({ err }, 'director: election failed, defaulting to none') + return 'none' + } +} + +type DirectorEventOpts = { + user: AppSchema.User + log: AppLog + event: { location: string; description: string; when?: string; vibe?: string; note?: string } + roster: Array<{ name: string; hook: string }> + recent: Array<{ name: string; text: string }> +} + +/** + * One director inference: optionally produce a short world/narration beat to push + * the scene forward (announcement, arrival, environment shift). Returns the beat + * text, or '' when the director declines / on any model or parse failure (a beat + * is never essential, so it must never crash a turn). + */ +export async function proposeDirectorEvent(opts: DirectorEventOpts): Promise { + const prompt = buildDirectorEventPrompt({ + event: opts.event, + roster: opts.roster, + recent: opts.recent, + }) + + try { + const { generated } = await inferenceAsync({ + user: opts.user, + log: opts.log, + prompt, + maxTokens: 100, + temp: 0.7, + jsonSchema: buildDirectorEventSchema(), + // World-beat narration is orchestration too — run it on the original Qwen + // model (mod endpoint), not the chat finetune. See electSpeaker. + moderation: true, + // Clean utility system prompt so the model narrates the world as a director + // tool, not in character — overrides any roleplay default on the served + // model (and the tutu fallback). See electSpeaker. + system: `You are an unseen scene director narrating world events. Respond only with the requested JSON. Do not roleplay or speak as any character.`, + }) + return parseNarration(generated) + } catch (err) { + opts.log.warn({ err }, 'director: world-beat generation failed, skipping') + return '' + } +} + +/** Pull the narration string out of `{ "narration": "..." }`, tolerating chatter. */ +function parseNarration(generated: string): string { + const text = (generated || '').trim() + try { + const match = text.match(/\{[\s\S]*\}/) + if (match) { + const obj = JSON.parse(match[0]) + const s = String(obj?.narration ?? '').trim() + // Guard against a model echoing a literal empty-marker. + if (s.toLowerCase() === 'empty string' || s === '""') return '' + return s + } + } catch {} + return '' +} + +/** Tolerant parse: accept strict JSON `{ "speaker": "" }` or a bare id/"none". */ +function parseSpeaker(generated: string, ids: string[]): string { + const text = (generated || '').trim() + try { + const obj = JSON.parse(text) + const s = String(obj?.speaker || '').trim() + if (s === 'none' || ids.includes(s)) return s + } catch {} + // Fallback: the raw text might be an id or "none". + if (text === 'none' || ids.includes(text)) return text + const found = ids.find((id) => text.includes(id)) + return found || 'none' +} diff --git a/srv/adapter/gate.ts b/srv/adapter/gate.ts new file mode 100644 index 00000000..617ab65d --- /dev/null +++ b/srv/adapter/gate.ts @@ -0,0 +1,72 @@ +import { store } from '../db' +import { AppLog } from '../middleware' +import { AppSchema } from '/common/types' + +export type ResolvedSubscription = { + level: number + preset?: Partial + error?: string + warning?: string + tier?: AppSchema.SubscriptionTier +} + +export type GateResult = { error?: string; warning?: string } + +/** + * Centralised generation gating. + * + * Validates a resolved subscription against the user's *actual* entitlement: + * subscription enabled, model available, tier/level sufficient, and guest + * usage allowed. Previously this logic was duplicated inside handleHorde and + * handleAgnaistic; both now call this so the rules live in one place. + * + * Returns `{ error }` to block generation (caller should yield the error and + * stop) or `{ warning }` to surface a non-fatal notice. + */ +export async function validateGenerationGate(opts: { + user: AppSchema.User + guest?: string | boolean + subscription?: ResolvedSubscription + log?: AppLog +}): Promise { + const { user, guest, subscription, log } = opts + + if (!subscription || !subscription.preset) { + return { error: 'Subscriptions are not enabled' } + } + + if (subscription.error) { + return { error: subscription.error } + } + + const preset = subscription.preset + + let newLevel = await store.users.validateSubscription(user) + if (newLevel === undefined) { + newLevel = -1 + } + + if (newLevel instanceof Error) { + return { error: newLevel.message } + } + + if (preset.subLevel !== undefined && preset.subLevel > -1 && preset.subLevel > newLevel) { + log?.error( + { + preset: preset.name, + presetLevel: preset.subLevel, + newLevel, + nativeLevel: user.sub?.level, + patronLevel: user.patreon?.sub?.level, + }, + `Subscription insufficient` + ) + return { error: 'Your account is ineligible for this model - Subscription tier insufficient' } + } + + if (!preset.allowGuestUsage && guest) { + return { error: 'Please sign in to use this model' } + } + + return { warning: subscription.warning } +} diff --git a/srv/adapter/generate.js b/srv/adapter/generate.js new file mode 100644 index 00000000..9bc6193b --- /dev/null +++ b/srv/adapter/generate.js @@ -0,0 +1,470 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.inferenceAsync = inferenceAsync; +exports.guidanceAsync = guidanceAsync; +exports.createInferenceStream = createInferenceStream; +exports.createChatStream = createChatStream; +exports.getResponseEntities = getResponseEntities; +const presets_1 = require("/common/presets"); +const db_1 = require("../db"); +const middleware_1 = require("../middleware"); +const wrap_1 = require("../api/wrap"); +const prompt_1 = require("../../common/prompt"); +const horde_gen_1 = require("../../common/horde-gen"); +const needle_1 = __importDefault(require("needle")); +const horde_1 = require("../api/horde"); +const tokenize_1 = require("../tokenize"); +const settings_1 = require("../api/settings"); +const charluv_1 = require("./charluv"); +const util_1 = require("/common/util"); +const templates_1 = require("/common/presets/templates"); +const guidance_parser_1 = require("/common/guidance/guidance-parser"); +const subscriptions_1 = require("../db/subscriptions"); +const queue_1 = require("../queue"); +const ws_1 = require("../api/ws"); +const store_1 = require("../memory/store"); +let version = ''; +(0, horde_gen_1.configure)(async (opts) => { + if (!version) { + const appConfig = await (0, settings_1.getAppConfig)(); + version = appConfig.version; + } + const res = await (0, needle_1.default)(opts.method, opts.url, opts.payload, { + json: true, + headers: { + 'Content-Type': 'application/json', + apikey: opts.key || horde_1.HORDE_GUEST_KEY, + 'Client-Agent': `Charluv:${version}:`, + }, + }); + return { body: res.body, statusCode: res.statusCode, statusMessage: res.statusMessage }; +}, middleware_1.logger); +async function inferenceAsync(opts) { + const retries = opts.retries ?? 0; + let error; + for (let attempt = 0; attempt <= retries; attempt++) { + const { stream, service } = await createInferenceStream(opts); + let generated = ''; + let meta = {}; + let prompt = ''; + for await (const gen of stream) { + if (typeof gen === 'string') { + generated = gen; + continue; + } + if ('partial' in gen && gen.partial) { + const partial = (0, util_1.tryParse)(gen.partial); + if (!partial || typeof partial !== 'object') + continue; + (0, ws_1.sendOne)(opts.user._id, { + type: 'guidance-partial', + partial, + adapter: service, + requestId: opts.requestId, + }); + continue; + } + if ('meta' in gen) { + Object.assign(meta, gen.meta); + continue; + } + if ('prompt' in gen) { + prompt = gen.prompt; + continue; + } + if ('error' in gen) { + error = gen.error; + if (attempt >= retries) { + throw new Error(gen.error); + } + } + } + if (opts.guidance && + (opts.settings?.service === 'horde' || opts.settings?.service === 'charluv')) { + try { + const values = JSON.parse(generated); + return { generated, prompt, meta, values: Object.assign({}, opts.previous, values) }; + } + catch (ex) { } + } + return { generated, prompt, meta }; + } + if (error) + throw error; + throw new Error(`Could not complete inference: Max retries exceeded`); +} +async function guidanceAsync(opts) { + const settings = await getRequestPreset(opts); + const sub = await (0, charluv_1.getSubscriptionPreset)(opts.user, !!opts.guest, opts.settings || settings); + const previous = { ...opts.previous }; + for (const name of opts.reguidance || []) { + delete previous[name]; + } + const infer = async (params, v2) => { + const inference = await inferenceAsync({ + ...opts, + previous, + prompt: params.prompt, + settings, + maxTokens: params.tokens, + stop: params.stop, + guidance: v2, + }); + return inference; + }; + if (sub?.preset?.guidanceCapable && (sub.tier?.guidanceAccess || opts.user.admin)) { + const srv = await db_1.store.admin.getServerConfiguration(); + const counts = (0, guidance_parser_1.calculateGuidanceCounts)(opts.prompt, opts.placeholders); + if (srv.maxGuidanceTokens && counts.tokens > srv.maxGuidanceTokens) { + throw new Error(`Cannot run guidance: Template is requesting too many tokens (>1000)`); + } + if (srv.maxGuidanceVariables && counts.vars > srv.maxGuidanceVariables) { + throw new Error(`Cannot run guidance: Template requests too many variables (>15)`); + } + const result = await infer({ prompt: opts.prompt, tokens: 200, stop: opts.stop }, true); + if (!result.values) { + try { + const values = JSON.parse(result.generated); + result.values = values; + } + catch (ex) { + opts.log.error({ result }, 'Failed to JSON parse guidance result'); + throw ex; + } + } + return result; + } + const result = await (0, guidance_parser_1.runGuidance)(opts.prompt, { + infer: (params) => infer(params, false).then((res) => res.generated), + reguidance: opts.reguidance, + placeholders: opts.placeholders, + previous, + }); + return result; +} +async function createInferenceStream(opts) { + // getRequestPreset can return a SHARED cached preset object, so clone before + // applying any per-request override — otherwise stop/temp/maxTokens leak into + // the cache and affect every other request. (This also makes opts.temp / + // opts.maxTokens actually take effect: they were declared but never applied, so + // callers like the event director ran at the default temp instead of the 0.2 + // election / 0.7 world-beat temps they asked for.) + const settings = { ...(await getRequestPreset(opts)) }; + if (opts.stop) { + settings.stopSequences = opts.stop; + } + if (opts.temp !== undefined) { + settings.temp = opts.temp; + } + if (opts.maxTokens !== undefined) { + settings.maxTokens = opts.maxTokens; + } + const handler = (0, charluv_1.getHandlers)(settings); + const stream = handler({ + kind: 'plain', + requestId: '', + char: {}, + chat: {}, + gen: settings, + log: opts.log, + lines: [], + members: [], + guest: opts.guest, + user: opts.user, + replyAs: {}, + parts: { persona: '', post: [], allPersonas: [], chatEmbeds: [], userEmbeds: [] }, + prompt: opts.prompt, + sender: {}, + mappedSettings: (0, presets_1.mapPresetsToAdapter)(settings, settings.service), + impersonate: undefined, + guidance: opts.guidance, + previous: opts.previous, + placeholders: opts.placeholders, + lists: opts.lists, + jsonSchema: opts.jsonSchema, + imageData: opts.imageData, + images: opts.images, + system: opts.system, + jsonValues: opts.jsonValues, + }); + const gated = queue_1.inferenceGate.gateStream({ + kind: 'text', + priority: (opts.queuePriority ?? 3), + userId: opts.guest ? undefined : opts.user?._id, + socketId: opts.guest, + requestId: opts.requestId, + }, () => stream); + return { stream: gated, service: settings.service || '' }; +} +async function getRequestPreset(opts) { + let preset; + if (opts.settings) { + const model = (0, subscriptions_1.getCachedSubscriptionModels)().find((m) => m._id === opts.settings?._id); + preset = model || opts.settings; + } + else { + // Custom user presets are retired — inference always runs on the platform's + // default subscription model (the self-hosted endpoint), never a user's + // saved preset. + preset = (0, subscriptions_1.getCachedSubscriptionModels)().find((m) => m.isDefaultSub); + } + if (!preset) { + throw new wrap_1.StatusError('Could not locate preset for inference request', 400); + } + if (preset.thirdPartyUrl) { + opts.user.koboldUrl = preset.thirdPartyUrl; + } + if (preset.thirdPartyFormat) { + opts.user.thirdPartyFormat = preset.thirdPartyFormat; + } + return preset; +} +async function createChatStream(opts, log, guestSocketId) { + const entities = opts.entities; + if (entities) { + opts.settings = entities.gen; + opts.user = entities.user; + opts.char = entities.char; + entities.gen.temporary = opts.settings?.temporary; + } + const subscription = await (0, charluv_1.getSubscriptionPreset)(opts.user, !!guestSocketId, opts.settings); + /** + * Only use a JSON schema if: + * - Service allows it + * - User preset has it enabled + * - User preset has specified a schema + * - There is both a history and response template + */ + let jsonSchema; + if (subscription?.preset && opts.entities?.gen.jsonEnabled && opts.chatSchema) { + jsonSchema = opts.chatSchema.schema; + } + const fallbackContext = subscription?.preset?.maxContextLength; + const modelContext = subscription + ? (0, util_1.getSubscriptionModelLimits)(subscription?.preset, subscription.level)?.maxContextLength + : undefined; + const subContextLimit = modelContext || fallbackContext; + opts.settings = opts.settings || {}; + if (subContextLimit) { + opts.settings.maxContextLength = Math.min(subContextLimit, opts.settings.maxContextLength ?? 4096); + } + /** + * N.b.: The front-end sends the `lines` and `history` in TIME-ASCENDING order. I.e. Oldest -> Newest + * + * We need to ensure the prompt is always generated using the correct version of the memory book. + * If a non-owner initiates generation, they will not have the memory book. + * + * Everything else should be up to date at this point + */ + if (entities) { + const { adapter, model } = (0, prompt_1.getAdapter)(opts.chat, entities.user, entities.gen); + const encoder = (0, tokenize_1.getTokenCounter)(adapter, model); + opts.parts = await (0, prompt_1.buildPromptParts)({ + ...entities, + sender: opts.sender, + kind: opts.kind, + settings: entities.gen, + chat: opts.chat, + members: opts.members, + replyAs: opts.replyAs, + impersonate: opts.impersonate, + characters: opts.characters, + chatEmbeds: opts.chatEmbeds || [], + userEmbeds: opts.userEmbeds || [], + resolvedScenario: entities.resolvedScenario, + }, [...opts.lines].reverse(), encoder); + // RAG: recall long-term memories relevant to the recent conversation and + // inject them into the {{memory}} slot (additive to any book memory). Scoped + // to the chat owner + the SPEAKING character (replyAs) so each companion only + // recalls its own memories — in a multi-char/event chat the main char + // (chat.characterId) is not necessarily the one replying. + try { + const charId = opts.replyAs?._id || opts.chat?.characterId; + const ownerId = opts.chat?.userId; + if (charId && ownerId && opts.lines?.length) { + const query = [...opts.lines].slice(-3).join('\n'); + const memories = opts.chat?.memoryDisabled + ? [] + : await (0, store_1.recallMemories)(ownerId, charId, query, { k: 5 }); + if (memories.length) { + const block = ['What you remember:'].concat(memories.map((m) => `- ${m.text}`)).join('\n'); + opts.parts.memory = opts.parts.memory ? `${opts.parts.memory}\n${block}` : block; + } + } + } + catch (err) { + log.warn({ err }, 'Long-term memory recall failed'); + } + } + if (opts.settings?.thirdPartyUrl) { + opts.user.koboldUrl = opts.settings.thirdPartyUrl; + } + if (opts.settings?.thirdPartyFormat) { + opts.user.thirdPartyFormat = opts.settings.thirdPartyFormat; + } + if (opts.settings?.stopSequences) { + opts.settings.stopSequences = (0, util_1.parseStops)(opts.settings.stopSequences); + } + if (opts.settings?.phraseBias) { + opts.settings.phraseBias = opts.settings.phraseBias + .map(({ seq, bias }) => ({ seq: seq.replace(/\\n/g, '\n'), bias })) + .filter((pb) => !!pb.seq); + } + const { adapter, isThirdParty, model } = (0, prompt_1.getAdapter)(opts.chat, opts.user, opts.settings); + const encoder = (0, tokenize_1.getTokenCounter)(adapter, model, subscription?.preset); + const handler = charluv_1.handlers[adapter]; + /** + * Context limits set by the subscription need to be present before the prompt is finalised. + * We never need to use the users context length here as the subscription should contain the maximum possible context length. + */ + const prompt = await (0, prompt_1.assemblePrompt)(opts, opts.parts, opts.lines, encoder); + const size = encoder([ + opts.parts.sampleChat, + opts.parts.scenario, + opts.parts.memory, + opts.parts.systemPrompt, + opts.parts.ujb, + opts.parts.persona, + ] + .filter((l) => !!l) + .join('\n')); + if (opts.impersonate) { + Object.assign(opts.characters, { impersonated: opts.impersonate }); + } + const gen = opts.settings || (0, presets_1.getFallbackPreset)(adapter); + const mappedSettings = (0, presets_1.mapPresetsToAdapter)(gen, adapter); + const stream = handler({ + requestId: opts.requestId, + kind: opts.kind, + char: opts.char, + chat: opts.chat, + gen: opts.settings || {}, + log, + members: opts.members.concat(opts.sender), + prompt: prompt.prompt, + parts: prompt.parts, + sender: opts.sender, + mappedSettings, + user: opts.user, + guest: guestSocketId, + lines: prompt.lines, + isThirdParty, + replyAs: opts.replyAs, + characters: opts.characters, + impersonate: opts.impersonate, + lastMessage: opts.lastMessage, + imageData: opts.imageData, + jsonSchema: jsonSchema || opts.jsonSchema, + subscription, + encoder, + jsonValues: opts.jsonValues, + }); + const priority = (0, queue_1.priorityForUser)(opts.user, !!guestSocketId, (0, subscriptions_1.getCachedTiers)()); + const gatedStream = queue_1.inferenceGate.gateStream({ + kind: 'text', + priority, + userId: guestSocketId ? undefined : opts.user._id, + socketId: guestSocketId, + requestId: opts.requestId, + }, () => stream); + return { + stream: gatedStream, + adapter, + settings: gen, + user: opts.user, + size, + length: prompt.length, + json: !!jsonSchema || !!opts.jsonSchema, + }; +} +async function getResponseEntities(chat, senderId, gen) { + const isOwnerOrMember = senderId === chat.userId || chat.memberIds.includes(senderId); + if (!isOwnerOrMember) { + throw wrap_1.errors.Forbidden; + } + const user = await db_1.store.users.getUser(chat.userId); + if (!user) { + throw wrap_1.errors.Forbidden; + } + const book = chat.memoryId ? await db_1.store.memory.getBook(chat.memoryId) : undefined; + const char = await db_1.store.characters.getCharacter(chat.userId, chat.characterId); + if (!char) { + throw new wrap_1.StatusError('Character not found', 404); + } + const { adapter, model } = (0, prompt_1.getAdapter)(chat, user, gen); + const genSettings = await getGenerationSettings(user, chat, adapter); + const settings = (0, presets_1.mapPresetsToAdapter)(genSettings, adapter); + // Scenario books (the retired event state-machine) no longer feed the prompt — + // resolveScenario only uses the character's/chat's plain-text scenario now. + const resolvedScenario = (0, prompt_1.resolveScenario)(chat, char, []); + if (genSettings.promptTemplateId) { + if ((0, templates_1.isDefaultTemplate)(genSettings.promptTemplateId)) { + genSettings.gaslight = templates_1.templates[genSettings.promptTemplateId]; + } + else { + const template = await db_1.store.presets.getTemplate(genSettings.promptTemplateId); + if (template?.userId === chat.userId) { + genSettings.gaslight = template.template; + } + } + } + return { char, user, adapter, settings, gen: genSettings, model, book, resolvedScenario }; +} +async function getGenerationSettings(user, chat, adapter, guest) { + if (chat.genPreset) { + if ((0, presets_1.isDefaultPreset)(chat.genPreset)) { + return { ...presets_1.defaultPresets[chat.genPreset], src: 'user-chat-genpreset-default' }; + } + if (guest) { + if (chat.genSettings) + return { ...chat.genSettings, src: 'guest-chat-gensettings' }; + return { ...(0, presets_1.getFallbackPreset)(adapter), src: 'guest-fallback' }; + } + const preset = await db_1.store.presets.getUserPreset(chat.genPreset); + if (preset) { + preset.src = 'user-chat-genpreset-custom'; + return preset; + } + } + if (chat.genSettings) { + const src = guest ? 'guest-chat-gensettings' : 'user-chat-gensettings'; + return { ...chat.genSettings, src }; + } + if (user.defaultPreset) { + if ((0, presets_1.isDefaultPreset)(user.defaultPreset)) { + return { ...presets_1.defaultPresets[user.defaultPreset], src: 'user-settings-genpreset-default' }; + } + const preset = await db_1.store.presets.getUserPreset(user.defaultPreset); + if (preset) { + preset.src = 'user-settings-genpreset-custom'; + return preset; + } + } + const servicePreset = user.defaultPresets?.[adapter]; + if (servicePreset) { + if ((0, presets_1.isDefaultPreset)(servicePreset)) { + return { + ...presets_1.defaultPresets[servicePreset], + src: `${guest ? 'guest' : 'user'}-service-defaultpreset`, + }; + } + // No user presets are persisted for anonymous users + // Do not try to check the database for them + if (guest) { + return { ...(0, presets_1.getFallbackPreset)(adapter), src: 'guest-fallback' }; + } + const preset = await db_1.store.presets.getUserPreset(servicePreset); + if (preset) { + preset.src = 'user-service-custom'; + return preset; + } + } + return { + ...(0, presets_1.getFallbackPreset)(adapter), + src: guest ? 'guest-fallback-last' : 'user-fallback-last', + }; +} +//# sourceMappingURL=generate.js.map \ No newline at end of file diff --git a/srv/adapter/generate.js.map b/srv/adapter/generate.js.map new file mode 100644 index 00000000..6e04cff2 --- /dev/null +++ b/srv/adapter/generate.js.map @@ -0,0 +1 @@ +{"version":3,"file":"generate.js","sourceRoot":"","sources":["generate.ts"],"names":[],"mappings":";;;;;AAoGA,wCA6DC;AAED,sCAuDC;AAED,sDA8DC;AA8BD,4CAiMC;AAED,kDA2CC;AAriBD,6CAKwB;AACxB,8BAA6B;AAE7B,8CAA8C;AAC9C,sCAAiD;AAEjD,gDAM4B;AAC5B,sDAAkD;AAClD,oDAA2B;AAC3B,wCAA8C;AAC9C,0CAA6C;AAC7C,8CAA8C;AAC9C,uCAAwE;AACxE,uCAA+E;AAC/E,yDAAwE;AACxE,sEAIyC;AACzC,uDAAiF;AACjF,oCAAyD;AACzD,kCAAmC;AACnC,2CAAgD;AAGhD,IAAI,OAAO,GAAG,EAAE,CAAA;AAEhB,IAAA,qBAAS,EAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACvB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,SAAS,GAAG,MAAM,IAAA,uBAAY,GAAE,CAAA;QACtC,OAAO,GAAG,SAAS,CAAC,OAAO,CAAA;IAC7B,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,IAAA,gBAAM,EAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE;QAC5D,IAAI,EAAE,IAAI;QACV,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,MAAM,EAAE,IAAI,CAAC,GAAG,IAAI,uBAAe;YACnC,cAAc,EAAE,WAAW,OAAO,GAAG;SACtC;KACF,CAAC,CAAA;IAEF,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,aAAa,EAAE,GAAG,CAAC,aAAa,EAAE,CAAA;AACzF,CAAC,EAAE,mBAAM,CAAC,CAAA;AA4CH,KAAK,UAAU,cAAc,CAAC,IAAsB;IACzD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC,CAAA;IACjC,IAAI,KAAU,CAAA;IAEd,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC;QACpD,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,qBAAqB,CAAC,IAAI,CAAC,CAAA;QAE7D,IAAI,SAAS,GAAG,EAAE,CAAA;QAClB,IAAI,IAAI,GAAQ,EAAE,CAAA;QAClB,IAAI,MAAM,GAAG,EAAE,CAAA;QACf,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;YAC/B,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;gBAC5B,SAAS,GAAG,GAAG,CAAA;gBACf,SAAQ;YACV,CAAC;YAED,IAAI,SAAS,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;gBACpC,MAAM,OAAO,GAAG,IAAA,eAAQ,EAAC,GAAG,CAAC,OAAO,CAAC,CAAA;gBACrC,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;oBAAE,SAAQ;gBACrD,IAAA,YAAO,EAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;oBACrB,IAAI,EAAE,kBAAkB;oBACxB,OAAO;oBACP,OAAO,EAAE,OAAO;oBAChB,SAAS,EAAE,IAAI,CAAC,SAAS;iBAC1B,CAAC,CAAA;gBACF,SAAQ;YACV,CAAC;YAED,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC;gBAClB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAA;gBAC7B,SAAQ;YACV,CAAC;YAED,IAAI,QAAQ,IAAI,GAAG,EAAE,CAAC;gBACpB,MAAM,GAAG,GAAG,CAAC,MAAM,CAAA;gBACnB,SAAQ;YACV,CAAC;YAED,IAAI,OAAO,IAAI,GAAG,EAAE,CAAC;gBACnB,KAAK,GAAG,GAAG,CAAC,KAAK,CAAA;gBACjB,IAAI,OAAO,IAAI,OAAO,EAAE,CAAC;oBACvB,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;gBAC5B,CAAC;YACH,CAAC;QACH,CAAC;QAED,IACE,IAAI,CAAC,QAAQ;YACb,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,KAAK,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,OAAO,KAAK,SAAS,CAAC,EAC5E,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;gBACpC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAA;YACtF,CAAC;YAAC,OAAO,EAAE,EAAE,CAAC,CAAA,CAAC;QACjB,CAAC;QAED,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;IACpC,CAAC;IAED,IAAI,KAAK;QAAE,MAAM,KAAK,CAAA;IACtB,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAA;AACvE,CAAC;AAEM,KAAK,UAAU,aAAa,CAAC,IAAsB;IACxD,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAA;IAC7C,MAAM,GAAG,GAAG,MAAM,IAAA,+BAAqB,EAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,CAAA;IAE3F,MAAM,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;IAErC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,UAAU,IAAI,EAAE,EAAE,CAAC;QACzC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAA;IACvB,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,EAAE,MAAsB,EAAE,EAAW,EAAE,EAAE;QAC1D,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC;YACrC,GAAG,IAAI;YACP,QAAQ;YACR,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,QAAQ;YACR,SAAS,EAAE,MAAM,CAAC,MAAM;YACxB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,QAAQ,EAAE,EAAE;SACb,CAAC,CAAA;QACF,OAAO,SAAS,CAAA;IAClB,CAAC,CAAA;IAED,IAAI,GAAG,EAAE,MAAM,EAAE,eAAe,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,cAAc,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAClF,MAAM,GAAG,GAAG,MAAM,UAAK,CAAC,KAAK,CAAC,sBAAsB,EAAE,CAAA;QACtD,MAAM,MAAM,GAAG,IAAA,yCAAuB,EAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,CAAA;QACtE,IAAI,GAAG,CAAC,iBAAiB,IAAI,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,iBAAiB,EAAE,CAAC;YACnE,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAA;QACxF,CAAC;QAED,IAAI,GAAG,CAAC,oBAAoB,IAAI,MAAM,CAAC,IAAI,GAAG,GAAG,CAAC,oBAAoB,EAAE,CAAC;YACvE,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAA;QACpF,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,CAAA;QACvF,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;gBAC3C,MAAM,CAAC,MAAM,GAAG,MAAM,CAAA;YACxB,CAAC;YAAC,OAAO,EAAE,EAAE,CAAC;gBACZ,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,EAAE,sCAAsC,CAAC,CAAA;gBAClE,MAAM,EAAE,CAAA;YACV,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAA;IACf,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,IAAA,6BAAW,EAAC,IAAI,CAAC,MAAM,EAAE;QAC5C,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC;QACpE,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,QAAQ;KACT,CAAC,CAAA;IAEF,OAAO,MAAM,CAAA;AACf,CAAC;AAEM,KAAK,UAAU,qBAAqB,CAAC,IAAsB;IAChE,6EAA6E;IAC7E,8EAA8E;IAC9E,yEAAyE;IACzE,gFAAgF;IAChF,6EAA6E;IAC7E,mDAAmD;IACnD,MAAM,QAAQ,GAAG,EAAE,GAAG,CAAC,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC,EAAE,CAAA;IAEtD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,QAAQ,CAAC,aAAa,GAAG,IAAI,CAAC,IAAI,CAAA;IACpC,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC5B,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;IAC3B,CAAC;IAED,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACjC,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAA;IACrC,CAAC;IAED,MAAM,OAAO,GAAG,IAAA,qBAAW,EAAC,QAAQ,CAAC,CAAA;IACrC,MAAM,MAAM,GAAG,OAAO,CAAC;QACrB,IAAI,EAAE,OAAO;QACb,SAAS,EAAE,EAAE;QACb,IAAI,EAAE,EAAS;QACf,IAAI,EAAE,EAAS;QACf,GAAG,EAAE,QAAQ;QACb,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,KAAK,EAAE,EAAE;QACT,OAAO,EAAE,EAAE;QACX,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,OAAO,EAAE,EAAS;QAClB,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE;QACjF,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,MAAM,EAAE,EAAS;QACjB,cAAc,EAAE,IAAA,6BAAmB,EAAC,QAAQ,EAAE,QAAQ,CAAC,OAAQ,CAAC;QAChE,WAAW,EAAE,SAAS;QACtB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,UAAU,EAAE,IAAI,CAAC,UAAU;KAC5B,CAAC,CAAA;IAEF,MAAM,KAAK,GAAG,qBAAa,CAAC,UAAU,CACpC;QACE,IAAI,EAAE,MAAM;QACZ,QAAQ,EAAE,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,CAAQ;QAC1C,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG;QAC/C,QAAQ,EAAE,IAAI,CAAC,KAAK;QACpB,SAAS,EAAE,IAAI,CAAC,SAAS;KAC1B,EACD,GAAG,EAAE,CAAC,MAAM,CACb,CAAA;IAED,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,IAAI,EAAE,EAAE,CAAA;AAC3D,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,IAAsB;IACpD,IAAI,MAAkD,CAAA;IAEtD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,MAAM,KAAK,GAAG,IAAA,2CAA2B,GAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;QACrF,MAAM,GAAG,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAA;IACjC,CAAC;SAAM,CAAC;QACN,4EAA4E;QAC5E,wEAAwE;QACxE,gBAAgB;QAChB,MAAM,GAAG,IAAA,2CAA2B,GAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAA;IACpE,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,kBAAW,CAAC,+CAA+C,EAAE,GAAG,CAAC,CAAA;IAC7E,CAAC;IAED,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,aAAa,CAAA;IAC5C,CAAC;IAED,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAA;IACtD,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAEM,KAAK,UAAU,gBAAgB,CACpC,IAAsF,EACtF,GAAW,EACX,aAAsB;IAEtB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAA;IAE9B,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAA;QAC5B,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAA;QACzB,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAA;QACzB,QAAQ,CAAC,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAA;IACnD,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,IAAA,+BAAqB,EAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;IAE3F;;;;;;OAMG;IACH,IAAI,UAAmC,CAAA;IACvC,IAAI,YAAY,EAAE,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,WAAW,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QAC9E,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAA;IACrC,CAAC;IAED,MAAM,eAAe,GAAG,YAAY,EAAE,MAAM,EAAE,gBAAgB,CAAA;IAC9D,MAAM,YAAY,GAAG,YAAY;QAC/B,CAAC,CAAC,IAAA,iCAA0B,EAAC,YAAY,EAAE,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,gBAAgB;QACxF,CAAC,CAAC,SAAS,CAAA;IAEb,MAAM,eAAe,GAAG,YAAY,IAAI,eAAe,CAAA;IACvD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAA;IAEnC,IAAI,eAAe,EAAE,CAAC;QACpB,IAAI,CAAC,QAAQ,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,CACvC,eAAe,EACf,IAAI,CAAC,QAAQ,CAAC,gBAAgB,IAAI,IAAI,CACvC,CAAA;IACH,CAAC;IAED;;;;;;;OAOG;IAEH,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,IAAA,mBAAU,EAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAA;QAC7E,MAAM,OAAO,GAAG,IAAA,0BAAe,EAAC,OAAO,EAAE,KAAK,CAAC,CAAA;QAC/C,IAAI,CAAC,KAAK,GAAG,MAAM,IAAA,yBAAgB,EACjC;YACE,GAAG,QAAQ;YACX,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,QAAQ,CAAC,GAAG;YACtB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,EAAE;YACjC,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,EAAE;YACjC,gBAAgB,EAAE,QAAQ,CAAC,gBAAgB;SAC5C,EACD,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,EACzB,OAAO,CACR,CAAA;QAED,yEAAyE;QACzE,6EAA6E;QAC7E,8EAA8E;QAC9E,sEAAsE;QACtE,0DAA0D;QAC1D,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,WAAW,CAAA;YAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,MAAM,CAAA;YACjC,IAAI,MAAM,IAAI,OAAO,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;gBAC5C,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,cAAc;oBACxC,CAAC,CAAC,EAAE;oBACJ,CAAC,CAAC,MAAM,IAAA,sBAAc,EAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;gBAC1D,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;oBACpB,MAAM,KAAK,GAAG,CAAC,oBAAoB,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;oBAC1F,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAA;gBAClF,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,gCAAgC,CAAC,CAAA;QACrD,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,QAAQ,EAAE,aAAa,EAAE,CAAC;QACjC,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAA;IACnD,CAAC;IAED,IAAI,IAAI,CAAC,QAAQ,EAAE,gBAAgB,EAAE,CAAC;QACpC,IAAI,CAAC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAA;IAC7D,CAAC;IAED,IAAI,IAAI,CAAC,QAAQ,EAAE,aAAa,EAAE,CAAC;QACjC,IAAI,CAAC,QAAQ,CAAC,aAAa,GAAG,IAAA,iBAAU,EAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAA;IACvE,CAAC;IAED,IAAI,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,CAAC;QAC9B,IAAI,CAAC,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU;aAChD,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;aAClE,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAA;IAC7B,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,IAAA,mBAAU,EAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;IACxF,MAAM,OAAO,GAAG,IAAA,0BAAe,EAAC,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,CAAC,CAAA;IACrE,MAAM,OAAO,GAAG,kBAAQ,CAAC,OAAO,CAAC,CAAA;IAEjC;;;OAGG;IAEH,MAAM,MAAM,GAAG,MAAM,IAAA,uBAAc,EAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IAE1E,MAAM,IAAI,GAAG,OAAO,CAClB;QACE,IAAI,CAAC,KAAK,CAAC,UAAU;QACrB,IAAI,CAAC,KAAK,CAAC,QAAQ;QACnB,IAAI,CAAC,KAAK,CAAC,MAAM;QACjB,IAAI,CAAC,KAAK,CAAC,YAAY;QACvB,IAAI,CAAC,KAAK,CAAC,GAAG;QACd,IAAI,CAAC,KAAK,CAAC,OAAO;KACnB;SACE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;SAClB,IAAI,CAAC,IAAI,CAAC,CACd,CAAA;IAED,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,YAAY,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAA;IACpE,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAA,2BAAiB,EAAC,OAAO,CAAC,CAAA;IACvD,MAAM,cAAc,GAAG,IAAA,6BAAmB,EAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IACxD,MAAM,MAAM,GAAG,OAAO,CAAC;QACrB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,GAAG,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE;QACxB,GAAG;QACH,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;QACzC,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,cAAc;QACd,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,aAAa;QACpB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,YAAY;QACZ,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,UAAU,EAAE,UAAU,IAAI,IAAI,CAAC,UAAU;QACzC,YAAY;QACZ,OAAO;QACP,UAAU,EAAE,IAAI,CAAC,UAAU;KAC5B,CAAC,CAAA;IAEF,MAAM,QAAQ,GAAG,IAAA,uBAAe,EAAC,IAAI,CAAC,IAAW,EAAE,CAAC,CAAC,aAAa,EAAE,IAAA,8BAAc,GAAE,CAAC,CAAA;IACrF,MAAM,WAAW,GAAG,qBAAa,CAAC,UAAU,CAC1C;QACE,IAAI,EAAE,MAAM;QACZ,QAAQ;QACR,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;QACjD,QAAQ,EAAE,aAAa;QACvB,SAAS,EAAE,IAAI,CAAC,SAAS;KAC1B,EACD,GAAG,EAAE,CAAC,MAAM,CACb,CAAA;IAED,OAAO;QACL,MAAM,EAAE,WAAW;QACnB,OAAO;QACP,QAAQ,EAAE,GAAG;QACb,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,IAAI;QACJ,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,IAAI,EAAE,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU;KACxC,CAAA;AACH,CAAC;AAEM,KAAK,UAAU,mBAAmB,CACvC,IAAoB,EACpB,QAAgB,EAChB,GAA+C;IAE/C,MAAM,eAAe,GAAG,QAAQ,KAAK,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;IACrF,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,MAAM,aAAM,CAAC,SAAS,CAAA;IACxB,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,UAAK,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACnD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,aAAM,CAAC,SAAS,CAAA;IACxB,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,UAAK,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAElF,MAAM,IAAI,GAAG,MAAM,UAAK,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,CAAA;IAC/E,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,kBAAW,CAAC,qBAAqB,EAAE,GAAG,CAAC,CAAA;IACnD,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,IAAA,mBAAU,EAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAA;IAEtD,MAAM,WAAW,GAAG,MAAM,qBAAqB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;IACpE,MAAM,QAAQ,GAAG,IAAA,6BAAmB,EAAC,WAAW,EAAE,OAAO,CAAC,CAAA;IAE1D,+EAA+E;IAC/E,4EAA4E;IAC5E,MAAM,gBAAgB,GAAG,IAAA,wBAAe,EAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAA;IAExD,IAAI,WAAW,CAAC,gBAAgB,EAAE,CAAC;QACjC,IAAI,IAAA,6BAAiB,EAAC,WAAW,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACpD,WAAW,CAAC,QAAQ,GAAG,qBAAS,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAA;QAChE,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,GAAG,MAAM,UAAK,CAAC,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAA;YAC9E,IAAI,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;gBACrC,WAAW,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAA;YAC1C,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAA;AAC3F,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,IAAoB,EACpB,IAAoB,EACpB,OAAkB,EAClB,KAAe;IAEf,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,IAAI,IAAA,yBAAe,EAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YACpC,OAAO,EAAE,GAAG,wBAAc,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,6BAA6B,EAAE,CAAA;QAClF,CAAC;QAED,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,IAAI,CAAC,WAAW;gBAAE,OAAO,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,wBAAwB,EAAE,CAAA;YACnF,OAAO,EAAE,GAAG,IAAA,2BAAiB,EAAC,OAAO,CAAC,EAAE,GAAG,EAAE,gBAAgB,EAAE,CAAA;QACjE,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,UAAK,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAChE,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,GAAG,GAAG,4BAA4B,CAAA;YACzC,OAAO,MAAM,CAAA;QACf,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,uBAAuB,CAAA;QACtE,OAAO,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAA;IACrC,CAAC;IAED,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,IAAI,IAAA,yBAAe,EAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;YACxC,OAAO,EAAE,GAAG,wBAAc,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE,iCAAiC,EAAE,CAAA;QAC1F,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,UAAK,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;QACpE,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,GAAG,GAAG,gCAAgC,CAAA;YAC7C,OAAO,MAAM,CAAA;QACf,CAAC;IACH,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,OAAO,CAAC,CAAA;IACpD,IAAI,aAAa,EAAE,CAAC;QAClB,IAAI,IAAA,yBAAe,EAAC,aAAa,CAAC,EAAE,CAAC;YACnC,OAAO;gBACL,GAAG,wBAAc,CAAC,aAAa,CAAC;gBAChC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,wBAAwB;aACzD,CAAA;QACH,CAAC;QAED,oDAAoD;QACpD,4CAA4C;QAC5C,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,EAAE,GAAG,IAAA,2BAAiB,EAAC,OAAO,CAAC,EAAE,GAAG,EAAE,gBAAgB,EAAE,CAAA;QACjE,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,UAAK,CAAC,OAAO,CAAC,aAAa,CAAC,aAAa,CAAC,CAAA;QAC/D,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,GAAG,GAAG,qBAAqB,CAAA;YAClC,OAAO,MAAM,CAAA;QACf,CAAC;IACH,CAAC;IAED,OAAO;QACL,GAAG,IAAA,2BAAiB,EAAC,OAAO,CAAC;QAC7B,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,oBAAoB;KAC1D,CAAA;AACH,CAAC"} \ No newline at end of file diff --git a/srv/adapter/generate.ts b/srv/adapter/generate.ts index a1c4341e..a008bd4d 100644 --- a/srv/adapter/generate.ts +++ b/srv/adapter/generate.ts @@ -22,16 +22,18 @@ import needle from 'needle' import { HORDE_GUEST_KEY } from '../api/horde' import { getTokenCounter } from '../tokenize' import { getAppConfig } from '../api/settings' -import { getHandlers, getSubscriptionPreset, handlers } from './agnaistic' -import { deepClone, getSubscriptionModelLimits, parseStops, tryParse } from '/common/util' +import { getHandlers, getSubscriptionPreset, handlers } from './charluv' +import { getSubscriptionModelLimits, parseStops, tryParse } from '/common/util' import { isDefaultTemplate, templates } from '/common/presets/templates' import { GuidanceParams, calculateGuidanceCounts, runGuidance, } from '/common/guidance/guidance-parser' -import { getCachedSubscriptionModels } from '../db/subscriptions' +import { getCachedSubscriptionModels, getCachedTiers } from '../db/subscriptions' +import { inferenceGate, priorityForUser } from '../queue' import { sendOne } from '../api/ws' +import { recallMemories } from '../memory/store' import { ResponseSchema } from '/common/types/library' let version = '' @@ -81,9 +83,25 @@ export type InferenceRequest = { reguidance?: string[] imageData?: string + images?: string[] + + /** + * Leading `system` message for chat-completion calls. Overrides the served + * model's default chat-template system prompt (the companion/LEVEL preamble) + * so utility calls like publish moderation aren't answered in-character. + */ + system?: string + + /** + * Route this call to the dedicated moderation endpoint (original vision model) + * instead of the user-facing chat model. Set by the publish/edit moderation path. + */ + moderation?: boolean jsonSchema?: any jsonValues?: Record + /** Queue priority: 0 premium, 1 free, 2 guest, 3 background. Defaults to 3 (utility). */ + queuePriority?: number } export async function inferenceAsync(opts: InferenceRequest) { @@ -134,7 +152,7 @@ export async function inferenceAsync(opts: InferenceRequest) { if ( opts.guidance && - (opts.settings?.service === 'horde' || opts.settings?.service === 'agnaistic') + (opts.settings?.service === 'horde' || opts.settings?.service === 'charluv') ) { try { const values = JSON.parse(generated) @@ -207,12 +225,26 @@ export async function guidanceAsync(opts: InferenceRequest) { } export async function createInferenceStream(opts: InferenceRequest) { - const settings = await getRequestPreset(opts) + // getRequestPreset can return a SHARED cached preset object, so clone before + // applying any per-request override — otherwise stop/temp/maxTokens leak into + // the cache and affect every other request. (This also makes opts.temp / + // opts.maxTokens actually take effect: they were declared but never applied, so + // callers like the event director ran at the default temp instead of the 0.2 + // election / 0.7 world-beat temps they asked for.) + const settings = { ...(await getRequestPreset(opts)) } if (opts.stop) { settings.stopSequences = opts.stop } + if (opts.temp !== undefined) { + settings.temp = opts.temp + } + + if (opts.maxTokens !== undefined) { + settings.maxTokens = opts.maxTokens + } + const handler = getHandlers(settings) const stream = handler({ kind: 'plain', @@ -237,10 +269,24 @@ export async function createInferenceStream(opts: InferenceRequest) { lists: opts.lists, jsonSchema: opts.jsonSchema, imageData: opts.imageData, + images: opts.images, + system: opts.system, + moderation: opts.moderation, jsonValues: opts.jsonValues, }) - return { stream, service: settings.service || '' } + const gated = inferenceGate.gateStream( + { + kind: 'text', + priority: (opts.queuePriority ?? 3) as any, + userId: opts.guest ? undefined : opts.user?._id, + socketId: opts.guest, + requestId: opts.requestId, + }, + () => stream + ) + + return { stream: gated, service: settings.service || '' } } async function getRequestPreset(opts: InferenceRequest) { @@ -248,26 +294,12 @@ async function getRequestPreset(opts: InferenceRequest) { if (opts.settings) { const model = getCachedSubscriptionModels().find((m) => m._id === opts.settings?._id) - if (model) { - preset = model - } else { - preset = opts.settings - } - } else if (opts.user.defaultPreset) { - if (isDefaultPreset(opts.user.defaultPreset)) { - preset = deepClone(defaultPresets[opts.user.defaultPreset]) - } - - const user = await store.presets.getUserPreset(opts.user.defaultPreset) - if (user) { - preset = user - } + preset = model || opts.settings } else { - const models = getCachedSubscriptionModels() - const model = models.find((m) => m.isDefaultSub) - if (model) { - preset = model - } + // Custom user presets are retired — inference always runs on the platform's + // default subscription model (the self-hosted endpoint), never a user's + // saved preset. + preset = getCachedSubscriptionModels().find((m) => m.isDefaultSub) } if (!preset) { @@ -358,6 +390,28 @@ export async function createChatStream( [...opts.lines].reverse(), encoder ) + + // RAG: recall long-term memories relevant to the recent conversation and + // inject them into the {{memory}} slot (additive to any book memory). Scoped + // to the chat owner + the SPEAKING character (replyAs) so each companion only + // recalls its own memories — in a multi-char/event chat the main char + // (chat.characterId) is not necessarily the one replying. + try { + const charId = opts.replyAs?._id || opts.chat?.characterId + const ownerId = opts.chat?.userId + if (charId && ownerId && opts.lines?.length) { + const query = [...opts.lines].slice(-3).join('\n') + const memories = opts.chat?.memoryDisabled + ? [] + : await recallMemories(ownerId, charId, query, { k: 5 }) + if (memories.length) { + const block = ['What you remember:'].concat(memories.map((m) => `- ${m.text}`)).join('\n') + opts.parts.memory = opts.parts.memory ? `${opts.parts.memory}\n${block}` : block + } + } + } catch (err) { + log.warn({ err }, 'Long-term memory recall failed') + } } if (opts.settings?.thirdPartyUrl) { @@ -435,8 +489,20 @@ export async function createChatStream( jsonValues: opts.jsonValues, }) + const priority = priorityForUser(opts.user as any, !!guestSocketId, getCachedTiers()) + const gatedStream = inferenceGate.gateStream( + { + kind: 'text', + priority, + userId: guestSocketId ? undefined : opts.user._id, + socketId: guestSocketId, + requestId: opts.requestId, + }, + () => stream + ) + return { - stream, + stream: gatedStream, adapter, settings: gen, user: opts.user, @@ -473,10 +539,9 @@ export async function getResponseEntities( const genSettings = await getGenerationSettings(user, chat, adapter) const settings = mapPresetsToAdapter(genSettings, adapter) - const chatScenarios = chat.scenarioIds - ? await store.scenario.getScenariosById(chat.scenarioIds) - : [] - const resolvedScenario = resolveScenario(chat, char, chatScenarios) + // Scenario books (the retired event state-machine) no longer feed the prompt — + // resolveScenario only uses the character's/chat's plain-text scenario now. + const resolvedScenario = resolveScenario(chat, char, []) if (genSettings.promptTemplateId) { if (isDefaultTemplate(genSettings.promptTemplateId)) { diff --git a/srv/adapter/goose.ts b/srv/adapter/goose.ts deleted file mode 100644 index 0da02dee..00000000 --- a/srv/adapter/goose.ts +++ /dev/null @@ -1,120 +0,0 @@ -import needle from 'needle' -import { decryptText } from '../db/util' -import { registerAdapter } from './register' -import { ModelAdapter } from './type' -import { GOOSE_ENGINES } from '/common/adapters' -import { logger } from '../middleware' -import { sanitise, trimResponseV2 } from '/common/requests/util' - -const baseUrl = 'https://api.goose.ai/v1' - -export const handleGooseAI: ModelAdapter = async function* (opts) { - const { log } = opts - const config = opts.user.adapterConfig?.goose - if (!config) { - yield { error: `GooseAI request failed: No config` } - return - } - - const key = config.apiKey ? (opts.guest ? config.apiKey : decryptText(config.apiKey)) : null - if (!key) { - yield { error: `GooseAI request failed: No API key set` } - return - } - - const body = { - prompt: opts.prompt, - n: 1, - max_tokens: opts.gen.maxTokens, - temperature: opts.gen.temp, - top_p: opts.gen.topP, - top_k: opts.gen.topK, - top_a: opts.gen.topA, - typical_p: opts.gen.typicalP, - presence_penalty: opts.gen.presencePenalty, - frequency_penalty: opts.gen.frequencyPenalty, - repetition_penalty: opts.gen.repetitionPenalty, - repetition_penalty_slope: opts.gen.repetitionPenaltySlope, - repetition_penalty_range: opts.gen.repetitionPenaltyRange, - } - - yield { prompt: body.prompt } - - logger.debug({ ...body, prompt: null }, 'Goose payload') - logger.debug(`Prompt:\n${body.prompt}`) - - const url = `${baseUrl}/engines/${config.engine}/completions` - const resp = await needle('post', url, JSON.stringify(body), { - json: true, - headers: { Authorization: `Bearer ${key}` }, - }).catch((err) => ({ error: err })) - - if ('error' in resp) { - log.error({ error: resp.error }, 'GooseAI failed to send') - yield { error: `GooseAI request failed: ${resp.error?.message || resp.error}` } - return - } - - if (resp.statusCode && resp.statusCode >= 400) { - log.error({ body: resp.body }, `GooseAI request failed (${resp.statusCode})`) - const msg = - resp.body?.error?.message || resp.body.message || resp.statusMessage || 'Unknown error' - - yield { - error: `GooseAI request failed (${resp.statusCode}): ${msg}`, - } - return - } - - try { - let text = resp.body.choices[0].text - if (!text) { - log.error({ body: resp.body }, 'GooseAI request failed: Empty response') - yield { error: `GooseAI request failed: Received empty response. Try again.` } - return - } - const parsed = sanitise(text.replace(opts.prompt, '')) - const trimmed = trimResponseV2(parsed, opts.replyAs, opts.members, opts.characters, [ - 'END_OF_DIALOG', - ]) - yield trimmed || parsed - } catch (ex: any) { - log.error({ err: ex }, 'GooseAI failed to parse') - yield { error: `GooseAI request failed: ${ex.message}` } - return - } -} - -const engines = Object.entries(GOOSE_ENGINES).map(([value, label]) => ({ value, label })) - -registerAdapter('goose', handleGooseAI, { - label: 'Goose AI', - settings: [ - { - field: 'apiKey', - label: 'API Key', - secret: true, - setting: { type: 'text', placeholder: 'E.g. sk-tJoOs94T...' }, - }, - { - field: 'engine', - label: 'Engine', - helperText: 'GooseAI Engine (Model)', - secret: false, - setting: { type: 'list', options: engines }, - preset: true, - }, - ], - options: [ - 'temp', - 'presencePenalty', - 'repetitionPenalty', - 'topA', - 'typicalP', - 'topK', - 'tailFreeSampling', - 'repetitionPenaltySlope', - 'repetitionPenaltyRange', - 'topP', - ], -}) diff --git a/srv/adapter/horde.ts b/srv/adapter/horde.ts index ff060a1e..9478f37d 100644 --- a/srv/adapter/horde.ts +++ b/srv/adapter/horde.ts @@ -1,16 +1,16 @@ import * as horde from '../../common/horde-gen' -import { HORDE_GUEST_KEY, getHordeModels } from '../api/horde' +import { HORDE_GUEST_KEY } from '../api/horde' import { sendOne } from '../api/ws' -import { decryptText } from '../db/util' import { config } from '../config' -const { hordeKeyPremium } = config import { logger } from '../middleware' import { ModelAdapter } from './type' import { sanitise, trimResponseV2 } from '/common/requests/util' -import { toArray } from '/common/util' import { AppSchema } from '/common/types' import { store } from '../db' import { isConnected } from '../db/client' +import { validateGenerationGate } from './gate' + +const { hordeKeyPremium } = config export const handleHorde: ModelAdapter = async function* ({ char, @@ -32,72 +32,30 @@ export const handleHorde: ModelAdapter = async function* ({ yield { prompt } - let newLevel = await store.users.validateSubscription(user) - - if ( - 'subscription' in opts === false || - opts.subscription === undefined || - newLevel === undefined - ) { + if ('subscription' in opts === false || opts.subscription === undefined) { opts.subscription = await getSubscriptionPreset(user, false, gen) } - if (!opts.subscription || !opts.subscription.preset) { - yield { error: 'Subscriptions are not enabled' } - return - } - - if (opts.subscription.error) { - yield { error: opts.subscription.error } - return - } - - if (opts.subscription.warning) { - yield { warning: opts.subscription.warning } - } - const level = opts.subscription.level ?? -1 - const preset = opts.subscription.preset - - if (newLevel === undefined) { - newLevel = -1 - } - - if (newLevel instanceof Error) { - yield { error: newLevel.message } + const gate = await validateGenerationGate({ + user, + guest, + subscription: opts.subscription, + log: opts.log, + }) + if (gate.error) { + yield { error: gate.error } return } - - if (preset.subLevel > -1 && preset.subLevel > newLevel) { - opts.log.error( - { - preset: preset.name, - presetLevel: preset.subLevel, - newLevel, - userLevel: user.sub?.level, - }, - `Subscription insufficient` - ) - yield { error: 'Your account is ineligible for this model - Subscription tier insufficient' } - return + if (gate.warning) { + yield { warning: gate.warning } } - if (!preset.allowGuestUsage && guest) { - yield { error: 'Please sign in to use this model' } + if (!opts.subscription?.preset) { + yield { error: 'Subscriptions are not enabled' } return } - const models = getHordeModels() - const userModels = toArray('') - - const modelsMatch = models - .filter((m) => { - const lowered = m.name.toLowerCase() - for (const um of userModels) { - if (lowered.includes(um.toLowerCase())) return true - } - return false - }) - .map((m) => m.name) + const preset = opts.subscription.preset // Max tokens and max context limit are decided by the subscription preset // We've already set the max context length prior to calling this handler @@ -160,7 +118,7 @@ export async function getSubscriptionPreset( let preset const fallback = await store.subs.getDefaultSubscription() if (gen.registered) { - const subId = gen.registered?.agnaistic?.subscriptionId + const subId = gen.registered?.charluv?.subscriptionId preset = subId ? await store.subs.getSubscription(subId) : fallback } if (user?.premium && !user.sub?.level) { diff --git a/srv/adapter/mancer.ts b/srv/adapter/mancer.ts deleted file mode 100644 index eaea8246..00000000 --- a/srv/adapter/mancer.ts +++ /dev/null @@ -1,195 +0,0 @@ -import needle from 'needle' -import { ModelAdapter } from './type' -import { decryptText } from '../db/util' -import { registerAdapter } from './register' -import { getStoppingStrings } from './prompt' -import { sanitise, trimResponseV2 } from '/common/requests/util' - -const mancerOptions: Record = { - 'OpenAssistant ORCA': 'https://neuro.mancer.tech/webui/oa-orca/api', - 'Wizard Vicuna': 'https://neuro.mancer.tech/webui/wizvic/api', -} - -let modelCache: MancerModel[] - -export type MancerModel = { - id: string - name: string - perTokenOutput: number - perTokenPrompt: number - paidOnly: boolean - context: number - online: boolean - hasDocs: boolean - streaming: boolean - description: string -} - -const modelOptions = Object.entries(mancerOptions).map(([label, value]) => ({ label, value })) - -export const handleMancer: ModelAdapter = async function* (opts) { - const body = { - prompt: opts.prompt, - add_bos_token: opts.gen.addBosToken ?? false, - ban_eos_token: opts.gen.banEosToken ?? false, - do_sample: true, - max_new_tokens: opts.gen.maxTokens, - temperature: opts.gen.temp, - top_a: opts.gen.topA, - top_k: opts.gen.topK, - top_p: opts.gen.topP, - length_penalty: 1, - truncation_length: opts.gen.maxContextLength, - typical_p: opts.gen.typicalP, - encoder_repetition_penalty: opts.gen.encoderRepitionPenalty, - repetition_penalty: opts.gen.repetitionPenalty, - repetition_penalty_range: opts.gen.repetitionPenaltyRange, - skip_special_tokens: true, - tfs: opts.gen.tailFreeSampling, - penalty_alpha: opts.gen.penaltyAlpha, - num_beams: 1, - seed: -1, - stop: getStoppingStrings(opts), - } - - const url = - opts.gen.registered?.mancer?.urlOverride || - opts.gen.registered?.mancer?.url || - opts.gen.registered?.mancer?.model || - opts.user.adapterConfig?.mancer?.altUrl || - opts.user.adapterConfig?.mancer?.url - - if (!url) { - yield { error: `Mancer request failed: Model/URL not set` } - return - } - - const key = opts.user.adapterConfig?.mancer?.apiKey - if (!key) { - yield { error: `Mancer request failed: API key not set` } - return - } - - const apiKey = opts.guest ? key : decryptText(key) - opts.log.debug({ ...body, prompt: null }, 'Mancer payload') - opts.log.debug(`Prompt:\n${body.prompt}`) - yield { prompt: body.prompt } - - const headers = { - 'Content-Type': 'application/json', - 'X-API-KEY': apiKey, - } - - const resp = await needle('post', `${url}/v1/generate`, body, { - json: true, - headers, - }).catch((error) => ({ error })) - - if ('error' in resp) { - opts.log.error({ err: resp.error }) - yield { error: `Mancer request failed: ${resp.error?.message || resp.error}` } - return - } - - if (resp.statusCode && resp.statusCode >= 400) { - opts.log.error({ err: resp.body }, `Mancer request failed [${resp.statusCode}]`) - yield { - error: `Mancer request failed (${resp.statusCode}) ${ - resp.body.error || resp.body.message || resp.statusMessage - }`, - } - return - } - - try { - const text = resp.body.results?.[0]?.text - if (!text) { - yield { - error: `Mancer request failed: Received empty response. Try again.`, - } - return - } - yield { meta: { 'credits-spent': resp.body['x-spent-credits'] } } - const parsed = sanitise(text.replace(opts.prompt, '')) - const trimmed = trimResponseV2(parsed, opts.replyAs, opts.members, opts.characters, [ - 'END_OF_DIALOG', - ]) - yield trimmed || parsed - } catch (ex: any) { - yield { error: `Mancer request failed: ${ex.message}` } - return - } -} - -registerAdapter('mancer', handleMancer, { - label: 'Mancer', - settings: [ - { - field: 'url', - label: 'Model', - secret: false, - setting: { type: 'list', options: modelOptions }, - preset: true, - }, - { - field: 'urlOverride', - label: 'URL Override (See: https://mancer.tech/models.html)', - helperText: - '(Optional) Overrides the URL from the model selected above - Leave empty if unsure.', - secret: false, - setting: { type: 'text', placeholder: 'https://neuro.mancer.tech/webui/...../api' }, - preset: true, - }, - { - field: 'apiKey', - label: 'API Key', - secret: true, - setting: { type: 'text', placeholder: 'E.g. mcr-ahjk7dD2...' }, - }, - ], - options: [ - 'temp', - 'addBosToken', - 'banEosToken', - 'repetitionPenalty', - 'repetitionPenaltyRange', - 'encoderRepitionPenalty', - 'frequencyPenalty', - 'gaslight', - 'topA', - 'topP', - 'topK', - 'typicalP', - 'penaltyAlpha', - ], -}) - -export async function getMancerModels() { - if (modelCache) return modelCache - - try { - const res = await needle('get', 'https://mancer.tech/internal/api/models', {}) - if (res.body) { - modelCache = res.body.models - - modelOptions.length = 0 - for (const model of res.body.models as MancerModel[]) { - const url = `https://neuro.mancer.tech/webui/${model.id}/api` - mancerOptions[model.name] = url - modelOptions.push({ - label: `${model.paidOnly ? '(Paid) ' : ''} ${model.name} (${ - model.perTokenOutput - }cr/out + ${model.perTokenPrompt}/prompt)`, - value: url, - }) - } - } - - return modelCache - } catch (ex) { - return modelCache || [] - } -} - -setInterval(getMancerModels, 60000 * 2) -getMancerModels() diff --git a/srv/adapter/novel-bad-words.ts b/srv/adapter/novel-bad-words.ts deleted file mode 100644 index d07b1320..00000000 --- a/srv/adapter/novel-bad-words.ts +++ /dev/null @@ -1,328 +0,0 @@ -export const badWordIds = [ - [60], - [62], - [544], - [683], - [696], - [880], - [905], - [1008], - [1019], - [1084], - [1092], - [1181], - [1184], - [1254], - [1447], - [1570], - [1656], - [2194], - [2470], - [2479], - [2498], - [2947], - [3138], - [3291], - [3455], - [3725], - [3851], - [3891], - [3921], - [3951], - [4207], - [4299], - [4622], - [4681], - [5013], - [5032], - [5180], - [5218], - [5290], - [5413], - [5456], - [5709], - [5749], - [5774], - [6038], - [6257], - [6334], - [6660], - [6904], - [7082], - [7086], - [7254], - [7444], - [7748], - [8001], - [8088], - [8168], - [8562], - [8605], - [8795], - [8850], - [9014], - [9102], - [9259], - [9318], - [9336], - [9502], - [9686], - [9793], - [9855], - [9899], - [9955], - [10148], - [10174], - [10943], - [11326], - [11337], - [11661], - [12004], - [12084], - [12159], - [12520], - [12977], - [13380], - [13488], - [13663], - [13811], - [13976], - [14412], - [14598], - [14767], - [15640], - [15707], - [15775], - [15830], - [16079], - [16354], - [16369], - [16445], - [16595], - [16614], - [16731], - [16943], - [17278], - [17281], - [17548], - [17555], - [17981], - [18022], - [18095], - [18297], - [18413], - [18736], - [18772], - [18990], - [19181], - [20095], - [20197], - [20481], - [20629], - [20871], - [20879], - [20924], - [20977], - [21375], - [21382], - [21391], - [21687], - [21810], - [21828], - [21938], - [22367], - [22372], - [22734], - [23405], - [23505], - [23734], - [23741], - [23781], - [24237], - [24254], - [24345], - [24430], - [25416], - [25896], - [26119], - [26635], - [26842], - [26991], - [26997], - [27075], - [27114], - [27468], - [27501], - [27618], - [27655], - [27720], - [27829], - [28052], - [28118], - [28231], - [28532], - [28571], - [28591], - [28653], - [29013], - [29547], - [29650], - [29925], - [30522], - [30537], - [30996], - [31011], - [31053], - [31096], - [31148], - [31258], - [31350], - [31379], - [31422], - [31789], - [31830], - [32214], - [32666], - [32871], - [33094], - [33376], - [33440], - [33805], - [34368], - [34398], - [34417], - [34418], - [34419], - [34476], - [34494], - [34607], - [34758], - [34761], - [34904], - [34993], - [35117], - [35138], - [35237], - [35487], - [35830], - [35869], - [36033], - [36134], - [36320], - [36399], - [36487], - [36586], - [36676], - [36692], - [36786], - [37077], - [37594], - [37596], - [37786], - [37982], - [38475], - [38791], - [39083], - [39258], - [39487], - [39822], - [40116], - [40125], - [41000], - [41018], - [41256], - [41305], - [41361], - [41447], - [41449], - [41512], - [41604], - [42041], - [42274], - [42368], - [42696], - [42767], - [42804], - [42854], - [42944], - [42989], - [43134], - [43144], - [43189], - [43521], - [43782], - [44082], - [44162], - [44270], - [44308], - [44479], - [44524], - [44965], - [45114], - [45301], - [45382], - [45443], - [45472], - [45488], - [45507], - [45564], - [45662], - [46265], - [46267], - [46275], - [46295], - [46462], - [46468], - [46576], - [46694], - [47093], - [47384], - [47389], - [47446], - [47552], - [47686], - [47744], - [47916], - [48064], - [48167], - [48392], - [48471], - [48664], - [48701], - [49021], - [49193], - [49236], - [49550], - [49694], - [49806], - [49824], - [50001], - [50256], - [0], - [1], -] - -export const clioBadWordsId = [ - [3], - [49356], - [1431], - [31715], - [34387], - [20765], - [30702], - [10691], - [49333], - [1266], - [19438], - [43145], - [26523], - [41471], - [2936], -] - -export const penaltyWhitelist = [ - 49256, 49264, 49231, 49230, 49287, 85, 49255, 49399, 49262, 336, 333, 432, 363, 468, 492, 745, - 401, 426, 623, 794, 1096, 2919, 2072, 7379, 1259, 2110, 620, 526, 487, 16562, 603, 805, 761, 2681, - 942, 8917, 653, 3513, 506, 5301, 562, 5010, 614, 10942, 539, 2976, 462, 5189, 567, 2032, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 588, 803, 1040, 49209, 4, 5, 6, 7, 8, 9, 10, 11, 12, -] diff --git a/srv/adapter/novel.ts b/srv/adapter/novel.ts deleted file mode 100644 index 9c12eaa0..00000000 --- a/srv/adapter/novel.ts +++ /dev/null @@ -1,327 +0,0 @@ -import needle from 'needle' -import { decryptText } from '../db/util' -import { sanitise, sanitiseAndTrim, trimResponseV2 } from '/common/requests/util' -import { badWordIds, clioBadWordsId, penaltyWhitelist } from './novel-bad-words' -import { ModelAdapter } from './type' -import { AppSchema } from '../../common/types/schema' -import { NOVEL_ALIASES, NOVEL_MODELS } from '/common/adapters' -import { requestStream } from './stream' -import { AppLog } from '../middleware' -import { getEncoder } from '../tokenize' -import { toSamplerOrder } from '/common/sampler-order' -import { getStoppingStrings } from './prompt' - -export const NOVEL_BASEURL = `https://api.novelai.net` -const NOVEL_TEXT_URL = `https://text.novelai.net` // use text.novelai.net when the new API allows >150 response tokens. - -const novelUrl = (model: string) => `${getBaseUrl(model)}/ai/generate` -const streamUrl = (model: string) => `${getBaseUrl(model)}/ai/generate-stream` - -/** - * Samplers: - * 0. Temperature - * 1. Top K - * 2. Nucleus Sampling (Top P) - * 3. Tail Free Sampling - * 4. Top A Sampling - * 5. Typical Sampling - * 6. CFG Scale - * 7. Top G (omitted) - * 8. Mirostat - */ - -const statuses: Record = { - 400: 'Invalid payload', - 401: 'Invalid API key', - 402: 'You need an active subscription', - 409: "You have a model selected that your subscription tier isn't eligible for", -} - -const base = { - generate_until_sentence: true, - min_length: 1, - prefix: 'vanilla', - use_cache: false, - use_string: true, - repetition_penalty_frequency: 0, - repetition_penalty_presence: 0, - bad_words_ids: badWordIds, -} - -const NEW_PARAMS: Record = { - 'llama-3-erato-v1': true, - [NOVEL_MODELS.clio_v1]: true, - [NOVEL_MODELS.kayra_v1]: true, -} - -export const handleNovel: ModelAdapter = async function* (opts) { - const { members, user, prompt, mappedSettings, guest, log } = opts - if (!user.novelApiKey) { - yield { error: 'Novel API key not set' } - return - } - - const samplers = toSamplerOrder('novel', opts.gen.order, opts.gen.disabledSamplers) - if (samplers) { - opts.gen.order = samplers.order - opts.gen.disabledSamplers = samplers.disabled - } - - const model = - NOVEL_ALIASES[opts.gen.novelModel!] || - opts.gen.novelModel || - user.novelModel || - NOVEL_MODELS.clio_v1 - - const processedPrompt = processNovelAIPrompt(prompt) - - const body = { - model, - input: processedPrompt, - parameters: NEW_PARAMS[model] ? getModernParams(opts.gen) : { ...base, ...mappedSettings }, - } - - const baseStops = getStoppingStrings(opts) - - if (opts.kind === 'plain') { - body.parameters.prefix = 'special_instruct' - body.parameters.phrase_rep_pen = 'aggressive' - } else { - const { encode } = getEncoder('novel', model) - const stops: Array = [] - const biases: any[] = [] - - for (const { bias, seq } of opts.gen.phraseBias || []) { - biases.push({ - // Range from -2 to 2 - bias: Math.min(Math.max(bias, -2), 2), - sequence: encode(seq), - generate_once: true, - ensure_sequence_finish: false, - }) - } - - body.parameters.logit_bias_exp = biases - const all = ['***', 'Scenario:', '----', '⁂'].concat(baseStops).map(encode) - - for (const stop of all) { - stops.push(stop) - } - - body.parameters.stop_sequences = stops - } - - yield { prompt: body.input } - - const endTokens = baseStops.concat(['***', 'Scenario:', '----', '⁂']) - - log.debug( - { - ...body, - input: null, - parameters: { - ...body.parameters, - bad_words_ids: null, - repetition_penalty_whitelist: null, - stop_sequences: null, - }, - }, - 'NovelAI payload' - ) - log.debug(`Prompt:\n${body.input}`) - - const headers = { - Authorization: `Bearer ${guest ? user.novelApiKey : decryptText(user.novelApiKey)}`, - } - - const maxTokens = await getMaxTokens(body.model, headers) - if (maxTokens) { - body.parameters.max_length = Math.min(body.parameters.max_length, maxTokens) - } - - const stream = - opts.kind !== 'summary' && opts.gen.streamResponse - ? streamCompletion(headers, body, log) - : fullCompletion(headers, body, log) - - let accum = '' - while (true) { - const generated = await stream.next() - - if (!generated || !generated.value) break - - if ('error' in generated.value) { - yield { error: generated.value.error } - return - } - - if ('token' in generated.value) { - accum += generated.value.token - yield { partial: sanitiseAndTrim(accum, prompt, opts.replyAs, opts.characters, members) } - } - - if ('tokens' in generated.value) { - accum = generated.value.tokens - break - } - } - - const parsed = sanitise(accum) - const trimmed = trimResponseV2(parsed, opts.replyAs, members, opts.characters, endTokens) - - yield trimmed || parsed -} - -function getModernParams(gen: Partial) { - const module = gen.temporary?.module || 'vanilla' - - const max_length = Math.min(gen.maxTokens!, 150) - const payload: any = { - temperature: gen.temp, - max_length, - min_length: 10, - top_k: gen.topK, - top_p: gen.topP, - top_a: gen.topA, - typical_p: gen.typicalP, - tail_free_sampling: gen.tailFreeSampling, - repetition_penalty: gen.repetitionPenalty, - repetition_penalty_range: gen.repetitionPenaltyRange, - repetition_penalty_slope: gen.repetitionPenaltySlope, - repetition_penalty_frequency: gen.frequencyPenalty, - repetition_penalty_presence: gen.presencePenalty, - generate_until_sentence: true, - use_cache: false, - use_string: true, - return_full_text: false, - prefix: module, - phrase_rep_pen: gen.phraseRepPenalty || 'aggressive', - order: gen.order, - bad_words_ids: clioBadWordsId, - repetition_penalty_whitelist: penaltyWhitelist, - mirostat_tau: gen.mirostatTau, - mirostat_lr: gen.mirostatLR, - } - - return payload -} - -const streamCompletion = async function* (headers: any, body: any, _log: AppLog) { - const resp = needle.post(streamUrl(body.model), body, { - parse: false, - json: true, - headers: { - ...headers, - Accept: `text/event-stream`, - }, - }) - - const tokens = [] - - try { - const events = requestStream(resp) - for await (const event of events) { - if (event.error) { - yield { error: `NovelAI streaming request failed: ${event.error}` } - return - } - - if (event.type !== 'newToken') { - continue - } - - const data = JSON.parse(event.data) as { - token: string - final: boolean - ptr: number - error?: string - } - - if (data.error) { - yield { error: `NovelAI streaming request failed: ${data.error}` } - return - } - tokens.push(data.token) - yield { token: data.token } - } - } catch (err: any) { - yield { error: `NovelAI streaming request failed: ${err.message || err}` } - return - } - - return { text: tokens.join('') } -} - -async function* fullCompletion(headers: any, body: any, log: AppLog) { - const res = await needle('post', novelUrl(body.model), body, { - json: true, - // timeout: 2000, - response_timeout: 30000, - headers, - }).catch((err) => ({ err })) - - if ('err' in res) { - log.error({ err: `Novel request failed: ${res.err?.message || res.err}` }) - yield { error: res.err.message } - return - } - - const status = res.statusCode || 0 - if (statuses[status]) { - log.error({ error: res.body }, `Novel response failed (${status})`) - yield { error: `Novel API returned an error (${statuses[status]}) ${res.body.message}` } - return - } - - if (status >= 400) { - log.error({ error: res.body }, `Novel request failed (${status})`) - yield { - error: `Novel API returned an error (${res.statusMessage!}) ${res.body.message}`, - } - return - } - - if (res.body.error) { - log.error({ error: res.body }, `Novel response failed (${status})`) - yield { error: `Novel API returned an error: ${res.body.error.message || res.body.error}` } - return - } - - return { tokens: res.body.output } -} - -function processNovelAIPrompt(prompt: string) { - return prompt.replace(/^\$/gm, '***').replace(/\n\n+/gi, '\n\n') -} - -function getBaseUrl(model: string) { - if (model === NOVEL_MODELS.kayra_v1 || model === 'llama-3-erato-v1') { - return NOVEL_TEXT_URL - } - - if (!model.includes('/')) return NOVEL_BASEURL - const url = model.split('/').slice(0, -1).join('/') - if (url.toLowerCase().startsWith('http')) return url - return `https://${url}` -} - -async function getMaxTokens(model: string, headers: any) { - try { - const config = await needle( - 'get', - 'https://api.novelai.net/user/subscription', - {}, - { json: true, headers, response_timeout: 5000 } - ) - - if (model !== 'llama-3-erato-v1' && model !== NOVEL_MODELS.kayra_v1) { - return - } - - const tier = config.body?.tier ?? 0 - if (tier !== 3) return 100 - return 150 - } catch (ex) { - return - } -} diff --git a/srv/adapter/openai.ts b/srv/adapter/openai.ts index 1f64ed88..2786d443 100644 --- a/srv/adapter/openai.ts +++ b/srv/adapter/openai.ts @@ -1,4 +1,4 @@ -import { sanitiseAndTrim } from '/common/requests/util' +import { sanitiseAndTrim, sanitise, extractSpeakerTurn } from '/common/requests/util' import { ChatRole, CompletionItem, ModelAdapter } from './type' import { defaultPresets } from '../../common/presets' import { OPENAI_CHAT_MODELS, OPENAI_MODELS } from '../../common/adapters' @@ -6,12 +6,144 @@ import { AppSchema } from '../../common/types/schema' import { config } from '../config' import { AppLog } from '../middleware' import { requestFullCompletion, toChatCompletionPayload } from './chat-completion' +import { getStoppingStrings } from './prompt' import { decryptText } from '../db/util' import { streamCompletion } from './stream' import { getTokenCounter } from '../tokenize' +import { isZImageConfigured } from '../image/zimage' +import { toJsonSchema } from '../../common/prompt' const baseUrl = `https://api.openai.com` +/** + * Native tool the model can call mid-chat to show an image (e.g. user asks + * "show me your new bike"). The backend executes it via the Z-Image endpoint + * using the character's stored LoRA, then appends the image to the reply. + */ +const IMAGE_TOOL = { + type: 'function', + function: { + name: 'generate_image', + description: + "Generate and show an image to the user. Call this when the user asks to see something visual (a selfie, an object, a scene) or when sharing an image naturally fits the roleplay. Describe what should be depicted from the character's point of view.", + parameters: { + type: 'object', + properties: { + prompt: { + type: 'string', + description: + 'A concise, comma-separated visual description of the image to generate (subject, setting, pose, lighting). Do not include the character name.', + }, + }, + required: ['prompt'], + }, + }, +} + +/** + * Native tool the model can call to durably remember a fact about the user or the + * relationship (name, preferences, promises, events). Stored in long-term memory + * and recalled (via RAG) in future chats with this character. + */ +const REMEMBER_TOOL = { + type: 'function', + function: { + name: 'remember', + description: + "Save a lasting fact so you recall it in future conversations — about {{user}} (their name, job, preferences, promises) AND about yourself, INCLUDING personal details you state or invent in the moment (e.g. your pet's name, family members, where you live, your backstory). Call this whenever you mention a new concrete personal detail or something worth remembering comes up. Do NOT use it for trivial small-talk.", + parameters: { + type: 'object', + properties: { + fact: { + type: 'string', + description: + 'A single concise, self-contained fact written in the third person, e.g. "{{user}} works as a nurse and has a dog named Max".', + }, + }, + required: ['fact'], + }, + }, +} + +/** Chat kinds where offering the tools makes sense (a fresh assistant reply). */ +const IMAGE_TOOL_KINDS = new Set([ + 'send', + 'request', + 'self', + 'send-event:world', + 'send-event:character', + 'send-event:hidden', + 'retry', +]) + +/** + * Roleplay finetunes with a name-prefilled prompt format don't reliably emit + * native tool_calls. By default we use in-band MARKERS the model writes inside + * its reply, which the server parses out. Set CHARLUV_NATIVE_TOOLS=1 to use the + * native OpenAI tools/tool_calls path instead. + */ +const NATIVE_TOOLS = process.env.CHARLUV_NATIVE_TOOLS === '1' + +/** Temperature ceiling for event/group character replies. Lowering it didn't move + * how often the model writes whole scenes (that's handled by extracting the + * speaker's turn), so this is a mild cap only. Only caps — a cooler preset is + * left as-is. */ +const EVENT_REPLY_TEMP_CAP = 0.7 + +const IMG_MARKER = /([\s\S]*?)<\/image>/gi +const MEM_MARKER = /([\s\S]*?)<\/remember>/gi + +function markerInstructions(charName: string, userName: string, image: boolean, memory: boolean) { + const lines: string[] = [] + if (image) + lines.push( + `- Share a photo with concise, comma-separated visual description, no names. ` + + `Only when ${userName} explicitly asks to see something (you, a place, an object). ` + + `Do NOT send unprompted, "here's my situation", or opening/greeting photos — wait until ${userName} asks. At most one per reply.` + ) + if (memory) + lines.push( + `- Remember a lasting detail with the fact, in third person. ` + + `Only durable facts that stay true across days and weeks — names, relationships, jobs, preferences, promises, history — about ${userName} AND about ${charName} yourself, INCLUDING details you state or invent (e.g. "${charName}'s cat is named Mochi", "${charName}'s brother is called Tom", where ${charName} lives, ${charName}'s backstory). Whenever you mention a new concrete personal detail about yourself, remember it. ` + + `Do NOT remember moment-to-moment events or the current scene — who arrived, where someone is sitting, what is happening right now (e.g. "${userName} arrived at ${charName}'s apartment" is NOT a memory). One fact per tag; skip routine chit-chat and never restate something already remembered.` + ) + if (!lines.length) return '' + // Framed as a built-in Charluv platform capability (in-world), not a meta system + // instruction — characters are far more likely to use it in-character. + return ( + `On Charluv, companions can share photos and remember things — it's a normal part of the platform:\n` + + lines.join('\n') + + `\nWrite the tag inline as a natural part of your reply (don't announce or describe doing it); the tag text is hidden from ${userName}.` + ) +} + +/** Remove marker tags (and any still-streaming unclosed/partial tag) from text. */ +function stripMarkers(text: string): string { + return text + .replace(IMG_MARKER, '') + .replace(MEM_MARKER, '') + .replace(/[\s\S]*$/i, '') + .replace(/[\s\S]*$/i, '') + .replace(/<\/?(i(mage)?|r(emember)?)?$/i, '') +} + +function parseMarkers(text: string) { + const images: string[] = [] + const facts: string[] = [] + let m: RegExpExecArray | null + IMG_MARKER.lastIndex = 0 + while ((m = IMG_MARKER.exec(text))) { + const v = m[1].trim() + if (v) images.push(v) + } + MEM_MARKER.lastIndex = 0 + while ((m = MEM_MARKER.exec(text))) { + const v = m[1].trim() + if (v) facts.push(v) + } + return { images, facts } +} + type CompletionContent = Array<{ finish_reason: string; index: number } & ({ text: string } | T)> export type Inference = { message: { content: string; role: ChatRole } } @@ -27,39 +159,116 @@ export type Completion = { export const handleOAI: ModelAdapter = async function* (opts) { const { char, members, user, prompt, log, gen, guest, kind, isThirdParty } = opts - const base = getBaseUrl(user, !!gen.thirdPartyUrlNoSuffix, isThirdParty) + // Event/group chats run entirely on the original orchestration model (the mod + // endpoint, Qwen): the chat finetune (tutu) can't keep to one character in a + // multi-character scene. Route the whole reply there, like moderation calls do. + const useModEndpoint = !!opts.moderation || opts.chat?.mode === 'event' + const base = getBaseUrl(user, !!gen.thirdPartyUrlNoSuffix, isThirdParty, useModEndpoint) const handle = opts.impersonate?.name || opts.sender?.handle || 'You' if (!user.oaiKey && !base.changed) { yield { error: `OpenAI request failed: No OpenAI API key not set. Check your settings.` } return } - const oaiModel = gen.thirdPartyModel || gen.oaiModel || defaultPresets.openai.oaiModel + // When targeting the self-hosted endpoint, the server-configured model always + // wins — that host serves a single model, so a preset's model id is irrelevant. + const oaiModel = + (base.server && + (base.mod + ? config.inference.modModel || config.inference.textModel + : config.inference.textModel)) || + gen.thirdPartyModel || + gen.oaiModel || + defaultPresets.openai.oaiModel const maxResponseLength = gen.maxTokens ?? defaultPresets.openai.maxTokens + const isEvent = opts.chat?.mode === 'event' + + // Stop the model from speaking for anyone but the elected character: "\nName:" + // for each other present character + the user, plus the Narrator/Director labels. + // Applies to events too — the mod model (Qwen) stays in one character, so cutting + // at any drift keeps the reply clean. extractSpeakerTurn below is a safety net. + const narratorStops = + opts.replyAs?.name === 'Narrator' || opts.replyAs?.name === 'Director' + ? [] + : ['\nNarrator :', '\nDirector :'] + const stopSet = new Set([`\n${handle}:`, ...narratorStops, ...getStoppingStrings(opts)]) + + // Mild temp cap for event replies (see EVENT_REPLY_TEMP_CAP). Detected via chat + // mode — the client sends kind:'send' for event turns. Director calls run via + // inferenceAsync with an empty chat, so they're unaffected. + const baseTemp = gen.temp ?? defaultPresets.openai.temp + const temperature = isEvent ? Math.min(baseTemp, EVENT_REPLY_TEMP_CAP) : baseTemp + const body: any = { model: oaiModel, stream: (gen.streamResponse && kind !== 'summary') ?? defaultPresets.openai.streamResponse, - temperature: gen.temp ?? defaultPresets.openai.temp, + temperature, max_tokens: maxResponseLength, top_p: gen.topP ?? 1, - stop: [`\n${handle}:`].concat(gen.stopSequences!), + // Filter falsy entries — a null/empty stop value makes strict OpenAI-compatible + // servers (e.g. vLLM) reject the request with HTTP 400. + stop: Array.from(stopSet).filter(Boolean), } body.presence_penalty = gen.presencePenalty ?? defaultPresets.openai.presencePenalty body.frequency_penalty = gen.frequencyPenalty ?? defaultPresets.openai.frequencyPenalty + // vLLM honours top_k / min_p as OpenAI-API extensions. Only send them to the + // self-hosted server (base.server) — real OpenAI / third-party endpoints would + // reject unknown sampler fields with HTTP 400. Omit disabled values (top_k 0, + // min_p 0) so vLLM keeps its own defaults. + if (base.server) { + if (typeof gen.topK === 'number' && gen.topK > 0) body.top_k = gen.topK + // min_p is unsupported with speculative decoding on the self-hosted endpoint. + if (!config.inference.specDecoding && typeof gen.minP === 'number' && gen.minP > 0) + body.min_p = gen.minP + + // Structured output: when the caller supplies a JSON schema (e.g. publish + // moderation), constrain the self-hosted model with vLLM guided decoding so + // the response is always valid JSON matching the schema. Without this the + // model free-forms and the verdict parse fails (which fail-closes the + // moderation check). vLLM reads `guided_json` as an OpenAI-API extension. + const guided = opts.jsonSchema ? toJsonSchema(opts.jsonSchema) : undefined + if (guided) body.guided_json = guided + } + const useChat = - (isThirdParty && gen.thirdPartyFormat === 'openai-chat') || !!OPENAI_CHAT_MODELS[oaiModel] + base.server || + (isThirdParty && gen.thirdPartyFormat === 'openai-chat') || + !!OPENAI_CHAT_MODELS[oaiModel] if (useChat) { const messages: CompletionItem[] = config.inference.flatChatCompletion - ? [{ role: 'system', content: opts.prompt }] + ? // `user` not `system`: the self-hosted endpoint rejects requests with no + // user-role message ("No user query found in messages"). + [{ role: 'user', content: opts.prompt }] : await toChatCompletionPayload( opts, getTokenCounter('openai', OPENAI_MODELS.Turbo), body.max_tokens ) + // A leading `system` message overrides the served model's default + // chat-template system prompt (the companion/LEVEL preamble). Utility calls + // like publish moderation pass `system` so the model follows the instruction + // instead of answering in-character. + if (opts.system) messages.unshift({ role: 'system', content: opts.system }) + + // Vision requests (e.g. publish moderation reviewing the avatar + gallery) + // carry one or more images. vLLM's OpenAI endpoint only sees them as + // `image_url` content parts, so fold them into the last user message — + // otherwise the check is text-only. + const visionImages = opts.images?.length ? opts.images : opts.imageData ? [opts.imageData] : [] + if (visionImages.length && messages.length) { + const target = + [...messages].reverse().find((m) => m.role === 'user') ?? messages[messages.length - 1] + const text = typeof target.content === 'string' ? target.content : '' + ;(target as any).content = [ + { type: 'text', text }, + ...visionImages.map((url) => ({ type: 'image_url', image_url: { url } })), + ] + } + body.messages = messages yield { prompt: messages } } else { @@ -67,7 +276,73 @@ export const handleOAI: ModelAdapter = async function* (opts) { yield { prompt } } - if (gen.antiBond) body.logit_bias = { 3938: -50, 11049: -50, 64186: -50, 3717: -25 } + // Offer native tools on normal assistant replies. The model decides whether to + // call them. Image tool needs Z-Image configured; the memory tool has no + // external dependency (server-side embeddings). + const replyKind = useChat && IMAGE_TOOL_KINDS.has(kind as string) + const imageToolEnabled = replyKind && isZImageConfigured() + const memoryToolEnabled = replyKind + // marker mode (default) injects instructions into the system message; native + // mode attaches OpenAI tools[]. Both feed the same downstream (meta.imageTool / + // meta.rememberFacts). + const markerMode = !NATIVE_TOOLS && (imageToolEnabled || memoryToolEnabled) + + if (NATIVE_TOOLS) { + const tools: any[] = [] + if (imageToolEnabled) tools.push(IMAGE_TOOL) + if (memoryToolEnabled) tools.push(REMEMBER_TOOL) + if (tools.length) { + body.tools = tools + body.tool_choice = 'auto' + log.debug( + { tools: tools.map((t) => t.function.name), tool_choice: body.tool_choice }, + 'tools: attached to request' + ) + } + } else if (markerMode) { + const instr = markerInstructions( + opts.replyAs?.name || char?.name || 'the character', + handle, + imageToolEnabled, + memoryToolEnabled + ) + // Prepend (not append) so it isn't read as part of the trailing ":" cue. + // Attach to the leading message regardless of its role: the system message in a + // standard chat payload, or the single user message in flatChatCompletion mode + // (the self-hosted endpoint sends one flat user message with no system message, + // so the old `role === 'system'` guard dropped the instructions entirely — which + // disabled memory and auto-image). Fall back to the /completions text prompt. + if (instr) { + const head = Array.isArray(body.messages) ? body.messages[0] : undefined + if (head && typeof head.content === 'string') { + head.content = `${instr.trim()}\n\n${head.content}` + } else if (typeof body.prompt === 'string') { + body.prompt = `${instr.trim()}\n\n${body.prompt}` + } + } + log.debug({ imageToolEnabled, memoryToolEnabled }, 'tools: marker instructions injected') + } + + // Some prompts emit a `system` message after the conversation has started + // (e.g. a post-history instruction, jailbreak, or a `System:` history line). + // Strict chat templates (Qwen on vLLM) reject this — "system messages should + // come before user/assistant messages" — and the request returns no reply. + // Demote any non-leading system message to `user` so its content still reaches + // the model in place. Leading system messages are untouched. + if (Array.isArray(body.messages)) { + let seenNonSystem = false + for (const m of body.messages as CompletionItem[]) { + if (m.role === 'system') { + if (seenNonSystem) m.role = 'user' + } else { + seenNonSystem = true + } + } + } + + // logit_bias is also unsupported with speculative decoding on the self-hosted endpoint. + if (gen.antiBond && !(base.server && config.inference.specDecoding)) + body.logit_bias = { 3938: -50, 11049: -50, 64186: -50, 3717: -25 } const useThirdPartyPassword = base.changed && isThirdParty && (gen.thirdPartyKey || user.thirdPartyPassword) @@ -77,7 +352,20 @@ export const handleOAI: ModelAdapter = async function* (opts) { : !isThirdParty ? user.oaiKey : null - const bearer = !!guest ? `Bearer ${apiKey}` : apiKey ? `Bearer ${decryptText(apiKey)}` : null + + // The server-configured self-hosted key is stored in plaintext config, not encrypted per-user. + const serverKey = base.mod + ? config.inference.modApiKey || config.inference.textApiKey + : config.inference.textApiKey + const bearer = base.server + ? serverKey + ? `Bearer ${serverKey}` + : null + : !!guest + ? `Bearer ${apiKey}` + : apiKey + ? `Bearer ${decryptText(apiKey)}` + : null const headers: any = { 'Content-Type': 'application/json', @@ -118,7 +406,8 @@ export const handleOAI: ModelAdapter = async function* (opts) { // Only the streaming generator yields individual tokens. if ('token' in generated.value) { accumulated += generated.value.token - yield { partial: sanitiseAndTrim(accumulated, prompt, char, opts.characters, members) } + const shown = markerMode ? stripMarkers(accumulated) : accumulated + yield { partial: sanitiseAndTrim(shown, prompt, char, opts.characters, members) } } } @@ -129,15 +418,93 @@ export const handleOAI: ModelAdapter = async function* (opts) { return } - if (!text?.length) { + let imagePrompt = '' + const rememberFacts: string[] = [] + + if (NATIVE_TOOLS) { + // Streaming returns tool_calls on the choice; non-streaming nests under message. + const choice0 = response?.choices?.[0] as any + const toolCalls: any[] = choice0?.tool_calls || choice0?.message?.tool_calls || [] + log.debug( + { + finish_reason: choice0?.finish_reason, + toolCallCount: toolCalls.length, + names: toolCalls.map((t: any) => t?.function?.name), + }, + 'tools: response tool_calls' + ) + if (imageToolEnabled) { + const call = toolCalls.find((t: any) => t?.function?.name === 'generate_image') + try { + const args = call?.function?.arguments ? JSON.parse(call.function.arguments) : undefined + if (typeof args?.prompt === 'string') imagePrompt = args.prompt.trim() + } catch { + log.warn({ args: call?.function?.arguments }, 'Bad generate_image tool arguments') + } + } + if (memoryToolEnabled) { + for (const t of toolCalls) { + if (t?.function?.name !== 'remember' || !t.function.arguments) continue + try { + const args = JSON.parse(t.function.arguments) + if (typeof args?.fact === 'string' && args.fact.trim()) + rememberFacts.push(args.fact.trim()) + } catch { + log.warn({ args: t.function.arguments }, 'Bad remember tool arguments') + } + } + } + } else if (markerMode && typeof text === 'string') { + // Parse in-band markers the model wrote, then strip them from the reply. + const { images, facts } = parseMarkers(text) + if (imageToolEnabled && images[0]) imagePrompt = images[0] + if (memoryToolEnabled) rememberFacts.push(...facts) + text = stripMarkers(text).trim() + if (imagePrompt || rememberFacts.length) { + log.debug({ image: !!imagePrompt, facts: rememberFacts.length }, 'tools: markers parsed') + } + } + + // Empty text is only an error when there's no tool action to surface (the + // model may reply with just an image or a memory write). + if (!text?.length && !imagePrompt && !rememberFacts.length) { log.error({ body: response }, 'OpenAI request failed: Empty response') yield { error: `OpenAI request failed: Received empty response. Try again.` } return } - gen.swipesPerGeneration! > 1 - ? yield sanitiseAndTrim(accumulated, prompt, char, opts.characters, members) - : yield sanitiseAndTrim(text, prompt, opts.replyAs, opts.characters, members) + // Surface tool intent so the message handler can act on it. + if (imagePrompt || rememberFacts.length) { + yield { + meta: { + ...(imagePrompt ? { imageTool: { prompt: imagePrompt } } : {}), + ...(rememberFacts.length ? { rememberFacts } : {}), + }, + } + } + + const swipeText = markerMode ? stripMarkers(accumulated).trim() : accumulated + if (gen.swipesPerGeneration! > 1) { + yield sanitiseAndTrim(swipeText, prompt, char, opts.characters, members) + } else { + // Event replies: the model writes the whole scene, so pull out only the + // elected character's own turn. Non-event: normal trim. + const finalText = isEvent + ? sanitise( + extractSpeakerTurn(sanitise((text || '').replace(prompt, '')), opts.replyAs.name) + ) + : sanitiseAndTrim(text || '', prompt, opts.replyAs, opts.characters, members) + // Empty after extraction/trim means the model produced nothing usable for + // this speaker (e.g. it narrated/spoke only as others). Surface an error so + // the caller (the event loop) retries cleanly instead of storing an empty + // bubble. Tool-only replies still go through (guarded by the empty-text check). + if (!finalText && !imagePrompt && !rememberFacts.length) { + log.warn('OpenAI reply had no content for the speaker; dropping') + yield { error: `OpenAI request failed: Received empty response. Try again.` } + return + } + yield finalText + } } catch (ex: any) { log.error({ err: ex }, 'OpenAI failed to parse') yield { error: `OpenAI request failed: ${ex.message}` } @@ -145,17 +512,37 @@ export const handleOAI: ModelAdapter = async function* (opts) { } } -function getBaseUrl(user: AppSchema.User, noSuffix: boolean, isThirdParty?: boolean) { +function getBaseUrl( + user: AppSchema.User, + noSuffix: boolean, + isThirdParty?: boolean, + moderation?: boolean +) { + // Moderation runs on the dedicated (original, vision-capable) model, kept off + // the user-facing chat model. Takes precedence over everything else so a + // less-censored chat swap can't weaken the safety check. + if (moderation && config.inference.modUrl) { + const version = config.inference.modUrl.match(/\/v\d+$/) ? '' : '/v1' + return { url: config.inference.modUrl + version, changed: true, server: true, mod: true } + } + if (isThirdParty && user.koboldUrl) { - if (noSuffix) return { url: user.koboldUrl, changed: true } + if (noSuffix) return { url: user.koboldUrl, changed: true, server: false, mod: false } // If the user provides a versioned API URL for their third-party API, use that. Otherwise // fall back to the standard /v1 URL. const version = user.koboldUrl.match(/\/v\d+$/) ? '' : '/v1' - return { url: user.koboldUrl + version, changed: true } + return { url: user.koboldUrl + version, changed: true, server: false, mod: false } + } + + // Self-hosted, OpenAI-compatible default endpoint configured at the server level. + // Lets the platform run off its own model without a per-user OpenAI key. + if (config.inference.textUrl) { + const version = config.inference.textUrl.match(/\/v\d+$/) ? '' : '/v1' + return { url: config.inference.textUrl + version, changed: true, server: true, mod: false } } - return { url: `${baseUrl}/v1`, changed: false } + return { url: `${baseUrl}/v1`, changed: false, server: false, mod: false } } export type OAIUsage = { diff --git a/srv/adapter/openrouter.ts b/srv/adapter/openrouter.ts deleted file mode 100644 index e74533a6..00000000 --- a/srv/adapter/openrouter.ts +++ /dev/null @@ -1,198 +0,0 @@ -import needle from 'needle' -import { decryptText } from '../db/util' -import { registerAdapter } from './register' -import { ModelAdapter } from './type' -import { sanitiseAndTrim } from '/common/requests/util' -import { AppLog } from '../middleware' -import { OpenRouterModel } from '/common/adapters' -import { getStoppingStrings } from './prompt' -import { createClaudeChatCompletion } from './claude' -import { streamCompletion } from './stream' - -const baseUrl = 'https://openrouter.ai/api/v1' -const chatUrl = `${baseUrl}/chat/completions` -let modelCache: OpenRouterModel[] - -export const handleOpenRouter: ModelAdapter = async function* (opts) { - const { user, guest } = opts - - const key = user.adapterConfig?.openrouter?.apiKey - if (!key) { - yield { - error: - 'OpenRouter request failed: Set your API key in the settings page. Visit openrouter.ai/keys to generate one.', - } - return - } - - const payload: any = { - prompt: opts.prompt, - stream: opts.gen.streamResponse, - // 256 is the OpenRouter default. We will use this. - temperature: opts.gen.temp, - max_tokens: opts.gen.maxTokens ?? 256, - stop: getStoppingStrings(opts), - top_p: opts.gen.topP, - top_k: opts.gen.topK, - top_a: opts.gen.topA, - min_p: opts.gen.minP, - - frequency_penalty: opts.gen.frequencyPenalty, - presence_penalty: opts.gen.presencePenalty, - repetition_penalty: opts.gen.repetitionPenalty, - } - - if (opts.gen.openRouterModel?.id) { - payload.model = opts.gen.openRouterModel.id - } - - const useChat = (opts.gen.openRouterModel?.id || '').startsWith('anthropic') - if (useChat) { - const { messages, system } = await createClaudeChatCompletion(opts) - payload.messages = messages - payload.system = system - delete payload.prompt - } - - // payload.messages = await toChatCompletionPayload(opts, payload.max_tokens) - yield { prompt: payload.messages ? JSON.stringify(payload.messages, null, 2) : payload.prompt } - - const headers = { - Authorization: `Bearer ${guest ? key : decryptText(key)}`, - 'HTTP-Referer': 'https://agnai.chat', - } - - const res = opts.gen.streamResponse - ? streamCompletion(user._id, chatUrl, headers, payload, 'OpenRouter', opts.log, 'openrouter') - : getCompletion(payload, headers) - - let accum = '' - let response: any - - opts.log.debug(payload, 'OpenRouter payload') - - while (true) { - const gen = await res.next() - if (gen.done) { - response = gen.value - break - } - - if ('error' in gen.value) { - yield gen.value - return - } - - if ('token' in gen.value) { - accum += gen.value.token - yield { - partial: sanitiseAndTrim(accum, opts.prompt, opts.replyAs, opts.characters, opts.members), - } - } - } - - if (response && 'model' in response) { - yield { meta: { model: response.model } } - } - - const text = getResponseText(response, opts.log) - if (text instanceof Error) { - yield { error: `OpenRouter response failed: ${text.message}` } - return - } - - if (!text?.length) { - opts.log.error({ body: response }, 'OpenRouter request failed: Empty response') - yield { error: `OpenRouter request failed: Received empty response. Try again.` } - return - } - - yield sanitiseAndTrim(text, opts.prompt, opts.replyAs, opts.characters, opts.members) -} - -async function* getCompletion(payload: any, headers: any): AsyncGenerator { - const resp = await needle('post', chatUrl, JSON.stringify(payload), { - json: true, - headers: Object.assign(headers, { Accept: 'application/json' }), - }).catch((err) => ({ err })) - - if ('err' in resp) { - yield { error: `OpenRouter request failed: ${resp.err.message || resp.err}` } - return - } - - if (resp.statusCode && resp.statusCode >= 400) { - const msg = - resp.body.message || resp.body.error?.message || resp.statusMessage || 'Unknown error' - yield { error: `OpenRouter request failed (${resp.statusCode}): ${msg}` } - return - } - - return resp.body -} - -registerAdapter('openrouter', handleOpenRouter, { - label: 'OpenRouter', - settings: [ - { - field: 'apiKey', - label: 'API Key', - helperText: - 'If you are unable to use the "Login with OpenRouter" button, enter your API key manually. Head to openrouter.ai/keys to obtain an API key.', - secret: true, - setting: { type: 'text', placeholder: 'E.g. sk-or-v1-2v6few...' }, - }, - ], - options: ['temp', 'maxTokens'], -}) - -function getResponseText(resp: any, log: AppLog) { - if (typeof resp === 'string') { - resp = JSON.parse(resp) - } - - if (resp.type === 'Buffer') { - const buffer = Buffer.from(resp.data).toString() - return getResponseText(buffer, log) - } - - if (!resp.choices || !Array.isArray(resp.choices) || resp.choices.length === 0) { - log.warn({ resp }, 'OpenRouter response was empty (No choices)') - return new Error(`Response contained no data (No choices)`) - } - - const choice = resp.choices[0] - if (choice.text) return choice.text as string - - const message = choice.message - if (typeof message === 'string') return message - - if (!message || !message.content) { - log.warn({ resp }, 'OpenRouter response was empty (No text)') - return new Error(`Response contained no data (No text)`) - } - - return message.content as string -} - -export async function getOpenRouterModels(): Promise { - if (modelCache) return modelCache - - return fetchOpenRouterModels() -} - -async function fetchOpenRouterModels(): Promise { - try { - const res = await needle('get', 'https://openrouter.ai/api/v1/models', {}, { json: true }) - if (res.body) { - modelCache = res.body.data - } - - return modelCache - } catch (ex) { - return modelCache || [] - } -} - -setInterval(fetchOpenRouterModels, 60000 * 2) -fetchOpenRouterModels() diff --git a/srv/adapter/petals.ts b/srv/adapter/petals.ts deleted file mode 100644 index 1f11378a..00000000 --- a/srv/adapter/petals.ts +++ /dev/null @@ -1,172 +0,0 @@ -import { AdapterProps, ModelAdapter } from './type' -import { sanitise, sanitiseAndTrim, trimResponseV2 } from '/common/requests/util' -import { registerAdapter } from './register' -import { WebSocket } from 'ws' -import { eventGenerator } from '/common/util' -import { logger } from '../middleware' - -type PetalRequest = { - type: 'generate' - inputs: string - do_sample: number - extra_stop_sequences?: string[] - stop_sequence?: string - temperature: number - top_p?: number - top_k?: number - max_length?: number - max_new_tokens?: number // 1 ? - num_beams?: number // 1 -} - -export const handlePetals: ModelAdapter = async function* (opts) { - const body: PetalRequest = { - type: 'generate', - inputs: opts.prompt, - do_sample: 1, - max_new_tokens: 1, // ? - temperature: opts.gen.temp!, - stop_sequence: '###', - extra_stop_sequences: [''], - // max_length: 2048, - // top_k: opts.gen.topK, - top_p: opts.gen.topP, - num_beams: 1, - } - - const url = opts.gen.registered?.petals?.url || opts.user.adapterConfig?.petals?.url - if (!url) { - yield { error: `Petals request failed: URL not set` } - return - } - - const model = opts.gen.registered?.petals?.model || opts.user.adapterConfig?.petals?.model - if (!model) { - yield { error: `Petals request failed: Model not set` } - return - } - - opts.log.debug({ ...body, prompt: null }, 'Petals payload') - opts.log.debug(`Prompt:\n${body.inputs}`) - yield { prompt: body.inputs } - - let accum = '' - const resp = generateStream(url, model, opts, body) - - for await (const event of resp) { - if (event.error) { - yield event - return - } - - if (event.token) { - accum += event.token - yield { - partial: sanitiseAndTrim(accum, opts.prompt, opts.replyAs, opts.characters, opts.members), - } - } - } - - const parsed = sanitise(accum.replace(opts.prompt, '')) - const trimmed = trimResponseV2(parsed, opts.replyAs, opts.members, opts.characters, [ - 'END_OF_DIALOG', - ]) - yield trimmed || parsed -} - -function generateStream(url: string, model: string, opts: AdapterProps, body: PetalRequest) { - url = url.toLocaleLowerCase().replace('https:', 'wss:').replace('http:', 'ws:') - if (!url.startsWith('ws')) { - url = `ws://${url}` - } - - const emitter = eventGenerator() - const socket = new WebSocket(`${url}/api/v2/generate`) - let init = false - let accum = '' - - const endTokens: string[] = [] - for (const char of Object.values(opts.characters || {})) { - if (char.name === opts.replyAs.name) continue - endTokens.push(`${char.name}:`) - } - - socket.on('open', () => { - socket.send( - JSON.stringify({ - type: 'open_inference_session', - model, - max_length: opts.gen.maxContextLength, - }) - ) - }) - - socket.on('message', (data) => { - const msg = JSON.parse(data.toString()) as any - - if (!init && msg.ok) { - init = true - - socket.send(JSON.stringify(body)) - return - } - - if (msg.outputs) { - accum += msg.outputs - emitter.push({ token: msg.outputs }) - } - - if (msg.stop) { - socket.close() - emitter.done() - return - } - - for (const endToken of endTokens) { - if (accum.includes(endToken)) { - socket.close() - emitter.done() - return - } - } - }) - - socket.on('error', (err) => { - logger.error({ err }, 'Petals error') - }) - - socket.on('close', () => { - emitter.done() - }) - - return emitter.stream -} - -registerAdapter('petals', handlePetals, { - label: 'Petals', - settings: [ - { - field: 'url', - label: 'Petals Chat URL', - secret: false, - setting: { type: 'text', placeholder: 'E.g. http://localhost:5000' }, - preset: true, - }, - { - field: 'model', - label: 'Model', - secret: false, - setting: { type: 'text', placeholder: 'E.g. meta-llama/Llama-2-13b-chat-hf' }, - preset: true, - }, - ], - options: [ - 'temp', - 'gaslight', - 'topA', - 'topP', - 'ultimeJailbreak', - 'gaslight', - 'ignoreCharacterSystemPrompt', - ], -}) diff --git a/srv/adapter/prompt.ts b/srv/adapter/prompt.ts index c6995c58..91e4abdf 100644 --- a/srv/adapter/prompt.ts +++ b/srv/adapter/prompt.ts @@ -76,6 +76,17 @@ export function getStoppingStrings(opts: AdapterProps, extras: string[] = []) { unique.add(`\n${member.handle}:`) seen.add(member.handle) } + + // Scene narration (world beats) is its own "Narrator"/"Director" message, + // generated on a separate path. A snappy model otherwise tacks a narration + // passage onto a character's reply ("\nNarrator: ..."); stop the turn when it + // tries to hand off to the narrator. Skip if this speaker IS the narrator. + for (const speaker of ['Narrator', 'Director']) { + if (opts.replyAs.name === speaker) continue + if (seen.has(speaker)) continue + unique.add(`\n${speaker}:`) + seen.add(speaker) + } } if (opts.gen.stopSequences && !Array.isArray(opts.gen.stopSequences)) { diff --git a/srv/adapter/replicate.ts b/srv/adapter/replicate.ts deleted file mode 100644 index 51f92aab..00000000 --- a/srv/adapter/replicate.ts +++ /dev/null @@ -1,421 +0,0 @@ -import needle from 'needle' -import { decryptText } from '../db/util' -import { registerAdapter } from './register' -import { ModelAdapter } from './type' -import { sanitise, trimResponseV2 } from '/common/requests/util' -import { sendMany } from '../api/ws' -import { logger } from '../middleware' -import { getTokenCounter } from '../tokenize' -import { config } from '../config' -import { ReplicateModel, ReplicateModelType } from '/common/types/replicate' - -const publicApiV1 = 'https://api.replicate.com/v1' - -let modelCache: Record = {} - -const COLLECTIONS = { - language: 'language-models', - image: 'text-to-image', - diffusion: 'diffusion-models', - imageEditing: 'image-editing', - embedding: 'embedding-models', - audio: 'audio-generation', - video: 'text-to-video', - upscale: 'super-resolution', - makeover: 'ml-makeovers', - controlNet: 'control-net', -} - -// Llama: https://replicate.com/replicate/vicuna-13b/api -type ReplicateInputLlama = { - prompt: string - max_length?: number - temperature?: number - top_p?: number - repetition_penalty?: number - seed?: number - debug?: boolean -} - -type ReplicateOutputLlama = string[] - -// StableLM: https://replicate.com/stability-ai/stablelm-tuned-alpha-7b/api -type ReplicateInputStableLm = { - prompt: string - max_tokens?: number - temperature?: number - top_p?: number - repetition_penalty?: number -} - -type ReplicateOutputStableLm = string[] - -// OpenAssistant: https://replicate.com/replicate/oasst-sft-1-pythia-12b/api -type ReplicateInputOpenAssistant = { - prompt: string - max_length?: number - decoding?: 'top_p' | 'top_k' - temperature?: number - top_p?: number - top_k?: number - repetition_penalty?: number -} - -type ReplicateOutputOpenAssistant = string[] - -// Replica: https://replicate.com/docs/reference/http - -type ReplicateRequest = { - version: string - input: ReplicateInputLlama | ReplicateInputStableLm | ReplicateInputOpenAssistant -} - -type ReplicatePrediction = { - id: string - version: string - urls: { - get: string - cancel: string - } - created_at: string | null - started_at: string | null - status: 'starting' | 'processing' | 'succeeded' | 'failed' | 'canceled' - input: { text: string } - output: ReplicateOutputLlama | ReplicateOutputStableLm | ReplicateOutputOpenAssistant | null - error: string | null - logs: string - metrics: { predict_time: number } -} - -const knownModelTypes: Record = { - 'vicuna-13b': 'llama', - 'llama-7b': 'llama', - - 'oasst-sft-1-pythia-12b': 'openassistant', - 'dolly-v2-12b': 'openassistant', - - 'replit-code-v1-3b': 'stablelm', - 'stablelm-tuned-alpha-7b': 'stablelm', - 'gpt-j-6b': 'stablelm', - 'flan-t5-xl': 'stablelm', -} - -export const handleReplicate: ModelAdapter = async function* (opts) { - const { log } = opts - const config = opts.user.adapterConfig?.replicate - if (!config) { - yield { - error: `Replicate request failed: User settings missing. Make sure you've provided your API key in your user settings.`, - } - return - } - - const key = config.apiToken ? (opts.guest ? config.apiToken : decryptText(config.apiToken)) : null - if (!key) { - yield { - error: `Replicate request failed: No API Token set. Make sure it is set in your user settings.`, - } - return - } - - if (!opts.gen.replicateModelName && !opts.gen.replicateModelVersion) { - yield { - error: 'Replicate request failed: Your preset does not have a model selected.', - } - return - } - - const selection = getModelVersion(opts.gen.replicateModelName || opts.gen.replicateModelVersion!) - if (!selection) { - yield { - error: - 'Replicate request failed: Could not model version. Ensure your preset has a replicate model or version selected.', - } - return - } - const modelType = selection.type || opts.gen.replicateModelType || 'llama' - // const version = - // opts.gen.replicateModelVersion || - // '6282abe6a492de4145d7bb601023762212f9ddbbe78278bd6771c8b3b2f2a13b' - - let input: ReplicateRequest['input'] - const encoder = getTokenCounter('replicate', modelType) - switch (modelType) { - case 'stablelm': { - // TODO: Use a similar logic to OpenAI - const prompt = opts.prompt - .replace(new RegExp(`^${opts.replyAs.name}:`, 'gm'), '\n<|ASSISTANT|>') - .replace(new RegExp(`^${opts.members[0].handle || 'You'}:`, 'gm'), '\n<|USER|>') - input = { - prompt, - max_tokens: (await encoder(opts.prompt)) + (opts.gen.maxTokens || 500), - temperature: opts.gen.temp, - top_p: opts.gen.topP, - repetition_penalty: opts.gen.repetitionPenalty, - } - break - } - - case 'openassistant': { - // TODO: Use a similar logic to OpenAI - const prompt = opts.prompt - .replace(new RegExp(`^${opts.replyAs.name}:`, 'gm'), '<|endoftext|><|assistant|>') - .replace( - new RegExp(`^${opts.members[0].handle || 'You'}:`, 'gm'), - '<|endoftext|><|prompter|>' - ) - input = { - prompt, - max_length: (await encoder(opts.prompt)) + (opts.gen.maxTokens || 500), - decoding: 'top_p', - temperature: opts.gen.temp, - top_p: opts.gen.topP, - repetition_penalty: opts.gen.repetitionPenalty, - } - break - } - - case 'llama': { - input = { - prompt: opts.prompt, - max_length: (await encoder(opts.prompt)) + (opts.gen.maxTokens || 500), - temperature: opts.gen.temp, - top_p: opts.gen.topP, - repetition_penalty: opts.gen.repetitionPenalty, - } - break - } - default: - yield { error: `Replicate request failed: Unknown model type ${modelType}` } - return - } - - const body: ReplicateRequest = { - version: selection.version, - input, - } - - logger.debug({ ...input, prompt: null }, 'Replicate payload') - logger.debug(`Prompt:\n${input.prompt}`) - yield { prompt: input.prompt } - - let prediction: ReplicatePrediction - try { - prediction = await createPrediction(body, key) - } catch (e: any) { - log.error({ error: e.message }, 'Replicate failed to send') - yield { error: `Replicate request failed: ${e.message}` } - return - } - - let secondsSinceStart = 0 - const timeoutInSeconds = 60 * 5 // Model cold boots can take 3 to 5 minutes - const coldBootNotificationInSeconds = 20 - let hasDispatchedStartingMessage = false - - predictionWaitLoop: while (true) { - try { - prediction = await getPrediction(prediction.urls.get, key) - } catch (e: any) { - log.error({ error: e.message }, 'Failed to poll replicate') - yield { error: `Replicate request failed: ${e.message}` } - return - } - - const status = prediction.status - - switch (status) { - case 'succeeded': - break predictionWaitLoop - case 'starting': - case 'processing': - if ( - !hasDispatchedStartingMessage && - status === 'starting' && - secondsSinceStart > coldBootNotificationInSeconds - ) { - hasDispatchedStartingMessage = true - // TODO: Dispatching to ws here is not ideal - sendMany(opts.guest ? [opts.guest] : opts.members.map((m) => m.userId), { - type: 'chat-server-notification', - chatId: opts.chat._id, - text: 'The Replicate model is starting up. This can take 3-5 minutes.', - }) - } - if (secondsSinceStart++ < timeoutInSeconds) { - await sleep(1000) - continue - } - yield { error: `Replicate request timed out (request id: ${prediction.id})` } - return - case 'failed': - case 'canceled': - default: - throw new Error( - `Replicate prediction request status: ${status} (error: ${prediction.error})` - ) - } - } - - try { - const output: ReplicatePrediction['output'] = prediction.output - // The first token always seems to be missing a space. - let text = output ? output[0] + ' ' + output.slice(1).join('') : '' - if (!text) { - log.error({ body: prediction }, 'Replicate request failed: Empty response') - yield { error: `Replicate request failed: Received empty response.` } - return - } - - yield { - meta: { - model: opts.gen.replicateModelName || selection.version, - predict_time: prediction.metrics.predict_time, - }, - } - const parsed = sanitise(text) - const trimmed = trimResponseV2(parsed, opts.replyAs, opts.members, opts.characters, [ - '<|USER|>', - '<|ASSISTANT|>', - '[/LIST]', - '<|endoftext|>', - '<|prompter|>', - '<|assistant|>', - ]) - yield trimmed || parsed - } catch (ex: any) { - log.error({ err: ex }, 'Replicate failed to parse') - yield { error: `Replicate request failed: ${ex.message}` } - return - } -} - -registerAdapter('replicate', handleReplicate, { - label: 'Replicate', - settings: [ - { - field: 'apiToken', - label: 'API Token', - helperText: 'You can get your key from https://replicate.com/account/api-tokens', - secret: true, - setting: { type: 'text', placeholder: 'E.g. a0_Q45sfF...' }, - }, - ], - options: ['temp', 'maxTokens', 'repetitionPenalty', 'topP'], -}) - -async function createPrediction(body: any, key: string): Promise { - const url = `${publicApiV1}/predictions` - const resp = await needle('post', url, JSON.stringify(body), { - json: true, - headers: { Authorization: `Token ${key}` }, - }).catch((err) => ({ error: err })) - - if ('error' in resp) { - throw new Error(resp.error?.message || resp.error) - } - - if (resp.statusCode && resp.statusCode >= 400) { - if (resp.statusCode === 404) { - throw new Error(`Request failed: Not Found (verify your model version)`) - } - - throw new Error(`Request failed (${resp.statusCode}): ${JSON.stringify(resp.body)}`) - } - - return resp.body -} - -async function getPrediction(url: string, key: string): Promise { - const resp = await needle('get', url, { - headers: { Authorization: `Token ${key}` }, - }).catch((err) => ({ error: err })) - - if ('error' in resp) { - throw new Error(resp.error?.message || resp.error) - } - - if (resp.statusCode && resp.statusCode >= 400) { - throw new Error(`Request failed (${resp.statusCode}): ${JSON.stringify(resp.body)}`) - } - - return resp.body -} - -function sleep(delay: number) { - return new Promise((resolve) => setTimeout(resolve, delay)) -} - -export async function getCollections(key: string) { - const resp = await needle(`get`, `${publicApiV1}/collections`, { - headers: { Authorization: `Token ${parseKey(key)}` }, - }) - - if (resp.statusCode && resp.statusCode >= 400) { - logger.error({ body: resp.body }, `Failed to get replicate collections`) - throw new Error(`[${resp.statusCode}] Failed to get collections`) - } - - return resp.body -} - -export async function getCollection(key: string, slug: string) { - const resp = await needle(`get`, `${publicApiV1}/collections/${slug}`, { - headers: { Authorization: `Token ${parseKey(key)}` }, - }) - - if (resp.statusCode && resp.statusCode >= 400) { - logger.error({ body: resp.body }, `Failed to get replicate collections`) - throw new Error(`[${resp.statusCode}] Failed to get collections`) - } - - return resp.body -} - -export async function getLanguageCollection(key: string): Promise> { - const collection = await getCollection(key, COLLECTIONS.language) - const models = collection.models.reduce((prev: any, curr: ReplicateModel) => { - curr.latest_version.openapi_schema = undefined - curr.default_example = undefined - prev[curr.name] = curr - return prev - }, {}) - return models -} - -function parseKey(key: string) { - try { - return decryptText(key) - } catch (ex) { - return key - } -} - -if (config.keys.REPLICATE) { - cacheLanguageModels().catch(() => null) -} - -async function cacheLanguageModels() { - try { - const collection = await getLanguageCollection(config.keys.REPLICATE) - modelCache = collection - } catch (ex) {} -} - -export async function getLanguageModels(key?: string) { - if (!key) { - return modelCache - } - - const models = await getLanguageCollection(key) - return models -} - -function getModelVersion(model: string) { - if (model in modelCache) { - const data = modelCache[model] - return { version: data.latest_version.id, type: knownModelTypes[model] || 'stablelm' } - } - - return { version: model, type: '' } -} diff --git a/srv/adapter/scale.ts b/srv/adapter/scale.ts deleted file mode 100644 index 61f9e273..00000000 --- a/srv/adapter/scale.ts +++ /dev/null @@ -1,63 +0,0 @@ -import needle from 'needle' -import { decryptText } from '../db/util' -import { sanitise, trimResponseV2 } from '/common/requests/util' -import { ModelAdapter } from './type' - -export const handleScale: ModelAdapter = async function* ({ - char, - members, - user, - prompt, - guest, - log, - ...opts -}) { - if (!user.scaleApiKey) { - yield { error: 'Scale API key not set' } - return - } - - if (!user.scaleUrl) { - yield { error: 'Scale URL not set' } - return - } - - const body = { - input: { input: prompt }, - } - - log.debug(body, 'Scale payload') - yield { prompt: prompt } - const auth = `Basic ${guest ? user.scaleApiKey : decryptText(user.scaleApiKey)}` - - const response = await needle('post', user.scaleUrl, body, { - json: true, - open_timeout: 0, - headers: { - Authorization: auth, - }, - }).catch((err) => ({ err })) - - if ('err' in response) { - log.error({ err: `Scale request failed: ${response.err?.message || response.err}` }) - yield { error: `Scale request failed: ${response.err.message || response.err}` } - return - } - - const status = response.statusCode || 0 - if (status >= 400) { - log.error({ error: response.body }, `Scale request failed (${status})`) - yield { error: `Scale API returned an error: ${response.statusMessage!}` } - return - } - - if (response.body.error) { - log.error({ error: response.body }, `Scale response failed (${status})`) - yield { error: `Scale API returned an error: ${response.body.error}` } - return - } - - const parsed = sanitise(response.body.output) - const trimmed = trimResponseV2(parsed, opts.replyAs, members, opts.characters, []) - yield trimmed || parsed -} diff --git a/srv/adapter/stream.ts b/srv/adapter/stream.ts index 21d811d4..60f081b2 100644 --- a/srv/adapter/stream.ts +++ b/srv/adapter/stream.ts @@ -35,6 +35,7 @@ export const streamCompletion: CompletionGenerator = async function* ( }) const tokens = [] + const toolCalls: any[] = [] let meta = { id: '', created: 0, model: '', object: '', finish_reason: '', index: 0 } let current: any = {} @@ -100,6 +101,20 @@ export const streamCompletion: CompletionGenerator = async function* ( tokens.push(token) yield { token } } + + // Accumulate streamed tool-call deltas (merge fragments by index). + if ('delta' in choice && (choice.delta as any).tool_calls) { + for (const tc of (choice.delta as any).tool_calls) { + const i = tc.index ?? 0 + const acc = + toolCalls[i] || + (toolCalls[i] = { id: '', type: 'function', function: { name: '', arguments: '' } }) + if (tc.id) acc.id = tc.id + if (tc.type) acc.type = tc.type + if (tc.function?.name) acc.function.name = tc.function.name + if (tc.function?.arguments) acc.function.arguments += tc.function.arguments + } + } } } catch (err: any) { log.error({ err, current }, `${service} streaming request failed`) @@ -117,6 +132,7 @@ export const streamCompletion: CompletionGenerator = async function* ( finish_reason: meta.finish_reason, index: meta.index, text: tokens.join(''), + tool_calls: toolCalls.filter(Boolean), }, ], } diff --git a/srv/adapter/type.ts b/srv/adapter/type.ts index b3824ac7..18d42cf1 100644 --- a/srv/adapter/type.ts +++ b/srv/adapter/type.ts @@ -30,10 +30,19 @@ export type CompletionGenerator = ( export type CompletionItem = { role: ChatRole; content: string; name?: string } +export type ToolCall = { + index?: number + id?: string + type?: string + function?: { name?: string; arguments?: string } +} + export type CompletionContent = Array< - { finish_reason: string; index: number } & ({ text: string } | T) + { finish_reason: string; index: number } & ({ text: string; tool_calls?: ToolCall[] } | T) > -export type Inference = { message: { content: string; role: ChatRole } } +export type Inference = { + message: { content: string; role: ChatRole; tool_calls?: ToolCall[] } +} export type AsyncDelta = { delta: Partial } export type GenerateRequestV2 = { @@ -122,6 +131,19 @@ export type AdapterProps = { jsonValues: Record | undefined imageData?: string + /** Multiple base64 data URLs (e.g. avatar + gallery for moderation). */ + images?: string[] + /** + * Leading `system` message (chat-completion only). Overrides the served model's + * default chat-template system prompt so utility calls (publish moderation) + * aren't answered in-character. + */ + system?: string + /** + * Route this call to the dedicated moderation endpoint (original vision model) + * instead of the user-facing chat model. Set by the publish/edit moderation path. + */ + moderation?: boolean guidance?: boolean placeholders?: Record lists?: Record diff --git a/srv/adapter/venus.ts b/srv/adapter/venus.ts deleted file mode 100644 index 7dd25973..00000000 --- a/srv/adapter/venus.ts +++ /dev/null @@ -1,115 +0,0 @@ -import { ModelAdapter } from './type' -import { decryptText } from '../db/util' -import { sanitise, sanitiseAndTrim, trimResponseV2 } from '/common/requests/util' -import { registerAdapter } from './register' -import { getStoppingStrings } from './prompt' -import { streamCompletion } from './stream' - -const venusOptions: Record = { - Mars: 'asha', - Mercury: 'mythomax', -} - -const modelOptions = Object.entries(venusOptions).map(([label, value]) => ({ label, value })) - -export const handleVenus: ModelAdapter = async function* (opts) { - const body = { - model: opts.gen.thirdPartyModel || 'mythomax', - frequency_penalty: opts.gen.frequencyPenalty, - max_tokens: opts.gen.maxTokens, - min_tokens: 0, - template: opts.prompt, - presence_penalty: opts.gen.presencePenalty, - stream: true, - return_raw: true, - temperature: opts.gen.temp, - top_p: opts.gen.topP, - top_k: opts.gen.topK, - stop: getStoppingStrings(opts), - } - - const url = `https://inference.chub.ai/prompt` - const key = opts.user.adapterConfig?.venus?.apiKey - if (!key) { - yield { error: `Venus request failed: API key not set` } - return - } - - const apiKey = opts.guest ? key : decryptText(key) - opts.log.debug({ ...body, prompt: null }, 'Venus payload') - opts.log.debug(`Prompt:\n${body.template}`) - yield { prompt: body.template } - - const headers = { - 'Content-Type': 'application/json', - Authorization: `Bearer ${apiKey}`, - } - - const iter = streamCompletion(opts.user._id, url, headers, body, 'Venus', opts.log, 'openai') - let accumulated = '' - - while (true) { - let generated = await iter.next() - - // Both the streaming and non-streaming generators return a full completion and yield errors. - if (generated.done) { - break - } - - if (generated.value.error) { - yield { error: generated.value.error } - return - } - - // Only the streaming generator yields individual tokens. - if ('token' in generated.value) { - accumulated += generated.value.token - - if (opts.gen.streamResponse) { - yield { - partial: sanitiseAndTrim( - accumulated, - body.template, - opts.char, - opts.characters, - opts.members - ), - } - } - } - } - - const parsed = sanitise(accumulated) - const trimmed = trimResponseV2(parsed, opts.replyAs, opts.members, opts.characters) - - yield trimmed || parsed -} - -registerAdapter('venus', handleVenus, { - label: 'Venus', - settings: [ - { - field: 'url', - label: 'Model', - secret: false, - setting: { type: 'list', options: modelOptions }, - preset: true, - }, - { - field: 'apiKey', - label: 'API Key', - secret: true, - setting: { type: 'text', placeholder: 'E.g. CHK-SBIX...' }, - }, - ], - options: [ - 'temp', - 'frequencyPenalty', - 'presencePenalty', - 'systemPrompt', - 'gaslight', - 'topP', - 'topK', - 'typicalP', - ], -}) diff --git a/srv/api/admin.ts b/srv/api/admin.ts index dfd3affb..44008481 100644 --- a/srv/api/admin.ts +++ b/srv/api/admin.ts @@ -3,8 +3,9 @@ import { assertValid } from '/common/valid' import { store } from '../db' import { isAdmin, loggedIn } from './auth' import { StatusError, handle } from './wrap' -import { getLiveCounts, sendAll, sendOne } from './ws/bus' +import { getLiveCounts, notifyUser, sendAll } from './ws/bus' import { encryptText } from '../db/util' +import { PUBLISH_DEFAULTS } from '/common/publish' const router = Router() @@ -48,39 +49,227 @@ const getUserInfo = handle(async ({ params }) => { return info }) -const getSubmitted = handle(async () => { - const submitted = await store.characters.getSubmitted() +// --- Character moderation: stage-2 review of live published characters --- - return submitted +const getPublished = handle(async () => { + const characters = await store.characters.getPublishedForReview() + return { characters } }) -const declineSubmitted = handle(async (req) => { - const body = req.body || false - //assertValid({ characterId: 'string', reason: 'string', userId: 'string' }, body) - const char = await store.characters.getCharacter(body?.userId, body?.characterId) - if (!char) return { error: 'Character not found' } - await store.characters.declineSubmitted(body?.characterId, body?.userId, body?.reason) +/** Stage-2 actions on a live published character. */ +const moderatePublished = handle(async ({ params, body, userId }) => { + assertValid({ action: 'string', reason: 'string?' }, body) + const char = await store.characters.getCharacterById(params.id) + if (!char) throw new StatusError('Character not found', 404) - sendOne(body?.userId, { - type: 'admin-notification', - message: `Your character ${char?.name} has been declined, reason: ${body?.reason}`, - }) - return { success: true } + // Optional moderator note, relayed to the character's owner. + const reason = body.reason?.trim() + const suffix = reason ? ` Reason: ${reason}` : '' + + switch (body.action) { + case 'reviewed': + await store.characters.setCharacterModeration(char._id, { + moderation: { + ...(char.moderation || { status: 'approved' }), + status: char.moderation?.status === 'hidden' ? 'hidden' : 'approved', + moderated: true, + moderatedBy: userId!, + moderatedAt: Date.now(), + }, + }) + return { success: true } + + case 'unpublish': + await store.characters.setCharacterModeration(char._id, { + published: false, + moderation: { + ...(char.moderation || { status: 'approved' }), + status: 'hidden', + moderated: true, + moderatedBy: userId!, + moderatedAt: Date.now(), + }, + }) + await notifyUser( + char.userId, + `Your public character "${char.name}" has been unpublished by a moderator.${suffix}` + ) + return { success: true } + + case 'delete': + await store.reports.resolveReportsForChar(char._id, userId!) + await store.characters.adminDeleteCharacter(char._id) + await notifyUser( + char.userId, + `Your public character "${char.name}" was removed by a moderator.${suffix}` + ) + return { success: true } + + default: + throw new StatusError('Unknown action', 400) + } +}) + +// --- Stage-1 review: characters the automated check rejected (not yet live) --- + +const getPending = handle(async () => { + const characters = await store.characters.getPendingModeration() + return { characters } +}) + +/** Human decision on an AI-rejected character. */ +const moderatePending = handle(async ({ params, body, userId }) => { + assertValid({ action: 'string', reason: 'string?' }, body) + const char = await store.characters.getCharacterById(params.id) + if (!char) throw new StatusError('Character not found', 404) + + // Optional moderator note, relayed to the character's owner. + const reason = body.reason?.trim() + const suffix = reason ? ` Reason: ${reason}` : '' + const now = Date.now() + + switch (body.action) { + case 'approve': { + // Overrides the AI denial: publish it. Pay the publish reward if the owner + // hasn't already been rewarded for this character. + const config = await store.admin.getServerConfiguration() + const reward = config.publishReward || PUBLISH_DEFAULTS.reward + const shouldReward = !char.publishRewarded && reward > 0 + await store.characters.setCharacterModeration(char._id, { + published: true, + publishedAt: now, + publishRewarded: char.publishRewarded || shouldReward, + moderation: { + ...(char.moderation || { status: 'approved' }), + status: 'approved', + moderated: true, + moderatedBy: userId!, + moderatedAt: now, + }, + }) + if (shouldReward) await store.credits.updateCredits(char.userId, reward) + await notifyUser( + char.userId, + `Your character "${char.name}" passed review and is now public.${ + shouldReward ? ` You earned ${reward} credits.` : '' + }` + ) + return { success: true } + } + + case 'reject': + // Upholds the AI denial: stays private, leaves the pending queue. + await store.characters.setCharacterModeration(char._id, { + published: false, + moderation: { + ...(char.moderation || { status: 'rejected' }), + status: 'rejected', + moderated: true, + moderatedBy: userId!, + moderatedAt: now, + }, + }) + await notifyUser( + char.userId, + `Your character "${char.name}" was not approved for publishing.${suffix}` + ) + return { success: true } + + case 'delete': + await store.characters.adminDeleteCharacter(char._id) + await notifyUser( + char.userId, + `Your character "${char.name}" was removed by a moderator.${suffix}` + ) + return { success: true } + + default: + throw new StatusError('Unknown action', 400) + } }) -const acceptSubmitted = handle(async (req) => { - const body = req.body || false +// --- Reports queue --- - //assertValid({ characterId: 'string', reason: 'string', userId: 'string' }, body) - const char = await store.characters.getCharacter(body?.userId, body?.characterId) - if (!char) return { error: 'Character not found' } - await store.characters.acceptSubmitted(body?.characterId, body?.userId, body?.amount) +const getReports = handle(async () => { + const reports = await store.reports.getOpenReports() + const charIds = [...new Set(reports.map((r) => r.charId))] + const chars = await Promise.all(charIds.map((id) => store.characters.getCharacterById(id))) + const byId = new Map(chars.filter(Boolean).map((c) => [c!._id, c!])) - sendOne(body?.userId, { - type: 'admin-notification', - message: `Your character ${char?.name} has been accepted and copied! Reward: ${body?.amount}`, + // Group reports per character with its current state. + const groups = charIds.map((id) => { + const char = byId.get(id) + const charReports = reports.filter((r) => r.charId === id) + return { + charId: id, + name: char?.name, + avatar: char?.avatar, + userId: char?.userId, + published: char?.published, + status: char?.moderation?.status, + reportCount: charReports.length, + reasons: charReports.map((r) => ({ reason: r.reason, note: r.note, createdAt: r.createdAt })), + } }) - return { success: true } + + return { reports: groups } +}) + +/** Admin action on a reported character. */ +const resolveReport = handle(async ({ params, body, userId }) => { + assertValid({ action: 'string', reason: 'string?' }, body) + const char = await store.characters.getCharacterById(params.id) + await store.reports.resolveReportsForChar(params.id, userId!) + if (!char) return { success: true } + + // Optional moderator note, relayed to the character's owner. + const reason = body.reason?.trim() + const suffix = reason ? ` Reason: ${reason}` : '' + + switch (body.action) { + case 'dismiss': + // Reports unfounded — restore visibility and clear the count. + await store.characters.setCharacterModeration(char._id, { + published: true, + reportCount: 0, + moderation: { + ...(char.moderation || { status: 'approved' }), + status: 'approved', + moderated: true, + moderatedBy: userId!, + moderatedAt: Date.now(), + }, + }) + return { success: true } + + case 'hide': + await store.characters.setCharacterModeration(char._id, { + published: false, + moderation: { + ...(char.moderation || { status: 'approved' }), + status: 'hidden', + moderated: true, + moderatedBy: userId!, + moderatedAt: Date.now(), + }, + }) + await notifyUser( + char.userId, + `Your public character "${char.name}" has been taken down after reports.${suffix}` + ) + return { success: true } + + case 'delete': + await store.characters.adminDeleteCharacter(char._id) + await notifyUser( + char.userId, + `Your public character "${char.name}" was removed after reports.${suffix}` + ) + return { success: true } + + default: + throw new StatusError('Unknown action', 400) + } }) const notifyAll = handle(async ({ body }) => { @@ -170,13 +359,24 @@ const updateTier = handle(async (req) => { return { success: true } }) +const clearRestriction = handle(async (req) => { + const userId = req.params.userId + if (!userId) throw new StatusError('Missing userId', 400) + await store.users.clearRestriction(userId) + return { success: true } +}) + router.post('/impersonate/:userId', impersonateUser) router.post('/users', searchUsers) router.post('/users/:userId/tier', updateTier) +router.post('/users/:userId/clear-restriction', clearRestriction) router.get('/metrics', getMetrics) -router.get('/submitted', getSubmitted) -router.post('/submitted/declined', declineSubmitted) -router.post('/submitted/accept', acceptSubmitted) +router.get('/published', getPublished) +router.post('/published/:id', moderatePublished) +router.get('/pending', getPending) +router.post('/pending/:id', moderatePending) +router.get('/reports', getReports) +router.post('/reports/:id', resolveReport) router.get('/users/:id/info', getUserInfo) router.post('/user/password', setUserPassword) router.post('/notify', notifyAll) diff --git a/srv/api/cart.ts b/srv/api/cart.ts index 25767f21..eb29403d 100644 --- a/srv/api/cart.ts +++ b/srv/api/cart.ts @@ -1,12 +1,10 @@ import { Router } from 'express' -import { assertValid } from 'frisker' import { store } from '../db' -import { isAdmin, loggedIn } from './auth' +import { loggedIn } from './auth' import { handle } from './wrap' import { AppSchema } from '../../common/types/schema' import { now } from '../db/util' import { v4 } from 'uuid' -import needle, { NeedleOptions, NeedleResponse } from 'needle' import { sendOne } from './ws' import { config } from '../config' import paypal from 'paypal-rest-sdk' @@ -22,19 +20,8 @@ paypal.configure({ client_secret: paypalSecret, }) -interface PaypalItem { - name: string - description: string - price: number - quantity: number - category?: 'DIGITAL_GOODS' -} const paypalLogin = () => { return new Promise((resolve, reject) => { - const data = { - grant_type: 'client_credentials', - } - const options = { method: 'POST', hostname: 'api-m.paypal.com', @@ -177,7 +164,7 @@ const giveOrder = async (order: AppSchema.ShopOrder) => { premiumUntil: newPremiumUntil, }) order.status = 'completed' - const updateOrder = await store.shop.updateShopOrder(order) + await store.shop.updateShopOrder(order) sendOne(userId, { type: 'credits-updated', newCredits }) sendOne(userId, { type: 'admin-notification', @@ -187,7 +174,6 @@ const giveOrder = async (order: AppSchema.ShopOrder) => { const checkOut = handle(async ({ body, userId, user, ip }) => { const items = await store.shop.getItems() const cart = JSON.parse(body.cart) || [] - const service = body.service || null const itemsToCheckout: any = [] cart.forEach((itemId: string) => { const item = items.find((item) => item._id === itemId) diff --git a/srv/api/character.ts b/srv/api/character.ts index 66232085..e63d71df 100644 --- a/srv/api/character.ts +++ b/srv/api/character.ts @@ -2,19 +2,35 @@ import { Router } from 'express' import { assertValid } from '/common/valid' import { store } from '../db' -import { loggedIn, isAdmin } from './auth' +import { loggedIn } from './auth' import { errors, handle, StatusError } from './wrap' -import { entityUpload, entityUploadBase64, handleForm } from './upload' +import { + entityUpload, + entityUploadBase64, + entityUploadBase64Unique, + handleForm, + readAssetBase64, +} from './upload' import { PERSONA_FORMATS } from '../../common/adapters' import { AppSchema } from '../../common/types/schema' import { CharacterUpdate } from '../db/characters' import { getVoiceService } from '../voice' -import { generateImage } from '../image' +import { generateImage, IMAGE_COST } from '../image' +import { makeLoraName, zimageEncode, zimageDeleteLora } from '../image/zimage' +import { logger } from '../middleware' +import { listMemories, rememberFact, deleteMemory, deleteAllMemories } from '../memory/store' import { v4 } from 'uuid' import { validBook } from './memory' import { isObject, tryParse } from '/common/util' import { assertStrict } from '/common/valid/validate' -import { buildModPrompt, fromJsonResponse } from '/common/prompt' +import { + buildModPrompt, + fromJsonResponse, + DEFAULT_MOD_PROMPT, + DEFAULT_MOD_SCHEMA, + DEFAULT_MOD_SYSTEM, +} from '/common/prompt' +import { checkPublishRequirements, PUBLISH_DEFAULTS, PUBLISH_MIN } from '/common/publish' import { createInferenceStream } from '../adapter/generate' import { sendOne } from './ws' @@ -35,10 +51,20 @@ const characterForm = { persona: 'string?', xp: 'any?', - match: 'any?', share: 'string?', premium: 'any?', + // Charluv: progression archetype/map + Discover facets + progression: 'string?', + gender: 'string?', + artStyle: 'string?', + ageRange: 'string?', + category: 'string?', + nsfw: 'any?', + draft: 'any?', + loraName: 'string?', + imageSeed: 'any?', + favorite: 'boolean?', voice: 'string?', voiceDisabled: 'string?', @@ -79,7 +105,6 @@ const newCharacterValidator = { greeting: 'string', sampleChat: 'string', xp: 'any?', - match: 'any?', premium: 'boolean?', share: 'string?', persona: 'string', @@ -91,146 +116,303 @@ const personaValidator = { attributes: 'any', } as const -const createCharacter = handle(async (req) => { - const body = handleForm(req, newCharacterValidator) - const persona = JSON.parse(body.persona) as AppSchema.Persona - assertValid(personaValidator, persona) +// Shared by the create (`charge: true`) and import (`charge: false`) endpoints. +// Whether to bill the creation fee is decided SERVER-SIDE by which route was +// hit — never by a client-supplied flag — so imports can't be used to dodge the +// charge on a generated character. +const createCharacterFor = (charge: boolean) => + handle(async (req) => { + const body = handleForm(req, newCharacterValidator) + const persona = JSON.parse(body.persona) as AppSchema.Persona + assertValid(personaValidator, persona) - const sprite = body.sprite ? JSON.parse(body.sprite) : undefined - const voice = parseAndValidateVoice(body.voice) - const tags = toArray(body.tags) - const alternateGreetings = body.alternateGreetings ? toArray(body.alternateGreetings) : undefined - const insert = body.insert - ? (JSON.parse(body.insert) as { prompt: string; depth: number }) - : undefined + const sprite = body.sprite ? JSON.parse(body.sprite) : undefined + const voice = parseAndValidateVoice(body.voice) + const tags = toArray(body.tags) + const alternateGreetings = body.alternateGreetings + ? toArray(body.alternateGreetings) + : undefined + const insert = body.insert + ? (JSON.parse(body.insert) as { prompt: string; depth: number }) + : undefined + + const characterBook = body.characterBook + ? typeof body.characterBook === 'string' + ? JSON.parse(body.characterBook) + : body.characterBook + : undefined + + if (!!characterBook) { + assertValid(validBook, characterBook) + } - const characterBook = body.characterBook - ? typeof body.characterBook === 'string' - ? JSON.parse(body.characterBook) - : body.characterBook - : undefined + const extensions = body.extensions ? JSON.parse(body.extensions) : undefined + if (!isObject(extensions) && extensions !== undefined) { + throw new StatusError('Character `extensions` field must be an object or undefined.', 400) + } + // Imports bring a ready-made character (nothing is generated for them) and are + // created via the separate, charge-free /import route. The create route bills — + // but NOT for the hidden draft made on entering the final step: the 100-credit + // creation fee is taken when the user actually finalizes the AI (the draft is + // finalized via the edit route, which charges there instead). + const isDraft = body.draft?.toString() === 'true' + if (charge && !isDraft) { + const user = await store.users.getUser(req.userId!) + if (user?.credits && user?.credits < 100) { + throw new StatusError('Not enough credits', 400) + } + await store.credits.updateCredits(req.userId!, -100) + } - if (!!characterBook) { - assertValid(validBook, characterBook) - } + const imageSettings = body.imageSettings ? JSON.parse(body.imageSettings) : undefined + const json = body.json ? JSON.parse(body.json) : undefined + const progression = body.progression ? JSON.parse(body.progression) : undefined + const category = body.category ? JSON.parse(body.category) : undefined + + // creator / characterVersion are set automatically (server-side). The user no + // longer edits these in the form, so any body values are ignored. + const profile = await store.users.getProfile(req.userId!) + const autoCreator = profile?.handle || '' + const autoVersion = '1' + + const char = await store.characters.createCharacter(req.user?.userId!, { + name: body.name, + persona, + premium: !!body.premium, + xp: 0, + draft: body.draft?.toString() === 'true' || undefined, + progression, + gender: (body.gender as AppSchema.Character['gender']) || undefined, + artStyle: (body.artStyle as AppSchema.Character['artStyle']) || undefined, + ageRange: body.ageRange || undefined, + category, + nsfw: body.nsfw?.toString() === 'true' || undefined, + loraName: body.loraName || undefined, + imageSeed: body.imageSeed ? Number(body.imageSeed) : undefined, + share: body.share, + sampleChat: body.sampleChat, + description: body.description, + appearance: body.appearance, + culture: body.culture, + scenario: body.scenario, + greeting: body.greeting, + visualType: body.visualType, + sprite, + avatar: body.originalAvatar, + favorite: false, + voiceDisabled: body.voiceDisabled === 'true', + voice, + tags, + alternateGreetings, + characterBook, + systemPrompt: body.systemPrompt, + postHistoryInstructions: body.postHistoryInstructions, + creator: autoCreator, + characterVersion: autoVersion, + insert: insert, + imageSettings, + json, + }) + + const filename = await entityUpload( + 'char', + char._id, + body.attachments.find((a) => a.field === 'avatar') + ) + + if (filename) { + await store.characters.updateCharacter(char._id, req.userId, { avatar: filename }) + char.avatar = filename + } - const extensions = body.extensions ? JSON.parse(body.extensions) : undefined - if (!isObject(extensions) && extensions !== undefined) { - throw new StatusError('Character `extensions` field must be an object or undefined.', 400) - } - const user = await store.users.getUser(req.userId!) - if (user?.credits && user?.credits < 50) { - throw new StatusError('Not enough credits', 400) - } - await store.credits.updateCredits(req.userId!, -50) + return char + }) - const imageSettings = body.imageSettings ? JSON.parse(body.imageSettings) : undefined - const json = body.json ? JSON.parse(body.json) : undefined +const createCharacter = createCharacterFor(true) +const importCharacter = createCharacterFor(false) - const char = await store.characters.createCharacter(req.user?.userId!, { - name: body.name, - persona, - premium: !!body.premium, - xp: 0, - match: body.match?.toString() === 'true' || false, - share: body.share, - sampleChat: body.sampleChat, - description: body.description, - appearance: body.appearance, - culture: body.culture, - scenario: body.scenario, - greeting: body.greeting, - visualType: body.visualType, - sprite, - avatar: body.originalAvatar, - favorite: false, - voiceDisabled: body.voiceDisabled === 'true', - voice, - tags, - alternateGreetings, - characterBook, - systemPrompt: body.systemPrompt, - postHistoryInstructions: body.postHistoryInstructions, - creator: body.creator, - characterVersion: body.characterVersion, - insert: insert, - imageSettings, - json, - }) +const getCharacters = handle(async ({ userId }) => { + const chars = await store.characters.getCharacters(userId!) + return { characters: chars } +}) - const filename = await entityUpload( - 'char', - char._id, - body.attachments.find((a) => a.field === 'avatar') - ) +// Returns the user's unfinished wizard draft so Create can resume it. The +// creation credit was already charged when the draft was made. +const getDraft = handle(async ({ userId }) => { + const character = await store.characters.getDraftCharacter(userId!) + return { character: character || null } +}) - if (filename) { - await store.characters.updateCharacter(char._id, req.userId, { avatar: filename }) - char.avatar = filename +/** Resolve the per-tier daily publish cap from config (with shared defaults). */ +function publishCap(config: AppSchema.Configuration, premium?: boolean) { + return premium + ? config.publishDailyPremium || PUBLISH_DEFAULTS.dailyPremium + : config.publishDailyFree || PUBLISH_DEFAULTS.dailyFree +} + +/** Admin-configured minimum-quality thresholds (falling back to shared defaults). */ +function publishMins(config: AppSchema.Configuration) { + return { + greeting: config.publishMinGreeting ?? PUBLISH_MIN.greeting, + description: config.publishMinDescription ?? PUBLISH_MIN.description, + scenario: config.publishMinScenario ?? PUBLISH_MIN.scenario, + personality: config.publishMinPersonality ?? PUBLISH_MIN.personality, } +} - return char -}) +/** Whether this user is allowed to publish given the configured audience gate. */ +function canPublish(audience: AppSchema.Configuration['charlibPublish'], user: AppSchema.User) { + switch (audience) { + case 'off': + return false + case 'users': + return true + case 'subscribers': + return !!user.premium || !!user.admin + case 'moderators': + case 'admins': + return !!user.admin + default: + return false + } +} -const getCharacters = handle(async ({ userId }) => { - const chars = await store.characters.getCharacters(userId!) - return { characters: chars } +const getPublishStatus = handle(async ({ userId }) => { + const config = await store.admin.getServerConfiguration() + const user = await store.users.getUser(userId!) + const cap = publishCap(config, user?.premium) + const used = await store.characters.countPublishedToday(userId!) + // Admins/moderators are exempt from the daily cap — never report them as out. + const exempt = !!user?.admin + return { + enabled: canPublish(config.charlibPublish, user!), + cap, + used, + remaining: exempt ? cap : Math.max(0, cap - used), + exempt, + reward: config.publishReward || PUBLISH_DEFAULTS.reward, + guidelines: config.charlibGuidelines || '', + mins: publishMins(config), + } }) const publishCharacter = handle(async ({ userId, body, log }, res) => { - assertValid( - { requestId: 'string?', character: 'any?', characterId: 'any?', imageData: 'string?' }, - body - ) + assertValid({ requestId: 'string?', characterId: 'string', imageData: 'string?' }, body) + const config = await store.admin.getServerConfiguration() - console.log(config) - if (!config.modPresetId) { - throw new StatusError(`Mod preset not configured`, 400) - } + const user = await store.users.getUser(userId!) + if (!user) throw new StatusError('Not authorized', 401) - const user = await store.users.getUser(userId) - if (!user) { - throw new StatusError('Not authorized', 401) + if (!canPublish(config.charlibPublish, user)) { + throw new StatusError('Publishing is not available for your account', 403) } - const settings = await store.presets.getUserPreset(config.modPresetId) - if (!settings) { - throw new StatusError('Mod preset not found', 400) + const character = await store.characters.getCharacter(userId!, body.characterId) + if (!character) throw new StatusError('Character not found', 404) + if (character.draft) throw new StatusError('Finish creating the character before publishing', 400) + + // Minimum-quality thresholds + the fields Discover/profile rely on (avatar, + // gender, art style, age range). Admins bypass this gate so special characters + // that deliberately omit some details can still be published. + const { ok, requirements, fields } = checkPublishRequirements(character, publishMins(config)) + if (!ok && !user.admin) { + const missingFields = fields.filter((f) => !f.ok).map((f) => f.label) + const missingLen = requirements + .filter((r) => !r.ok) + .map((r) => `${r.label} (${r.actual}/${r.min})`) + const parts = [...missingFields, ...missingLen] + throw new StatusError(`Not ready to publish — missing: ${parts.join(', ')}`, 400) } - let character = body.character - - if (body.characterId) { - character = await store.characters.getCharacter(userId, body.characterId) + // Daily cap applies only to a character's first publish; re-publishing after + // an edit (publishRewarded already set) is exempt and never re-rewarded. + // Admins/moderators are exempt from the cap entirely. + const cap = publishCap(config, user.premium) + if (!character.publishRewarded && !user.admin) { + const used = await store.characters.countPublishedToday(userId!) + if (used >= cap) throw new StatusError(`Daily publish limit reached (${cap} per day)`, 429) } - if (!character) { - throw new StatusError(`Character not provided`, 400) + // No preset to configure — moderation runs on the local vision LLM (the + // default subscription model, resolved inside createInferenceStream) using a + // built-in prompt + schema, with optional admin overrides. + const modSchema = config.modSchema?.length ? config.modSchema : DEFAULT_MOD_SCHEMA + + // Moderate every image on the character — avatar + gallery — up to the + // model's 10-images-per-request limit. Prefer the client-sent avatar data + // URL; read the rest server-side so the image check can't be skipped. + const imageRefs = Array.from( + new Set([character.avatar, ...(character.gallery || [])].filter(Boolean) as string[]) + ).slice(0, 10) + const images: string[] = [] + for (const ref of imageRefs) { + if (ref === character.avatar && body.imageData) { + images.push(body.imageData) + continue + } + const clean = ref.split('?')[0] + const path = clean.startsWith('/assets') ? clean : `/assets/${clean}` + const b64 = await readAssetBase64(path) + if (b64) images.push(`data:image/png;base64,${b64}`) } - const prompt = buildModPrompt({ + // Spell out the exact JSON shape in the prompt. `guided_json` rides along but + // the self-hosted endpoint's speculative decoding ignores it, so the model + // free-forms its own shape (e.g. `{"safe": true}`) whose keys don't match the + // schema — fromJsonResponse then parses nothing and the publish fail-closes. + // Enumerating the schema's keys forces the model to emit the fields we read. + const verdictKeys = modSchema.filter((f) => !f.disabled).map((f) => f.name) + const jsonShape = `{${verdictKeys.map((k) => `"${k}": false`).join(', ')}}` + const prompt = `${buildModPrompt({ char: character, - prompt: config.modPrompt, + prompt: config.modPrompt || DEFAULT_MOD_PROMPT, fields: config.modFieldPrompt, - }) + })}\n\nRespond with ONLY this JSON object — exactly these keys, each set to true or false, no other keys and no prose:\n${jsonShape}` const requestId = body.requestId || v4() + // A failed automated check (an AI denial, or a verdict we couldn't interpret) + // doesn't dead-end the user — the character is kept private and queued for a + // human moderator, who approves (publishes) or confirms the rejection. The + // technical flags/reason are stored for the admin; the user sees a neutral + // "sent for review" message. + const sendToReview = async (char: AppSchema.Character, flags: string[], reason: string) => { + const moderation: AppSchema.CharacterModeration = { + status: 'rejected', + flags, + reason, + autoCheckedAt: Date.now(), + moderated: false, + } + await store.characters.updateCharacter(char._id, userId!, { published: false, moderation }) + sendOne(userId, { + type: 'publish-response', + acceptable: false, + pending: true, + requestId, + reason: + "Your character didn't pass the automatic check and has been sent to our moderators for review. You'll be notified once it's reviewed.", + }) + } + const { stream, service } = await createInferenceStream({ requestId, - jsonSchema: config.modSchema, + jsonSchema: modSchema, user, log, prompt, - settings, - imageData: body.imageData, + images, + // Overrides the served model's default companion system prompt so the model + // classifies the character instead of answering the prompt in-character. + system: DEFAULT_MOD_SYSTEM, + // Run on the dedicated (original, vision-capable) moderation model rather than + // the user-facing chat model, which may be a less-censored swap. + moderation: true, }) res.json({ success: true, generating: true, requestId }) - if (user.admin) { - sendOne(userId, { type: 'inference-prompt', prompt }) - } + if (user.admin) sendOne(userId, { type: 'inference-prompt', prompt }) let response = '' let partial = '' @@ -242,79 +424,208 @@ const publishCharacter = handle(async ({ userId, body, log }, res) => { response = gen continue } - if ('meta' in gen && user.admin) { sendOne(userId, { type: 'inference-meta', meta: gen.meta, requestId }) } - if ('partial' in gen) { partial = gen.partial - fromJsonResponse(config.modSchema, gen.partial, output) + fromJsonResponse(modSchema, gen.partial, output) if (user.admin) sendOne(userId, { type: 'inference-partial', partial, service, requestId, output }) continue } - if ('error' in gen) { sendOne(userId, { type: 'inference-error', partial, error: gen.error, requestId }) continue } - if ('warning' in gen) { sendOne(userId, { type: 'inference-warning', requestId, warning: gen.warning }) continue } } } catch (ex: any) { - if (ex instanceof StatusError) { - sendOne(userId, { - type: 'inference-error', - partial, - error: `[${ex.status}] ${ex.message}`, - requestId, - }) - } else { - sendOne(userId, { type: 'inference-error', partial, error: `${ex.message || ex}`, requestId }) - } + const msg = ex instanceof StatusError ? `[${ex.status}] ${ex.message}` : `${ex.message || ex}` + sendOne(userId, { type: 'inference-error', partial, error: msg, requestId }) + sendOne(userId, { + type: 'publish-response', + acceptable: false, + requestId, + reason: 'The moderation check could not be completed. Please try again.', + }) + return } - if (!response) return - if (user.admin) sendOne(userId, { type: 'inference', requestId, response: response, output }) + if (!response) { + sendOne(userId, { + type: 'publish-response', + acceptable: false, + requestId, + reason: 'The moderation check returned no result. Please try again.', + }) + return + } + if (user.admin) sendOne(userId, { type: 'inference', requestId, response, output }) + + // Fail CLOSED: if we couldn't parse the verdict into any known moderation + // field, the model didn't actually clear the character — do NOT publish. (The + // verdict below defaults to acceptable=true and only flips on a parsed + // violation, so an empty output would otherwise auto-approve anything.) + fromJsonResponse(modSchema, response, output) + if (!Object.keys(output).length) { + // The automated check didn't return a usable verdict — don't approve, but + // don't dead-end the user either: hand it to a human moderator (same as any + // AI denial below). + await sendToReview( + character, + [], + 'Automated check returned no usable verdict — needs manual review.' + ) + return + } + // A field is a violation when its moderation-schema rule isn't satisfied; the + // field name doubles as the moderation flag (e.g. 'underage', 'violence'). let acceptable = true + let nsfwDetected = false + const flags: string[] = [] for (const [key, value] of Object.entries(output)) { - const def = config.modSchema.find((s) => s.name === key) - if (!def) continue - if (!def.type.valid) continue + const def = modSchema.find((s) => s.name === key) + if (!def || !def.type.valid) continue + + // Nudity is allowed on this adults-only platform: it never blocks publishing, + // it just flips the character's NSFW flag. (Minors remain a hard deny below.) + if (key === 'nudity') { + if (value === true) { + nsfwDetected = true + flags.push('nudity') + } + continue + } + let fieldOk = true switch (def.type.type) { case 'integer': case 'string': continue + case 'bool': + fieldOk = value === (def.type.valid === 'true') + break + case 'enum': + fieldOk = def.type.valid + .split(',') + .map((v) => v.trim()) + .includes((value || '') as string) + break + } + if (!fieldOk) { + acceptable = false + flags.push(def.name) + } + } - case 'bool': { - const expected = def.type.valid === 'true' - if (value !== expected) acceptable = false - continue - } + const checkedAt = Date.now() + + if (!acceptable) { + // AI denial: the character is NOT published. Instead of dead-ending the user, + // route it to the admin pending-review queue for a human decision. + await sendToReview( + character, + flags, + flags.length ? `Flagged for: ${flags.join(', ')}` : 'Did not pass the content check' + ) + return + } - case 'enum': { - const values = def.type.valid.split(',').map((v) => v.trim()) - const valid = values.includes((value || '') as string) - if (!valid) acceptable = false - continue - } - } + const reward = config.publishReward || PUBLISH_DEFAULTS.reward + const shouldReward = !character.publishRewarded && reward > 0 + + const moderation: AppSchema.CharacterModeration = { + status: 'approved', + flags, + autoCheckedAt: checkedAt, + moderated: false, } + await store.characters.updateCharacter(character._id, userId!, { + published: true, + publishedAt: checkedAt, + publishRewarded: character.publishRewarded || shouldReward, + moderation, + // Nudity in the text/images auto-marks the character 18+ rather than blocking. + ...(nsfwDetected ? { nsfw: true } : {}), + }) - sendOne(userId, { type: 'publish-response', acceptable, requestId }) + if (shouldReward) await store.credits.updateCredits(userId!, reward) + + sendOne(userId, { + type: 'publish-response', + acceptable: true, + requestId, + rewarded: shouldReward ? reward : 0, + }) +}) + +const reportCharacter = handle(async ({ userId, params, body }) => { + assertValid({ reason: 'string', note: 'string?' }, body) + if (!body.reason.trim()) throw new StatusError('A reason is required', 400) + + // Only publicly-visible characters can be reported (and never your own). + const char = await store.matches.getMatch(userId!, params.id) + if (!char) throw new StatusError('Character not found', 404) + if (char.userId === userId) throw new StatusError(`You can't report your own character`, 400) + + const { count } = await store.reports.createReport({ + charId: char._id, + charOwnerId: char.userId, + reporterId: userId!, + reason: body.reason.trim().slice(0, 60), + note: body.note?.toString().slice(0, 500), + }) + + // Auto-hide once enough distinct users have reported it; admins review next. + if (count >= PUBLISH_DEFAULTS.reportThreshold && char.moderation?.status !== 'hidden') { + await store.characters.setCharacterModeration(char._id, { + published: false, + moderation: { + ...(char.moderation || { status: 'approved' }), + status: 'hidden', + reason: `Auto-hidden after ${count} reports`, + }, + reportCount: count, + }) + } else { + await store.characters.setCharacterModeration(char._id, { reportCount: count }) + } + + return { success: true } +}) + +// Migrate a legacy embedded memory book into the new long-term memory, then +// drop the book from the character. Idempotent: no book → migrated 0. +const migrateBook = handle(async ({ userId, params }) => { + const char = await store.characters.getCharacter(userId!, params.id) + if (!char) throw new StatusError('Character not found', 404) + + const entries = (char.characterBook?.entries || []).filter((e) => e.entry?.trim()) + if (!entries.length) return { migrated: 0 } + + let migrated = 0 + for (const entry of entries) { + const text = (entry.name ? `${entry.name}: ${entry.entry}` : entry.entry).trim() + // 'manual' so book facts are stored verbatim (no ephemeral filter / reconcile). + const doc = await rememberFact(userId!, char._id, text, 'manual') + if (doc) migrated++ + } + + // Drop the old book from the character. + await store.characters.updateCharacter(char._id, userId!, { characterBook: null as any }) + return { migrated } }) const editPartCharacter = handle(async ({ body, params, userId }) => { const id = params.id assertStrict({ type: characterPost }, body) - const update: CharacterUpdate = body + const update: CharacterUpdate = body as any if (update.avatar?.startsWith('data:image/png;base64')) { const filename = await entityUploadBase64('char', id, update.avatar) @@ -356,10 +667,43 @@ const editPartCharacter = handle(async ({ body, params, userId }) => { } } + // If this partial update changes moderatable content on a live public + // character, take it private for re-publishing (see editFullCharacter). A + // non-content tweak (favourite, folder, …) leaves the public state alone. + if (CONTENT_FIELDS.some((f) => f in update)) { + const existing = await store.characters.getCharacter(userId!, id) + if (existing?.published) { + update.published = false + update.moderation = { + ...(existing.moderation || { status: 'approved' }), + status: 'review', + moderated: false, + } + } + } + const char = await store.characters.partialUpdateCharacter(id, userId, update) return char }) +/** Character fields whose change requires re-moderation before staying public. */ +const CONTENT_FIELDS: (keyof CharacterUpdate)[] = [ + 'name', + 'persona', + 'greeting', + 'scenario', + 'sampleChat', + 'description', + 'appearance', + 'avatar', + 'sprite', + 'visualType', + 'systemPrompt', + 'postHistoryInstructions', + 'alternateGreetings', + 'characterBook', +] + export const bulkUpdate = handle(async (req) => { assertValid( { characterIds: ['string'], folder: 'string?', addTag: 'string?', removeTag: 'string?' }, @@ -391,6 +735,22 @@ const editFullCharacter = handle(async (req) => { const imageSettings = body.imageSettings ? JSON.parse(body.imageSettings) : undefined const json = body.json ? JSON.parse(body.json) : undefined + // creator / characterVersion are managed automatically (server-side). Keep the + // existing creator untouched and auto-increment the version. Body values for + // these two are ignored. + const existing = await store.characters.getCharacter(req.userId!, id) + + // A character carrying a custom system_prompt is a power/safety-sensitive + // definition (e.g. imported jailbreak-style cards whose prompt can try to + // subvert the levels/18+ safeguard). It is not user-editable — only an + // admin/moderator may change it. Block the edit outright for everyone else. + if (existing?.systemPrompt && !req.user?.admin) { + throw errors.Forbidden + } + + const parsedVersion = parseInt(existing?.characterVersion ?? '', 10) + const nextVersion = Number.isFinite(parsedVersion) ? String(parsedVersion + 1) : '1' + const update: CharacterUpdate = { name: body.name, description: body.description, @@ -405,9 +765,12 @@ const editFullCharacter = handle(async (req) => { characterBook: characterBook ?? null, systemPrompt: body.systemPrompt, postHistoryInstructions: body.postHistoryInstructions, - creator: body.creator, - characterVersion: body.characterVersion, - match: body.match?.toString() === 'true' || false, + // creator left as-is (omitted from update so it isn't overwritten); + // characterVersion auto-incremented. + characterVersion: nextVersion, + // Editing always lands a finished character. Finalizing a draft clears the + // flag (making it visible); editing a normal character is a harmless no-op. + draft: false, premium: body.premium?.toString() === 'true' || false, // xp: 0, // body.xp ? parseInt(body.xp) : 0, share: body.share || 'private', @@ -415,6 +778,14 @@ const editFullCharacter = handle(async (req) => { imageSettings, insert, json, + progression: body.progression ? JSON.parse(body.progression) : undefined, + gender: (body.gender as AppSchema.Character['gender']) || undefined, + artStyle: (body.artStyle as AppSchema.Character['artStyle']) || undefined, + ageRange: body.ageRange || undefined, + category: body.category ? JSON.parse(body.category) : undefined, + nsfw: body.nsfw?.toString() === 'true' || undefined, + loraName: body.loraName || undefined, + imageSeed: body.imageSeed ? Number(body.imageSeed) : undefined, } if (body.persona) { @@ -440,11 +811,29 @@ const editFullCharacter = handle(async (req) => { update.avatar = filename + `?v=${v4().slice(0, 4)}` } - const user = await store.users.getUser(req.userId!) - if (user?.credits && user?.credits < 20) { + // Editing a live public character takes it private again: the content changed + // and must be re-moderated. The owner re-publishes (re-running the automated + // check) to make it public again. publishRewarded is left set so re-publishing + // is exempt from the daily cap and isn't re-rewarded. + if (existing?.published) { + update.published = false + update.moderation = { + ...(existing.moderation || { status: 'approved' }), + status: 'review', + moderated: false, + } + } + + // Billing: finalizing a draft into a live character IS the creation step, so it + // takes the 100-credit creation fee (the draft itself was made for free on + // entering the final step). Editing an already-finished character takes the + // smaller 30-credit edit fee. + const fee = existing?.draft ? 100 : 30 + const billed = await store.users.getUser(req.userId!) + if (billed?.credits && billed.credits < fee) { throw new StatusError('Not enough credits', 400) } - await store.credits.updateCredits(req.userId!, -20) + await store.credits.updateCredits(req.userId!, -fee) const char = await store.characters.updateCharacter(id, req.userId!, update) @@ -467,9 +856,228 @@ const getCharacter = handle(async ({ userId, params }) => { return char }) +/** Max images stored per character gallery. The LoRA reference set is a user- + * picked subset of these (max 4, the Z-Image encode limit). */ +const MAX_GALLERY = 10 + +const addGalleryImage = handle(async ({ userId, params, body }) => { + assertValid({ image: 'string' }, body) + + const char = await store.characters.getCharacter(userId!, params.id) + if (!char) throw errors.NotFound + + const gallery = (char.gallery || []).slice() + if (gallery.length >= MAX_GALLERY) { + throw new StatusError(`Gallery is full (max ${MAX_GALLERY} images)`, 400) + } + + const url = await entityUploadBase64Unique('char-gallery', params.id, body.image) + if (!url) throw new StatusError('Invalid image data', 400) + + gallery.push(url) + + const update: CharacterUpdate = { gallery } + + // Publish moderation reviews the avatar + gallery only at publish time, and + // Discover/Profile render gallery images — so adding a new image to a live public + // character would put unmoderated content on the gallery immediately. Mirror the + // edit path: take it private for review; the owner re-publishes to re-run the + // automated check. publishRewarded is left set so re-publishing isn't re-rewarded. + if (char.published) { + update.published = false + update.moderation = { + ...(char.moderation || { status: 'approved' }), + status: 'review', + moderated: false, + } + } + + await store.characters.updateCharacter(params.id, userId!, update) + return { gallery, published: update.published ?? char.published } +}) + +const removeGalleryImage = handle(async ({ userId, params, body }) => { + assertValid({ url: 'string' }, body) + + const char = await store.characters.getCharacter(userId!, params.id) + if (!char) throw errors.NotFound + + const gallery = (char.gallery || []).filter((url) => url !== body.url) + await store.characters.updateCharacter(params.id, userId!, { gallery }) + return { gallery } +}) + +/** Set the character's cover (avatar) to one of its existing images. The url + * must be the current avatar or part of the character's gallery so we never + * point the avatar at an arbitrary/unowned asset. */ +const setCover = handle(async ({ userId, params, body }) => { + assertValid({ url: 'string' }, body) + + const char = await store.characters.getCharacter(userId!, params.id) + if (!char) throw errors.NotFound + + const allowed = new Set([...(char.gallery || []), char.avatar].filter(Boolean) as string[]) + if (!allowed.has(body.url)) { + throw new StatusError('Cover image is not part of this character', 400) + } + + await store.characters.updateCharacter(params.id, userId!, { avatar: body.url }) + return { avatar: body.url } +}) + +/** + * Long-term memory management for a character (the new "remember" system that + * replaces memory books). Scoped to the owner + character, so it spans every + * chat with that companion. The model writes these via the `remember` tool; + * these routes let the owner view, add, and remove them. + */ +const listCharacterMemories = handle(async ({ userId, params }) => { + const char = await store.characters.getCharacter(userId!, params.id) + if (!char) throw errors.NotFound + const memories = await listMemories(userId!, params.id) + return { memories: memories.map(({ embedding, ...m }) => m) } +}) + +const addCharacterMemory = handle(async ({ userId, params, body }) => { + assertValid({ text: 'string' }, body) + const char = await store.characters.getCharacter(userId!, params.id) + if (!char) throw errors.NotFound + + const text = (body.text || '').trim() + if (!text) throw new StatusError('Memory text is required', 400) + + const doc = await rememberFact(userId!, params.id, text, 'manual') + if (!doc) throw new StatusError('Could not store memory', 400) + + const memories = await listMemories(userId!, params.id) + return { memories: memories.map(({ embedding, ...m }) => m) } +}) + +const removeCharacterMemory = handle(async ({ userId, params }) => { + const char = await store.characters.getCharacter(userId!, params.id) + if (!char) throw errors.NotFound + + await deleteMemory(userId!, params.memId) + const memories = await listMemories(userId!, params.id) + return { memories: memories.map(({ embedding, ...m }) => m) } +}) + +/** Max reference images accepted by the Z-Image encode endpoint. */ +const MAX_LORA_REFS = 4 + +/** Credit cost to train/encode a character LoRA. */ +const LORA_COST = 300 + +const encodeLora = handle(async ({ userId, params, body }) => { + assertValid({ images: ['string'] }, body) + + const char = await store.characters.getCharacter(userId!, params.id) + if (!char) throw errors.NotFound + + // Gate on credits up front so an under-funded request is rejected before the + // expensive encode; the actual deduction happens only after it succeeds. + const user = await store.users.getUser(userId!) + if ((user?.credits ?? 0) < LORA_COST) { + throw new StatusError(`Not enough credits — training a LoRA costs ${LORA_COST}`, 400) + } + + const refs = (body.images || []).filter((img: string) => !!img).slice(0, MAX_LORA_REFS) + if (!refs.length) { + throw new StatusError('Provide at least one reference image', 400) + } + + // Entries may be base64 data urls (freshly generated/uploaded) or stored asset + // URLs. Resolve everything to base64 server-side (avoids browser CORS on the + // CDN). Restrict to the character's own gallery when an asset ref is given. + const allowed = new Set([...(char.gallery || []), char.avatar].filter(Boolean) as string[]) + const images: string[] = [] + for (const ref of refs) { + if (ref.includes('base64,')) { + images.push(ref) + continue + } + if (!allowed.has(ref)) { + throw new StatusError('Reference image is not part of this character gallery', 400) + } + const b64 = await readAssetBase64(ref) + if (b64) images.push(b64) + } + + if (!images.length) { + throw new StatusError('Could not read the reference images', 400) + } + + // Reuse the character's existing LoRA name so re-encoding REPLACES it (Z-Image + // overwrites the stored LoRA under the same name). Only mint a new unique name + // (character name + randomizer) the first time. + // + // BUT: a matched clone inherits its parent's `loraName`, so that name is shared + // on the image server. Overwriting it here would corrupt the parent template and + // every other clone. If anyone else still references this name, fork a fresh + // unique name so this character gets its own LoRA instead of clobbering theirs. + const shared = char.loraName + ? await store.characters.anyCharacterUsesLora(char.loraName, char._id) + : false + const saveAs = char.loraName && !shared ? char.loraName : makeLoraName(char.name) + const loraName = await zimageEncode(images, saveAs) + + await store.characters.updateCharacter(params.id, userId!, { loraName }) + await store.credits.updateCredits(userId!, -LORA_COST) + return { loraName } +}) + +/** + * Remove a stored LoRA from the image server, but only when no remaining + * character still references it (clones share the parent's `loraName`). Call this + * AFTER the local change (clear/delete) so the usage check reflects reality. + * Best-effort: a failed remote delete must not fail the user's local action. + */ +async function deleteLoraFromImageServer(loraName?: string) { + if (!loraName) return + if (await store.characters.anyCharacterUsesLora(loraName)) return + try { + await zimageDeleteLora(loraName) + } catch (err: any) { + logger.warn({ err: err?.message, loraName }, 'Failed to delete LoRA from image server') + } +} + +/** Delete just the character's image LoRA (keeps the character itself). */ +const deleteLora = handle(async ({ userId, params }) => { + const char = await store.characters.getCharacter(userId!, params.id) + if (!char) throw errors.NotFound + const loraName = char.loraName + if (!loraName) return { success: true } + + await store.characters.clearCharacterLora(params.id, userId!) + await deleteLoraFromImageServer(loraName) + return { success: true } +}) + const deleteCharacter = handle(async ({ userId, params }) => { const id = params.id + // Read the LoRA name before the doc is gone; clean it up off the image server + // after deletion (so the shared-use check sees the character as already removed). + const char = await store.characters.getCharacter(userId!, id) await store.characters.deleteCharacter({ userId: userId!, charId: id }) + await deleteLoraFromImageServer(char?.loraName) + return { success: true } +}) + +/** + * Reset a character the user owns back to a clean slate: delete all of their + * chats with it, zero the relationship XP, and wipe its long-term memories. The + * character itself (persona, gallery, progression config) is kept. + */ +const resetCharacter = handle(async ({ userId, params }) => { + const id = params.id + const char = await store.characters.getCharacter(userId!, id) + if (!char) throw errors.NotFound + + await store.chats.deleteChatsByCharacter(userId!, id) + await deleteAllMemories(userId!, id) + await store.characters.updateCharacter(id, userId!, { xp: 0 }) + return { success: true } }) @@ -477,10 +1085,17 @@ const editCharacterFavorite = handle(async (req) => { const id = req.params.id const favorite = req.body.favorite === true + const prev = await store.characters.getCharacter(req.userId!, id) const char = await store.characters.updateCharacter(id, req.userId!, { favorite: favorite, }) + // Roll the favourite up to the public template (the clone's parent, or itself) + // only when the flag actually flips, so re-toggling can't double-count. + if (prev && !!prev.favorite !== favorite) { + await store.matches.incrementEngagement(id, 'favorites', favorite ? 1 : -1, prev.parent || id) + } + return char }) @@ -509,11 +1124,32 @@ export const createImage = handle(async ({ body, userId, socketId, log }) => { chatId: 'string?', requestId: 'string?', parent: 'string?', + seed: 'number?', + noCharge: 'boolean?', }, body ) const user = userId ? await store.users.getUser(userId) : body.user + // Charge logged-in users for each image generation/regeneration. Avatar, + // gallery, and the create-wizard portrait all route through here, so this is + // the single place the image cost is applied. Guests have no account to bill; + // generateImage refunds the charge if the request is dropped on disconnect. + if (userId && userId !== 'anon') { + // The create wizard's FIRST portrait is free — it's bundled into the + // 100-credit creation fee. This is a single-use freebie claimed atomically + // from the draft's server state (not the client's `noCharge` flag), so it + // can't be replayed for unlimited free images, nor used on the edit form or + // in chat (no draft). Every other generation is charged. + const free = body.noCharge ? await store.characters.claimDraftFreePortrait(userId) : false + if (!free) { + if ((user?.credits ?? 0) < IMAGE_COST) { + throw new StatusError(`Not enough credits — generating an image costs ${IMAGE_COST}`, 400) + } + await store.credits.updateCredits(userId, -IMAGE_COST) + } + } + const guestId = userId ? undefined : socketId generateImage( { @@ -526,6 +1162,7 @@ export const createImage = handle(async ({ body, userId, socketId, log }) => { characterId: body.characterId, requestId: body.requestId, parentId: body.parent, + seed: body.seed, }, log, guestId @@ -536,14 +1173,28 @@ export const createImage = handle(async ({ body, userId, socketId, log }) => { router.post('/image', createImage) router.use(loggedIn) router.post('/', loggedIn, createCharacter) +router.post('/import', loggedIn, importCharacter) router.get('/', getCharacters) +router.get('/draft', loggedIn, getDraft) +router.get('/publish/status', getPublishStatus) router.post('/publish', publishCharacter) +router.post('/:id/report', reportCharacter) +router.post('/:id/migrate-book', migrateBook) router.post('/:id/update', editPartCharacter) router.post('/:id', editFullCharacter) router.get('/:id', getCharacter) router.delete('/:id', loggedIn, deleteCharacter) +router.post('/:id/reset', resetCharacter) router.post('/:id/favorite', editCharacterFavorite) router.delete('/:id/avatar', removeAvatar) +router.post('/:id/gallery', addGalleryImage) +router.delete('/:id/gallery', removeGalleryImage) +router.post('/:id/cover', setCover) +router.post('/:id/encode-lora', encodeLora) +router.delete('/:id/lora', loggedIn, deleteLora) +router.get('/:id/memories', listCharacterMemories) +router.post('/:id/memories', addCharacterMemory) +router.delete('/:id/memories/:memId', removeCharacterMemory) router.post('/bulk-update', bulkUpdate) export default router diff --git a/srv/api/charimport.ts b/srv/api/charimport.ts deleted file mode 100644 index f9f0b5ae..00000000 --- a/srv/api/charimport.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { Router } from 'express' -import needle from 'needle' -import { loggedIn } from './auth' -import { handle, StatusError } from './wrap' - -const router = Router() - -const CHUB_URL = `https://char-archive.evulid.cc/api/archive/v1/` - -export const importCharacter = handle(async (req, res) => { - const path = req?.body?.path - - if (!path.startsWith(CHUB_URL)) { - throw new StatusError('Illegal URL', 403) - } - - try { - // Fetch the image using Needle - const response = await needle('get', path, { responseType: 'buffer' }) - - // Check if the response is successful - if (response.statusCode === 200) { - // Set the appropriate headers - res.setHeader('Content-Type', 'image/png') - res.setHeader('Cache-Control', 'public, max-age=31536000, immutable') - - // Send the image as the response - res.status(200).send(response.body) - } else { - // Handle error if image fetching fails - throw new StatusError('Failed to fetch image', 500) - } - } catch (error) { - // Catch and handle any errors - res.status(500).json({ error: 'Failed to fetch image' }) - } -}) - -router.use(loggedIn) - -router.post('/', importCharacter) - -export default router diff --git a/srv/api/chat/create.ts b/srv/api/chat/create.ts index 864b88e6..7f39da3c 100644 --- a/srv/api/chat/create.ts +++ b/srv/api/chat/create.ts @@ -1,9 +1,9 @@ import { assertValid } from '/common/valid' import { PERSONA_FORMATS } from '../../../common/adapters' +import { buildEventScenario } from '../../../common/event' import { store } from '../../db' import { NewMessage } from '../../db/messages' import { handle, StatusError } from '../wrap' -import XPLevel from '../../../common/xplevel' export const createChat = handle(async ({ body, user, userId }) => { assertValid( @@ -17,38 +17,18 @@ export const createChat = handle(async ({ body, user, userId }) => { sampleChat: 'string?', overrides: { '?': 'any?', kind: PERSONA_FORMATS, attributes: 'any' }, useOverrides: 'boolean?', - scenarioId: 'string?', - scenarioStates: 'string?', impersonating: 'string?', imageSource: 'string?', }, body ) - if (body.scenarioId) { - const scenario = await store.scenario.getScenario(body.scenarioId) - // if (scenario?.userId !== userId) - // throw new StatusError('You do not have access to this scenario', 403) - } - const character = await store.characters.getCharacter(userId, body.characterId) const profile = await store.users.getProfile(userId) const impersonating = body.impersonating ? await store.characters.getCharacter(userId, body.impersonating) : undefined - let scenarios: string[] = [] - let lvl: string[] = [] - if (character?.scenarioIds) { - scenarios = character.scenarioIds - lvl.push(`LEVEL${XPLevel(character?.xp as number)}`) - if (user?.premium) { - lvl.push(`PREMIUM`) - } - } else { - scenarios = body.scenarioId !== undefined ? [body.scenarioId] : [] - } - const chat = await store.chats.create( body.characterId, { @@ -56,8 +36,8 @@ export const createChat = handle(async ({ body, user, userId }) => { imageSource: body.imageSource as any, greeting: body.greeting ?? character?.greeting, userId: user?.userId!, - scenarioIds: scenarios, - scenarioStates: lvl, + scenarioIds: [], + scenarioStates: [], }, profile!, impersonating @@ -133,3 +113,85 @@ export const importChat = handle(async ({ body, userId }) => { return chat }) + +export const createEventChat = handle(async ({ body, user, userId }) => { + assertValid( + { + location: 'string', + description: 'string', + characterIds: ['string'], + memoryDisabled: 'boolean?', + when: 'string?', + vibe: 'string?', + directorEvents: 'string?', + note: 'string?', + }, + body + ) + + const chars = ( + await Promise.all( + body.characterIds.map((id: string) => store.characters.getCharacter(userId, id)) + ) + ).filter(Boolean) + + if (chars.length === 0) throw new StatusError('Invite at least one character', 400) + + const profile = await store.users.getProfile(userId) + + const scenario = buildEventScenario({ + location: body.location, + description: body.description, + names: chars.map((c) => c!.name), + when: body.when || undefined, + vibe: body.vibe || undefined, + // List the user (self-persona handle) as present so the characters treat + // this as an ongoing acquaintance, not a stranger arriving. + userName: profile?.handle || undefined, + }) + + const characters: Record = {} + for (const c of chars) characters[c!._id] = true + + const chat = await store.chats.create( + chars[0]!._id, + { + name: `${body.location} — ${body.description}`.slice(0, 80), + userId: userId!, + mode: 'event', + event: { + location: body.location, + description: body.description, + when: body.when || undefined, + vibe: body.vibe || undefined, + directorEvents: (body.directorEvents as 'none' | 'rare' | 'normal' | 'regular') || 'none', + note: body.note?.trim() || undefined, + }, + // Defaults on for events (no long-term residue), but the creator can opt in + // to remembering the party from the start screen. + memoryDisabled: body.memoryDisabled ?? true, + scenario, + overrides: chars[0]!.persona, + // No char-attributed greeting: the opening is a neutral scene line (below) + // so no single character "owns" the intro. The director then opens the scene. + characters, + memberIds: [], + scenarioIds: [], + scenarioStates: [], + }, + profile! + ) + + // Scene-setting narration shown as a world event (no characterId → not owned by + // any character). The director elects who speaks first when the chat is opened. + await store.msgs.createChatMessage({ + chatId: chat._id, + message: `You arrive at ${body.location}. ${body.description}.`, + ooc: false, + event: 'world', + name: undefined, + }) + + const updated = await store.chats.update(chat._id, { messageCount: 1 }) + return updated || chat +}) diff --git a/srv/api/chat/edit.ts b/srv/api/chat/edit.ts index 576a110c..8ce776cd 100644 --- a/srv/api/chat/edit.ts +++ b/srv/api/chat/edit.ts @@ -25,6 +25,7 @@ export const updateChat = handle(async ({ params, body, user, userId }) => { postHistoryInstructions: 'string?', imageSource: 'string?', imageSettings: 'any?', + memoryDisabled: 'boolean?', }, body, true @@ -53,6 +54,7 @@ export const updateChat = handle(async ({ params, body, user, userId }) => { scenarioStates: body.scenarioStates ?? prev.scenarioStates, imageSource: (body.imageSource as any) ?? prev.imageSource, imageSettings: body.imageSettings, + memoryDisabled: body.memoryDisabled ?? prev.memoryDisabled, } if (body.useOverrides === false) { diff --git a/srv/api/chat/image.ts b/srv/api/chat/image.ts index 32f4ee5b..57d2183a 100644 --- a/srv/api/chat/image.ts +++ b/srv/api/chat/image.ts @@ -1,7 +1,7 @@ import { assertValid } from '/common/valid' import { store } from '../../db' -import { generateImage } from '../../image' -import { handle } from '../wrap' +import { generateImage, IMAGE_COST } from '../../image' +import { handle, StatusError } from '../wrap' export const createImage = handle(async ({ body, userId, socketId, log, params }) => { assertValid( @@ -24,6 +24,14 @@ export const createImage = handle(async ({ body, userId, socketId, log, params } return { success: false } } + // Charge logged-in users for image generation / regeneration. + if (userId) { + if (user?.credits && user.credits < IMAGE_COST) { + throw new StatusError('Not enough credits', 400) + } + await store.credits.updateCredits(userId, -IMAGE_COST) + } + generateImage( { user, diff --git a/srv/api/chat/index.ts b/srv/api/chat/index.ts index 3b3dfef1..4bae6a0d 100644 --- a/srv/api/chat/index.ts +++ b/srv/api/chat/index.ts @@ -1,6 +1,6 @@ import { Router } from 'express' import { apiKeyUsage, loggedIn } from '../auth' -import { createChat, importChat } from './create' +import { createChat, createEventChat, importChat } from './create' import { restartChat, updateChat, @@ -43,6 +43,7 @@ router.put('/:id', updateChat) router.put('/:id/preset', updateChatGenPreset) router.post('/', createChat) +router.post('/event', createEventChat) router.post('/import', importChat) router.post('/:id/invite', createInvite) router.post('/:id/uninvite', uninviteMember) diff --git a/srv/api/chat/inference.ts b/srv/api/chat/inference.ts index 54b3c0e4..204decd8 100644 --- a/srv/api/chat/inference.ts +++ b/srv/api/chat/inference.ts @@ -14,6 +14,7 @@ import { cyoaTemplate } from '/common/mode-templates' import { AIAdapter } from '/common/adapters' import { parseTemplate } from '/common/template-parser' import { obtainLock, releaseLock } from './lock' +import { ClientGoneError } from '../../queue' import { v4 } from 'uuid' const validInference = { @@ -187,7 +188,7 @@ export const guidance = wrap(async ({ userId, log, body, socketId }) => { if (!userId || body.user.credits < 10) { throw errors.MissingCredits } - const credits = await store.credits.updateCredits(userId!, -10) + await store.credits.updateCredits(userId!, -10) const props: InferenceRequest = { user: body.user, log, @@ -203,8 +204,17 @@ export const guidance = wrap(async ({ userId, log, body, socketId }) => { jsonSchema: body.jsonSchema, } - const result = await guidanceAsync(props) - return result + try { + const result = await guidanceAsync(props) + return result + } catch (ex) { + if (ex instanceof ClientGoneError) { + // Client disconnected before generation; refund the up-front charge. + await store.credits.updateCredits(userId!, 10) + return { values: {} } + } + throw ex + } }) export const inferenceModels = wrap(async (req) => { diff --git a/srv/api/chat/message.ts b/srv/api/chat/message.ts index 3c3e2d85..b97c1e63 100644 --- a/srv/api/chat/message.ts +++ b/srv/api/chat/message.ts @@ -4,11 +4,23 @@ import { createChatStream, getResponseEntities } from '../../adapter/generate' import { AppRequest, StatusError, errors, handle } from '../wrap' import { sendGuest, sendMany, sendOne } from '../ws' import { obtainLock, releaseLock } from './lock' +import { generateImage } from '../../image' +import { getXpPerMessage } from '/common/progression' +import { rememberFact, extractAndStoreMemories } from '../../memory/store' import { AppSchema } from '../../../common/types/schema' import { v4 } from 'uuid' import { Response } from 'express' import { getScenarioEventType } from '/common/scenario' -import { HydratedJson, jsonHydrator, parsePartialJson } from '/common/util' +import { HydratedJson, jsonHydrator, parsePartialJson, escapeRegex } from '/common/util' +import { + EVENT_TURN_COST, + EVENT_MAX_REPLIES, + DIRECTOR_EVENT_CHANCE, + DirectorFrequency, +} from '../../../common/event' +import { electSpeaker, proposeDirectorEvent } from '../../adapter/director' +import { resolveScenario, getLinesForPrompt, getAdapter } from '../../../common/prompt' +import { getTokenCounter } from '../../tokenize' type GenRequest = UnwrapBody @@ -78,6 +90,23 @@ const genValidator = { response: 'string?', } as const +/** Reply kinds that should trigger automatic long-term memory extraction: fresh + * character replies only. Retries/continues re-cover an already-seen turn, and + * ooc/summary/chat-query aren't in-character exchanges worth mining. */ +/** Re-rolls of a single event speaker's reply before the scene gives up. The chat + * finetune intermittently produces a whole-scene/Narrator output that gets dropped + * to empty; retrying the same speaker usually lands a clean in-character turn. */ +const EVENT_REPLY_RETRIES = 2 + +const AUTO_MEMORY_KINDS = new Set([ + 'send', + 'request', + 'self', + 'send-event:world', + 'send-event:character', + 'send-event:hidden', +]) + export const getMessages = handle(async ({ userId, params, query }) => { const chatId = params.id @@ -158,6 +187,14 @@ export const generateMessageV2 = handle(async (req, res) => { const chat = await store.chats.getChatOnly(chatId) if (!chat) throw errors.NotFound + // Event turns cost a flat EVENT_TURN_COST; reject early (before the ack) so the + // client gets a clean MissingCredits instead of a silently-swallowed throw. + // 'request' is the director auto-open trigger (no user message); it costs a turn too. + const isEventTurn = chat.mode === 'event' && (body.kind === 'send' || body.kind === 'request') + if (isEventTurn && body.user && body.user.credits < EVENT_TURN_COST) { + throw errors.MissingCredits + } + if (body.kind === 'request' && chat.userId !== userId) { throw errors.Forbidden } @@ -198,6 +235,18 @@ export const generateMessageV2 = handle(async (req, res) => { name: impersonate?.name, }) + // Measure sustained engagement: a real user message rolls up to the public + // template (the clone's parent, or the template itself). OOC chatter and + // retries/swipes are excluded. `replyAs` is already loaded, so no extra read. + if (body.kind === 'send' && !replyAs._id.startsWith('temp-')) { + await store.matches.incrementEngagement( + replyAs._id, + 'messages', + 1, + replyAs.parent || replyAs._id + ) + } + sendMany(members, { type: 'message-created', msg: userMsg, chatId }) } else if (body.kind.startsWith('send-event:')) { userMsg = await store.msgs.createChatMessage({ @@ -242,6 +291,303 @@ export const generateMessageV2 = handle(async (req, res) => { }) } + res.json({ requestId, success: true, generating: true, message: 'Generating message', messageId }) + + if (isEventTurn) { + try { + // Flat fee covers the whole turn (director calls + every reply). Applies to + // both a user 'send' and the 'request' auto-open (director opens the scene). + await store.credits.updateCredits(userId!, -EVENT_TURN_COST) + + const roster = await getEventRoster(chat) + + // Server-side prompt deps (mirror the client's createActiveChatPrompt). + const entities = await getResponseEntities(chat, body.sender.userId, body.settings) + const { adapter, model } = getAdapter(chat, entities.user, entities.gen) + const encoder = getTokenCounter(adapter, model) + const memberIds = Array.from(new Set([chat.userId, ...chat.memberIds])) + const profiles = await store.users.getProfiles(chat.userId, memberIds) + const senderProfile = await store.users.getProfile(userId!) + + const repliedThisTurn: string[] = [] + // Set when the previous reply directly addressed a present character who + // hasn't spoken yet — a deterministic fallback for when the director model + // declines an obviously-warranted continuation (see detectAddressedSpeaker). + let addressed: string | undefined + + for (let i = 0; i < EVENT_MAX_REPLIES; i++) { + const msgs = await store.msgs.getMessages(chatId) + const recent = msgs + .slice() + .sort((a, b) => (a.createdAt < b.createdAt ? -1 : 1)) + .slice(-8) + .map((m) => ({ + name: m.name || (m.userId ? senderProfile?.handle || 'You' : 'Unknown'), + text: m.msg, + })) + + let speakerId = await electSpeaker({ + user: body.user!, + log, + event: chat.event!, + roster: roster.map((r) => ({ id: r.id, name: r.name, hook: r.hook })), + recent, + repliedThisTurn, + // The user is present in the scene (with their self-persona), so the + // director treats them as a known participant — not a stranger. + present: { + name: senderProfile?.handle || 'You', + hook: (senderProfile?.description || '').slice(0, 120), + }, + }) + + // The opening/user turn MUST produce a reply: a user 'send' always + // deserves a response and the 'request' auto-open has to open the scene. + // electSpeaker returns 'none' both when the director genuinely declines + // AND on any model/parse failure (it swallows errors → 'none'), so on the + // first election fall back to the main character instead of breaking with + // zero replies — otherwise the client hangs forever on `waiting`. + // Subsequent declines (someone already spoke) are legitimate: stop there. + if (speakerId === 'none') { + if (repliedThisTurn.length > 0) { + // Director declined a continuation. If the previous reply directly + // addressed a present character who hasn't spoken (named them + asked + // a question), let them answer anyway — the small director model + // reliably under-triggers this case even when prompted to. + if (addressed) speakerId = addressed + else break + } else { + speakerId = replyAs._id + } + } + // Consumed (or irrelevant because the director picked someone): clear so a + // stale value can't leak into a later iteration. + addressed = undefined + + const picked = roster.find((r) => r.id === speakerId) + if (!picked) break + // The roster contains {id, name, hook} only; load the full character to + // generate as. Reuse the already-loaded main char on the fallback path. + const eventReplyAs = + speakerId === replyAs._id ? replyAs : await store.characters.getCharacterById(speakerId) + if (!eventReplyAs) break + + // History the model sees, with this speaker's identity resolved. + // getLinesForPrompt returns time-DESCENDING (newest first); createChatStream + // (via assemblePrompt's `order: 'asc'`) expects time-ASCENDING. The client + // reverses inside createPromptParts before sending request.lines, so we must + // do the same here — otherwise the history is reversed and every character + // replies to the opening message. + const lines = ( + await getLinesForPrompt( + { + kind: body.kind, + settings: entities.gen, + members: profiles, + messages: msgs, + char: entities.char, + characters: body.characters, + sender: senderProfile!, + replyAs: eventReplyAs, + impersonate, + chat, + user: entities.user, + book: entities.book, + lastMessage: '', + chatEmbeds: [], + userEmbeds: [], + resolvedScenario: '', + jsonValues: undefined, + }, + encoder + ) + ).reverse() + + // Reuse one request id across retries so the client sees a single reply + // slot. The first turn keeps the original requestId for client correlation. + const slotRequestId = i === 0 ? requestId : v4() + const genReply = () => + generateOneReply({ + req, + body, + chat, + replyAs: eventReplyAs, + impersonate, + members, + userMsg, + requestId: slotRequestId, + eventTurn: true, + lines, + // chat.overrides is set on event chats, so scenario text = chat.scenario + // (the event block); the 4th arg makes the stage token + meta the speaker's. + resolvedScenario: resolveScenario(chat, eventReplyAs, [], eventReplyAs), + }) + + // A failed reply is usually the chat finetune going off the rails (a + // whole-scene / Narrator-led output that gets dropped to empty). That's + // random, so re-roll the same speaker a few times before giving up instead + // of stalling the scene — the only workaround was a manual resend. + let result = await genReply() + for (let attempt = 0; !result.ok && attempt < EVENT_REPLY_RETRIES; attempt++) { + log.warn( + { speaker: eventReplyAs.name, attempt: attempt + 1 }, + 'event: reply failed, retrying' + ) + result = await genReply() + } + if (!result.ok) break + repliedThisTurn.push(eventReplyAs._id) + addressed = detectAddressedSpeaker(result.text, roster, new Set(repliedThisTurn)) + } + + // Director events: after the characters have replied, the director may add an + // unprompted world beat (announcement, arrival, environment shift) to drive + // the story. Frequency gates how often we *consider* it; the model still + // decides whether a beat is warranted (it can decline → empty). Narration + // only — the director never speaks or acts for a character or the user. It's + // attributed to a Charluv-heart "Director" avatar via meta.director. + const directorFreq = (chat.event?.directorEvents as DirectorFrequency) || 'none' + const chance = DIRECTOR_EVENT_CHANCE[directorFreq] ?? 0 + if (repliedThisTurn.length > 0 && chance > 0 && Math.random() < chance) { + try { + const msgs = await store.msgs.getMessages(chatId) + const recent = msgs + .slice() + .sort((a, b) => (a.createdAt < b.createdAt ? -1 : 1)) + .slice(-8) + .map((m) => ({ + name: m.name || (m.userId ? senderProfile?.handle || 'You' : 'Unknown'), + text: m.msg, + })) + const narration = await proposeDirectorEvent({ + user: body.user!, + log, + event: chat.event!, + roster: roster.map((r) => ({ name: r.name, hook: r.hook })), + recent, + }) + if (narration) { + const beat = await store.msgs.createChatMessage({ + chatId, + message: narration, + ooc: false, + event: 'world', + name: 'Director', + meta: { director: true }, + }) + sendMany(members, { type: 'message-created', msg: beat, chatId }) + } + } catch (err) { + log.warn({ err }, 'director: world-beat injection failed') + } + } + + // Safety net: a turn that produced no reply at all (e.g. the fallback char + // failed to load, or generateOneReply bailed before emitting its own + // message-error) must still tell the client to stop waiting — the + // `generating: true` ack already put it into the waiting state. + if (repliedThisTurn.length === 0) { + sendMany(members, { + type: 'message-error', + requestId, + error: 'The scene director could not continue the scene. Please try again.', + chatId, + }) + } + } finally { + await releaseLock(chatId) + } + return + } + + await generateOneReply({ + req, + body, + chat, + replyAs, + impersonate, + members, + userMsg, + requestId, + eventTurn: false, + }) + + await releaseLock(chatId) + return +}) + +/** + * When a just-generated reply directly addresses another present character who + * hasn't spoken this turn — naming them AND asking a question — return that + * character's id so the loop can let them respond. Deterministic safety net for + * the director under-triggering continuations. Conservative on purpose: requires + * both a whole-word name match and a question mark, and picks the most recently + * named candidate (closest to the question). + */ +function detectAddressedSpeaker( + text: string, + roster: Array<{ id: string; name: string }>, + replied: Set +): string | undefined { + if (!text || !text.includes('?')) return undefined + let best: { id: string; idx: number } | undefined + for (const r of roster) { + if (replied.has(r.id) || !r.name) continue + const match = new RegExp(`\\b${escapeRegex(r.name)}\\b`, 'i').exec(text) + if (match && (!best || match.index > best.idx)) best = { id: r.id, idx: match.index } + } + return best?.id +} + +// Present characters in the event, with a one-line persona hook for the director. +async function getEventRoster(chat: AppSchema.Chat) { + const ids = Object.entries(chat.characters || {}) + .filter(([, on]) => on) + .map(([id]) => id) + const chars = await store.characters.getCharacterList(ids) + return chars.map((char) => ({ + id: char._id as string, + name: char.name as string, + hook: ((char.description as string) || '').slice(0, 120), + })) +} + +/** + * Generate ONE bot reply as `ctx.replyAs` and persist it. Streams partials over + * WS, assembles the response, pulls native image/memory tool output, persists the + * message, and charges credits + advances XP. Returns `ok: false` on a stream + * error (the caller is responsible for releasing the lock). + * + * The lock, the single `res.json` ack, and `releaseLock` are owned by the caller. + */ +async function generateOneReply(ctx: { + req: AppRequest + body: GenRequest + chat: AppSchema.Chat + replyAs: AppSchema.Character + impersonate: AppSchema.Character | undefined + members: string[] + userMsg: AppSchema.ChatMessage | undefined + requestId: string + // True when this reply is part of an already-paid event turn (Task 5b): the + // per-reply −10 credit is then skipped (the flat fee was charged at turn start). + eventTurn: boolean + // Event mode: per-speaker overrides. When omitted, the existing body-derived + // values are used (non-event path is unchanged). + lines?: string[] + resolvedScenario?: string +}): Promise<{ ok: boolean; text: string; speakerId: string }> { + const { req, body, chat, replyAs, impersonate, members, userMsg, requestId } = ctx + const { userId, log } = req + const chatId = chat._id + + const messageId = + body.kind === 'retry' + ? body.replacing?._id ?? requestId + : body.kind === 'continue' + ? body.continuing?._id + : requestId + if (body.kind !== 'chat-query') { sendMany(members, { type: 'message-creating', @@ -252,9 +598,12 @@ export const generateMessageV2 = handle(async (req, res) => { }) } - res.json({ requestId, success: true, generating: true, message: 'Generating message', messageId }) - const entities = await getResponseEntities(chat, body.sender.userId, body.settings) + // Event mode: use this speaker's resolved scenario (stage token + meta) so the + // prompt createChatStream rebuilds reflects the elected character, not the main char. + if (ctx.resolvedScenario !== undefined) { + entities.resolvedScenario = ctx.resolvedScenario + } const schema = entities.gen.jsonSource === 'character' ? replyAs.json : entities.gen.json const hydrator = entities.gen.jsonEnabled && schema ? jsonHydrator(schema) : undefined @@ -271,6 +620,10 @@ export const generateMessageV2 = handle(async (req, res) => { const { stream, ...metadata } = await createChatStream( { ...body, + // Event mode passes a per-speaker history (built via getLinesForPrompt with + // this speaker's identity resolved); it overrides body.lines. Non-event + // callers omit ctx.lines, so body.lines is used unchanged. + lines: ctx.lines ?? body.lines, chat, replyAs, impersonate, @@ -369,9 +722,8 @@ export const generateMessageV2 = handle(async (req, res) => { } } - await releaseLock(chatId) if (error) { - return + return { ok: false, text: '', speakerId: replyAs._id } } } @@ -385,9 +737,67 @@ export const generateMessageV2 = handle(async (req, res) => { let treeLeafId = '' - const credits = await store.credits.updateCredits(userId!, -10) - await store.scenario.updateCharXp(chat.characterId!, +1) - //sendOne(userId!, { type: 'credits-updated', credits }) + // Native image tool: the model may have requested an image. Pull it out of the + // transient meta so it isn't persisted on the message; we fire generation after + // the message is created (see below). + const imageTool: { prompt?: string } | undefined = (meta as any).imageTool + delete (meta as any).imageTool + + // Native memory tool: facts the model chose to remember. Pull out of meta (not + // persisted on the message) and store them in long-term memory, scoped to the + // SPEAKING character (replyAs) — NOT chat.characterId. In a multi-char/event + // chat the speaker isn't the main char, so keying on chat.characterId would + // dump every participant's facts onto the main character (the memory pane would + // then show "all characters'" memories). In a 1:1 chat replyAs === main char. + const rememberFacts: string[] | undefined = (meta as any).rememberFacts + delete (meta as any).rememberFacts + if (rememberFacts?.length && replyAs._id && !chat.memoryDisabled) { + for (const fact of rememberFacts) { + rememberFact(userId!, replyAs._id, fact, 'tool').catch((err) => + log.error({ err }, 'Failed to store long-term memory') + ) + } + } + + // Auto memory extraction: the roleplay model rarely emits the inline + // marker on its own, so a separate background pass pulls durable facts out of + // this exchange and stores them (source 'auto'). Fired AFTER the reply (not + // awaited) so it adds zero user-facing latency; the marker path above still runs + // as a second source. Only on fresh character replies — not retries/continues + // (which re-cover the same turn) or utility kinds (summary, chat-query). + if ( + AUTO_MEMORY_KINDS.has(body.kind) && + replyAs._id && + userId && + !chat.memoryDisabled && + responseText.trim() + ) { + const userName = body.sender?.handle || 'User' + const transcript = [ + userMsg?.msg ? `${userName}: ${userMsg.msg}` : '', + `${replyAs.name}: ${responseText}`, + ] + .filter(Boolean) + .join('\n') + extractAndStoreMemories(userId, replyAs._id, userName, replyAs.name, transcript).catch((err) => + log.error({ err }, 'Failed to auto-extract long-term memory') + ) + } + + // Summaries are a cheap utility generation (no user-facing message); don't + // charge credits or advance relationship XP for them. + if (body.kind !== 'summary') { + // Event replies are paid once per turn at turn start (Task 5b); don't + // re-charge per reply. Normal replies still cost 10 each. + if (!ctx.eventTurn) { + await store.credits.updateCredits(userId!, -10) + } + // XP advances the character that REPLIED (replyAs), not the chat's main char. + // (Correct for multi-character chats generally; identical to before in 1:1 + // chats where replyAs === the main char.) + const xpGain = getXpPerMessage(replyAs.progression) + if (xpGain > 0) await store.scenario.updateCharXp(replyAs._id, xpGain) + } switch (body.kind) { case 'summary': { @@ -437,6 +847,33 @@ export const generateMessageV2 = handle(async (req, res) => { json: hydration, }) treeLeafId = requestId + + // Native image tool requested an image: generate it via Z-Image using the + // replying character's LoRA and attach it to the just-created reply message + // (in its `extras`, below the text) so it behaves like the in-chat image + // generation — spinner on the reply, then the image attached. Fire-and-forget; + // it broadcasts a `message-retry` over WS and persists for refresh. + if (imageTool?.prompt) { + // An auto-generated image costs the same 25 credits as an explicit one, + // on top of the message charge. Fire-and-forget like the generation. + if (userId && userId !== 'anon') { + store.credits.updateCredits(userId, -25).catch(() => {}) + } + generateImage( + { + user: body.user!, + prompt: imageTool.prompt, + chatId, + characterId: replyAs._id, + source: 'tool', + requestId: v4(), + messageId: requestId, + append: true, + parentId: undefined, + }, + log + ).catch((err) => log.error({ err }, 'Image tool generation failed')) + } break } @@ -527,7 +964,9 @@ export const generateMessageV2 = handle(async (req, res) => { } else { await store.chats.update(chatId, { updatedAt }) } -}) + + return { ok: true, text: responseText, speakerId: replyAs._id } +} async function handleGuestGenerate(body: GenRequest, req: AppRequest, res: Response) { const chatId = req.params.id diff --git a/srv/api/freecredits.ts b/srv/api/freecredits.ts index fd1e2cd1..7d48cef2 100644 --- a/srv/api/freecredits.ts +++ b/srv/api/freecredits.ts @@ -1,5 +1,4 @@ import { store } from '../db' -import { loggedIn } from './auth' import { isConnected } from '../db/client' diff --git a/srv/api/index.ts b/srv/api/index.ts index c9e43b29..93d0bf54 100644 --- a/srv/api/index.ts +++ b/srv/api/index.ts @@ -4,6 +4,7 @@ import character from './character' import classify from './classify' import user from './user' import admin from './admin' +import promo from './promo' import subscriptions from './subscriptions' import horde from './horde' import settings from './settings' @@ -18,30 +19,26 @@ import { inferenceApi, inferenceModels } from './chat/inference' import freeCredits from './freecredits' -import charImport from './charimport' - import match from './match' -import cart from './cart' import paypalcheck from './paypal' const router = Router() const keyedRouter = Router() -router.use('/charimport', charImport) router.use('/user', user) router.use('/chat', chat) router.use('/character', character) router.use('/classify', classify) router.use('/admin', subscriptions) router.use('/admin', admin) +router.use('/admin', promo) router.use('/horde', horde) router.use('/settings', settings) router.use('/memory', memory) router.use('/scenario', scenario) router.use('/voice', voice) router.use('/freecredits', freeCredits) -router.use('/shop', cart) router.use('/match', match) router.use('/announce', announcements) router.use('/paypalcheck', paypalcheck) diff --git a/srv/api/match.ts b/srv/api/match.ts index e81a70fa..6eae2283 100644 --- a/srv/api/match.ts +++ b/srv/api/match.ts @@ -1,32 +1,13 @@ import { Router } from 'express' -import { assertValid } from 'frisker' import { store } from '../db' import { v4 } from 'uuid' import { loggedIn } from './auth' -import { handle, StatusError } from './wrap' +import { handle, errors } from './wrap' //import { handleUpload } from './upload' import { now } from '../db/util' -import { PERSONA_FORMATS } from '../../common/adapters' const router = Router() -const valid = { - name: 'string', - avatar: 'string?', - scenario: 'string', - greeting: 'string', - sampleChat: 'string', - match: 'boolean', - xp: 'number', - - premium: 'boolean', - description: 'string', - persona: { - kind: PERSONA_FORMATS, - attributes: 'any', - }, -} as const - const getMatches = handle(async (req) => { //console.log(loggedIn()) @@ -42,12 +23,48 @@ const getMatches = handle(async (req) => { return { characters: newChars } }) +const GENDERS = ['female', 'male', 'trans', 'nonbinary'] as const +const ART_STYLES = ['realistic', 'anime'] as const + +/** Only accept primitive strings; reject objects/arrays (e.g. `?gender[$ne]=x`) to prevent operator injection. */ +const str = (v: unknown): string | undefined => (typeof v === 'string' ? v : undefined) +const oneOf = (v: unknown, allowed: readonly T[]): T | undefined => { + const s = str(v) + return s && (allowed as readonly string[]).includes(s) ? (s as T) : undefined +} + +const discover = handle(async (req) => { + const { userId } = req?.user || { userId: '' } + const q = req.query as Record + const sort = q.sort === 'new' || q.sort === 'popular' ? q.sort : 'trending' + const skip = Number(str(q.skip)) + const limit = Number(str(q.limit)) + const characters = await store.matches.discover(userId, { + gender: oneOf(q.gender, GENDERS), + artStyle: oneOf(q.artStyle, ART_STYLES), + category: str(q.category), + nsfw: str(q.nsfw) === 'false' ? false : undefined, + search: str(q.search), + sort, + skip: Number.isFinite(skip) ? skip : undefined, + limit: Number.isFinite(limit) ? limit : undefined, + }) + return { characters } +}) + const createCharacter = handle(async (req) => { // const body = await handleUpload(req, { ...valid, persona: 'string' }) // const userId=params.user?.userId const id = req.params.id || '' const { userId } = req?.user || { userId: '' } + // Idempotent: if the user already cloned this template, return that existing + // copy (its `parent` is the template id) instead of creating a duplicate. + if (userId) { + const existing = await store.characters.getUserCopyOfTemplate(userId, id) + if (existing) return existing + } + const matchChar = await store.matches.getMatch(userId, id) const oldId = matchChar?._id.toString() const newChar = matchChar @@ -59,6 +76,27 @@ const createCharacter = handle(async (req) => { newChar.userId = userId newChar.createdAt = now() newChar.updatedAt = now() + // Start the personal copy's own popularity counters fresh — the template's + // clone/engagement totals are not this copy's (and would mislead if the user + // later publishes it). The clone itself rolls up to `parent` via the +1 in + // createCharacter. + newChar.children = 0 + delete (newChar as any).engagement + delete (newChar as any).creatorName + // The matched template may itself be a published Discover character owned by + // another user. getMatch returns the full doc, so the clone would otherwise + // inherit the original's publish/moderation/report state — silently relisting + // a personal copy as a public template (the Discover query selects + // published:true) with no moderation or owner intent. Reset to an unpublished, + // unmoderated copy; the user must explicitly publish it themselves. + newChar.published = false + delete (newChar as any).publishedAt + delete (newChar as any).publishRewarded + delete (newChar as any).moderation + delete (newChar as any).reportCount + } + if (newChar && req.body?.name) { + newChar.name = String(req.body.name) } if (newChar?._id) { const char = await store.characters.createCharacter(userId!, newChar) @@ -68,6 +106,24 @@ const createCharacter = handle(async (req) => { } }) +const getDiscoverChar = handle(async (req) => { + const id = req.params.id || '' + const { userId } = req?.user || { userId: '' } + + const char = await store.matches.getMatch(userId, id) + if (!char) throw errors.NotFound + + return char +}) + +// Public reads — guests can browse the Discover gallery and preview a +// character without an account. The handlers tolerate an empty userId (no +// premium templates for guests). Keep '/discover' before '/:id' so the literal +// route isn't captured as an id. +router.get('/discover', discover) +router.get('/:id', getDiscoverChar) + +// Everything below mutates or returns the caller's own data — login required. router.use(loggedIn) //router.post('/', createMatch) router.get('/', getMatches) diff --git a/srv/api/paypal.ts b/srv/api/paypal.ts index 372452e7..4f5b9a7e 100644 --- a/srv/api/paypal.ts +++ b/srv/api/paypal.ts @@ -1,35 +1,22 @@ import { Router } from 'express' import { store } from '../db' -import { sendOne } from './ws' -import { config } from '../config' import { handle } from './wrap' import { paypalLogin, giveOrder } from './cart' import https from 'https' const router = Router() -const { paypalID, paypalSecret, paypalWebhook } = config - -interface PaypalItem { - name: string - description: string - price: number - quantity: number - category?: 'DIGITAL_GOODS' -} - const checkPaypalOrders = handle(async () => { - console.log('checking orders'); + console.log('checking orders') const authToken = await paypalLogin() - - const dayold = new Date(); - dayold.setHours(dayold.getHours() - 2); + + const dayold = new Date() + dayold.setHours(dayold.getHours() - 2) const orders = await store.shop.getShopOrdersFrom(dayold.toISOString()) - + orders.forEach((order) => { - const options = { hostname: 'api-m.paypal.com', - path: '/v2/checkout/orders/'+order.paymentId, + path: '/v2/checkout/orders/' + order.paymentId, method: 'GET', headers: { 'Content-Type': 'application/json', @@ -37,28 +24,28 @@ const checkPaypalOrders = handle(async () => { }, } const req = https.request(options, (res) => { - let data = '' - res.on('data', (chunk) => { - data += chunk - }) - res.on('end', () => { - const orderDataObject = JSON.parse(data) - if(orderDataObject.status == 'COMPLETED' ){ - giveOrder(order) - } - }) + let data = '' + res.on('data', (chunk) => { + data += chunk }) - - req.on('error', (error) => { - console.log("error",error) + res.on('end', () => { + const orderDataObject = JSON.parse(data) + if (orderDataObject.status == 'COMPLETED') { + giveOrder(order) + } }) + }) + + req.on('error', (error) => { + console.log('error', error) + }) - req.end() - return true; - }); + req.end() + return true + }) - return true; -}); + return true +}) router.get('/', checkPaypalOrders) diff --git a/srv/api/promo.ts b/srv/api/promo.ts new file mode 100644 index 00000000..7b445006 --- /dev/null +++ b/srv/api/promo.ts @@ -0,0 +1,68 @@ +import { Router } from 'express' +import { assertValid } from '/common/valid' +import { store } from '../db' +import { isAdmin, loggedIn } from './auth' +import { StatusError, handle } from './wrap' + +const router = Router() + +router.use(loggedIn, isAdmin) + +const list = handle(async () => { + const codes = await store.promo.getPromos() + return { codes } +}) + +const create = handle(async ({ userId, body }) => { + assertValid( + { + code: 'string', + credits: 'number?', + days: 'number?', + maxUses: 'number', + enabled: 'boolean', + expiresAt: 'string?', + }, + body + ) + const code = await store.promo.createPromo({ + code: body.code, + credits: body.credits, + days: body.days, + maxUses: body.maxUses, + enabled: body.enabled, + expiresAt: body.expiresAt, + createdBy: userId!, + }) + return { code } +}) + +const update = handle(async ({ params, body }) => { + if (!params.id) throw new StatusError('Missing id', 400) + assertValid( + { + code: 'string?', + credits: 'number?', + days: 'number?', + maxUses: 'number?', + enabled: 'boolean?', + expiresAt: 'string?', + }, + body + ) + const code = await store.promo.updatePromo(params.id, body) + return { code } +}) + +const remove = handle(async ({ params }) => { + if (!params.id) throw new StatusError('Missing id', 400) + await store.promo.deletePromo(params.id) + return { success: true } +}) + +router.get('/promo', list) +router.post('/promo', create) +router.post('/promo/:id', update) +router.delete('/promo/:id', remove) + +export default router diff --git a/srv/api/settings.ts b/srv/api/settings.ts index 98330c73..d57a2058 100644 --- a/srv/api/settings.ts +++ b/srv/api/settings.ts @@ -9,8 +9,7 @@ import { AppSchema } from '../../common/types/schema' import { store } from '../db' import { RegisteredAdapter } from '/common/adapters' import { getHordeWorkers, getHordeModels } from './horde' -import { getOpenRouterModels } from '../adapter/openrouter' -import { updateRegisteredSubs } from '../adapter/agnaistic' +import { updateRegisteredSubs } from '../adapter/charluv' const router = Router() @@ -36,7 +35,6 @@ export async function getAppConfig(user?: AppSchema.User) { const canAuth = isConnected() const workers = getHordeWorkers() const models = getHordeModels() - const openRouter = await getOpenRouterModels() const configuration = await store.admin.getServerConfiguration().catch(() => undefined) if (!user?.admin && configuration) { @@ -75,7 +73,7 @@ export async function getAppConfig(user?: AppSchema.User) { models, workers: workers.filter((w) => w.type === 'text'), }, - openRouter: { models: openRouter }, + openRouter: { models: [] }, subs, serverConfig: configuration, } @@ -117,7 +115,6 @@ export async function getAppConfig(user?: AppSchema.User) { appConfig.serverConfig = configuration appConfig.subs = subs appConfig.registered = getRegisteredAdapters(user).map(toRegisteredAdapter) - appConfig.openRouter.models = openRouter appConfig.horde = { models, workers: workers.filter((w) => w.type === 'text'), diff --git a/srv/api/upload.ts b/srv/api/upload.ts index d407d91c..2d4bce6d 100644 --- a/srv/api/upload.ts +++ b/srv/api/upload.ts @@ -1,12 +1,14 @@ import { S3 } from '@aws-sdk/client-s3' import { mkdirpSync } from 'mkdirp' import { Request } from 'express' -import { unlink, writeFile } from 'fs/promises' +import { unlink, writeFile, readFile } from 'fs/promises' import { extname, normalize, resolve } from 'path' import { createReadStream, readdirSync } from 'fs' import { assertValid, Validator, UnwrapBody } from '/common/valid' import { config } from '../config' import { errors } from './wrap' +import { v4 } from 'uuid' +import needle from 'needle' const s3 = new S3({ region: 'us-east-1', @@ -66,6 +68,16 @@ export async function entityUploadBase64(kind: string, id: string, content?: str return upload(attachment, filename) } +/** + * Like entityUploadBase64 but writes to a unique filename so multiple images can + * coexist (e.g. a character's image gallery). Returns the asset URL. + */ +export async function entityUploadBase64Unique(kind: string, id: string, content?: string) { + if (!content || !content.includes(',')) return + const attachment = toAttachment(content) + return upload(attachment, `${kind}-${id}-${v4().slice(0, 8)}`) +} + function toAttachment(content: string): Attachment { const [prefix, base64] = content.split(',') const type = prefix.slice(5, -7) @@ -121,6 +133,52 @@ export async function saveFile(filename: string, content: any, ttl?: number) { return `/assets/${filename}` } +/** + * Read a stored asset (by `/assets/...` path or full URL) and return its raw + * base64. Used server-side to avoid CORS — the browser can't fetch cross-origin + * CDN assets, but the server can. Tries the local asset folder first, then + * fetches the configured asset URL (S3/CDN). + */ +export async function readAssetBase64(ref: string): Promise { + if (!ref) return + if (ref.includes('base64,')) return ref.slice(ref.indexOf('base64,') + 7) + + // SSRF guard: only ever resolve our own stored asset paths. Reject absolute + // URLs and anything outside `/assets/`, and disallow path traversal. The + // remote URL is always rebuilt from the trusted, configured asset host — an + // attacker-supplied host/path can never reach the outbound request. + const clean = ref.split('?')[0] + if (!/^\/assets\//.test(clean)) return + const filename = clean.replace(/^\/assets\//, '').replace(/^\/+/, '') + if (!filename || filename.includes('..')) return + + // Local asset folder (non-S3 deployments) + try { + const buf = await readFile(safeRelativeResolve(config.assetFolder, filename)) + return buf.toString('base64') + } catch {} + + // S3 object store — read directly, independent of ASSET_URL/CDN config. + if (config.storage.enabled) { + try { + const obj = await s3.getObject({ Bucket: config.storage.bucket, Key: `assets/${filename}` }) + const bytes = await (obj.Body as any)?.transformToByteArray?.() + if (bytes) return Buffer.from(bytes).toString('base64') + } catch {} + } + + // Remote (CDN) — server-to-server fetch against the configured host only, + // no redirect-following (a redirect could otherwise point at an internal host). + const base = config.assetUrl?.replace(/\/$/, '') || '' + if (!base) return + const url = `${base}/assets/${filename}` + + const res: any = await needle('get', url, null, { parse: false, follow_max: 0 }).catch(() => null) + if (!res || (res.statusCode && res.statusCode >= 400)) return + const buf = res.body + return Buffer.isBuffer(buf) ? buf.toString('base64') : Buffer.from(buf).toString('base64') +} + export async function saveBase64File(filename: string, content: any) { await writeFile(safeRelativeResolve(config.assetFolder, filename), content, 'base64') return `/assets/${filename}` diff --git a/srv/api/user/auth.ts b/srv/api/user/auth.ts index 63f9db16..ca1f7621 100644 --- a/srv/api/user/auth.ts +++ b/srv/api/user/auth.ts @@ -1,36 +1,55 @@ import { assertValid } from '/common/valid' import { store } from '../../db' import { errors, handle, StatusError } from '../wrap' +import { classifyRegistration } from '/common/abuse' import { OAuthScope, oauthScopes } from '/common/types' import { patreon } from './patreon' import { getSafeUserConfig } from './settings' import { OAuth2Client } from 'google-auth-library' import { createAccessToken, toSafeUser } from '/srv/db/user' +import { config } from '../../config' const GOOGLE = new OAuth2Client() export const register = handle(async (req) => { assertValid( - { handle: 'string', username: 'string', password: 'string', invitecode: 'string' }, + { + handle: 'string', + username: 'string', + password: 'string', + fingerprint: 'string?', + consent: 'boolean?', + }, req.body ) - const valid = await store.invitecode.checkInviteCode(req.body.invitecode) - // if (!valid) { - // throw new StatusError('Invalid invite code', 403) - // return - // } - const alreadyRegisterd = await store.users.checkIp(req.ip) - - if (alreadyRegisterd) { - throw new StatusError('Only 1 account per IP, goto our Discord if you lost your password.', 403) + + if (req.body.consent !== true) { + throw new StatusError('You must accept the identifier policy to register', 400) } - const { profile, token, user } = await store.users.createUser(req.body) - if (valid) { - await store.invitecode.takeInviteCode(req.body.invitecode, user._id) + const fpMatch = await store.users.checkFingerprint(req.body.fingerprint) + const ipMatch = await store.users.checkIp(req.ip) + const verdict = classifyRegistration({ fpMatch, ipMatch }) + + if (verdict === 'block') { + throw new StatusError( + 'Only 1 account per device/IP. Go to our Discord if you lost your password.', + 403 + ) } - req.log.info({ user: user.username, id: user._id }, 'User registered') + const restrictedReason = + fpMatch && ipMatch ? 'both' : fpMatch ? 'fingerprint' : ipMatch ? 'ip' : undefined + + const { profile, token, user } = await store.users.createUser(req.body, false, { + restricted: verdict === 'restrict', + restrictedReason, + fingerprint: req.body.fingerprint, + ip: req.ip, + consentAt: new Date().toISOString(), + }) + + req.log.info({ user: user.username, id: user._id, verdict }, 'User registered') return { profile, token, user } }) @@ -41,13 +60,14 @@ export const login = handle(async (req) => { if (!result) { throw new StatusError('Unauthorized', 401) } - const storeIp = await store.users.updateIp(result.user._id, req.ip) + await store.users.updateIp(result.user._id, req.ip) return result }) -export const oathGoogleLogin = handle(async ({ log, body }) => { - assertValid({ token: 'string' }, body) +export const oathGoogleLogin = handle(async (req) => { + const { body, ip, log } = req + assertValid({ token: 'string', fingerprint: 'string?' }, body) const config = await store.admin.getServerConfiguration().catch(() => undefined) @@ -64,24 +84,129 @@ export const oathGoogleLogin = handle(async ({ log, body }) => { if (!payload) throw new StatusError('Could not verify Google token', 401) if (!payload.email || !payload.sub) throw new StatusError('Could not verify Google token', 401) + // Already linked → straight login. const existing = await store.users.findByGoogleSub(payload.sub) if (existing) { await store.users.updateUser(existing._id, { google: payload as any }) - const token = await createAccessToken(existing.username, existing) + const accessToken = await createAccessToken(existing.username, existing) const profile = await store.users.getProfile(existing._id) - return { user: toSafeUser(existing), token, profile } + return { user: toSafeUser(existing), token: accessToken, profile } } - const newuser = await store.users.createUser({ - username: `google_${payload.sub}`, - handle: payload.name || 'You', - password: '', - }) + // No linked account: creating one is fine, but it must clear the same + // multi-account abuse check as a normal registration. If this device/IP + // already owns an account, refuse to spin up a second — point them at their + // existing account + the profile link flow instead. + const fpMatch = await store.users.checkFingerprint(body.fingerprint) + const ipMatch = await store.users.checkIp(ip) + const verdict = classifyRegistration({ fpMatch, ipMatch }) + + if (verdict === 'block') { + throw new StatusError( + 'An account already exists on this device. Sign in to it, then link Google from your profile to enable Google sign-in.', + 403 + ) + } + + const restrictedReason = + fpMatch && ipMatch ? 'both' : fpMatch ? 'fingerprint' : ipMatch ? 'ip' : undefined + + const newuser = await store.users.createUser( + { + username: `google_${payload.sub}`, + handle: payload.name || 'You', + password: '', + }, + false, + { + restricted: verdict === 'restrict', + restrictedReason, + fingerprint: body.fingerprint, + ip, + // Implied consent: the login page states that signing in agrees to the + // Terms + 18+, mirroring the register flow's consent stamp. + consentAt: new Date().toISOString(), + } + ) await store.users.updateUser(newuser.user._id, { google: payload as any }) - log.info({ user: newuser.user.username, id: newuser.user._id }, 'User registered (Google OAuth)') + log.info( + { user: newuser.user.username, id: newuser.user._id, verdict }, + 'User registered (Google OAuth)' + ) return newuser }) +/** + * Sign in with Patreon. If the Patreon account is already linked, that account + * logs in. Otherwise we create one — behind the same multi-account abuse check + * as Google login and normal registration — so a device/IP that already owns an + * account is told to sign in and link Patreon instead of making a second. + */ +export const oauthPatreonLogin = handle(async (req) => { + const { body, ip, log } = req + assertValid({ code: 'string', fingerprint: 'string?', url: 'string?' }, body) + + if (!config.patreon.client_id) { + throw new StatusError('Not allowed', 405) + } + + const token = await patreon.authorize(body.code, false, patreonRedirect(body.url)) + const patron = await patreon.identity(token.access_token) + + // Already linked → straight login. + const existing = await store.users.findByPatreonUserId(patron.user.id) + if (existing) { + const accessToken = await createAccessToken(existing.username, existing) + const profile = await store.users.getProfile(existing._id) + await store.users.updateIp(existing._id, ip) + return { user: toSafeUser(existing), token: accessToken, profile } + } + + // No linked account: create one, but only if it clears the abuse check. + const fpMatch = await store.users.checkFingerprint(body.fingerprint) + const ipMatch = await store.users.checkIp(ip) + const verdict = classifyRegistration({ fpMatch, ipMatch }) + + if (verdict === 'block') { + throw new StatusError( + 'An account already exists on this device. Sign in to it, then link Patreon from your profile to enable Patreon sign-in.', + 403 + ) + } + + const restrictedReason = + fpMatch && ipMatch ? 'both' : fpMatch ? 'fingerprint' : ipMatch ? 'ip' : undefined + + const newuser = await store.users.createUser( + { + username: `patreon_${patron.user.id}`, + handle: patron.user.attributes?.full_name || 'You', + password: '', + }, + false, + { + restricted: verdict === 'restrict', + restrictedReason, + fingerprint: body.fingerprint, + ip, + consentAt: new Date().toISOString(), + } + ) + + // Store the Patreon link + premium onto the fresh account (we already hold the + // token; the single-use code can't be re-authorized). + await patreon.persistPatron(newuser.user._id, token, patron) + log.info( + { user: newuser.user.username, id: newuser.user._id, verdict }, + 'User registered (Patreon OAuth)' + ) + + const fresh = (await store.users.getUser(newuser.user._id)) || newuser.user + const accessToken = await createAccessToken(fresh.username, fresh) + const profile = await store.users.getProfile(fresh._id) + return { user: toSafeUser(fresh), token: accessToken, profile } +}) + export const unlinkGoogleAccount = handle(async ({ userId }) => { const user = await store.users.getUser(userId) if (!user) throw new StatusError('User not found', 404) @@ -163,10 +288,22 @@ export const resyncPatreon = handle(async (req) => { return { user: next, token } }) +// The token exchange's redirect_uri must exactly match the one the browser used +// at the authorize step. The client sends the origin it used; accept it only if +// it's a well-formed `.../oauth/patreon` URL (otherwise fall back to config). +// Patreon also validates it against the app's registered URIs, so this can't be +// abused as an open redirect. +function patreonRedirect(raw?: string) { + if (typeof raw === 'string' && /^https?:\/\/[a-z0-9.-]+(:\d+)?\/oauth\/patreon$/i.test(raw)) { + return raw + } + return undefined +} + export const verifyPatreonOauth = handle(async (req) => { const { body } = req - assertValid({ code: 'string' }, body) - await patreon.initialVerifyPatron(req.userId, body.code) + assertValid({ code: 'string', url: 'string?' }, body) + await patreon.initialVerifyPatron(req.userId, body.code, patreonRedirect(body.url)) const user = await getSafeUserConfig(req.userId) // Re-issue the JWT so its embedded `premium` flag reflects the newly linked account. const token = user ? await createAccessToken(user.username, user) : undefined diff --git a/srv/api/user/index.ts b/srv/api/user/index.ts index ece180ec..761a9a47 100644 --- a/srv/api/user/index.ts +++ b/srv/api/user/index.ts @@ -1,11 +1,12 @@ import { Router } from 'express' -import { loggedIn, isPremium } from '../auth' +import { loggedIn } from '../auth' import { changePassword, createApiKey, linkGoogleAccount, login, oathGoogleLogin, + oauthPatreonLogin, register, remoteLogin, resyncPatreon, @@ -47,11 +48,13 @@ import { removeProfileAvatar, } from './settings' import { deleteUserAccount } from './delete-user' +import { redeemPromoCode } from './promo' const router = Router() router.post('/login/callback', loggedIn, remoteLogin) router.post('/login/google', oathGoogleLogin) +router.post('/login/patreon', oauthPatreonLogin) router.post('/link-google', loggedIn, linkGoogleAccount) router.post('/unlink-google', loggedIn, unlinkGoogleAccount) router.post('/login', login) @@ -95,6 +98,7 @@ router.post('/presets/:id', loggedIn, updateUserPreset) router.post('/templates', loggedIn, createTemplate) router.post('/templates/:id', loggedIn, updateTemplate) router.delete('/templates/:id', loggedIn, deleteTemplate) +router.post('/promo/redeem', loggedIn, redeemPromoCode) router.get('/:id', loggedIn, getProfile) export default router diff --git a/srv/api/user/patreon.ts b/srv/api/user/patreon.ts index 1b25ea38..50a617c8 100644 --- a/srv/api/user/patreon.ts +++ b/srv/api/user/patreon.ts @@ -6,19 +6,24 @@ import { getCachedTiers } from '../../db/subscriptions' import { store } from '../../db' import { command } from '../../domains' import { sendOne } from '../ws' +import { logger } from '../../middleware' export const patreon = { authorize, identity, revalidatePatron, initialVerifyPatron, + persistPatron, getCampaignTiers, } -async function authorize(code: string, refresh?: boolean) { +async function authorize(code: string, refresh?: boolean, redirectUri?: string) { const form = new URLSearchParams() form.append('code', code) - form.append('redirect_uri', config.patreon.redirect) + // The token exchange's redirect_uri MUST be identical to the one the browser + // used at the authorize step. Prefer the caller-supplied value (derived from + // the actual site origin); fall back to the configured default. + form.append('redirect_uri', redirectUri || config.patreon.redirect) form.append('client_id', config.patreon.client_id) form.append('client_secret', config.patreon.client_secret) form.append('grant_type', refresh ? 'refresh_token' : 'authorization_code') @@ -34,7 +39,17 @@ async function authorize(code: string, refresh?: boolean) { }) if (result.statusCode && result.statusCode > 200) { - throw new StatusError(`Unable to verify Patreon account`, 400) + // Surface Patreon's actual error (e.g. invalid_grant, redirect_uri mismatch) + // instead of swallowing it — both in the logs and the message. + logger.error( + { statusCode: result.statusCode, body: result.body }, + 'Patreon token exchange failed' + ) + const detail = + result.body && typeof result.body === 'object' + ? result.body.error_description || result.body.error + : undefined + throw new StatusError(`Unable to verify Patreon account${detail ? `: ${detail}` : ''}`, 400) } const user: Patreon.Authorize = result.body @@ -198,8 +213,8 @@ function getPatronSubscriptionTier(contrib: number) { return sub } -async function initialVerifyPatron(userId: string, code: string) { - const token = await patreon.authorize(code) +async function initialVerifyPatron(userId: string, code: string, redirectUri?: string) { + const token = await patreon.authorize(code, false, redirectUri) const patron = await identity(token.access_token) const existing = await store.users.findByPatreonUserId(patron.user.id) @@ -207,6 +222,20 @@ async function initialVerifyPatron(userId: string, code: string) { throw new StatusError(`This Patreon account is already attributed to another user`, 400) } + return persistPatron(userId, token, patron) +} + +/** + * Persist a verified Patreon authorization onto a user and grant premium for an + * active patron. Shared by the link flow (`initialVerifyPatron`) and the + * Patreon login-that-creates-an-account flow, which has already exchanged the + * single-use code for a token and can't authorize again. + */ +async function persistPatron( + userId: string, + token: Patreon.Authorize, + patron: Awaited> +) { const expires = new Date(Date.now() + token.expires_in * 1000).toISOString() /** diff --git a/srv/api/user/promo.ts b/srv/api/user/promo.ts new file mode 100644 index 00000000..e711ce48 --- /dev/null +++ b/srv/api/user/promo.ts @@ -0,0 +1,9 @@ +import { assertValid } from '/common/valid' +import { store } from '../../db' +import { handle } from '../wrap' + +export const redeemPromoCode = handle(async ({ userId, body }) => { + assertValid({ code: 'string' }, body) + const result = await store.promo.redeemPromo(userId!, body.code) + return { user: result.user, credits: result.credits, days: result.days } +}) diff --git a/srv/api/user/services.ts b/srv/api/user/services.ts index b50f069b..8ef615b9 100644 --- a/srv/api/user/services.ts +++ b/srv/api/user/services.ts @@ -3,11 +3,9 @@ import { store } from '../../db' import { errors, handle, StatusError } from '../wrap' import { findUser } from '../horde' import { decryptText, encryptText } from '/srv/db/util' -import { getLanguageModels } from '/srv/adapter/replicate' import { AIAdapter } from '/common/adapters' import { getRegisteredAdapters } from '/srv/adapter/register' import { getSafeUserConfig, verifyNovelKey } from './settings' -import { getOpenRouterModels } from '/srv/adapter/openrouter' import needle from 'needle' export const novelLogin = handle(async ({ userId, body }) => { @@ -71,14 +69,13 @@ export const hordeStats = handle(async ({ userId, body }) => { } }) +// Retired services — endpoints kept as no-ops for route compatibility. export const openRouterModels = handle(async () => { - const models = await getOpenRouterModels() - return { models } + return { models: [] } }) -export const replicateModels = handle(async ({ userId, body }) => { - const models = await getLanguageModels() - return models +export const replicateModels = handle(async () => { + return [] }) export const updateService = handle(async ({ userId, body, params }) => { diff --git a/srv/api/user/settings.ts b/srv/api/user/settings.ts index 4695a85e..0f7782f0 100644 --- a/srv/api/user/settings.ts +++ b/srv/api/user/settings.ts @@ -1,6 +1,4 @@ import { assertValid } from '/common/valid' -import needle from 'needle' -import { NOVEL_BASEURL } from '../../adapter/novel' import { store } from '../../db' import { AppSchema } from '../../../common/types/schema' import { encryptText } from '../../db/util' @@ -17,11 +15,10 @@ import { config } from '/srv/config' import { toArray } from '/common/util' import { UI } from '/common/types' -import { getLanguageModels } from '/srv/adapter/replicate' import { getUser, toSafeUser } from '/srv/db/user' export const getInitialLoad = handle(async ({ userId }) => { - const replicate = await getLanguageModels() + const replicate: any[] = [] if (config.ui.maintenance) { const appConfig = await getAppConfig() return { config: appConfig, replicate } @@ -385,7 +382,11 @@ export const removeProfileAvatar = handle(async (req) => { }) export const updateProfile = handle(async (req) => { - const form = handleForm(req, { handle: 'string' } as const) + const form = handleForm(req, { + handle: 'string', + persona: 'string?', + description: 'string?', + } as const) const filename = await entityUpload( 'profile', v4(), @@ -401,6 +402,11 @@ export const updateProfile = handle(async (req) => { handle: form.handle, } + // Only touch the self-persona fields when the Your Character tab submits them, + // so saving the plain Profile tab doesn't wipe them. + if (form.persona !== undefined) update.persona = form.persona.slice(0, 4000) + if (form.description !== undefined) update.description = form.description.slice(0, 1000) + if (filename) { update.avatar = filename } @@ -434,14 +440,9 @@ async function verifyKobldUrl(user: AppSchema.User, incomingUrl?: string) { return url[0] } -export async function verifyNovelKey(key: string) { - const res = await needle('get', `${NOVEL_BASEURL}/user/data`, { - headers: { Authorization: `Bearer ${key}` }, - json: true, - response_timeout: 5000, - }) - - return res.statusCode && res.statusCode <= 400 +export async function verifyNovelKey(_key: string) { + // NovelAI support retired; treat as unverified. + return false } async function verifyHordeKey(key: string) { diff --git a/srv/api/ws/bus.ts b/srv/api/ws/bus.ts index 0dd1cd1c..a2c7e9ee 100644 --- a/srv/api/ws/bus.ts +++ b/srv/api/ws/bus.ts @@ -4,6 +4,7 @@ import { config } from '../../config' import { logger } from '../../middleware' import { AppSocket } from './types' import { PING_INTERVAL_MS } from '../../../common/util' +import { store } from '../../db' export const allSockets = new Map() export const userSockets = new Map() @@ -232,3 +233,17 @@ export async function sendAll(data: T) { export async function sendGuest(socketId: string, data: T) { await broadcast({ target: 'guest', socketId, data }) } + +/** + * Durable per-user notification (e.g. a moderation outcome). Unlike sendOne it + * survives the recipient being offline: it's persisted first, then pushed live. + * The live push goes through sendOne → Redis fan-out, so it reaches the user on + * whichever node holds their socket (a local presence check would miss cross-node + * users). Delivery is confirmed by the client's `notification-ack` (keyed by the + * `id` below), which marks it delivered so it isn't replayed on the next login. + * If the user is offline no ack arrives and login replay handles it instead. + */ +export async function notifyUser(userId: string, message: string, level?: number) { + const notif = await store.notifications.createNotification(userId, message, level) + await sendOne(userId, { type: 'admin-notification', id: notif._id, message, level }) +} diff --git a/srv/api/ws/handle.ts b/srv/api/ws/handle.ts index 755cc993..6391e072 100644 --- a/srv/api/ws/handle.ts +++ b/srv/api/ws/handle.ts @@ -1,6 +1,7 @@ import { AppSocket } from './types' import { handlers, WebMessage } from './handlers' import { allSockets } from './bus' +import { markPresent, clearPresent } from '../../queue/presence' export function handleMessage(client: AppSocket) { client.on('message', (data) => { @@ -20,10 +21,12 @@ export function handleMessage(client: AppSocket) { } client.on('close', () => { + clearPresent({ socketId: client.uid }, client.uid) handlers.logout(client, { type: 'logout' }) }) client.on('error', () => { + clearPresent({ socketId: client.uid }, client.uid) handlers.logout(client, { type: 'logout' }) }) @@ -32,6 +35,7 @@ export function handleMessage(client: AppSocket) { }) allSockets.set(client.uid, client) + markPresent({ socketId: client.uid }, client.uid) } function parse(data: any) { diff --git a/srv/api/ws/handlers.ts b/srv/api/ws/handlers.ts index 105b3494..9f38f35c 100644 --- a/srv/api/ws/handlers.ts +++ b/srv/api/ws/handlers.ts @@ -3,6 +3,7 @@ import { AppSocket } from './types' import { assertValid } from '../../../common/valid' import { store } from '../../db' import { verifyJwt } from '../../db/user' +import { markPresent, clearPresent } from '../../queue/presence' export type WebMessage = | { type: 'login'; token: string } @@ -11,6 +12,7 @@ export type WebMessage = | { type: 'ping' } | { type: 'pong' } | { type: 'message-ready'; messageId: string; updatedAt?: string } + | { type: 'notification-ack'; ids: string[] } type Handlers = { [key in WebMessage['type']]: ( @@ -20,7 +22,7 @@ type Handlers = { } export const handlers: Handlers = { - login: (client: AppSocket, data: any) => { + login: async (client: AppSocket, data: any) => { assertValid({ token: 'string' }, data) try { if (client.userId) { @@ -34,7 +36,26 @@ export const handlers: Handlers = { const sockets = userSockets.get(client.userId) || [] sockets.push(client) userSockets.set(client.userId, sockets) + markPresent({ userId: client.userId }, client.uid) client.dispatch({ type: 'login', success: true }) + + // Replay any per-user notifications raised while the user was offline, then + // mark them delivered so a later reconnect doesn't re-toast the same ones. + const pending = await store.notifications.getUndelivered(client.userId) + if (pending.length) { + for (const n of pending) { + client.dispatch({ + type: 'admin-notification', + id: n._id, + message: n.message, + level: n.level, + }) + } + await store.notifications.markDelivered( + client.userId, + pending.map((n) => n._id) + ) + } } catch (ex) { client.dispatch({ type: 'login', success: false }) } @@ -43,6 +64,7 @@ export const handlers: Handlers = { allSockets.delete(client.uid) if (!client.userId) return const userId = client.userId + clearPresent({ userId }, client.uid) const sockets = userSockets.get(userId) || [] client.userId = '' @@ -95,4 +117,9 @@ export const handlers: Handlers = { retry: !!data.updatedAt, }) }, + 'notification-ack': async (client: AppSocket, data) => { + if (!client.userId) return + assertValid({ ids: ['string'] }, data) + await store.notifications.markDelivered(client.userId, data.ids) + }, } diff --git a/srv/app.ts b/srv/app.ts index d70c7556..d4695faf 100644 --- a/srv/app.ts +++ b/srv/app.ts @@ -90,6 +90,16 @@ export function createApp() { return next(errors.NotFound) } + // The static middleware above already served any file that exists. A request + // for something with a file extension that reaches here is a MISSING asset — + // most commonly a stale hashed chunk (e.g. /assets/index-OLDHASH.js) after a + // redeploy cleaned the old build. Return 404, never the SPA shell: handing the + // browser index.html for a .js fails with "MIME type text/html" and blanks the + // page. Extension-less paths are client routes, so they still get the shell. + if (/\.[^/]+$/.test(req.path)) { + return next(errors.NotFound) + } + return res.sendFile(index) }) app.use((err: any, _req: any, res: express.Response, _next: any) => { diff --git a/srv/bin.ts b/srv/bin.ts index 942cde7d..e258f04e 100644 --- a/srv/bin.ts +++ b/srv/bin.ts @@ -22,7 +22,6 @@ const port = flag(`Choose the port to run the server on. Default: 3001`, 'p', 'p const all = flag('Run Agnaistic and the Pipeline API', 'a', 'all') const pipeline = flag('Run the Pipeline API only', 'pipeline') -const tunnel = flag('Expose your Agnai server using LocalTunnel', 't', 'tunnel') if (argv.help || argv.h) { help() @@ -108,9 +107,6 @@ function help(code = 0) { start() async function start() { - if (tunnel) { - process.env.PUBLIC_TUNNEL = 'true' - } const runApi = all || !pipeline const runPipeline = all || pipeline @@ -202,15 +198,15 @@ async function startPipeline() { async function execAsync(command: string) { console.log(command) // removed feature - + const cmd = proc.exec('', { cwd: folders.root }) cmd.stdout?.on('data', console.log) cmd.stderr?.on('data', console.error) cmd.stderr?.on('error', console.error) - + return 0 - + return new Promise((resolve, reject) => { cmd.on('error', (err) => { console.error(err) diff --git a/srv/config.ts b/srv/config.ts index e24284b4..2cdc50b9 100644 --- a/srv/config.ts +++ b/srv/config.ts @@ -109,7 +109,7 @@ export const config = { hordeKeyPremium: env('HORDE_KEY_PREMIUM', ''), hordeKeyImages: env('HORDE_KEY_IMAGES', ''), elevenLabsPremium: env('ELEVENLABS_PREMIUM', ''), - adapters: env('ADAPTERS', 'horde') + adapters: env('ADAPTERS', 'charluv') .split(',') .filter((i) => !!i && i in ADAPTER_LABELS) as AIAdapter[], storage: { @@ -142,12 +142,73 @@ export const config = { inference: { flatChatCompletion: !!env('SIMPLE_COMPLETION', ''), + /** + * Self-hosted, OpenAI-compatible text endpoint. When `textUrl` is set the + * `openai` adapter will target it (with `textApiKey` as the bearer) without + * requiring a per-user OpenAI key. Base URL should be the root that exposes + * `/v1/chat/completions` (the `/v1` suffix is added if absent). + */ + textUrl: env('INFERENCE_TEXT_URL', ''), + textApiKey: env('INFERENCE_TEXT_KEY', ''), + textModel: env('INFERENCE_TEXT_MODEL', ''), + /** + * Dedicated moderation endpoint. Publish/edit moderation runs on the original + * (vision-capable) model, kept separate from the user-facing chat model on + * `textUrl` — so the chat model can be swapped for a less-censored one without + * weakening the safety check. When unset these fall back to the `text*` + * values, so existing single-endpoint deployments are unchanged. Base URL is + * the root exposing `/v1/chat/completions` (`/v1` is added if absent). + */ + modUrl: env('INFERENCE_MOD_URL', ''), + modApiKey: env('INFERENCE_MOD_KEY', ''), + modModel: env('INFERENCE_MOD_MODEL', ''), + /** + * The self-hosted text endpoint runs speculative decoding, which vLLM does + * not yet support alongside `min_p` / `logit_bias` (it aborts the response: + * "min_p and logit_bias sampling parameters are not yet supported with + * speculative decoding"). When true (default) we omit those two fields. + * Set INFERENCE_SPEC_DECODING=false if the endpoint ever drops spec-decoding. + */ + specDecoding: env('INFERENCE_SPEC_DECODING', 'true') !== 'false', + /** + * Self-hosted Z-Image backend (separate from text). Does text-to-image and + * character-consistent generation via i2L: encode a character's reference + * images once into a stored LoRA (POST /v1/encode), then generate + * that character forever (POST /v1/generate with lora_name). + * Auth is an `X-API-Key` header. When set, all image generation routes here + * regardless of a chat/user's stored image `type`. No data migration. + */ + imageUrl: env('ZIMAGE_BASE_URL', env('INFERENCE_IMAGE_URL', '')), + imageApiKey: env('ZIMAGE_API_KEY', env('INFERENCE_IMAGE_KEY', '')), + // Speed/quality knobs (steps is linear, size is quadratic in gen time). + // Gallery/avatar is tuned for speed; chat keeps its higher-quality defaults. + imageSteps: +env('INFERENCE_IMAGE_STEPS', '14'), // gallery / avatar + imageSize: +env('INFERENCE_IMAGE_SIZE', '640'), // gallery / avatar + imageChatSteps: +env('INFERENCE_IMAGE_CHAT_STEPS', '20'), // in-chat images + imageChatSize: +env('INFERENCE_IMAGE_CHAT_SIZE', '512'), // in-chat images + /** + * Server-wide negative prompt applied to EVERY image generation. The per-user + * negative field is no longer editable (legacy), so this env-configured value + * is the authoritative negative; any legacy stored negative is appended after + * it (deduped). Comma-separated tokens. + */ + imageNegative: env( + 'INFERENCE_IMAGE_NEGATIVE', + 'bad anatomy, bad composition, bad lighting, distorted face, extra limbs, low quality, out of focus, overexposed, plastic, poor symmetry, signature, watermark, ugly' + ), + }, + queue: { + global: +env('INFERENCE_GLOBAL_CONCURRENCY', '10'), + image: +env('IMAGE_CONCURRENCY', '4'), + textHardCap: +env('TEXT_HARD_CAP', '16'), + metricsUrl: env('VLLM_METRICS_URL', ''), + waitingThreshold: +env('VLLM_WAITING_THRESHOLD', '1'), + pollMs: +env('VLLM_METRICS_POLL_MS', '1500'), }, keys: { REPLICATE: env('REPLICATE_KEY', ''), }, pipelineProxy: !!env('PIPELINE_PROXY', ''), - publicTunnel: !!env('PUBLIC_TUNNEL', ''), } insertInject() diff --git a/srv/db/admin.ts b/srv/db/admin.ts index 7e93a582..4e68c25b 100644 --- a/srv/db/admin.ts +++ b/srv/db/admin.ts @@ -4,6 +4,7 @@ import { encryptPassword } from './util' import { AppSchema } from '../../common/types/schema' import { domain } from '../domains' import { config } from '../config' +import { PUBLISH_DEFAULTS, PUBLISH_MIN } from '../../common/publish' type UsersOpts = { username?: string @@ -13,9 +14,6 @@ type UsersOpts = { } export async function getServerConfiguration() { - const cfg = await db('configuration').findOne({ kind: 'configuration' }) - if (cfg) return cfg - const next: AppSchema.Configuration = { kind: 'configuration', apiAccess: 'off', @@ -41,6 +39,13 @@ export async function getServerConfiguration() { googleEnabled: false, charlibPublish: 'off', charlibGuidelines: '', + publishDailyFree: PUBLISH_DEFAULTS.dailyFree, + publishDailyPremium: PUBLISH_DEFAULTS.dailyPremium, + publishReward: PUBLISH_DEFAULTS.reward, + publishMinGreeting: PUBLISH_MIN.greeting, + publishMinDescription: PUBLISH_MIN.description, + publishMinScenario: PUBLISH_MIN.scenario, + publishMinPersonality: PUBLISH_MIN.personality, modFieldPrompt: '', modPresetId: '', modPrompt: '', @@ -49,6 +54,14 @@ export async function getServerConfiguration() { lockSeconds: 0, } + const cfg = await db('configuration').findOne({ kind: 'configuration' }) + if (cfg) { + // Backfill any field added in a newer version so an older stored config + // still exposes every field (the admin form needs them all to save). + // Existing values win; only missing keys fall back to defaults. No migration. + return { ...next, ...cfg } + } + await db('configuration').insertOne(next) return next } @@ -97,25 +110,41 @@ export async function changePassword(opts: { userId: string; password: string }) return true } +/** Resolve `p`, but fall back to `value` if it doesn't settle within `ms`. */ +function withTimeout(p: Promise, ms: number, value: T): Promise { + return Promise.race([ + p.catch(() => value), + new Promise((resolve) => setTimeout(() => resolve(value), ms)), + ]) +} + export async function getUserInfo(userId: string) { - const billing = await db('user').findOne( - { _id: userId }, - { - projection: { - username: 1, - sub: 1, - manualSub: 1, - billing: 1, - patreon: 1, - stripeSessions: 1, - google: 1, - }, - } - ) - const profile = await db('profile').findOne({ userId }) - const chats = await db('chat').countDocuments({ userId }) - const characters = await db('character').countDocuments({ userId }) - const state = await domain.subscription.getAggregate(userId) + // Run everything in parallel and bound the slow pieces so the admin info + // request can never hang (Cloudflare 524). The subscription aggregate replays + // the user's full billing event stream (Stripe/PayPal/Patreon) and the counts + // scan large collections — any one of these can be slow for a heavy account. + const [billing, profile, chats, characters, state] = await Promise.all([ + db('user').findOne( + { _id: userId }, + { + projection: { + username: 1, + sub: 1, + manualSub: 1, + billing: 1, + patreon: 1, + stripeSessions: 1, + google: 1, + creditsRestricted: 1, + restrictedReason: 1, + }, + } + ), + db('profile').findOne({ userId }), + withTimeout(db('chat').countDocuments({ userId }), 8000, -1), + withTimeout(db('character').countDocuments({ userId }), 8000, -1), + withTimeout(domain.subscription.getAggregate(userId), 8000, undefined as any), + ]) return { userId, diff --git a/srv/db/characters.ts b/srv/db/characters.ts index ce2de57b..919c1d1d 100644 --- a/srv/db/characters.ts +++ b/srv/db/characters.ts @@ -18,6 +18,12 @@ export type CharacterUpdate = Partial< | 'tags' | 'favorite' | 'match' + | 'draft' + | 'published' + | 'publishedAt' + | 'publishRewarded' + | 'moderation' + | 'reportCount' | 'xp' | 'share' | 'premium' @@ -38,6 +44,15 @@ export type CharacterUpdate = Partial< | 'imageSettings' | 'json' | 'folder' + | 'progression' + | 'gender' + | 'artStyle' + | 'ageRange' + | 'category' + | 'nsfw' + | 'loraName' + | 'imageSeed' + | 'gallery' > > @@ -57,6 +72,7 @@ export async function createCharacter( | 'tags' | 'favorite' | 'match' + | 'draft' | 'xp' | 'premium' | 'share' @@ -76,6 +92,15 @@ export async function createCharacter( | 'voiceDisabled' | 'imageSettings' | 'json' + | 'progression' + | 'gender' + | 'artStyle' + | 'ageRange' + | 'category' + | 'nsfw' + | 'loraName' + | 'imageSeed' + | 'gallery' > ) { const newChar: AppSchema.Character = { @@ -109,43 +134,75 @@ export async function getPublicCharacter(name: string) { return char } -export async function getSubmitted() { - const list = await db('character').find({ kind: 'character', share: 'submitted' }).toArray() - return list || [] +/** Load a character by id regardless of owner (admin / moderation use). */ +export async function getCharacterById(id: string) { + const char = await db('character').findOne({ _id: id, kind: 'character' }) + return char || undefined } -export async function declineSubmitted(characterId: string, userId: string, reason: string) { - const shareReason = `declined:${reason}` - console.log('char', characterId, userId, reason) - const update = { share: shareReason, updatedAt: now() } - - await db('character').updateOne({ _id: characterId, userId }, { $set: update }) - return { characterId, userId, reason } +/** Live published characters for the admin stage-2 review queue (unreviewed first). */ +export async function getPublishedForReview() { + const list = await db('character') + .find({ kind: 'character', published: true }) + .sort({ 'moderation.moderated': 1, publishedAt: -1 }) + .limit(500) + .toArray() + return list } -function clearChar(char?: any) { - if (!char._id && !char.userId && !char.updatedAt && !char.createdAt) return char - delete char?._id - delete char?.userId - delete char?.updatedAt - delete char?.createdAt - return char +/** + * Characters that FAILED the automated publish check and are awaiting a human + * decision: rejected by the AI, not yet actioned by a moderator. These are not + * published (not live) — an admin approves (publishes) or confirms the rejection. + */ +export async function getPendingModeration() { + const list = await db('character') + .find({ + kind: 'character', + 'moderation.status': 'rejected', + 'moderation.moderated': { $ne: true }, + }) + .sort({ 'moderation.autoCheckedAt': -1 }) + .limit(500) + .toArray() + return list } -export async function acceptSubmitted(characterId: string, userId: string, amount: string) { - const update = { share: 'accepted', updatedAt: now() } - await db('character').updateOne({ _id: characterId, userId }, { $set: update }) - const char = await db('character').findOne({ kind: 'character', _id: characterId }) - const admin = await db('user').findOne({ kind: 'user', admin: true, username: 'admin' }) - if (!admin || !char) return - char.share = 'private' - char.xp = 0 +/** Delete a character by id regardless of owner (admin moderation action). */ +export async function adminDeleteCharacter(charId: string) { + await db('character').deleteOne({ _id: charId, kind: 'character' }) +} - await createCharacter(admin?._id, clearChar(char)) - await db('user').updateOne({ _id: userId }, { $inc: { credits: parseInt(amount) } }) +/** Number of characters this user has published since the start of the UTC day. */ +export async function countPublishedToday(userId: string) { + const start = new Date() + start.setUTCHours(0, 0, 0, 0) + return db('character').countDocuments({ + kind: 'character', + userId, + publishedAt: { $gte: start.getTime() }, + }) +} - return { characterId, userId, amount } +/** + * Update publish/moderation state on a character by id only (no userId scope). + * Used by report auto-hide and admin moderation actions, which act on characters + * the caller does not own. + */ +export async function setCharacterModeration( + characterId: string, + update: Pick< + CharacterUpdate, + 'published' | 'publishedAt' | 'publishRewarded' | 'moderation' | 'reportCount' + > +) { + await db('character').updateOne( + { _id: characterId, kind: 'character' }, + { $set: { ...update, updatedAt: now() } } + ) + return db('character').findOne({ _id: characterId, kind: 'character' }) } + export async function bulkUpdate( userId: string, charIds: string[], @@ -188,9 +245,47 @@ export async function getCharacter( return char || undefined } +/** + * The user's existing personal copy of a Discover template, if any. A clone's + * `parent` points back to the template it was matched from, so this is how we + * avoid spawning a second copy when the user matches the same character again. + */ +export async function getUserCopyOfTemplate(userId: string, templateId: string) { + const char = await db('character').findOne({ + kind: 'character', + userId, + parent: templateId, + draft: { $ne: true }, + }) + return char || undefined +} + +/** The user's current unfinished wizard draft, if any. One draft per user. */ +export async function getDraftCharacter(userId: string) { + const char = await db('character').findOne({ userId, kind: 'character', draft: true }) + return char || undefined +} + +/** + * Atomically claim the single free portrait for the user's active draft. Returns + * true exactly once per draft (the create wizard's first auto-generation, bundled + * into the creation fee); every later generation returns false and is charged. + * The `freePortraitUsed: { $ne: true }` guard makes the claim race-safe, so + * concurrent requests can't both win the freebie. Eligibility is derived entirely + * from server state — the client's request only signals intent. + */ +export async function claimDraftFreePortrait(userId: string) { + const res = await db('character').updateOne( + { userId, kind: 'character', draft: true, freePortraitUsed: { $ne: true } }, + { $set: { freePortraitUsed: true } } + ) + return res.modifiedCount === 1 +} + export async function getCharacters(userId: string) { const list = await db('character') - .find({ userId }) + // Hide unfinished wizard drafts from the My AI list. + .find({ userId, draft: { $ne: true } }) .project({ _id: 1, userId: 1, @@ -205,9 +300,23 @@ export async function getCharacters(userId: string) { xp: 1, children: 1, match: 1, + published: 1, + moderation: 1, + reportCount: 1, parent: 1, voiceDisabled: 1, folder: 1, + // The My AI list filters and cards need these: gender/artStyle/nsfw/category + // drive the filter chips and tag search; progression/loraName render the + // stage badge and archetype/LoRA pills. Without them the filters match + // nothing (undefined !== 'female') and the pills never show. + gender: 1, + artStyle: 1, + ageRange: 1, + nsfw: 1, + category: 1, + progression: 1, + loraName: 1, }) .toArray() @@ -221,6 +330,28 @@ export async function deleteCharacter(opts: { charId: string; userId: string }) await db('chat').deleteMany({ characterId: opts.charId, userId: opts.userId }) } +/** + * True if any character *other than* `exceptId` still references this LoRA name. + * Cloning a character copies the parent's `loraName`, so the stored LoRA on the + * image server is shared — it must outlive the deletion of any single character + * that points at it. + */ +export async function anyCharacterUsesLora(loraName: string, exceptId?: string) { + if (!loraName) return false + const query: any = { kind: 'character', loraName } + if (exceptId) query._id = { $ne: exceptId } + const found = await db('character').findOne(query, { projection: { _id: 1 } }) + return !!found +} + +/** Drop the LoRA association from a character. Does not touch the image server. */ +export async function clearCharacterLora(charId: string, userId: string) { + await db('character').updateOne( + { _id: charId, userId, kind: 'character' }, + { $set: { updatedAt: now() }, $unset: { loraName: '' } } + ) +} + export async function getCharacterList(charIds: string[], userId?: string) { const project = { _id: 1, diff --git a/srv/db/chats.ts b/srv/db/chats.ts index 740a6153..dfd2d268 100644 --- a/srv/db/chats.ts +++ b/srv/db/chats.ts @@ -61,7 +61,8 @@ export async function create( | 'genPreset' | 'mode' | 'imageSource' - >, + > & + Partial>, profile: AppSchema.Profile, impersonating?: AppSchema.Character ) { @@ -77,7 +78,7 @@ export async function create( mode: props.mode, characterId, userId: props.userId, - memberIds: [], + memberIds: props.memberIds || [], name: props.name, greeting: props.greeting, sampleChat: props.sampleChat, @@ -91,10 +92,19 @@ export async function create( messageCount: props.greeting ? 1 : 0, tempCharacters: {}, imageSource: props.imageSource, + characters: props.characters, + event: props.event, + memoryDisabled: props.memoryDisabled, } await db('chat').insertOne(doc) + // Roll this chat up to the public Discover template (the copy's parent, or self). + await db('character').updateOne( + { _id: char.parent || characterId }, + { $inc: { 'engagement.chats': 1 } } + ) + if (props.greeting) { const { parsed } = await parseTemplate(props.greeting, { chat: doc, @@ -141,6 +151,21 @@ export async function deleteAllChats(characterId?: string) { await db('chat-message').deleteMany({ chatId: { $in: chatIds } }) } +/** Delete every chat (and its messages) a user has with a single character. */ +export async function deleteChatsByCharacter(userId: string, characterId: string) { + const chatIds = await db('chat') + .find({ characterId, userId }) + .toArray() + .then((chats) => chats.map((ch) => ch._id)) + + if (!chatIds.length) return + + await db('chat').deleteMany({ _id: { $in: chatIds } }) + await db('chat-message').deleteMany({ chatId: { $in: chatIds } }) + await db('chat-invite').deleteMany({ chatId: { $in: chatIds } }) + await db('chat-member').deleteMany({ chatId: { $in: chatIds } }) +} + export async function canViewChat(senderId: string, chat: AppSchema.Chat) { if (chat.userId === senderId) return true const membership = await db('chat-member').findOne({ chatId: chat._id, userId: senderId }) diff --git a/srv/db/client.ts b/srv/db/client.ts index e394c12a..fbdf14ca 100644 --- a/srv/db/client.ts +++ b/srv/db/client.ts @@ -67,6 +67,48 @@ export async function createIndexes() { await db('character').createIndex({ userId: 1 }, { name: 'characters_userId' }) + // Discover gallery: filter public templates by facet, sort by engagement. + await db('character').createIndex( + { match: 1, premium: 1, gender: 1, artStyle: 1 }, + { name: 'characters_discover_facets' } + ) + await db('character').createIndex( + { match: 1, 'engagement.trending': -1 }, + { name: 'characters_discover_trending' } + ) + await db('character').createIndex( + { name: 'text', tags: 'text', category: 'text' }, + { name: 'characters_discover_text' } + ) + // Trending = recent clones: count child copies of a template within the window. + await db('character').createIndex( + { parent: 1, createdAt: -1 }, + { name: 'characters_parent_createdAt' } + ) + // User-published characters: facet/sort discovery + per-user daily publish cap. + await db('character').createIndex( + { published: 1, premium: 1, gender: 1, artStyle: 1 }, + { name: 'characters_published_facets' } + ) + await db('character').createIndex( + { published: 1, 'engagement.trending': -1 }, + { name: 'characters_published_trending' } + ) + await db('character').createIndex( + { userId: 1, publishedAt: -1 }, + { name: 'characters_userId_publishedAt' } + ) + + // Character reports (moderation queue): one per (reporter, char); list by char. + await db('character-report').createIndex( + { reporterId: 1, charId: 1 }, + { name: 'character-report_reporter_char', unique: true } + ) + await db('character-report').createIndex( + { resolved: 1, createdAt: -1 }, + { name: 'character-report_resolved_createdAt' } + ) + await db('chat').createIndex({ userId: 1 }, { name: 'chats_userId' }) await db('chat').createIndex({ characterId: 1, userId: 1 }, { name: 'chats_characterId_userId' }) @@ -103,14 +145,27 @@ export async function createIndexes() { ) await db('user').createIndex({ 'google.sub': 1 }, { name: 'user_googleSub' }) await db('user').createIndex({ 'google.email': 1 }, { name: 'user_googleEmail' }) + await db('user').createIndex({ fingerprint: 1 }, { name: 'user_fingerprint' }) await db('saga-template').createIndex({ userId: 1 }, { name: 'saga-template_userId' }) await db('saga-session').createIndex({ userId: 1 }, { name: 'saga-session_userId' }) await db('saga-session').createIndex({ templateId: 1 }, { name: 'saga-session_templateId' }) + await db('promo-code').createIndex({ code: 1 }, { unique: true, name: 'promo-code_code' }) + await db('promo-redemption').createIndex( + { codeId: 1, userId: 1 }, + { unique: true, name: 'promo-redemption_code_user' } + ) + await db('chat-lock').createIndex({ kind: 1, chatLock: 1 }, { name: 'chat-lock_kind_chatlock' }) await db('evtstore-events' as any).createIndex( { aggregateId: 1, stream: 1, position: 1 }, { name: 'evtstore-events_aggId_stream_position' } ) + + // Per-user notifications: replay undelivered ones on login, oldest first. + await db('notification').createIndex( + { userId: 1, deliveredAt: 1, createdAt: 1 }, + { name: 'notification_userId_delivered_created' } + ) } diff --git a/srv/db/credits.ts b/srv/db/credits.ts index 2d6283e0..1fd32965 100644 --- a/srv/db/credits.ts +++ b/srv/db/credits.ts @@ -1,8 +1,6 @@ import { errors, StatusError } from '../api/wrap' -import { getChat } from './chats' import { db } from './client' import { sendOne } from '../api/ws' -import { AppSchema } from '../../common/types/schema' import { getUserSubscriptionTier } from '../../common/util' import { getCachedTiers } from './subscriptions' @@ -29,59 +27,23 @@ export async function getFreeCredits() { const now = new Date().getTime() const nextTime: number = Number(now) + 120000 - // evil anti cheat - // check users that have more than one account on the same ip and give them credits accordingly - - const duplicateIPUsers = await db('user') - .aggregate([ - { - $match: { - kind: 'user', - nextCredits: { $lte: now }, - premium: false, - credits: { $lt: 300 }, - }, - }, - { - $group: { - _id: '$lastIp', - userIds: { $push: '$_id' }, - count: { $sum: 1 }, - }, - }, - { - $match: { - count: { $gt: 1 }, - }, - }, - ]) - .toArray() - - for (const { userIds } of duplicateIPUsers) { - let groupCreditsToAdd = Math.max(Math.floor(8 / userIds.length), 1) - - for (const userId of userIds) { - const user = await db('user').findOne({ kind: 'user', _id: userId }) - if (user) { - const updatedCredits = Math.min( - user.credits + groupCreditsToAdd, - Math.floor(300 / userIds.length) - ) - if (updatedCredits > user.credits) { - const credits = await updateCredits(userId, updatedCredits - user.credits, nextTime) - sendOne(userId, { type: 'recharged', amount: groupCreditsToAdd }) - //sendOne(userId, { type: 'credits-updated', credits }) - } - } - } - } - // end of Ronnies evil - const users = await db('user') - .find({ kind: 'user', nextCredits: { $lte: now }, premium: false, credits: { $lt: 300 } }) + .find({ + kind: 'user', + nextCredits: { $lte: now }, + premium: false, + credits: { $lt: 500 }, + creditsRestricted: { $ne: true }, + }) .toArray() const premiumUsers = await db('user') - .find({ kind: 'user', nextCredits: { $lte: now }, credits: { $lt: 1500 }, premium: true }) + .find({ + kind: 'user', + nextCredits: { $lte: now }, + credits: { $lt: 5000 }, + premium: true, + creditsRestricted: { $ne: true }, + }) .toArray() const expiredPremium = await db('user') .find({ @@ -96,9 +58,9 @@ export async function getFreeCredits() { const diff = now - lastCredits const creditsToAdd = Math.max(Math.floor(diff / 120000), 1) * 5 - const updatedCredits = Math.min(usr.credits + creditsToAdd, 300) + const updatedCredits = Math.min(usr.credits + creditsToAdd, 500) if (updatedCredits > usr.credits) { - const credits = await updateCredits(usr._id, updatedCredits - usr.credits, nextTime) + await updateCredits(usr._id, updatedCredits - usr.credits, nextTime) sendOne(usr._id, { type: 'recharged', amount: creditsToAdd }) // sendOne(usr._id, { type: 'credits-updated', credits }) } @@ -111,7 +73,7 @@ export async function getFreeCredits() { const updatedCredits = Math.min(usr.credits + creditsToAdd, 5000) if (updatedCredits > usr.credits) { - const credits = await updateCredits(usr._id, updatedCredits - usr.credits, nextTime) + await updateCredits(usr._id, updatedCredits - usr.credits, nextTime) sendOne(usr._id, { type: 'recharged', amount: creditsToAdd }) // sendOne(usr._id, { type: 'credits-updated', credits }) } diff --git a/srv/db/index.ts b/srv/db/index.ts index 8a19d8d3..7f0f3b5a 100644 --- a/srv/db/index.ts +++ b/srv/db/index.ts @@ -8,12 +8,14 @@ import * as msgs from './messages' import * as memory from './memory' import * as shop from './shop' import * as matches from './matches' +import * as reports from './reports' import * as credits from './credits' import * as scenario from './scenario' -import * as invitecode from './invitecode' import * as oauth from './oauth' import * as subs from './subscriptions' import * as announce from './announcements' +import * as promo from './promo' +import * as notifications from './notifications' export { db } from './client' @@ -27,11 +29,13 @@ export const store = { msgs, memory, shop, - invitecode, matches, + reports, credits, scenario, oauth, subs, announce, + promo, + notifications, } diff --git a/srv/db/invitecode.ts b/srv/db/invitecode.ts deleted file mode 100644 index 3fb1ba5e..00000000 --- a/srv/db/invitecode.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { v4 } from 'uuid' -import { db } from './client' -import { AppSchema } from '../../common/types/schema' - -export async function checkInviteCode(_id: any) { - const char = await db('invitecode').findOne({ - kind: 'invitecode', - _id: _id.toUpperCase(), - count: { $gt: 0 }, - }) - - return char?.kind ? true : false -} - -export async function getInviteCode() { - const char = await db('invitecode').findOne({ - kind: 'invitecode', - public: true, - count: { $gt: 0 }, - }) - - return char?._id || null -} - -export async function takeInviteCode(id: string, user: string = '') { - // convert id to uppercase - const uppercaseId = id.toUpperCase() - - if (id === 'SALVADOR' || id === 'salvador') { - const salv = await db('user').updateOne( - { kind: 'user', _id: user }, - { $set: { credits: 5000 } } - ) - } - - if (id === 'REDDIT2024' || id === 'reddit2024') { - const myCred=Math.random() < 1 / 25 ? 1000:500 - const salv = await db('user').updateOne( - { kind: 'user', _id: user }, - { $set: { credits: myCred } } - ) - } - - const list = await db('invitecode').updateOne( - { kind: 'invitecode', _id: id.toUpperCase() }, - { $inc: { count: -1 } } - ) - return list -} diff --git a/srv/db/matches.ts b/srv/db/matches.ts index dbc8c0ed..53f3646b 100644 --- a/srv/db/matches.ts +++ b/srv/db/matches.ts @@ -1,21 +1,63 @@ -import { v4 } from 'uuid' import { db } from './client' import { AppSchema } from '../../common/types/schema' -import { now } from './util' export async function getMatch(userId: string, id: string) { - const char = await db('character').findOne({ kind: 'character', _id: id, match: true }) + // Premium gate: a premium template is visible only to premium viewers (guests + // and free users get premium=false). Mirrors the gallery query (discover / + // getMatches) — without this, a premium character hidden from the gallery is + // still returned by direct ID, leaking its profile and feeding the clone flow. + const user = userId ? await db('user').findOne({ kind: 'user', _id: userId }) : undefined + const premium = user?.premium || false + + // A public template is either a legacy admin-curated char (match) or a + // user-published one (published), and must not be hidden by moderation. + const char = await db('character').findOne({ + kind: 'character', + _id: id, + 'moderation.status': { $ne: 'hidden' }, + $and: [ + { $or: [{ match: true }, { published: true }] }, + { $or: [{ premium: false }, { premium }] }, + ], + }) - return char + if (!char) return char + + // A shared character always presents as level 0 — the publisher's own XP is + // irrelevant to everyone else (and clones start fresh anyway). + const [creatorName] = await creatorNames([char.userId]) + return { ...char, xp: 0, creatorName } +} + +/** + * Resolve the public display name (profile handle) for each creator userId, in + * the same order. A transient, response-only join — never stored on the char. + */ +async function creatorNames(userIds: string[]) { + const unique = Array.from(new Set(userIds.filter(Boolean))) + if (!unique.length) return userIds.map(() => undefined) + const profiles = await db('profile') + .find({ kind: 'profile', userId: { $in: unique } }) + .toArray() + const byUser = new Map(profiles.map((p) => [p.userId, p.handle])) + return userIds.map((id) => byUser.get(id)) } export async function getMatches(userId: string) { const user = await db('user').findOne({ kind: 'user', _id: userId }) const premium = user?.premium || false const list = await db('character') - .find({ kind: 'character', match: true, $or: [{ premium: false }, { premium: premium }] }) + .find({ + kind: 'character', + 'moderation.status': { $ne: 'hidden' }, + $and: [ + { $or: [{ match: true }, { published: true }] }, + { $or: [{ premium: false }, { premium: premium }] }, + ], + }) .toArray() - return list + // Shared templates always present as level 0 (publisher XP is irrelevant). + return list.map((c) => ({ ...c, xp: 0 })) } export async function getMatchList(charIds: string[]) { @@ -24,3 +66,141 @@ export async function getMatchList(charIds: string[]) { .toArray() return list } + +/** Relative weights for the blended Discover popularity score. A clone (full + * adoption) outweighs a favourite, a started chat, then raw message volume. */ +const POP_WEIGHTS = { clone: 10, favorite: 4, chat: 2, message: 0.2 } + +/** Trailing window (days) that defines "recent" for the trending sort. */ +const TRENDING_WINDOW_DAYS = 30 + +export type DiscoverSort = 'trending' | 'popular' | 'new' + +export type DiscoverFilter = { + gender?: AppSchema.Character['gender'] + artStyle?: AppSchema.Character['artStyle'] + category?: string + nsfw?: boolean + search?: string + sort?: DiscoverSort + skip?: number + limit?: number +} + +/** + * Discover gallery query. Returns public template characters (`match: true`), + * premium-gated by the user, with facet filters and an engagement-based sort. + * Unlike the legacy swipe flow, picking a character does not remove it here — + * the template persists for everyone; selecting it clones a personal copy. + */ +export async function discover(userId: string, filter: DiscoverFilter = {}) { + const user = await db('user').findOne({ kind: 'user', _id: userId }) + const premium = user?.premium || false + + const query: any = { + kind: 'character', + draft: { $ne: true }, + // Discovery surfaces ONLY user-published characters now. The legacy + // admin-curated "match" templates are no longer discoverable, so the page is + // intentionally empty until the publishing system populates it. Never show + // anything taken down by moderation/reports. + 'moderation.status': { $ne: 'hidden' }, + published: true, + $or: [{ premium: false }, { premium }], + } + + // Defensive: only ever place primitive strings into the query so a malformed + // caller can't inject Mongo operators (e.g. { $ne: ... }) via these fields. + // 'trans' is the canonical third gender; older editor-written chars stored + // 'nonbinary' for the same thing, so the Trans filter must match either. The + // $in is built from the validated literal, not caller input, so it's safe. + if (filter.gender === 'trans') query.gender = { $in: ['trans', 'nonbinary'] } + else if (typeof filter.gender === 'string') query.gender = filter.gender + if (typeof filter.artStyle === 'string') query.artStyle = filter.artStyle + if (typeof filter.category === 'string') query.category = filter.category + if (filter.nsfw === false) query.nsfw = { $ne: true } + if (typeof filter.search === 'string') query.$text = { $search: filter.search } + + const limit = Math.min(filter.limit ?? 60, 200) + const skip = Math.max(filter.skip ?? 0, 0) + + // All-time popularity blends both signals. `children` (clone count) carries + // real historical data from the original Charluv; `engagement.*` is new and + // accrues going forward. A clone is the strongest adoption signal, then + // favourites, then chats started, then raw message volume (noisiest, lowest). + const popularity = { + $add: [ + { $multiply: [{ $ifNull: ['$children', 0] }, POP_WEIGHTS.clone] }, + { $multiply: [{ $ifNull: ['$engagement.favorites', 0] }, POP_WEIGHTS.favorite] }, + { $multiply: [{ $ifNull: ['$engagement.chats', 0] }, POP_WEIGHTS.chat] }, + { $multiply: [{ $ifNull: ['$engagement.messages', 0] }, POP_WEIGHTS.message] }, + ], + } + + const pipeline: any[] = [{ $match: query }, { $addFields: { _pop: popularity } }] + + if (filter.sort === 'new') { + // Freshest first. + pipeline.push({ $sort: { createdAt: -1 } }) + } else if (filter.sort === 'popular') { + // All-time blended score. + pipeline.push({ $sort: { _pop: -1, createdAt: -1 } }) + } else { + // Trending = recent only: every clone is a child character doc, so count the + // copies made within the trailing window. Falls back to all-time popularity + // then recency for templates with no recent clones. + const cutoff = new Date(Date.now() - TRENDING_WINDOW_DAYS * 86_400_000).toISOString() + pipeline.push( + { + $lookup: { + from: 'character', + let: { tid: '$_id' }, + pipeline: [ + { + $match: { + $expr: { + $and: [{ $eq: ['$parent', '$$tid'] }, { $gte: ['$createdAt', cutoff] }], + }, + }, + }, + { $count: 'n' }, + ], + as: '_recent', + }, + }, + { $addFields: { _trend: { $ifNull: [{ $arrayElemAt: ['$_recent.n', 0] }, 0] } } }, + { $sort: { _trend: -1, _pop: -1, createdAt: -1 } } + ) + } + + pipeline.push( + { $skip: skip }, + { $limit: limit }, + { $project: { _pop: 0, _trend: 0, _recent: 0 } } + ) + + const list = await db('character').aggregate(pipeline).toArray() + const names = await creatorNames(list.map((c) => c.userId)) + // Shared characters always present as level 0 — the publisher's XP is theirs + // alone and shouldn't show in the gallery or carry into a clone. + return list.map((c, i) => ({ ...c, xp: 0, creatorName: names[i] })) +} + +/** + * Increment an aggregated engagement counter on the public template character. + * A personal copy (with a `parent`) rolls its activity up to the template that + * is shown in Discover; a template increments itself. + */ +export async function incrementEngagement( + characterId: string, + field: 'chats' | 'messages' | 'favorites', + by: number = 1, + parentId?: string +) { + let targetId = parentId + if (targetId === undefined) { + const char = await db('character').findOne({ _id: characterId }, { projection: { parent: 1 } }) + targetId = char?.parent || characterId + } + await db('character').updateOne({ _id: targetId }, { $inc: { [`engagement.${field}`]: by } }) +} diff --git a/srv/db/messages.ts b/srv/db/messages.ts index effefb5b..a2b5ad5c 100644 --- a/srv/db/messages.ts +++ b/srv/db/messages.ts @@ -3,8 +3,6 @@ import { db } from './client' import { AppSchema } from '../../common/types/schema' import { now } from './util' -import { store } from '.' -import { config } from '../config' import { WithId } from 'mongodb' // let PAGE_SIZE = config.limits.msgPageSize diff --git a/srv/db/notifications.ts b/srv/db/notifications.ts new file mode 100644 index 00000000..10eb1469 --- /dev/null +++ b/srv/db/notifications.ts @@ -0,0 +1,38 @@ +import { v4 } from 'uuid' +import { db } from './client' +import { now } from './util' +import { AppSchema } from '/common/types' + +/** Persist a per-user notification. Returns the stored doc. */ +export async function createNotification(userId: string, message: string, level?: number) { + const doc: AppSchema.Notification = { + _id: v4(), + kind: 'notification', + userId, + message, + level, + createdAt: now(), + } + await db('notification').insertOne(doc) + return doc +} + +/** Notifications not yet pushed to a live socket, oldest first. */ +export async function getUndelivered(userId: string) { + return db('notification') + .find({ userId, deliveredAt: { $exists: false } }) + .sort({ createdAt: 1 }) + .toArray() +} + +/** + * Mark notifications delivered so they aren't replayed again on the next login. + * Scoped to the owner so a client ack can only ever clear its own notifications. + */ +export async function markDelivered(userId: string, ids: string[]) { + if (!ids.length) return + await db('notification').updateMany( + { _id: { $in: ids }, userId }, + { $set: { deliveredAt: now() } } + ) +} diff --git a/srv/db/promo.ts b/srv/db/promo.ts new file mode 100644 index 00000000..4a9f4230 --- /dev/null +++ b/srv/db/promo.ts @@ -0,0 +1,165 @@ +import { v4 } from 'uuid' +import { db } from './client' +import { StatusError } from '../api/wrap' +import { updateCredits } from './credits' +import { getUser, updateUser, toSafeUser } from './user' +import { AppSchema } from '../../common/types' + +const DAY_MS = 86_400_000 + +const now = () => new Date().toISOString() + +/** Pure helper: new premiumUntil after adding `days`, extending the later of existing/now. */ +export function extendPremium(premiumUntil: number, days: number, nowMs: number) { + const base = (premiumUntil || 0) > nowMs ? premiumUntil : nowMs + return base + days * DAY_MS +} + +export async function getPromos() { + return db('promo-code').find({ kind: 'promo-code' }).sort({ createdAt: -1 }).toArray() +} + +export async function getPromoByCode(code: string) { + return db('promo-code').findOne({ kind: 'promo-code', code: code.trim().toUpperCase() }) +} + +export async function createPromo(input: { + code: string + credits?: number + days?: number + maxUses: number + enabled: boolean + expiresAt?: string + createdBy: string +}) { + const code = input.code.trim().toUpperCase() + if (!code) throw new StatusError('Code is required', 400) + if (!input.credits && !input.days) { + throw new StatusError('A code must grant credits and/or days', 400) + } + if (input.maxUses < 0) throw new StatusError('maxUses cannot be negative', 400) + + const existing = await db('promo-code').findOne({ kind: 'promo-code', code }) + if (existing) throw new StatusError('A code with that name already exists', 400) + + const promo: AppSchema.PromoCode = { + _id: v4(), + kind: 'promo-code', + code, + credits: input.credits || 0, + days: input.days || 0, + maxUses: input.maxUses, + uses: 0, + enabled: input.enabled, + expiresAt: input.expiresAt || undefined, + createdAt: now(), + createdBy: input.createdBy, + } + + await db('promo-code').insertOne(promo) + return promo +} + +export async function updatePromo( + id: string, + patch: Partial< + Pick + > +) { + const existing = await db('promo-code').findOne({ kind: 'promo-code', _id: id }) + if (!existing) throw new StatusError('Promo code not found', 404) + + const set: any = { updatedAt: now() } + if (patch.code !== undefined) { + const code = patch.code.trim().toUpperCase() + if (!code) throw new StatusError('Code is required', 400) + const clash = await db('promo-code').findOne({ kind: 'promo-code', code, _id: { $ne: id } }) + if (clash) throw new StatusError('A code with that name already exists', 400) + set.code = code + } + if (patch.credits !== undefined) set.credits = patch.credits + if (patch.days !== undefined) set.days = patch.days + if (patch.maxUses !== undefined) set.maxUses = patch.maxUses + if (patch.enabled !== undefined) set.enabled = patch.enabled + if (patch.expiresAt !== undefined) set.expiresAt = patch.expiresAt || undefined + + const effCredits = patch.credits !== undefined ? patch.credits : existing.credits + const effDays = patch.days !== undefined ? patch.days : existing.days + if (!effCredits && !effDays) throw new StatusError('A code must grant credits and/or days', 400) + + await db('promo-code').updateOne({ kind: 'promo-code', _id: id }, { $set: set }) + return db('promo-code').findOne({ kind: 'promo-code', _id: id }) +} + +export async function deletePromo(id: string) { + await db('promo-code').deleteOne({ kind: 'promo-code', _id: id }) +} + +export async function redeemPromo(userId: string, rawCode: string) { + const code = (rawCode || '').trim().toUpperCase() + if (!code) throw new StatusError('Please enter a code', 400) + + const promo = await db('promo-code').findOne({ kind: 'promo-code', code }) + if (!promo) throw new StatusError('Invalid promo code', 404) + if (!promo.enabled) throw new StatusError('This code is no longer active', 400) + if (promo.expiresAt && new Date(promo.expiresAt).valueOf() < Date.now()) { + throw new StatusError('This code has expired', 400) + } + + // Atomically claim a use slot (skip the guard entirely when unlimited). + const filter: any = { kind: 'promo-code', _id: promo._id, enabled: true } + if (promo.maxUses > 0) filter.$expr = { $lt: ['$uses', '$maxUses'] } + const claimed = await db('promo-code').findOneAndUpdate(filter, { $inc: { uses: 1 } }) + // mongodb driver v5: findOneAndUpdate always returns ModifyResult { value: doc | null } + const claimedDoc = claimed?.value + if (!claimedDoc) throw new StatusError('This code has been fully used', 400) + + // Per-account lock via the unique (codeId,userId) index. + try { + await db('promo-redemption').insertOne({ + _id: v4(), + kind: 'promo-redemption', + codeId: promo._id, + userId, + code, + credits: promo.credits || 0, + days: promo.days || 0, + createdAt: now(), + }) + } catch (err: any) { + await db('promo-code').updateOne({ kind: 'promo-code', _id: promo._id }, { $inc: { uses: -1 } }) + if (err?.code === 11000) throw new StatusError('You have already redeemed this code', 400) + throw err + } + + const credits = promo.credits || 0 + const days = promo.days || 0 + + let creditsApplied = false + try { + if (credits > 0) { + await updateCredits(userId, credits) + creditsApplied = true + } + if (days > 0) { + const user = await getUser(userId) + if (!user) throw new StatusError('User not found', 404) + const premiumUntil = extendPremium(user.premiumUntil || 0, days, Date.now()) + await updateUser(userId, { premium: true, premiumUntil }) + } + } catch (err) { + // Roll back so the user can retry: reverse any credits, drop the redemption, free the use slot. + if (creditsApplied) await updateCredits(userId, -credits).catch(() => {}) + await db('promo-redemption') + .deleteOne({ kind: 'promo-redemption', codeId: promo._id, userId }) + .catch(() => {}) + await db('promo-code') + .updateOne({ kind: 'promo-code', _id: promo._id }, { $inc: { uses: -1 } }) + .catch(() => {}) + throw err + } + + const user = await getUser(userId) + if (!user) throw new StatusError('User not found', 404) + return { user: toSafeUser(user), credits, days } +} diff --git a/srv/db/reports.ts b/srv/db/reports.ts new file mode 100644 index 00000000..d88322dc --- /dev/null +++ b/srv/db/reports.ts @@ -0,0 +1,62 @@ +import { v4 } from 'uuid' +import { db } from './client' +import { now } from './util' +import { AppSchema } from '../../common/types/schema' + +/** + * File a report against a published character. One report per (reporter, char): + * a repeat report by the same user is a no-op. Returns the current count of + * distinct, unresolved reports so the caller can apply the auto-hide threshold. + */ +export async function createReport(input: { + charId: string + charOwnerId: string + reporterId: string + reason: string + note?: string +}): Promise<{ created: boolean; count: number }> { + const existing = await db('character-report').findOne({ + charId: input.charId, + reporterId: input.reporterId, + }) + + let created = false + if (!existing) { + const report: AppSchema.CharacterReport = { + _id: v4(), + kind: 'character-report', + charId: input.charId, + charOwnerId: input.charOwnerId, + reporterId: input.reporterId, + reason: input.reason, + note: input.note, + createdAt: now(), + resolved: false, + } + await db('character-report').insertOne(report) + created = true + } + + const count = await db('character-report').countDocuments({ + charId: input.charId, + resolved: { $ne: true }, + }) + + return { created, count } +} + +/** Open (unresolved) reports, grouped per character for the admin queue. */ +export async function getOpenReports() { + return db('character-report') + .find({ resolved: { $ne: true } }) + .sort({ createdAt: -1 }) + .toArray() +} + +/** Mark every open report for a character as resolved (admin actioned it). */ +export async function resolveReportsForChar(charId: string, adminId: string) { + await db('character-report').updateMany( + { charId, resolved: { $ne: true } }, + { $set: { resolved: true, resolvedAt: now(), resolvedBy: adminId } } + ) +} diff --git a/srv/db/scenario.ts b/srv/db/scenario.ts index d27b8d1f..3135715c 100644 --- a/srv/db/scenario.ts +++ b/srv/db/scenario.ts @@ -70,11 +70,6 @@ export async function getScenario(scenarioId: string) { if (!book) return return book } -export async function updateCharXp(charId: string, xp: number) { - const originalCharacter = await db('character').findOne({ _id: charId }) - if (originalCharacter?.name === 'Aiva') { - return - } - - await db('character').updateOne({ _id: charId }, { $inc: { xp: 1 } }) +export async function updateCharXp(charId: string, xp: number = 1) { + await db('character').updateOne({ _id: charId }, { $inc: { xp } }) } diff --git a/srv/db/shop.ts b/srv/db/shop.ts index f3d70f44..b6763a45 100644 --- a/srv/db/shop.ts +++ b/srv/db/shop.ts @@ -28,8 +28,9 @@ export async function getShopOrder(id: string) { return order[0] || null } export async function getShopOrdersFrom(created: string) { - - const orders = await db('order').find({"status": "pending", createdAt: {$gt: created}}).toArray() + const orders = await db('order') + .find({ status: 'pending', createdAt: { $gt: created } }) + .toArray() return orders } diff --git a/srv/db/subscriptions.ts b/srv/db/subscriptions.ts index 0159ef1c..ae031256 100644 --- a/srv/db/subscriptions.ts +++ b/srv/db/subscriptions.ts @@ -176,12 +176,12 @@ export async function prepSubscriptionCache() { setContextLimitStrategy((user, gen) => { if (!gen) return - if (gen.service !== 'agnaistic') return + if (gen.service !== 'charluv') return const sub = getUserSubscriptionTier(user, getCachedTiers()) const level = sub?.level ?? -1 - const tierId = gen.registered?.agnaistic?.subscriptionId || '' + const tierId = gen.registered?.charluv?.subscriptionId || '' const tier = subCache.get(tierId) if (!tier) return @@ -261,8 +261,8 @@ export async function replaceSubscription(id: string, replacementId: string) { } await db('gen-setting').updateMany( - { 'registered.agnaistic.subscriptionId': id }, - { $set: { 'registered.agnaistic.subscriptionId': replacementId } } + { 'registered.charluv.subscriptionId': id }, + { $set: { 'registered.charluv.subscriptionId': replacementId } } ) await updateSubscription(id, { subDisabled: true }) } diff --git a/srv/db/user.ts b/srv/db/user.ts index 3ea0162b..4d54991e 100644 --- a/srv/db/user.ts +++ b/srv/db/user.ts @@ -69,6 +69,19 @@ export async function updateUser(userId: string, props: Partial) return getUser(userId) } +export async function clearRestriction(userId: string) { + const user = await db('user').findOne({ kind: 'user', _id: userId }) + if (!user) throw errors.NotFound + const credits = (user.credits || 0) < 200 ? 200 : user.credits + await db('user').updateOne( + { kind: 'user', _id: userId }, + { + $set: { creditsRestricted: false, credits }, + $unset: { restrictedReason: '' }, + } + ) +} + export async function updateProfile(userId: string, props: Partial) { await db('profile').updateOne({ userId }, { $set: props }) return getProfile(userId) @@ -87,6 +100,12 @@ export async function checkIp(ip?: string) { return true } +export async function checkFingerprint(fingerprint?: string) { + if (!fingerprint) return false + const count = await db('user').countDocuments({ kind: 'user', fingerprint }) + return count > 0 +} + export async function authenticate(username: string, password: string) { const user = await db('user').findOne({ username: username.toLowerCase() }) if (!user) return @@ -102,7 +121,17 @@ export async function authenticate(username: string, password: string) { return { token, profile, user: toSafeUser(user) } } -export async function createUser(newUser: NewUser, admin?: boolean) { +export async function createUser( + newUser: NewUser, + admin?: boolean, + opts?: { + restricted?: boolean + restrictedReason?: 'ip' | 'fingerprint' | 'both' + fingerprint?: string + ip?: string + consentAt?: string + } +) { const username = newUser.username.toLowerCase().trim() const existing = await db('user').findOne({ kind: 'user', username }) @@ -121,7 +150,7 @@ export async function createUser(newUser: NewUser, admin?: boolean) { novelApiKey: '', premium: false, premiumUntil: 0, - credits: 200, + credits: opts?.restricted ? 0 : 200, nextCredits: 0, defaultAdapter: 'horde', koboldUrl: '', @@ -135,6 +164,11 @@ export async function createUser(newUser: NewUser, admin?: boolean) { defaultPresets: {}, useLocalPipeline: false, createdAt: new Date().toISOString(), + creditsRestricted: opts?.restricted || undefined, + restrictedReason: opts?.restrictedReason, + fingerprint: opts?.fingerprint || undefined, + lastIp: opts?.ip || undefined, + identifierConsentAt: opts?.consentAt, } await db('user').insertOne(user) @@ -530,5 +564,15 @@ export function toSafeUser(user: AppSchema.User) { } } + // Password hash must never reach the client. Most paths project it out, but + // OAuth login (Google/Patreon) reads the raw doc, so strip it here centrally. + delete (user as any).hash + + // Abuse-detection internals: never expose to the client. + delete (user as any).fingerprint + delete (user as any).restrictedReason + delete (user as any).lastIp + delete (user as any).identifierConsentAt + return user } diff --git a/srv/deploy-bot.ts b/srv/deploy-bot.ts deleted file mode 100644 index 71d3dfb8..00000000 --- a/srv/deploy-bot.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { REST, Routes } from 'discord.js' -import { config } from './config' -import fs from 'node:fs' -import path from 'node:path' - -const {discordToken,discordId} = config - -const commands:any = [] -// Grab all the command folders from the commands directory you created earlier -const foldersPath = path.join(__dirname, 'discord') -//const commandFolders = fs.readdirSync(foldersPath) - - const commandFiles = fs.readdirSync(foldersPath).filter(file => file.endsWith('.js')) - // Grab the SlashCommandBuilder#toJSON() output of each command's data for deployment - for (const file of commandFiles) { - const filePath = path.join(foldersPath, file) - const command = require(filePath) - - commands.push(command.data.toJSON()) - - } - - -// Construct and prepare an instance of the REST module - -// and deploy your commands! -(async () => { - try { - const rest = await new REST({ version: '10' }) - console.log(discordToken) - rest.setToken(discordToken) - - console.log(`Started refreshing ${commands.length} application (/) commands.`) - - // The put method is used to fully refresh all commands in the guild with the current set - await rest.put( - Routes.applicationCommands(discordId), - { body: commands }, - ) - - console.log(`Successfully reloaded ${commands.length} application (/) commands.`) - } catch (error) { - // And of course, make sure you catch and log any errors! - console.error(error) - } -})(); \ No newline at end of file diff --git a/srv/discord.ts b/srv/discord.ts deleted file mode 100644 index fc070c78..00000000 --- a/srv/discord.ts +++ /dev/null @@ -1,146 +0,0 @@ -import { store } from './db' -import fs from 'node:fs' -import path from 'node:path' -import { Client, Collection, Events, GatewayIntentBits, TextChannel } from 'discord.js' -import { config } from './config' -import { connect } from './db/client' -import * as redis from 'redis' - -function getUri() { - let creds = config.redis.user || '' - if (creds && config.redis.pass) creds += `:${config.redis.pass}` - if (creds) creds += '@' - - return `redis://${creds}${config.redis.host}:${config.redis.port}` -} -const redisClient = redis.createClient({ url: getUri() }) - -const checkRedis = async () => { - await redisClient.connect() - const result = await redisClient.get('discordBot') - console.log(result) - if (result === '1') return '1' - return result -} -checkRedis() - .then((result) => { - if (result === '1') { - process.exit() - } - }) - .catch((error) => { - // Handle any errors that occur during the Redis operation or Promise resolution - - process.exit() - }) - -const { discordToken } = config - -declare module 'discord.js' { - interface Client { - commands: Collection - } -} - -const client = new Client({ - intents: [ - GatewayIntentBits.Guilds, - GatewayIntentBits.GuildMessages, - GatewayIntentBits.MessageContent, - GatewayIntentBits.GuildMembers, - ], -}) - -const commandsPath = path.join(__dirname, 'discord') -const commandFiles = fs.readdirSync(commandsPath).filter((file) => file.endsWith('.js')) - -client.commands = new Collection() -for (const file of commandFiles) { - const filePath = path.join(commandsPath, file) - const command = require(filePath) - // Set a new item in the Collection with the key as the command name and the value as the exported module - if ('data' in command && 'execute' in command) { - console.log('Module loaded: ' + command.data.name) - client.commands.set(command.data.name, command) - } else { - console.log( - `[WARNING] The command at ${filePath} is missing a required "data" or "execute" property.` - ) - } -} - -client.on('guildMemberAdd', async (member) => { - // guildmemberadd is the event which gets triggered if somebody joins your Discord server - const embed = { - title: `Welcome to the server, ${member.user.username}!`, - description: `${member} ${member.guild.memberCount}rd to join, may many follow this great example..`, - color: 0x00ffff, - footer: { - text: `You got an early access code, just in case you needed it...`, - }, - } - const greetings = [ - 'We have great news', - 'We are happy to have you here', - 'Welcome to the server', - 'So nice you are here', - 'We are happy to see you', - ] - // shuffle greeting - const greeting = greetings[Math.floor(Math.random() * greetings.length)] - - await member.roles.add('1091916813736095754') - const code = await store.invitecode.getInviteCode() - if (!code) await member.send('No codes available') - await member.send( - `Your Charluv Early Access code is: **${code}**. The code is not exclusive to you and can be used by anyone. Please use it as soon as possible.` - ) - const channel: TextChannel = client.channels.cache.get('1091959187195559946') as TextChannel - await channel.send({ content: greeting, embeds: [embed] }) -}) - -// When the client is ready, run this code (only once) -// We use 'c' for the event parameter to keep it separate from the already defined 'client' -client.once(Events.ClientReady, async (c) => { - await redisClient.set('discordBot', '1') - await redisClient.expire('discordBot', 300) - await redisClient.disconnect() - console.log(`Ready! Logged in as ${c.user?.tag}`) - - await initDb() -}) - -client.on(Events.InteractionCreate, async (interaction) => { - if (!interaction.isChatInputCommand()) return - - const command = interaction.client.commands.get(interaction.commandName) - - if (!command) { - console.error(`No command matching ${interaction.commandName} was found.`) - return - } - - try { - await command.execute(interaction) - } catch (error) { - console.error(error) - if (interaction.replied || interaction.deferred) { - await interaction.followUp({ - content: 'There was an error while executing this command!', - ephemeral: true, - }) - } else { - await interaction.reply({ - content: 'There was an error while executing this command!', - ephemeral: true, - }) - } - } -}) - -// Log in to Discord with your client's token -client.login(discordToken) - -async function initDb() { - const db = await connect() -} diff --git a/srv/discord/access.ts b/srv/discord/access.ts deleted file mode 100644 index af910ae7..00000000 --- a/srv/discord/access.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { SlashCommandBuilder, Role, PermissionFlagsBits } from 'discord.js' -import { store } from '../db' - -module.exports = { - data: new SlashCommandBuilder() - .setName('access') - .setDescription('Send an early access code to a member') - .addStringOption((option) => - option.setName('target').setDescription('The user to send code to').setRequired(true) - ) - .setDMPermission(false) - .setDefaultMemberPermissions(PermissionFlagsBits.BanMembers), - async execute(interaction: any) { - const target = interaction.options.getString('target') - const members = await interaction.guild.members.fetch({ query: target, limit: 1 }) - if (!members.size) { - return interaction.reply({ content: 'User not found', ephemeral: true }) - } - const member = members?.first() || null - - const code = await store.invitecode.getInviteCode() - if (!code) await interaction.reply({ content: 'No codes available', ephemeral: true }) - if (code) { - await interaction.reply({ content: 'Code sent', ephemeral: true }) - await member.send( - `Your Charluv Early Access code is: **${code}**. The code is not exclusive to you and can be used by anyone. Please use it as soon as possible.` - ) - } - }, -} diff --git a/srv/discord/ask.ts b/srv/discord/ask.ts deleted file mode 100644 index e19e9b08..00000000 --- a/srv/discord/ask.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { SlashCommandBuilder, Role, PermissionFlagsBits, AttachmentBuilder } from 'discord.js' - -import makeDemandRequest from '../demandGPT' - -module.exports = { - data: new SlashCommandBuilder() - .setName('ask') - .setDescription('Ask any question about Charluv') - .addStringOption((option) => - option.setName('question').setDescription('The question you want to ask').setRequired(true) - ) - .setDMPermission(false), - - async execute(interaction: any) { - const question = interaction.options.getString('question') - const interactionId = interaction.id - - await interaction.deferReply({ - allowed_mentions: { - replied_user: true, - parse: ['users'], - }, - ephemeral: false, - }) - - const reply = await makeDemandRequest(question) - - if (!reply) { - await interaction.editReply('Did not get an answer. Please ask a mod.') - return - } - // Truncate the message to fit within Discord's character limit - const truncateMessage = (text: string, maxLength = 2000) => { - return text.length > maxLength ? text.slice(0, maxLength - 3) + '...' : text - } - - const formattedReply = truncateMessage(reply, 1700) - const result = `Question: ${question}\nAnswer: ${formattedReply - .replace(/['"\\]/g, '\\$&') - .replace(/#/g, '')}` - - try { - await interaction.editReply(result) - } catch { - console.error('Error sending message ' + result) - await interaction.reply({ - content: 'There was an error while executing this command!', - ephemeral: true, - }) - } - }, -} diff --git a/srv/discord/character.ts b/srv/discord/character.ts deleted file mode 100644 index 2bf2c8f7..00000000 --- a/srv/discord/character.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { SlashCommandBuilder, Role, PermissionFlagsBits, AttachmentBuilder } from 'discord.js' -import { store } from '../db' - -module.exports = { - data: new SlashCommandBuilder() - .setName('character') - .setDescription('Get details about a Charluv character') - .addStringOption((option) => - option - .setName('name') - .setDescription('The name of the character you are lookig for') - .setRequired(true) - ) - .setDMPermission(false), - - async execute(interaction: any) { - const char = interaction.options.getString('name') - const interactionId = interaction.id - - const character = await store.characters.getPublicCharacter(char) - - if (!character) { - await interaction.reply({ content: 'Character does not exist', ephemeral: true }) - return - } - - const persona: any = character?.persona?.attributes - const { age = [], gender = ['Prefers not to say'] } = persona ?? {} - let charAge = age - let charGender = gender[0] - if (age[0]) { - charAge = age[0].split(' ')[0] - } - const summary = character.description ? character.description : '' - // Async rendering... - const embed = { - title: character.name, - description: summary, - type: 'rich', - url: `https://charluv.com/likes/${character._id}/profile`, - color: 0x00ffff, - fields: [ - { - name: `Age`, - value: charAge, - inline: true, - }, - { - name: `Gender`, - value: charGender.toUpperCase(), - inline: true, - }, - ], - image: { - url: `https://cdn.aivo.chat${character.avatar}`, - }, - footer: { - text: `Charluv Character`, - icon_url: `https://charluv.com/favicon.ico`, - }, - } - - await interaction.reply({ - allowed_mentions: { - replied_user: true, - parse: ['users'], - }, - content: 'Here is the Charluv profile you asked for:', - embeds: [embed], - ephemeral: false, - }) - }, -} diff --git a/srv/discord/ping.ts b/srv/discord/ping.ts deleted file mode 100644 index 62cac85d..00000000 --- a/srv/discord/ping.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { SlashCommandBuilder } from 'discord.js'; - -module.exports = { - data: new SlashCommandBuilder() - .setName('ping') - .setDescription('Replies with Pong!'), - async execute(interaction: any) { - await interaction.reply('Pong!'); - }, -}; \ No newline at end of file diff --git a/srv/discord/register.ts b/srv/discord/register.ts deleted file mode 100644 index 74211b9c..00000000 --- a/srv/discord/register.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { SlashCommandBuilder, Role } from 'discord.js' -import { store } from '../db' - -module.exports = { - cooldown: 5, - data: new SlashCommandBuilder() - .setName('register') - .setDescription( - 'Send your Charluv username and ID to the bot to be granted the appropriate roles' - ) - .addStringOption((option) => - option - .setName('username') - .setDescription('Your username from your profile (not your displayname)') - .setRequired(true) - ) - .addStringOption((option) => - option.setName('id').setDescription('Your ID from your profile').setRequired(true) - ) - .setDMPermission(false), - async execute(interaction: any) { - const id = interaction.options.getString('id') - const username = interaction.options.getString('username') - const disuser = interaction.user - const guild = interaction.guild - if (!guild) { - await interaction.reply({ content: 'You can not use this command in a DM', ephemeral: true }) - return - } - const member = guild.members.cache.get(disuser.id) - const roles = member.roles.cache - - // const role = guild.roles.cache.find(role => role.name === "Registered") - const user = await store.users.getUser(id) - if (!user) await interaction.reply({ content: 'User not found', ephemeral: true }) - if (user?.username !== username) - await interaction.reply({ content: 'User not found', ephemeral: true }) - if (user?.username === username) { - const registeredRole: Role | undefined = guild.roles.cache.find( - (role: Role) => role.name === 'registered' - ) - const premiumRole: Role | undefined = guild.roles.cache.find( - (role: Role) => role.name === 'premium' - ) - - member.roles.add(registeredRole) - - if (user?.premium === true) { - member.roles.add(premiumRole) - await interaction.reply({ - content: 'Thank you for being a premium member!', - ephemeral: true, - }) - } - await interaction.reply({ content: 'You have been registered!', ephemeral: true }) - } - }, -} diff --git a/srv/image/horde.ts b/srv/image/horde.ts index 05099405..aaa79b5d 100644 --- a/srv/image/horde.ts +++ b/srv/image/horde.ts @@ -1,6 +1,5 @@ import * as horde from '../../common/horde-gen' import { ImageAdapter } from './types' -import { decryptText } from '../db/util' import { HORDE_GUEST_KEY } from '../api/horde' import { config } from '../config' import { HordeCheck } from '../../common/horde-gen' diff --git a/srv/image/index.js b/srv/image/index.js new file mode 100644 index 00000000..3fdee60d --- /dev/null +++ b/srv/image/index.js @@ -0,0 +1,308 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.IMAGE_COST = void 0; +exports.generateImage = generateImage; +const novel_1 = require("./novel"); +const db_1 = require("../db"); +const config_1 = require("../config"); +const uuid_1 = require("uuid"); +const upload_1 = require("../api/upload"); +const stable_diffusion_1 = require("./stable-diffusion"); +const ws_1 = require("../api/ws"); +const horde_1 = require("./horde"); +const zimage_1 = require("./zimage"); +const queue_1 = require("../queue"); +const subscriptions_1 = require("../db/subscriptions"); +/** Credit cost charged up-front by the image route; refunded if the request is + * dropped because the client disconnected before generation. */ +exports.IMAGE_COST = 25; +/** + * Merge negative-prompt sources into a single comma-separated string, deduping + * tokens case-insensitively (first occurrence wins, preserving order). Used to + * apply the server-wide negative (config.inference.imageNegative) ahead of any + * legacy per-character/chat/user negative. + */ +function mergeNegative(...parts) { + const seen = new Set(); + const out = []; + for (const part of parts) { + if (!part) + continue; + for (const token of part.split(',')) { + const trimmed = token.trim(); + if (!trimmed) + continue; + const key = trimmed.toLowerCase(); + if (seen.has(key)) + continue; + seen.add(key); + out.push(trimmed); + } + } + return out.join(', '); +} +async function generateImage({ user, chatId, messageId, ...opts }, log, guestId) { + const broadcastIds = []; + const chat = chatId ? await db_1.store.chats.getChatOnly(chatId) : undefined; + const characterId = chat?.imageSource === 'main-character' + ? chat.characterId + : chat?.imageSource === 'last-character' + ? opts.characterId + : // Fall back to the explicit character (e.g. the native image tool) or the + // chat's main character so the character's stored LoRA is always used. + // imageSettings source selection below is unchanged. + opts.characterId || chat?.characterId; + const character = chat && characterId ? await db_1.store.characters.getCharacter(chat.userId, characterId) : undefined; + if (!guestId) { + broadcastIds.push(user._id); + if (chatId) { + const members = await db_1.store.chats.getActiveMembers(chatId); + broadcastIds.push(...members, user._id); + } + } + let image; + let output = ''; + let error; + let parsed = opts.prompt.replace(/\{\{prompt\}\}/g, ' '); + let prompt = parsed; + let imageSettings = chat?.imageSource === 'main-character' || chat?.imageSource === 'last-character' + ? character?.imageSettings + : chat?.imageSource === 'chat' + ? chat?.imageSettings + : user.images; + if (!imageSettings) { + imageSettings = user.images; + } + if (imageSettings?.template) { + prompt = imageSettings.template.replace(/\{\{prompt\}\}/g, parsed); + if (!prompt.includes(parsed)) { + prompt = prompt + ' ' + parsed; + } + } + prompt = prompt.trim(); + if (!opts.noAffix) { + const parts = [prompt]; + if (imageSettings?.prefix) { + parts.unshift(imageSettings.prefix); + } + if (imageSettings?.suffix) { + parts.push(imageSettings.suffix); + } + prompt = parts + .join(', ') + .split(',') + .filter((p) => !!p.trim()) + .join(', ') + .replace(/,+/g, ',') + .replace(/ +/g, ' '); + } + log.debug({ prompt, type: imageSettings?.type, source: chat?.imageSource }, 'Image prompt'); + // Server-wide negative overrules: it's always applied first, with any legacy + // stored negative appended (deduped) so nothing previously configured is lost. + const negative = mergeNegative(config_1.config.inference.imageNegative, imageSettings?.negative); + if (!guestId) { + // Broadcast to all chat members (not just sendOne) so the reply message can + // show a loading spinner while the image generates. Include `messageId` when + // attaching to an existing message (e.g. the native image tool path). + (0, ws_1.sendMany)(broadcastIds, { + type: 'image-generation-started', + prompt, + negative, + service: imageSettings?.type, + requestId: opts.requestId, + chatId, + messageId, + }); + } + try { + const priority = (0, queue_1.priorityForUser)(user, !!guestId, (0, subscriptions_1.getCachedTiers)()); + image = await queue_1.inferenceGate.run({ + kind: 'image', + priority, + userId: guestId ? undefined : user._id, + socketId: guestId, + requestId: opts.requestId, + }, async () => { + // image-endpoint-only: when the self-hosted Z-Image backend is configured, + // route all generation there regardless of the chat/user's stored `type` + // (production data is 'horde'). Generate from the character's stored LoRA + // (i2L Mode A) when present, with its locked seed for consistency. No data + // migration required. + if ((0, zimage_1.isZImageConfigured)()) { + // Character/avatar/gallery images (faster) vs in-chat images (keep quality). + const isCharImage = opts.source === 'avatar'; + const size = isCharImage + ? config_1.config.inference.imageSize || 640 + : config_1.config.inference.imageChatSize || 512; + const steps = isCharImage + ? config_1.config.inference.imageSteps || 14 + : config_1.config.inference.imageChatSteps || 20; + return (0, zimage_1.handleZImage)({ + user, + prompt, + negative, + settings: imageSettings, + loraName: character?.loraName, + // Seed is locked only when supplied by the caller (the character + // editor). Chat generation omits it so images vary (the LoRA gives + // identity). Persisted character.imageSeed is forwarded by the editor. + seed: opts.seed, + width: size, + height: size, + steps, + }, log, guestId); + } + switch (imageSettings?.type || 'horde') { + case 'novel': + return (0, novel_1.handleNovelImage)({ user, prompt, negative, settings: imageSettings }, log, guestId); + case 'sd': + case 'agnai': + return (0, stable_diffusion_1.handleSDImage)({ user, prompt, negative, settings: imageSettings }, log, guestId); + case 'horde': + default: + return (0, horde_1.handleHordeImage)({ user, prompt, negative, settings: imageSettings }, log, guestId); + } + }); + } + catch (ex) { + if (ex instanceof queue_1.ClientGoneError) { + // Client disconnected before the image was generated; the gate freed the + // slot. Refund the credits the route charged up-front (guests aren't charged). + if (!guestId && user?._id) { + await db_1.store.credits.updateCredits(user._id, exports.IMAGE_COST); + } + return { output: '' }; + } + error = ex.message || ex; + } + /** + * If the server is configured to save images: we will store the image, generate a message, then publish the message + * Otherwise: We will broadcast the image content + */ + if (image) { + // Guest images do not get saved under any circumstances + if (typeof image.content === 'string' && image.content.startsWith('http')) { + output = image.content; + } + if (guestId) { + if (!output) { + output = `data:image/png;base64,${image.content.toString('base64')}`; + } + // Persist whenever this is a real chat image (has a chatId) OR the server + // opts into saving all images. Without this, chat images were uploaded but + // never attached to a message, so they vanished from history on refresh. + } + else if (!opts.ephemeral && (config_1.config.storage.saveImages || !!chatId)) { + const name = `${(0, uuid_1.v4)()}.${image.ext}`; + if (!output) { + output = await (0, upload_1.saveFile)(name, image.content); + } + if (!guestId && chatId) { + const msg = await createImageMessage({ + chatId, + userId: user._id, + filename: output, + memberIds: broadcastIds, + messageId, + imagePrompt: opts.prompt, + append: opts.append, + meta: { negative }, + parentId: opts.parentId, + }); + if (msg) + return; + } + } + else { + // Ephemeral preview — e.g. the create-wizard portrait (or an avatar + // regen) before the character is saved. Never persist these: previously + // they were written as `temp-*` files with a 300s TTL, but on S3/R2 that + // TTL is only the HTTP `Expires` cache header, NOT an object-expiration + // rule, so abandoned previews orphaned in the bucket forever. Return the + // image inline as base64 instead — nothing touches storage. The real + // avatar is persisted separately when the character is actually saved. + output = output || `data:image/${image.ext};base64,${image.content.toString('base64')}`; + } + } + const message = image + ? { + type: 'image-generated', + chatId, + image: output, + source: opts.source, + requestId: opts.requestId, + } + : { + type: 'image-failed', + chatId, + error: error || 'Invalid image settings (No handler found)', + requestId: opts.requestId, + }; + if (broadcastIds.length) { + (0, ws_1.sendMany)(broadcastIds, message); + } + else if (guestId) { + (0, ws_1.sendGuest)(guestId, message); + } + return { output }; +} +async function createImageMessage(opts) { + const chat = opts.chatId ? await db_1.store.chats.getChatOnly(opts.chatId) : undefined; + if (!chat) + return; + const char = await db_1.store.characters.getCharacter(chat.userId, chat.characterId); + if (!char) + return; + if (opts.messageId && !opts.append) { + const msg = await db_1.store.msgs.editMessage(opts.messageId, { + msg: opts.filename, + adapter: 'image', + meta: opts.meta, + }); + (0, ws_1.sendMany)(opts.memberIds, { + type: 'message-retry', + chatId: opts.chatId, + messageId: opts.messageId, + message: opts.filename, + adapter: 'image', + }); + return msg; + } + else if (opts.messageId && opts.append) { + const prev = await db_1.store.msgs.getMessage(opts.messageId); + const extras = prev?.extras || []; + extras.push(opts.filename); + // Preserve the target message's existing adapter so its text still renders. + // Only update `extras` — setting adapter:'image' here would make the renderer + // treat the message text as an image URL. + await db_1.store.msgs.editMessage(opts.messageId, { extras }); + (0, ws_1.sendMany)(opts.memberIds, { + type: 'message-retry', + chatId: opts.chatId, + messageId: opts.messageId, + message: prev?.msg || '', + extras, + adapter: prev?.adapter, + }); + if (prev) + prev.extras = extras; + return prev; + } + else { + const msg = await db_1.store.msgs.createChatMessage({ + chatId: opts.chatId, + message: opts.filename, + characterId: char._id, + adapter: 'image', + ooc: false, + imagePrompt: opts.imagePrompt, + event: undefined, + meta: opts.meta, + parent: opts.parentId, + name: char.name, + }); + (0, ws_1.sendMany)(opts.memberIds, { type: 'message-created', msg, chatId: opts.chatId }); + return msg; + } +} +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/srv/image/index.js.map b/srv/image/index.js.map new file mode 100644 index 00000000..ea3d3983 --- /dev/null +++ b/srv/image/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;AAyCA,sCAoPC;AA3RD,mCAA0C;AAC1C,8BAA6B;AAC7B,sCAAkC;AAClC,+BAAyB;AACzB,0CAAwC;AACxC,yDAAkD;AAClD,kCAA+C;AAC/C,mCAA0C;AAC1C,qCAA2D;AAC3D,oCAA0E;AAC1E,uDAAoD;AAEpD;gEACgE;AACnD,QAAA,UAAU,GAAG,EAAE,CAAA;AAE5B;;;;;GAKG;AACH,SAAS,aAAa,CAAC,GAAG,KAAgC;IACxD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAA;IAC9B,MAAM,GAAG,GAAa,EAAE,CAAA;IACxB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI;YAAE,SAAQ;QACnB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YACpC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAA;YAC5B,IAAI,CAAC,OAAO;gBAAE,SAAQ;YACtB,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,EAAE,CAAA;YACjC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,SAAQ;YAC3B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YACb,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACnB,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACvB,CAAC;AAEM,KAAK,UAAU,aAAa,CACjC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,EAAwB,EAC1D,GAAW,EACX,OAAgB;IAEhB,MAAM,YAAY,GAAa,EAAE,CAAA;IAEjC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,UAAK,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACvE,MAAM,WAAW,GACf,IAAI,EAAE,WAAW,KAAK,gBAAgB;QACpC,CAAC,CAAC,IAAI,CAAC,WAAW;QAClB,CAAC,CAAC,IAAI,EAAE,WAAW,KAAK,gBAAgB;YACxC,CAAC,CAAC,IAAI,CAAC,WAAW;YAClB,CAAC,CAAC,0EAA0E;gBAC1E,uEAAuE;gBACvE,qDAAqD;gBACrD,IAAI,CAAC,WAAW,IAAI,IAAI,EAAE,WAAW,CAAA;IAC3C,MAAM,SAAS,GACb,IAAI,IAAI,WAAW,CAAC,CAAC,CAAC,MAAM,UAAK,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAEjG,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC3B,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,OAAO,GAAG,MAAM,UAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAA;YAC1D,YAAY,CAAC,IAAI,CAAC,GAAG,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAA;QACzC,CAAC;IACH,CAAC;IAED,IAAI,KAAuC,CAAA;IAC3C,IAAI,MAAM,GAAW,EAAE,CAAA;IACvB,IAAI,KAAU,CAAA;IAEd,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAA;IACxD,IAAI,MAAM,GAAG,MAAM,CAAA;IAEnB,IAAI,aAAa,GACf,IAAI,EAAE,WAAW,KAAK,gBAAgB,IAAI,IAAI,EAAE,WAAW,KAAK,gBAAgB;QAC9E,CAAC,CAAC,SAAS,EAAE,aAAa;QAC1B,CAAC,CAAC,IAAI,EAAE,WAAW,KAAK,MAAM;YAC9B,CAAC,CAAC,IAAI,EAAE,aAAa;YACrB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAA;IAEjB,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,aAAa,GAAG,IAAI,CAAC,MAAM,CAAA;IAC7B,CAAC;IAED,IAAI,aAAa,EAAE,QAAQ,EAAE,CAAC;QAC5B,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAA;QAClE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7B,MAAM,GAAG,MAAM,GAAG,GAAG,GAAG,MAAM,CAAA;QAChC,CAAC;IACH,CAAC;IAED,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,CAAA;IAEtB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAClB,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,CAAA;QACtB,IAAI,aAAa,EAAE,MAAM,EAAE,CAAC;YAC1B,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;QACrC,CAAC;QAED,IAAI,aAAa,EAAE,MAAM,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;QAClC,CAAC;QAED,MAAM,GAAG,KAAK;aACX,IAAI,CAAC,IAAI,CAAC;aACV,KAAK,CAAC,GAAG,CAAC;aACV,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACzB,IAAI,CAAC,IAAI,CAAC;aACV,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;aACnB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IACxB,CAAC;IAED,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,cAAc,CAAC,CAAA;IAC3F,6EAA6E;IAC7E,+EAA+E;IAC/E,MAAM,QAAQ,GAAG,aAAa,CAAC,eAAM,CAAC,SAAS,CAAC,aAAa,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAA;IAEvF,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,4EAA4E;QAC5E,6EAA6E;QAC7E,sEAAsE;QACtE,IAAA,aAAQ,EAAC,YAAY,EAAE;YACrB,IAAI,EAAE,0BAA0B;YAChC,MAAM;YACN,QAAQ;YACR,OAAO,EAAE,aAAa,EAAE,IAAI;YAC5B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,MAAM;YACN,SAAS;SACV,CAAC,CAAA;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAA,uBAAe,EAAC,IAAW,EAAE,CAAC,CAAC,OAAO,EAAE,IAAA,8BAAc,GAAE,CAAC,CAAA;QAC1E,KAAK,GAAG,MAAM,qBAAa,CAAC,GAAG,CAC7B;YACE,IAAI,EAAE,OAAO;YACb,QAAQ;YACR,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG;YACtC,QAAQ,EAAE,OAAO;YACjB,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,EACD,KAAK,IAAI,EAAE;YACT,2EAA2E;YAC3E,yEAAyE;YACzE,0EAA0E;YAC1E,2EAA2E;YAC3E,sBAAsB;YACtB,IAAI,IAAA,2BAAkB,GAAE,EAAE,CAAC;gBACzB,6EAA6E;gBAC7E,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAA;gBAC5C,MAAM,IAAI,GAAG,WAAW;oBACtB,CAAC,CAAC,eAAM,CAAC,SAAS,CAAC,SAAS,IAAI,GAAG;oBACnC,CAAC,CAAC,eAAM,CAAC,SAAS,CAAC,aAAa,IAAI,GAAG,CAAA;gBACzC,MAAM,KAAK,GAAG,WAAW;oBACvB,CAAC,CAAC,eAAM,CAAC,SAAS,CAAC,UAAU,IAAI,EAAE;oBACnC,CAAC,CAAC,eAAM,CAAC,SAAS,CAAC,cAAc,IAAI,EAAE,CAAA;gBACzC,OAAO,IAAA,qBAAY,EACjB;oBACE,IAAI;oBACJ,MAAM;oBACN,QAAQ;oBACR,QAAQ,EAAE,aAAa;oBACvB,QAAQ,EAAE,SAAS,EAAE,QAAQ;oBAC7B,iEAAiE;oBACjE,mEAAmE;oBACnE,uEAAuE;oBACvE,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,KAAK,EAAE,IAAI;oBACX,MAAM,EAAE,IAAI;oBACZ,KAAK;iBACN,EACD,GAAG,EACH,OAAO,CACR,CAAA;YACH,CAAC;YACD,QAAQ,aAAa,EAAE,IAAI,IAAI,OAAO,EAAE,CAAC;gBACvC,KAAK,OAAO;oBACV,OAAO,IAAA,wBAAgB,EACrB,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,EACnD,GAAG,EACH,OAAO,CACR,CAAA;gBACH,KAAK,IAAI,CAAC;gBACV,KAAK,OAAO;oBACV,OAAO,IAAA,gCAAa,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,CAAA;gBACzF,KAAK,OAAO,CAAC;gBACb;oBACE,OAAO,IAAA,wBAAgB,EACrB,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,EACnD,GAAG,EACH,OAAO,CACR,CAAA;YACL,CAAC;QACH,CAAC,CACF,CAAA;IACH,CAAC;IAAC,OAAO,EAAO,EAAE,CAAC;QACjB,IAAI,EAAE,YAAY,uBAAe,EAAE,CAAC;YAClC,yEAAyE;YACzE,+EAA+E;YAC/E,IAAI,CAAC,OAAO,IAAI,IAAI,EAAE,GAAG,EAAE,CAAC;gBAC1B,MAAM,UAAK,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,kBAAU,CAAC,CAAA;YACzD,CAAC;YACD,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;QACvB,CAAC;QACD,KAAK,GAAG,EAAE,CAAC,OAAO,IAAI,EAAE,CAAA;IAC1B,CAAC;IAED;;;OAGG;IACH,IAAI,KAAK,EAAE,CAAC;QACV,wDAAwD;QAExD,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1E,MAAM,GAAG,KAAK,CAAC,OAAO,CAAA;QACxB,CAAC;QAED,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,GAAG,yBAAyB,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAA;YACtE,CAAC;YACD,0EAA0E;YAC1E,2EAA2E;YAC3E,yEAAyE;QAC3E,CAAC;aAAM,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,eAAM,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;YACtE,MAAM,IAAI,GAAG,GAAG,IAAA,SAAE,GAAE,IAAI,KAAK,CAAC,GAAG,EAAE,CAAA;YAEnC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,GAAG,MAAM,IAAA,iBAAQ,EAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;YAC9C,CAAC;YAED,IAAI,CAAC,OAAO,IAAI,MAAM,EAAE,CAAC;gBACvB,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC;oBACnC,MAAM;oBACN,MAAM,EAAE,IAAI,CAAC,GAAG;oBAChB,QAAQ,EAAE,MAAM;oBAChB,SAAS,EAAE,YAAY;oBACvB,SAAS;oBACT,WAAW,EAAE,IAAI,CAAC,MAAM;oBACxB,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,IAAI,EAAE,EAAE,QAAQ,EAAE;oBAClB,QAAQ,EAAE,IAAI,CAAC,QAAQ;iBACxB,CAAC,CAAA;gBAEF,IAAI,GAAG;oBAAE,OAAM;YACjB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,oEAAoE;YACpE,wEAAwE;YACxE,yEAAyE;YACzE,wEAAwE;YACxE,yEAAyE;YACzE,qEAAqE;YACrE,uEAAuE;YACvE,MAAM,GAAG,MAAM,IAAI,cAAc,KAAK,CAAC,GAAG,WAAW,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAA;QACzF,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,KAAK;QACnB,CAAC,CAAC;YACE,IAAI,EAAE,iBAAiB;YACvB,MAAM;YACN,KAAK,EAAE,MAAM;YACb,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B;QACH,CAAC,CAAC;YACE,IAAI,EAAE,cAAc;YACpB,MAAM;YACN,KAAK,EAAE,KAAK,IAAI,2CAA2C;YAC3D,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAA;IAEL,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;QACxB,IAAA,aAAQ,EAAC,YAAY,EAAE,OAAO,CAAC,CAAA;IACjC,CAAC;SAAM,IAAI,OAAO,EAAE,CAAC;QACnB,IAAA,cAAS,EAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IAC7B,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,CAAA;AACnB,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,IAUjC;IACC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,UAAK,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACjF,IAAI,CAAC,IAAI;QAAE,OAAM;IAEjB,MAAM,IAAI,GAAG,MAAM,UAAK,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,CAAA;IAC/E,IAAI,CAAC,IAAI;QAAE,OAAM;IAEjB,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,MAAM,UAAK,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE;YACvD,GAAG,EAAE,IAAI,CAAC,QAAQ;YAClB,OAAO,EAAE,OAAO;YAChB,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC,CAAA;QACF,IAAA,aAAQ,EAAC,IAAI,CAAC,SAAS,EAAE;YACvB,IAAI,EAAE,eAAe;YACrB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO,EAAE,IAAI,CAAC,QAAQ;YACtB,OAAO,EAAE,OAAO;SACjB,CAAC,CAAA;QACF,OAAO,GAAG,CAAA;IACZ,CAAC;SAAM,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,MAAM,UAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACxD,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,IAAI,EAAE,CAAA;QACjC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC1B,4EAA4E;QAC5E,8EAA8E;QAC9E,0CAA0C;QAC1C,MAAM,UAAK,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;QACxD,IAAA,aAAQ,EAAC,IAAI,CAAC,SAAS,EAAE;YACvB,IAAI,EAAE,eAAe;YACrB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE;YACxB,MAAM;YACN,OAAO,EAAE,IAAI,EAAE,OAAO;SACvB,CAAC,CAAA;QACF,IAAI,IAAI;YAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QAC9B,OAAO,IAAI,CAAA;IACb,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,GAAG,MAAM,UAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC;YAC7C,MAAM,EAAE,IAAI,CAAC,MAAO;YACpB,OAAO,EAAE,IAAI,CAAC,QAAQ;YACtB,WAAW,EAAE,IAAI,CAAC,GAAG;YACrB,OAAO,EAAE,OAAO;YAChB,GAAG,EAAE,KAAK;YACV,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,KAAK,EAAE,SAAS;YAChB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,IAAI,CAAC,QAAQ;YACrB,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC,CAAA;QAEF,IAAA,aAAQ,EAAC,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAA;QAC/E,OAAO,GAAG,CAAA;IACZ,CAAC;AACH,CAAC"} \ No newline at end of file diff --git a/srv/image/index.ts b/srv/image/index.ts index 39b9e684..4490cc04 100644 --- a/srv/image/index.ts +++ b/srv/image/index.ts @@ -6,10 +6,38 @@ import { config } from '../config' import { v4 } from 'uuid' import { saveFile } from '../api/upload' import { handleSDImage } from './stable-diffusion' -import { sendGuest, sendMany, sendOne } from '../api/ws' +import { sendGuest, sendMany } from '../api/ws' import { handleHordeImage } from './horde' +import { handleZImage, isZImageConfigured } from './zimage' +import { inferenceGate, priorityForUser, ClientGoneError } from '../queue' +import { getCachedTiers } from '../db/subscriptions' -const DEFAULT_NEGATIVE = `` +/** Credit cost charged up-front by the image route; refunded if the request is + * dropped because the client disconnected before generation. */ +export const IMAGE_COST = 25 + +/** + * Merge negative-prompt sources into a single comma-separated string, deduping + * tokens case-insensitively (first occurrence wins, preserving order). Used to + * apply the server-wide negative (config.inference.imageNegative) ahead of any + * legacy per-character/chat/user negative. + */ +function mergeNegative(...parts: Array) { + const seen = new Set() + const out: string[] = [] + for (const part of parts) { + if (!part) continue + for (const token of part.split(',')) { + const trimmed = token.trim() + if (!trimmed) continue + const key = trimmed.toLowerCase() + if (seen.has(key)) continue + seen.add(key) + out.push(trimmed) + } + } + return out.join(', ') +} export async function generateImage( { user, chatId, messageId, ...opts }: ImageGenerateRequest, @@ -24,7 +52,10 @@ export async function generateImage( ? chat.characterId : chat?.imageSource === 'last-character' ? opts.characterId - : undefined + : // Fall back to the explicit character (e.g. the native image tool) or the + // chat's main character so the character's stored LoRA is always used. + // imageSettings source selection below is unchanged. + opts.characterId || chat?.characterId const character = chat && characterId ? await store.characters.getCharacter(chat.userId, characterId) : undefined @@ -83,47 +114,98 @@ export async function generateImage( } log.debug({ prompt, type: imageSettings?.type, source: chat?.imageSource }, 'Image prompt') - const negative = imageSettings?.negative || DEFAULT_NEGATIVE + // Server-wide negative overrules: it's always applied first, with any legacy + // stored negative appended (deduped) so nothing previously configured is lost. + const negative = mergeNegative(config.inference.imageNegative, imageSettings?.negative) if (!guestId) { - sendOne(user._id, { + // Broadcast to all chat members (not just sendOne) so the reply message can + // show a loading spinner while the image generates. Include `messageId` when + // attaching to an existing message (e.g. the native image tool path). + sendMany(broadcastIds, { type: 'image-generation-started', prompt, negative, service: imageSettings?.type, requestId: opts.requestId, + chatId, + messageId, }) } try { - switch (imageSettings?.type || 'horde') { - case 'novel': - image = await handleNovelImage( - { user, prompt, negative, settings: imageSettings }, - log, - guestId - ) - break - - case 'sd': - case 'agnai': - image = await handleSDImage( - { user, prompt, negative, settings: imageSettings }, - log, - guestId - ) - break - - case 'horde': - default: - image = await handleHordeImage( - { user, prompt, negative, settings: imageSettings }, - log, - guestId - ) - break - } + const priority = priorityForUser(user as any, !!guestId, getCachedTiers()) + image = await inferenceGate.run( + { + kind: 'image', + priority, + userId: guestId ? undefined : user._id, + socketId: guestId, + requestId: opts.requestId, + }, + async () => { + // image-endpoint-only: when the self-hosted Z-Image backend is configured, + // route all generation there regardless of the chat/user's stored `type` + // (production data is 'horde'). Generate from the character's stored LoRA + // (i2L Mode A) when present, with its locked seed for consistency. No data + // migration required. + if (isZImageConfigured()) { + // Character/avatar/gallery images (faster) vs in-chat images (keep quality). + const isCharImage = opts.source === 'avatar' + const size = isCharImage + ? config.inference.imageSize || 640 + : config.inference.imageChatSize || 512 + const steps = isCharImage + ? config.inference.imageSteps || 14 + : config.inference.imageChatSteps || 20 + return handleZImage( + { + user, + prompt, + negative, + settings: imageSettings, + loraName: character?.loraName, + // Seed is locked only when supplied by the caller (the character + // editor). Chat generation omits it so images vary (the LoRA gives + // identity). Persisted character.imageSeed is forwarded by the editor. + seed: opts.seed, + width: size, + height: size, + steps, + }, + log, + guestId + ) + } + switch (imageSettings?.type || 'horde') { + case 'novel': + return handleNovelImage( + { user, prompt, negative, settings: imageSettings }, + log, + guestId + ) + case 'sd': + case 'agnai': + return handleSDImage({ user, prompt, negative, settings: imageSettings }, log, guestId) + case 'horde': + default: + return handleHordeImage( + { user, prompt, negative, settings: imageSettings }, + log, + guestId + ) + } + } + ) } catch (ex: any) { + if (ex instanceof ClientGoneError) { + // Client disconnected before the image was generated; the gate freed the + // slot. Refund the credits the route charged up-front (guests aren't charged). + if (!guestId && user?._id) { + await store.credits.updateCredits(user._id, IMAGE_COST) + } + return { output: '' } + } error = ex.message || ex } @@ -142,7 +224,10 @@ export async function generateImage( if (!output) { output = `data:image/png;base64,${image.content.toString('base64')}` } - } else if (!opts.ephemeral && config.storage.saveImages) { + // Persist whenever this is a real chat image (has a chatId) OR the server + // opts into saving all images. Without this, chat images were uploaded but + // never attached to a message, so they vanished from history on refresh. + } else if (!opts.ephemeral && (config.storage.saveImages || !!chatId)) { const name = `${v4()}.${image.ext}` if (!output) { @@ -165,7 +250,14 @@ export async function generateImage( if (msg) return } } else { - output = output || (await saveFile(`temp-${v4()}.${image.ext}`, image.content, 300)) + // Ephemeral preview — e.g. the create-wizard portrait (or an avatar + // regen) before the character is saved. Never persist these: previously + // they were written as `temp-*` files with a 300s TTL, but on S3/R2 that + // TTL is only the HTTP `Expires` cache header, NOT an object-expiration + // rule, so abandoned previews orphaned in the bucket forever. Return the + // image inline as base64 instead — nothing touches storage. The real + // avatar is persisted separately when the character is actually saved. + output = output || `data:image/${image.ext};base64,${image.content.toString('base64')}` } } @@ -228,14 +320,17 @@ async function createImageMessage(opts: { const prev = await store.msgs.getMessage(opts.messageId) const extras = prev?.extras || [] extras.push(opts.filename) - await store.msgs.editMessage(opts.messageId, { adapter: 'image', extras }) + // Preserve the target message's existing adapter so its text still renders. + // Only update `extras` — setting adapter:'image' here would make the renderer + // treat the message text as an image URL. + await store.msgs.editMessage(opts.messageId, { extras }) sendMany(opts.memberIds, { type: 'message-retry', chatId: opts.chatId, messageId: opts.messageId, message: prev?.msg || '', extras, - adapter: 'image', + adapter: prev?.adapter, }) if (prev) prev.extras = extras return prev @@ -253,6 +348,15 @@ async function createImageMessage(opts: { name: char.name, }) + // This image is a new message parented to the previous leaf. Advance the + // chat's persisted leaf to it, otherwise on reload resolveChatPath walks up + // from the stale (text) leaf and the image — being a CHILD of it — drops off + // the path, so generated images vanish from history. (The client already + // advances its in-memory leaf; only the server doc was stale.) + if (opts.chatId && msg?._id) { + await store.chats.update(opts.chatId, { treeLeafId: msg._id }) + } + sendMany(opts.memberIds, { type: 'message-created', msg, chatId: opts.chatId }) return msg } diff --git a/srv/image/types.ts b/srv/image/types.ts index b3fdb0a6..9b645b5c 100644 --- a/srv/image/types.ts +++ b/srv/image/types.ts @@ -14,6 +14,8 @@ export type ImageGenerateRequest = { characterId?: string requestId?: string parentId: string | undefined + /** Locked seed for consistent results (editor only; chat omits it). */ + seed?: number } export type ImageRequestOpts = { @@ -21,6 +23,15 @@ export type ImageRequestOpts = { prompt: string negative: string settings: BaseImageSettings | undefined + /** Z-Image stored LoRA to generate the character from (i2L Mode A). */ + loraName?: string + /** Locked seed for reproducible/consistent generation. */ + seed?: number + /** Output dimensions (chat images are smaller than character/avatar images). */ + width?: number + height?: number + /** Diffusion steps (gallery/avatar is tuned faster than chat). */ + steps?: number } export type ImageAdapter = ( @@ -29,4 +40,4 @@ export type ImageAdapter = ( guestId?: string ) => Promise -export type ImageAdapterResponse = { ext: string; content: Buffer | string } +export type ImageAdapterResponse = { ext: string; content: Buffer | string; seed?: number } diff --git a/srv/image/zimage.ts b/srv/image/zimage.ts new file mode 100644 index 00000000..032e88a1 --- /dev/null +++ b/srv/image/zimage.ts @@ -0,0 +1,219 @@ +import needle from 'needle' +import { randomBytes } from 'crypto' +import { ImageAdapter } from './types' +import { config } from '../config' + +/** + * Z-Image backend client. + * + * Self-hosted image service: text-to-image plus character-consistent generation + * via i2L (image-to-LoRA). A character's identity is encoded once into a stored + * LoRA (`/v1/encode`), then every image is a fast generation that loads it + * (`/v1/generate` with `lora_name`). Text and image inference live on separate + * endpoints by design, so this never shares config with the text adapter. + * + * Contract: JSON, synchronous (responds when done — seconds), one GPU so + * concurrent calls queue. Auth via `X-API-Key` header. + */ + +const baseUrl = () => (config.inference.imageUrl || '').replace(/\/+$/, '') + +export const isZImageConfigured = () => !!baseUrl() + +function headers() { + const h: Record = { 'Content-Type': 'application/json' } + if (config.inference.imageApiKey) h['X-API-Key'] = config.inference.imageApiKey + return h +} + +/** Strip a `data:image/...;base64,` prefix; Z-Image wants raw base64. */ +function rawBase64(input: string) { + return input.replace(/^data:image\/[a-z0-9.+-]+;base64,/i, '') +} + +/** + * Build a collision-resistant LoRA name from the character name plus a + * randomizer. Sanitised to satisfy the backend (no `/`, `\`, or `..`). + */ +export function makeLoraName(charName: string) { + const slug = + (charName || 'char') + .toLowerCase() + .replace(/[^a-z0-9]+/g, '-') + .replace(/^-+|-+$/g, '') + .slice(0, 32) || 'char' + return `${slug}-${randomBytes(4).toString('hex')}` +} + +async function post(path: string, body: Record) { + const url = `${baseUrl()}${path}` + const result: any = await needle('post', url, body, { json: true, headers: headers() }).catch( + (err) => ({ err }) + ) + + if ('err' in result) { + if (result.err && 'code' in result.err) { + throw new Error(`Image request failed: Service unreachable - ${result.err.code}`) + } + throw new Error(`Image request failed: ${result.err?.message || result.err}`) + } + + if (result.statusCode && result.statusCode >= 400) { + const detail = result.body?.detail + const msg = Array.isArray(detail) + ? detail.map((d: any) => d?.msg || d).join('; ') + : detail || result.body?.message || result.statusMessage + throw new Error(`Image request failed: ${msg} (${result.statusCode})`) + } + + return result.body +} + +type ZGenerateInput = { + prompt: string + negative?: string + /** Mode A: generate from a stored LoRA. */ + loraName?: string + /** Mode C: inline i2L (1-4 base64 images, data-url prefixes ok). */ + referenceImages?: string[] + /** Persist the inline-encoded LoRA (Mode C only). */ + saveAs?: string + width?: number + height?: number + steps?: number + cfg?: number + /** Omit for random; pass to reproduce/keep consistent. */ + seed?: number +} + +type ZGenerateResult = { + content: Buffer + ext: 'png' + seed: number + savedLora?: string | null +} + +/** POST /v1/generate. Returns the first image plus the seed actually used. */ +export async function zimageGenerate(input: ZGenerateInput): Promise { + if (!isZImageConfigured()) { + throw new Error('Image generation is not configured (ZIMAGE_BASE_URL is unset)') + } + + const body: Record = { + prompt: input.prompt, + response_format: 'json', + } + + if (input.negative) body.negative_prompt = input.negative + + // lora_name and reference_images are mutually exclusive (422 otherwise). + if (input.loraName) { + body.lora_name = input.loraName + } else if (input.referenceImages?.length) { + body.reference_images = input.referenceImages.slice(0, 4).map(rawBase64) + if (input.saveAs) body.save_as = input.saveAs + } + + if (input.width) body.width = input.width + if (input.height) body.height = input.height + if (input.steps) body.steps = input.steps + if (input.cfg) body.cfg = input.cfg + if (typeof input.seed === 'number') body.seed = input.seed + + const res = await post('/v1/generate', body) + const item = res?.images?.[0] + if (!item?.base64) { + throw new Error('Failed to generate image: Response did not contain an image') + } + + return { + content: Buffer.from(item.base64, 'base64'), + ext: 'png', + seed: res.seed, + savedLora: res.saved_lora ?? null, + } +} + +/** + * POST /v1/encode. Encodes 1-4 reference images of the *same* character into a + * stored LoRA and returns its name. Reference images can be discarded after. + */ +export async function zimageEncode(referenceImages: string[], saveAs: string): Promise { + if (!isZImageConfigured()) { + throw new Error('Image generation is not configured (ZIMAGE_BASE_URL is unset)') + } + if (!referenceImages.length) { + throw new Error('Encode requires at least one reference image') + } + + const res = await post('/v1/encode', { + reference_images: referenceImages.slice(0, 4).map(rawBase64), + save_as: saveAs, + }) + + if (!res?.lora_name) { + throw new Error('Encode failed: Response did not contain a lora_name') + } + return res.lora_name +} + +/** GET /v1/loras — list stored character LoRAs. */ +export async function zimageListLoras(): Promise { + if (!isZImageConfigured()) return [] + const url = `${baseUrl()}/v1/loras` + const result: any = await needle('get', url, null, { json: true, headers: headers() }).catch( + () => null + ) + return result?.body?.loras ?? [] +} + +/** + * DELETE /v1/loras/{name} — remove a stored character LoRA. A 404 (already gone) + * counts as success so callers can delete idempotently; transport or other 4xx/5xx + * errors throw so the caller can log them. + */ +export async function zimageDeleteLora(name: string): Promise { + if (!isZImageConfigured() || !name) return + const url = `${baseUrl()}/v1/loras/${encodeURIComponent(name)}` + const result: any = await needle('delete', url, null, { json: true, headers: headers() }).catch( + (err) => ({ err }) + ) + + if (result && 'err' in result) { + const e = result.err + throw new Error( + `Image request failed: ${e?.code ? `Service unreachable - ${e.code}` : e?.message || e}` + ) + } + + if (result?.statusCode && result.statusCode >= 400 && result.statusCode !== 404) { + const detail = result.body?.detail || result.body?.message || result.statusMessage + throw new Error(`Image request failed: ${detail} (${result.statusCode})`) + } +} + +/** + * ImageAdapter wrapper for the chat/avatar image pipeline. Generates from the + * character's stored LoRA when present (Mode A); otherwise plain text-to-image. + */ +export const handleZImage: ImageAdapter = async (opts, log) => { + log.debug( + { loraName: opts.loraName, seed: opts.seed, width: opts.width, height: opts.height }, + 'Image: Z-Image generate' + ) + + // Size is decided by the caller (chat = 512, character/avatar = 768). Steps/cfg + // are fixed for fast, consistent generation. + const res = await zimageGenerate({ + prompt: opts.prompt, + negative: opts.negative, + loraName: opts.loraName, + seed: opts.seed, + width: opts.width || 512, + height: opts.height || 512, + steps: opts.steps || 20, + cfg: 4, + }) + + return { ext: res.ext, content: res.content, seed: res.seed } +} diff --git a/srv/memory/embed.ts b/srv/memory/embed.ts new file mode 100644 index 00000000..6be5f823 --- /dev/null +++ b/srv/memory/embed.ts @@ -0,0 +1,50 @@ +import { logger } from '../middleware' + +/** + * Server-side text embeddings via @xenova/transformers (transformers.js), run + * in-process on CPU. This is the PoC backend; the rest of the memory system + * only depends on `embed()`, so this can be swapped for an OpenAI-compatible + * /v1/embeddings endpoint later without touching the tool or RAG code. + * + * Model: all-MiniLM-L6-v2 (384-dim, ~25MB quantized, downloaded + cached once). + */ +const MODEL = 'Xenova/all-MiniLM-L6-v2' + +export const EMBED_DIM = 384 + +let pipe: any +let loading: Promise | null = null + +async function getEmbedder() { + if (pipe) return pipe + if (!loading) { + loading = (async () => { + // ESM-only package; dynamic import keeps it out of the require graph. + const { pipeline } = await import('@xenova/transformers') + const created = await pipeline('feature-extraction', MODEL, { quantized: true }) + pipe = created + return created + })().catch((err) => { + loading = null + throw err + }) + } + return loading +} + +/** Embed a single string into a normalized 384-dim vector. */ +export async function embed(text: string): Promise { + const p = await getEmbedder() + const output = await p(text, { pooling: 'mean', normalize: true }) + return Array.from(output.data as Float32Array) +} + +/** Best-effort preload at boot so the first memory op isn't slow. */ +export async function warmupEmbedder() { + try { + await getEmbedder() + logger.info('Long-term memory embedder ready') + } catch (err) { + logger.warn({ err }, 'Long-term memory embedder failed to load') + } +} diff --git a/srv/memory/store.ts b/srv/memory/store.ts new file mode 100644 index 00000000..a9b6b1ac --- /dev/null +++ b/srv/memory/store.ts @@ -0,0 +1,353 @@ +import { v4 } from 'uuid' +import { getDb } from '../db/client' +import { embed } from './embed' +import { logger } from '../middleware' +import { classify, isTextLlmConfigured, parseJsonObject } from '../textgen' + +// Memory text is user PII (names, preferences, etc.). Logs carry only metadata by +// default; set MEMORY_DEBUG_LOG_TEXT=1 (dev only) to include the text for verification. +const LOG_TEXT = process.env.MEMORY_DEBUG_LOG_TEXT === '1' + +/** + * Long-term relationship memory. Scoped per user + character so memories persist + * across all chats with that companion. Each document stores its own embedding + * vector; retrieval loads a character's memories and ranks them by cosine + * similarity in Node (brute-force — the per-character set is small). + */ +export type LongTermMemory = { + _id: string + userId: string + characterId: string + text: string + embedding: number[] + /** How the memory was created: the model's `remember` tool, automatic, or the + * user adding it by hand in the memory pane. */ + source: 'tool' | 'auto' | 'manual' + createdAt: string +} + +const collection = () => getDb().collection('longterm-memory') + +/** + * Cosine similarity above which a new fact is treated as a duplicate of an + * existing one (the same thing said with slightly different words). The + * all-MiniLM embeddings put genuine paraphrases ~0.85+; distinct facts sit well + * below, so this only collapses true restatements. + */ +const DUP_SIMILARITY = 0.85 + +/** + * Cosine floor for a stored memory to be considered "related" to a new fact and + * therefore worth examining for redundancy/contradiction. Below this they're + * about different things and are left untouched (cheap path, no LLM call). + */ +const RELATED_MIN = 0.6 + +/** Cap on related memories sent to the LLM in one reconciliation prompt. */ +const MAX_RECONCILE = 8 + +/** + * Max facts a single auto-extraction pass may store. Extraction runs on every + * reply, so this bounds how fast memory can grow from one exchange; genuine turns + * rarely yield more than one or two durable facts. + */ +const MAX_AUTO_FACTS_PER_PASS = 2 + +type ReconcileDecision = { + /** A new fact already covered by this existing one; do not store the new fact. */ + skip?: LongTermMemory + /** Existing memories the new fact makes obsolete (contradicts/updates). */ + removeIds: string[] + reason?: string +} + +/** + * Decide what to do with a new fact given the existing memories. Asks the text + * LLM (vLLM, OpenAI-compatible) to compare the new fact against the related + * ones: which existing facts it makes obsolete (same attribute, new/contradicting + * value) and whether it's redundant. Falls back to a deterministic cosine + * near-duplicate skip when the LLM is unconfigured or fails. + */ +async function reconcile( + text: string, + embedding: number[], + docs: LongTermMemory[] +): Promise { + const related = docs + .map((d) => ({ d, score: cosine(embedding, d.embedding) })) + .filter((s) => s.score >= RELATED_MIN) + .sort((a, b) => b.score - a.score) + + if (!related.length) return { removeIds: [] } + + // Deterministic fallback: no LLM available -> treat a very close match as a + // duplicate and skip, otherwise store without touching anything. + if (!isTextLlmConfigured()) { + const top = related[0] + return top.score >= DUP_SIMILARITY + ? { skip: top.d, removeIds: [], reason: 'near-duplicate' } + : { removeIds: [] } + } + + const candidates = related.slice(0, MAX_RECONCILE) + const system = + 'You maintain a store of durable facts about two people in a relationship. ' + + 'Compare a NEW fact to the numbered EXISTING facts. An existing fact is OBSOLETE if the new ' + + 'fact states the same attribute with a different or updated value, or directly contradicts it ' + + '(e.g. a different name for the same pet, a changed job or location). The new fact is REDUNDANT ' + + 'if an existing fact already conveys the same information. Facts about different attributes are ' + + 'independent — keep both. Respond with ONLY JSON: ' + + '{"obsolete":[],"redundant":}.' + const list = candidates.map((c, i) => `${i + 1}. ${c.d.text}`).join('\n') + const user = `NEW: ${text}\n\nEXISTING:\n${list}` + + const raw = await classify(system, user, { maxTokens: 120 }) + const parsed = parseJsonObject<{ obsolete?: number[]; redundant?: boolean }>(raw) + + if (!parsed) { + // LLM failed/garbled -> safe deterministic fallback. + const top = related[0] + return top.score >= DUP_SIMILARITY + ? { skip: top.d, removeIds: [], reason: 'near-duplicate (llm fallback)' } + : { removeIds: [] } + } + + const removeIds = (parsed.obsolete || []) + .filter((n) => Number.isInteger(n) && n >= 1 && n <= candidates.length) + .map((n) => candidates[n - 1].d._id) + + // If redundant AND nothing is being replaced, skip storing the new fact. When + // it supersedes something, store the new fact even if "redundant" was flagged. + if (parsed.redundant && !removeIds.length) { + return { skip: candidates[0].d, removeIds: [], reason: 'redundant' } + } + + return { removeIds, reason: removeIds.length ? 'contradiction' : undefined } +} + +/** + * Reject transient, scene-level statements that aren't worth remembering long + * term — e.g. "Pete arrived at Julia's apartment", "she is sitting on the + * couch", "it's raining right now". These describe the current moment, not a + * durable fact about the people. Lasting facts (names, relationships, + * preferences, history, promises) don't match these episodic patterns. + */ +const EPHEMERAL_PATTERNS: RegExp[] = [ + // momentary time anchors + /\b(right now|just now|at the moment|currently|this morning|this afternoon|this evening|tonight|today|earlier (today|tonight)|a (moment|minute|second) ago)\b/i, + // one-off motion / scene events + /\b(just )?(arrived|arrives|arriving|left|leaving|walked|walks|walking|entered|enters|came over|comes over|showed up|shows up|stepped|knocked|sat down|sits down|stood up|stands up|got up|lay down|opened the door|closed the door|went (to|into|over))\b/i, + // describing a present pose / ongoing action (transient state) + /\bis (now |currently )?(sitting|standing|lying|kneeling|walking|running|driving|eating|drinking|sleeping|crying|smiling|laughing|holding|wearing|waiting|heading|on (her|his|their) way)\b/i, +] + +function isEphemeral(text: string): boolean { + return EPHEMERAL_PATTERNS.some((re) => re.test(text)) +} + +/** Store a fact the model chose to remember. Returns the created doc (or null). */ +export async function rememberFact( + userId: string, + characterId: string, + text: string, + source: LongTermMemory['source'] = 'tool' +): Promise { + const trimmed = text.trim() + if (!trimmed || !characterId) return null + + // Model-sourced facts get filtered for transient/scene content; a manual add + // is the user's deliberate choice, so it's trusted. + if (source !== 'manual' && isEphemeral(trimmed)) { + logger.debug( + { characterId, source, length: trimmed.length, ...(LOG_TEXT ? { text: trimmed } : {}) }, + 'memory: ephemeral, skipped' + ) + return null + } + + // Skip exact duplicates (same character already has this exact fact). + const existing = await collection().findOne({ userId, characterId, text: trimmed }) + if (existing) { + logger.debug( + { characterId, length: trimmed.length, ...(LOG_TEXT ? { text: trimmed } : {}) }, + 'memory: duplicate, skipped' + ) + return existing + } + + const embedding = await embed(trimmed) + + // Reconcile against existing memories: a new fact may be a paraphrase (skip), + // may contradict/update an older fact (replace it), or be unrelated (store). + // Manual adds are the user's deliberate choice and are stored as-is. + if (source !== 'manual') { + const docs = await collection().find({ userId, characterId }).toArray() + const decision = await reconcile(trimmed, embedding, docs) + + if (decision.removeIds.length) { + await collection().deleteMany({ _id: { $in: decision.removeIds }, userId }) + logger.info( + { characterId, removed: decision.removeIds.length, reason: decision.reason }, + 'memory: superseded outdated memories' + ) + } + + if (decision.skip) { + logger.debug( + { + characterId, + reason: decision.reason, + ...(LOG_TEXT ? { text: trimmed, existing: decision.skip.text } : {}), + }, + 'memory: redundant, skipped' + ) + return decision.skip + } + } + + const doc: LongTermMemory = { + _id: v4(), + userId, + characterId, + text: trimmed, + embedding, + source, + createdAt: new Date().toISOString(), + } + await collection().insertOne(doc) + logger.info( + { characterId, source, length: trimmed.length, ...(LOG_TEXT ? { text: trimmed } : {}) }, + 'memory: stored' + ) + return doc +} + +/** + * Automatic memory extraction. The roleplay model won't reliably emit the inline + * `` marker mid-immersion, so durable facts are also pulled out of the + * exchange by a separate, model-agnostic classification pass (temp 0, non-stream) + * and stored with source 'auto'. Each extracted fact still goes through the same + * rememberFact pipeline (ephemeral filter, reconcile, dedup), so this is additive + * to — and safely overlapping with — the marker path. Best-effort: never throws. + */ +export async function extractAndStoreMemories( + userId: string, + characterId: string, + userName: string, + charName: string, + transcript: string +): Promise { + if (!characterId || !transcript.trim() || !isTextLlmConfigured()) return + + const system = + `You maintain a small, high-value long-term memory about ${userName} and ${charName}. ` + + `From the exchange, extract ONLY genuinely important, lasting facts a partner would clearly ` + + `still remember weeks later — for example: their name, age, where they live or work, ` + + `family/relationship status, a major life event, a strongly stated preference or hard boundary, ` + + `or an explicit promise or plan — about ${userName} OR ${charName} (including personal details ` + + `${charName} states or invents about itself). ` + + `Be very selective: MOST exchanges contain nothing worth saving — then return an empty array. ` + + `Do NOT save: small talk, the current scene or activity, momentary moods or feelings, flirting or ` + + `compliments, opinions about the moment, vague or trivial details, or anything not clearly durable. ` + + `Write each fact as one short self-contained sentence in the third person. Respond with ONLY JSON: ` + + `{"facts":["", ...]}. Prefer an empty array; never include a fact you are unsure is important.` + + let raw: string | null = null + try { + raw = await classify(system, transcript, { maxTokens: 200 }) + } catch (err) { + logger.warn({ err, characterId }, 'memory: auto-extraction request failed') + return + } + + const parsed = parseJsonObject<{ facts?: string[] }>(raw) + const facts = Array.isArray(parsed?.facts) ? parsed!.facts : [] + if (!facts.length) return + + // Overstore guard: this runs on every reply, so cap how many facts a single + // exchange can contribute. A normal turn surfaces at most one or two durable + // facts; anything beyond the cap is the model padding with scene fluff. The + // rememberFact pipeline (ephemeral filter, reconcile, cosine + LLM dedup) still + // drops repeats and near-duplicates on top of this. + const deduped = Array.from( + new Set(facts.filter((f) => typeof f === 'string' && f.trim()).map((f) => f.trim())) + ).slice(0, MAX_AUTO_FACTS_PER_PASS) + + for (const fact of deduped) { + try { + await rememberFact(userId, characterId, fact, 'auto') + } catch (err) { + logger.error({ err, characterId }, 'memory: failed to store auto-extracted fact') + } + } +} + +/** + * Retrieve the memories most relevant to `query` for this user+character, ranked + * by cosine similarity. `minScore` filters out weak matches. + */ +export async function recallMemories( + userId: string, + characterId: string, + query: string, + opts: { k?: number; minScore?: number } = {} +): Promise { + const k = opts.k ?? 5 + const minScore = opts.minScore ?? 0.3 + if (!characterId || !query.trim()) return [] + + const docs = await collection().find({ userId, characterId }).toArray() + if (!docs.length) return [] + + const q = await embed(query) + const scored = docs + .map((d) => ({ d, score: cosine(q, d.embedding) })) + .filter((s) => s.score >= minScore) + .sort((a, b) => b.score - a.score) + .slice(0, k) + + if (scored.length) { + logger.debug( + { + characterId, + count: scored.length, + topScore: +scored[0].score.toFixed(3), + ...(LOG_TEXT + ? { recalled: scored.map((s) => ({ score: +s.score.toFixed(3), text: s.d.text })) } + : {}), + }, + 'memory: recalled' + ) + } + return scored.map((s) => s.d) +} + +/** All stored memories for a user+character (newest first) — for a management UI. */ +export async function listMemories(userId: string, characterId: string) { + return collection().find({ userId, characterId }).sort({ createdAt: -1 }).toArray() +} + +export async function deleteMemory(userId: string, id: string) { + await collection().deleteOne({ _id: id, userId }) +} + +/** Wipe every stored memory for a user+character (used by the character reset). */ +export async function deleteAllMemories(userId: string, characterId: string) { + if (!characterId) return + await collection().deleteMany({ userId, characterId }) +} + +/** Cosine similarity. Embeddings are L2-normalized, but compute fully for safety. */ +function cosine(a: number[], b: number[]): number { + if (a.length !== b.length) return 0 + let dot = 0 + let na = 0 + let nb = 0 + for (let i = 0; i < a.length; i++) { + dot += a[i] * b[i] + na += a[i] * a[i] + nb += b[i] * b[i] + } + const denom = Math.sqrt(na) * Math.sqrt(nb) + return denom ? dot / denom : 0 +} diff --git a/srv/queue/gate.js b/srv/queue/gate.js new file mode 100644 index 00000000..57f08e96 --- /dev/null +++ b/srv/queue/gate.js @@ -0,0 +1,117 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.PriorityGate = exports.ClientGoneError = void 0; +exports.priorityForUser = priorityForUser; +const uuid_1 = require("uuid"); +const util_1 = require("/common/util"); +const middleware_1 = require("../middleware"); +/** Thrown when an admitted request's client has already disconnected. Consumers + * treat it like any generation error (no message/credit/image persisted). */ +class ClientGoneError extends Error { + constructor(message = 'client disconnected before generation') { + super(message); + this.name = 'ClientGoneError'; + } +} +exports.ClientGoneError = ClientGoneError; +class PriorityGate { + constructor(backend, sender, presence = async () => true, now = () => Date.now()) { + this.backend = backend; + this.sender = sender; + this.presence = presence; + this.now = now; + } + setPauseText(pause) { + this.backend.setPauseText(pause); + } + setBackend(backend) { + this.backend = backend; + } + setPresence(presence) { + this.presence = presence; + } + async run(opts, fn) { + const id = (0, uuid_1.v4)(); + await this.enter(id, opts); + try { + return await fn(); + } + finally { + await this.release(id); + } + } + async *gateStream(opts, makeGen) { + const id = (0, uuid_1.v4)(); + await this.enter(id, opts); + try { + const gen = makeGen(); + for await (const chunk of gen) { + yield chunk; + } + } + finally { + await this.release(id); + } + } + async release(id) { + try { + await this.backend.release(id); + } + catch (err) { + middleware_1.logger.warn({ err }, 'inference gate: release failed, ignoring'); + } + } + async enter(id, opts) { + try { + await this.backend.acquire({ + id, + kind: opts.kind, + priority: opts.priority, + enqueuedAt: this.now(), + onPosition: (position) => this.emit(opts, position), + }); + } + catch (err) { + // Backend (e.g. Redis) unavailable: degrade to ungated rather than failing + // the inference request. Fulfils the spec's "Redis unavailable -> proceed" + // fallback. (Abort/disconnect is not wired through the facade in v1.) + middleware_1.logger.warn({ err }, 'inference gate: acquire failed, proceeding ungated'); + return; + } + // Admitted — but drop the request if its client has already disconnected, + // freeing the slot for the next waiter. Fails open (treats as present) on + // any presence-check error so an outage never wrongly drops requests. + let present = true; + try { + present = await this.presence({ userId: opts.userId, socketId: opts.socketId }); + } + catch { + present = true; + } + if (!present) { + await this.release(id); + throw new ClientGoneError(); + } + this.emit(opts, 0); // clear the badge on admission + } + emit(opts, position) { + const ev = { + type: 'queue-position', + kind: opts.kind, + position, + requestId: opts.requestId, + }; + if (opts.userId) + this.sender.toUser(opts.userId, ev); + else if (opts.socketId) + this.sender.toGuest(opts.socketId, ev); + } +} +exports.PriorityGate = PriorityGate; +function priorityForUser(user, isGuest, tiers) { + if (isGuest) + return 2; + const sub = (0, util_1.getUserSubscriptionTier)(user, tiers); + return sub?.tier ? 0 : 1; +} +//# sourceMappingURL=gate.js.map \ No newline at end of file diff --git a/srv/queue/gate.js.map b/srv/queue/gate.js.map new file mode 100644 index 00000000..4d4bbf3d --- /dev/null +++ b/srv/queue/gate.js.map @@ -0,0 +1 @@ +{"version":3,"file":"gate.js","sourceRoot":"","sources":["gate.ts"],"names":[],"mappings":";;;AAqIA,0CAWC;AAhJD,+BAAiC;AAGjC,uCAAsD;AAEtD,8CAAsC;AAEtC;6EAC6E;AAC7E,MAAa,eAAgB,SAAQ,KAAK;IACxC,YAAY,OAAO,GAAG,uCAAuC;QAC3D,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAA;IAC/B,CAAC;CACF;AALD,0CAKC;AAwBD,MAAa,YAAY;IACvB,YACU,OAAoB,EACpB,MAAc,EACd,WAA0B,KAAK,IAAI,EAAE,CAAC,IAAI,EAC1C,MAAoB,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;QAHpC,YAAO,GAAP,OAAO,CAAa;QACpB,WAAM,GAAN,MAAM,CAAQ;QACd,aAAQ,GAAR,QAAQ,CAAkC;QAC1C,QAAG,GAAH,GAAG,CAAiC;IAC3C,CAAC;IAEJ,YAAY,CAAC,KAAc;QACzB,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAA;IAClC,CAAC;IAED,UAAU,CAAC,OAAoB;QAC7B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,CAAC;IAED,WAAW,CAAC,QAAuB;QACjC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAC1B,CAAC;IAED,KAAK,CAAC,GAAG,CAAI,IAAc,EAAE,EAAoB;QAC/C,MAAM,EAAE,GAAG,IAAA,SAAI,GAAE,CAAA;QACjB,MAAM,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;QAC1B,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAA;QACnB,CAAC;gBAAS,CAAC;YACT,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QACxB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,CAAC,UAAU,CAAI,IAAc,EAAE,OAAgC;QACnE,MAAM,EAAE,GAAG,IAAA,SAAI,GAAE,CAAA;QACjB,MAAM,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;QAC1B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,OAAO,EAAE,CAAA;YACrB,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,EAAE,CAAC;gBAC9B,MAAM,KAAK,CAAA;YACb,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QACxB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,OAAO,CAAC,EAAU;QAC9B,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QAChC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,mBAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,0CAA0C,CAAC,CAAA;QAClE,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,KAAK,CAAC,EAAU,EAAE,IAAc;QAC5C,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;gBACzB,EAAE;gBACF,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;gBACtB,UAAU,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC;aACpD,CAAC,CAAA;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,2EAA2E;YAC3E,2EAA2E;YAC3E,sEAAsE;YACtE,mBAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,oDAAoD,CAAC,CAAA;YAC1E,OAAM;QACR,CAAC;QACD,0EAA0E;QAC1E,0EAA0E;QAC1E,sEAAsE;QACtE,IAAI,OAAO,GAAG,IAAI,CAAA;QAClB,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;QACjF,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,GAAG,IAAI,CAAA;QAChB,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;YACtB,MAAM,IAAI,eAAe,EAAE,CAAA;QAC7B,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA,CAAC,+BAA+B;IACpD,CAAC;IAEO,IAAI,CAAC,IAAc,EAAE,QAAgB;QAC3C,MAAM,EAAE,GAAkB;YACxB,IAAI,EAAE,gBAAgB;YACtB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ;YACR,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAA;QACD,IAAI,IAAI,CAAC,MAAM;YAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;aAC/C,IAAI,IAAI,CAAC,QAAQ;YAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;IAChE,CAAC;CACF;AA7FD,oCA6FC;AAED,SAAgB,eAAe,CAC7B,IAGC,EACD,OAAgB,EAChB,KAAmC;IAEnC,IAAI,OAAO;QAAE,OAAO,CAAC,CAAA;IACrB,MAAM,GAAG,GAAG,IAAA,8BAAuB,EAAC,IAAI,EAAE,KAAK,CAAC,CAAA;IAChD,OAAO,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAC1B,CAAC"} \ No newline at end of file diff --git a/srv/queue/gate.ts b/srv/queue/gate.ts new file mode 100644 index 00000000..4c863f4d --- /dev/null +++ b/srv/queue/gate.ts @@ -0,0 +1,145 @@ +import { v4 as uuid } from 'uuid' +import { GateBackend } from './local' +import { Kind, Priority } from './types' +import { getUserSubscriptionTier } from '/common/util' +import { AppSchema } from '/common/types/schema' +import { logger } from '../middleware' + +/** Thrown when an admitted request's client has already disconnected. Consumers + * treat it like any generation error (no message/credit/image persisted). */ +export class ClientGoneError extends Error { + constructor(message = 'client disconnected before generation') { + super(message) + this.name = 'ClientGoneError' + } +} + +export type GateOpts = { + kind: Kind + priority: Priority + userId?: string + socketId?: string + requestId?: string +} + +export type PositionEvent = { + type: 'queue-position' + kind: Kind + position: number + requestId?: string +} + +export type Sender = { + toUser: (userId: string, ev: PositionEvent) => void + toGuest: (socketId: string, ev: PositionEvent) => void +} + +export type PresenceCheck = (id: { userId?: string; socketId?: string }) => Promise + +export class PriorityGate { + constructor( + private backend: GateBackend, + private sender: Sender, + private presence: PresenceCheck = async () => true, + private now: () => number = () => Date.now() + ) {} + + setPauseText(pause: boolean) { + this.backend.setPauseText(pause) + } + + setBackend(backend: GateBackend) { + this.backend = backend + } + + setPresence(presence: PresenceCheck) { + this.presence = presence + } + + async run(opts: GateOpts, fn: () => Promise): Promise { + const id = uuid() + await this.enter(id, opts) + try { + return await fn() + } finally { + await this.release(id) + } + } + + async *gateStream(opts: GateOpts, makeGen: () => AsyncGenerator): AsyncGenerator { + const id = uuid() + await this.enter(id, opts) + try { + const gen = makeGen() + for await (const chunk of gen) { + yield chunk + } + } finally { + await this.release(id) + } + } + + private async release(id: string) { + try { + await this.backend.release(id) + } catch (err) { + logger.warn({ err }, 'inference gate: release failed, ignoring') + } + } + + private async enter(id: string, opts: GateOpts) { + try { + await this.backend.acquire({ + id, + kind: opts.kind, + priority: opts.priority, + enqueuedAt: this.now(), + onPosition: (position) => this.emit(opts, position), + }) + } catch (err) { + // Backend (e.g. Redis) unavailable: degrade to ungated rather than failing + // the inference request. Fulfils the spec's "Redis unavailable -> proceed" + // fallback. (Abort/disconnect is not wired through the facade in v1.) + logger.warn({ err }, 'inference gate: acquire failed, proceeding ungated') + return + } + // Admitted — but drop the request if its client has already disconnected, + // freeing the slot for the next waiter. Fails open (treats as present) on + // any presence-check error so an outage never wrongly drops requests. + let present = true + try { + present = await this.presence({ userId: opts.userId, socketId: opts.socketId }) + } catch { + present = true + } + if (!present) { + await this.release(id) + throw new ClientGoneError() + } + this.emit(opts, 0) // clear the badge on admission + } + + private emit(opts: GateOpts, position: number) { + const ev: PositionEvent = { + type: 'queue-position', + kind: opts.kind, + position, + requestId: opts.requestId, + } + if (opts.userId) this.sender.toUser(opts.userId, ev) + else if (opts.socketId) this.sender.toGuest(opts.socketId, ev) + } +} + +export function priorityForUser( + user: Pick< + AppSchema.User, + '_id' | 'patreon' | 'billing' | 'sub' | 'manualSub' | 'premium' | 'premiumUntil' | 'username' + >, + isGuest: boolean, + tiers: AppSchema.SubscriptionTier[] +): Priority { + if (isGuest) return 2 + const sub = getUserSubscriptionTier(user, tiers) + return sub?.tier ? 0 : 1 +} diff --git a/srv/queue/index.js b/srv/queue/index.js new file mode 100644 index 00000000..8c7f95bf --- /dev/null +++ b/srv/queue/index.js @@ -0,0 +1,49 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ClientGoneError = exports.priorityForUser = exports.PriorityGate = exports.inferenceGate = void 0; +exports.startQueue = startQueue; +const config_1 = require("../config"); +const bus_1 = require("../api/ws/bus"); +const ws_1 = require("../api/ws"); +const local_1 = require("./local"); +const redis_1 = require("./redis"); +const gate_1 = require("./gate"); +const metrics_1 = require("./metrics"); +const presence_1 = require("./presence"); +const caps = { global: config_1.config.queue.global, image: config_1.config.queue.image }; +const sender = { + toUser: (userId, ev) => (0, ws_1.sendOne)(userId, ev), + toGuest: (socketId, ev) => (0, ws_1.sendGuest)(socketId, ev), +}; +// Default to the in-process backend. startQueue() — run after initMessageBus() +// has connected the Redis bus — upgrades to the shared Redis backend when Redis +// is actually connected, so the global cap holds across the throng worker +// processes. Selecting here by isConnected() would be wrong: this module is +// constructed during createApp(), before the bus connects. Selecting by +// config.redis.host alone is also wrong: its default ('127.0.0.1') is always +// truthy, so dev/Redis-down would needlessly use the Redis backend. +exports.inferenceGate = new gate_1.PriorityGate(new local_1.LocalBackend(caps), sender, presence_1.isPresent); +const breaker = new metrics_1.Breaker(config_1.config.queue.waitingThreshold, config_1.config.queue.pollMs * 4); +function startQueue() { + if (config_1.config.redis.host && (0, bus_1.isConnected)()) { + exports.inferenceGate.setBackend(new redis_1.RedisBackend({ caps, cmd: bus_1.clients.pub, sub: bus_1.clients.sub })); + } + const stopPresence = (0, presence_1.startPresenceRefresh)(); + if (!config_1.config.queue.metricsUrl) + return stopPresence; + const stopPoller = (0, metrics_1.startMetricsPoller)({ + url: config_1.config.queue.metricsUrl, + pollMs: config_1.config.queue.pollMs, + breaker, + onUpdate: (pause) => exports.inferenceGate.setPauseText(pause), + }); + return () => { + stopPoller(); + stopPresence(); + }; +} +var gate_2 = require("./gate"); +Object.defineProperty(exports, "PriorityGate", { enumerable: true, get: function () { return gate_2.PriorityGate; } }); +Object.defineProperty(exports, "priorityForUser", { enumerable: true, get: function () { return gate_2.priorityForUser; } }); +Object.defineProperty(exports, "ClientGoneError", { enumerable: true, get: function () { return gate_2.ClientGoneError; } }); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/srv/queue/index.js.map b/srv/queue/index.js.map new file mode 100644 index 00000000..e4109fb8 --- /dev/null +++ b/srv/queue/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;AA2BA,gCAkBC;AA7CD,sCAAkC;AAClC,uCAAoD;AACpD,kCAA8C;AAC9C,mCAAsC;AACtC,mCAAsC;AACtC,iCAA6C;AAC7C,uCAAuD;AACvD,yCAA4D;AAE5D,MAAM,IAAI,GAAG,EAAE,MAAM,EAAE,eAAM,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,eAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;AAEvE,MAAM,MAAM,GAAW;IACrB,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,IAAA,YAAO,EAAC,MAAM,EAAE,EAAE,CAAC;IAC3C,OAAO,EAAE,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC,IAAA,cAAS,EAAC,QAAQ,EAAE,EAAE,CAAC;CACnD,CAAA;AAED,+EAA+E;AAC/E,gFAAgF;AAChF,0EAA0E;AAC1E,4EAA4E;AAC5E,wEAAwE;AACxE,6EAA6E;AAC7E,oEAAoE;AACvD,QAAA,aAAa,GAAG,IAAI,mBAAY,CAAC,IAAI,oBAAY,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,oBAAS,CAAC,CAAA;AAExF,MAAM,OAAO,GAAG,IAAI,iBAAO,CAAC,eAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,eAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;AAEnF,SAAgB,UAAU;IACxB,IAAI,eAAM,CAAC,KAAK,CAAC,IAAI,IAAI,IAAA,iBAAW,GAAE,EAAE,CAAC;QACvC,qBAAa,CAAC,UAAU,CACtB,IAAI,oBAAY,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,aAAO,CAAC,GAAU,EAAE,GAAG,EAAE,aAAO,CAAC,GAAU,EAAE,CAAC,CAC7E,CAAA;IACH,CAAC;IACD,MAAM,YAAY,GAAG,IAAA,+BAAoB,GAAE,CAAA;IAC3C,IAAI,CAAC,eAAM,CAAC,KAAK,CAAC,UAAU;QAAE,OAAO,YAAY,CAAA;IACjD,MAAM,UAAU,GAAG,IAAA,4BAAkB,EAAC;QACpC,GAAG,EAAE,eAAM,CAAC,KAAK,CAAC,UAAU;QAC5B,MAAM,EAAE,eAAM,CAAC,KAAK,CAAC,MAAM;QAC3B,OAAO;QACP,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,qBAAa,CAAC,YAAY,CAAC,KAAK,CAAC;KACvD,CAAC,CAAA;IACF,OAAO,GAAG,EAAE;QACV,UAAU,EAAE,CAAA;QACZ,YAAY,EAAE,CAAA;IAChB,CAAC,CAAA;AACH,CAAC;AAED,+BAAuE;AAA9D,oGAAA,YAAY,OAAA;AAAE,uGAAA,eAAe,OAAA;AAAE,uGAAA,eAAe,OAAA"} \ No newline at end of file diff --git a/srv/queue/index.ts b/srv/queue/index.ts new file mode 100644 index 00000000..fc4c68c7 --- /dev/null +++ b/srv/queue/index.ts @@ -0,0 +1,48 @@ +import { config } from '../config' +import { clients, isConnected } from '../api/ws/bus' +import { sendGuest, sendOne } from '../api/ws' +import { LocalBackend } from './local' +import { RedisBackend } from './redis' +import { PriorityGate, Sender } from './gate' +import { Breaker, startMetricsPoller } from './metrics' +import { isPresent, startPresenceRefresh } from './presence' + +const caps = { global: config.queue.global, image: config.queue.image } + +const sender: Sender = { + toUser: (userId, ev) => sendOne(userId, ev), + toGuest: (socketId, ev) => sendGuest(socketId, ev), +} + +// Default to the in-process backend. startQueue() — run after initMessageBus() +// has connected the Redis bus — upgrades to the shared Redis backend when Redis +// is actually connected, so the global cap holds across the throng worker +// processes. Selecting here by isConnected() would be wrong: this module is +// constructed during createApp(), before the bus connects. Selecting by +// config.redis.host alone is also wrong: its default ('127.0.0.1') is always +// truthy, so dev/Redis-down would needlessly use the Redis backend. +export const inferenceGate = new PriorityGate(new LocalBackend(caps), sender, isPresent) + +const breaker = new Breaker(config.queue.waitingThreshold, config.queue.pollMs * 4) + +export function startQueue(): () => void { + if (config.redis.host && isConnected()) { + inferenceGate.setBackend( + new RedisBackend({ caps, cmd: clients.pub as any, sub: clients.sub as any }) + ) + } + const stopPresence = startPresenceRefresh() + if (!config.queue.metricsUrl) return stopPresence + const stopPoller = startMetricsPoller({ + url: config.queue.metricsUrl, + pollMs: config.queue.pollMs, + breaker, + onUpdate: (pause) => inferenceGate.setPauseText(pause), + }) + return () => { + stopPoller() + stopPresence() + } +} + +export { PriorityGate, priorityForUser, ClientGoneError } from './gate' diff --git a/srv/queue/local.js b/srv/queue/local.js new file mode 100644 index 00000000..86f05805 --- /dev/null +++ b/srv/queue/local.js @@ -0,0 +1,90 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.LocalBackend = void 0; +const types_1 = require("./types"); +class LocalBackend { + constructor(caps) { + this.caps = caps; + this.counts = { inflight: 0, image: 0 }; + this.pauseText = false; + this.waiting = []; + this.admitted = new Map(); + } + acquire(req) { + return new Promise((resolve, reject) => { + const pending = { + waiter: { id: req.id, kind: req.kind, priority: req.priority, enqueuedAt: req.enqueuedAt }, + resolve, + reject, + onPosition: req.onPosition, + lastPosition: -1, + signal: req.signal, + }; + if (req.signal) { + if (req.signal.aborted) + return reject(new Error('aborted')); + pending.onAbort = () => this.abort(req.id); + req.signal.addEventListener('abort', pending.onAbort); + } + this.waiting.push(pending); + this.schedule(); + }); + } + async release(id) { + const kind = this.admitted.get(id); + if (!kind) + return; + this.admitted.delete(id); + this.counts.inflight--; + if (kind === 'image') + this.counts.image--; + this.schedule(); + } + setPauseText(pause) { + this.pauseText = pause; + this.schedule(); + } + abort(id) { + const idx = this.waiting.findIndex((p) => p.waiter.id === id); + if (idx === -1) + return; + const [pending] = this.waiting.splice(idx, 1); + if (pending.onAbort && pending.signal) + pending.signal.removeEventListener('abort', pending.onAbort); + pending.reject(new Error('aborted')); + this.schedule(); + } + schedule() { + // Admit as many eligible waiters as capacity allows. + while (this.waiting.length) { + const waiters = this.waiting.map((p) => p.waiter); + const next = (0, types_1.selectNext)(waiters, this.counts, this.caps, this.pauseText); + if (!next) + break; + const idx = this.waiting.findIndex((p) => p.waiter.id === next.id); + const [pending] = this.waiting.splice(idx, 1); + if (pending.onAbort && pending.signal) { + pending.signal.removeEventListener('abort', pending.onAbort); + } + this.admitted.set(next.id, next.kind); + this.counts.inflight++; + if (next.kind === 'image') + this.counts.image++; + pending.resolve(); + } + this.publishPositions(); + } + publishPositions() { + const sorted = [...this.waiting].sort((a, b) => (0, types_1.waiterScore)(a.waiter.priority, a.waiter.enqueuedAt) - + (0, types_1.waiterScore)(b.waiter.priority, b.waiter.enqueuedAt)); + sorted.forEach((pending, i) => { + const position = i + 1; + if (pending.onPosition && pending.lastPosition !== position) { + pending.lastPosition = position; + pending.onPosition(position); + } + }); + } +} +exports.LocalBackend = LocalBackend; +//# sourceMappingURL=local.js.map \ No newline at end of file diff --git a/srv/queue/local.js.map b/srv/queue/local.js.map new file mode 100644 index 00000000..51682fa1 --- /dev/null +++ b/srv/queue/local.js.map @@ -0,0 +1 @@ +{"version":3,"file":"local.js","sourceRoot":"","sources":["local.ts"],"names":[],"mappings":";;;AAAA,mCAAuF;AA2BvF,MAAa,YAAY;IAMvB,YAAoB,IAAU;QAAV,SAAI,GAAJ,IAAI,CAAM;QALtB,WAAM,GAAW,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAA;QAC1C,cAAS,GAAG,KAAK,CAAA;QACjB,YAAO,GAAc,EAAE,CAAA;QACvB,aAAQ,GAAG,IAAI,GAAG,EAAgB,CAAA;IAET,CAAC;IAElC,OAAO,CAAC,GAAe;QACrB,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC3C,MAAM,OAAO,GAAY;gBACvB,MAAM,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE;gBAC1F,OAAO;gBACP,MAAM;gBACN,UAAU,EAAE,GAAG,CAAC,UAAU;gBAC1B,YAAY,EAAE,CAAC,CAAC;gBAChB,MAAM,EAAE,GAAG,CAAC,MAAM;aACnB,CAAA;YACD,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;gBACf,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO;oBAAE,OAAO,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAA;gBAC3D,OAAO,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;gBAC1C,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;YACvD,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YAC1B,IAAI,CAAC,QAAQ,EAAE,CAAA;QACjB,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,EAAU;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAClC,IAAI,CAAC,IAAI;YAAE,OAAM;QACjB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QACxB,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAA;QACtB,IAAI,IAAI,KAAK,OAAO;YAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;QACzC,IAAI,CAAC,QAAQ,EAAE,CAAA;IACjB,CAAC;IAED,YAAY,CAAC,KAAc;QACzB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAA;QACtB,IAAI,CAAC,QAAQ,EAAE,CAAA;IACjB,CAAC;IAEO,KAAK,CAAC,EAAU;QACtB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;QAC7D,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,OAAM;QACtB,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;QAC7C,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM;YACnC,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;QAC9D,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAA;QACpC,IAAI,CAAC,QAAQ,EAAE,CAAA;IACjB,CAAC;IAEO,QAAQ;QACd,qDAAqD;QACrD,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;YACjD,MAAM,IAAI,GAAG,IAAA,kBAAU,EAAC,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;YACxE,IAAI,CAAC,IAAI;gBAAE,MAAK;YAChB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC,CAAA;YAClE,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;YAC7C,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACtC,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;YAC9D,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;YACrC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAA;YACtB,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO;gBAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;YAC9C,OAAO,CAAC,OAAO,EAAE,CAAA;QACnB,CAAC;QACD,IAAI,CAAC,gBAAgB,EAAE,CAAA;IACzB,CAAC;IAEO,gBAAgB;QACtB,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CACnC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,IAAA,mBAAW,EAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;YACnD,IAAA,mBAAW,EAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CACtD,CAAA;QACD,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE;YAC5B,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAA;YACtB,IAAI,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;gBAC5D,OAAO,CAAC,YAAY,GAAG,QAAQ,CAAA;gBAC/B,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAA;YAC9B,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;CACF;AArFD,oCAqFC"} \ No newline at end of file diff --git a/srv/queue/local.ts b/srv/queue/local.ts new file mode 100644 index 00000000..dfb1ec0f --- /dev/null +++ b/srv/queue/local.ts @@ -0,0 +1,113 @@ +import { Caps, Counts, Kind, Priority, Waiter, selectNext, waiterScore } from './types' + +export type AcquireReq = { + id: string + kind: Kind + priority: Priority + enqueuedAt: number + onPosition?: (position: number) => void + signal?: AbortSignal +} + +export interface GateBackend { + acquire(req: AcquireReq): Promise + release(id: string): Promise + setPauseText(pause: boolean): void +} + +type Pending = { + waiter: Waiter + resolve: () => void + reject: (err: Error) => void + onPosition?: (position: number) => void + lastPosition: number + onAbort?: () => void + signal?: AbortSignal +} + +export class LocalBackend implements GateBackend { + private counts: Counts = { inflight: 0, image: 0 } + private pauseText = false + private waiting: Pending[] = [] + private admitted = new Map() + + constructor(private caps: Caps) {} + + acquire(req: AcquireReq): Promise { + return new Promise((resolve, reject) => { + const pending: Pending = { + waiter: { id: req.id, kind: req.kind, priority: req.priority, enqueuedAt: req.enqueuedAt }, + resolve, + reject, + onPosition: req.onPosition, + lastPosition: -1, + signal: req.signal, + } + if (req.signal) { + if (req.signal.aborted) return reject(new Error('aborted')) + pending.onAbort = () => this.abort(req.id) + req.signal.addEventListener('abort', pending.onAbort) + } + this.waiting.push(pending) + this.schedule() + }) + } + + async release(id: string): Promise { + const kind = this.admitted.get(id) + if (!kind) return + this.admitted.delete(id) + this.counts.inflight-- + if (kind === 'image') this.counts.image-- + this.schedule() + } + + setPauseText(pause: boolean): void { + this.pauseText = pause + this.schedule() + } + + private abort(id: string) { + const idx = this.waiting.findIndex((p) => p.waiter.id === id) + if (idx === -1) return + const [pending] = this.waiting.splice(idx, 1) + if (pending.onAbort && pending.signal) + pending.signal.removeEventListener('abort', pending.onAbort) + pending.reject(new Error('aborted')) + this.schedule() + } + + private schedule() { + // Admit as many eligible waiters as capacity allows. + while (this.waiting.length) { + const waiters = this.waiting.map((p) => p.waiter) + const next = selectNext(waiters, this.counts, this.caps, this.pauseText) + if (!next) break + const idx = this.waiting.findIndex((p) => p.waiter.id === next.id) + const [pending] = this.waiting.splice(idx, 1) + if (pending.onAbort && pending.signal) { + pending.signal.removeEventListener('abort', pending.onAbort) + } + this.admitted.set(next.id, next.kind) + this.counts.inflight++ + if (next.kind === 'image') this.counts.image++ + pending.resolve() + } + this.publishPositions() + } + + private publishPositions() { + const sorted = [...this.waiting].sort( + (a, b) => + waiterScore(a.waiter.priority, a.waiter.enqueuedAt) - + waiterScore(b.waiter.priority, b.waiter.enqueuedAt) + ) + sorted.forEach((pending, i) => { + const position = i + 1 + if (pending.onPosition && pending.lastPosition !== position) { + pending.lastPosition = position + pending.onPosition(position) + } + }) + } +} diff --git a/srv/queue/metrics.js b/srv/queue/metrics.js new file mode 100644 index 00000000..e6d47fb9 --- /dev/null +++ b/srv/queue/metrics.js @@ -0,0 +1,69 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Breaker = void 0; +exports.parsePrometheus = parsePrometheus; +exports.startMetricsPoller = startMetricsPoller; +const needle_1 = __importDefault(require("needle")); +const middleware_1 = require("../middleware"); +function matchMetric(text, name) { + const escaped = name.replace(/[:]/g, '\\:'); + const re = new RegExp(`^${escaped}(?:\\{[^}]*\\})?\\s+([0-9.eE+-]+)`, 'm'); + const m = re.exec(text); + return m ? Number(m[1]) : undefined; +} +function parsePrometheus(text) { + return { + running: matchMetric(text, 'vllm:num_requests_running'), + waiting: matchMetric(text, 'vllm:num_requests_waiting'), + }; +} +class Breaker { + constructor(threshold, staleMs) { + this.threshold = threshold; + this.staleMs = staleMs; + this.waiting = 0; + this.lastOk = 0; + } + update(waiting, now) { + if (waiting === undefined) + return; + this.waiting = waiting; + this.lastOk = now; + } + /** True ⇒ pause admitting new text. Fails open (false) when scrape is stale. */ + pauseText(now) { + if (this.lastOk === 0) + return false; + if (now - this.lastOk > this.staleMs) + return false; + return this.waiting > this.threshold; + } +} +exports.Breaker = Breaker; +function startMetricsPoller(opts) { + let stopped = false; + const tick = async () => { + if (stopped) + return; + try { + const res = await (0, needle_1.default)('get', opts.url, { parse: false }); + const text = typeof res.body === 'string' ? res.body : res.body?.toString?.() || ''; + const { waiting } = parsePrometheus(text); + opts.breaker.update(waiting, Date.now()); + } + catch (err) { + middleware_1.logger.warn({ err }, 'vLLM metrics scrape failed'); + } + opts.onUpdate(opts.breaker.pauseText(Date.now())); + }; + const timer = setInterval(tick, opts.pollMs); + tick(); + return () => { + stopped = true; + clearInterval(timer); + }; +} +//# sourceMappingURL=metrics.js.map \ No newline at end of file diff --git a/srv/queue/metrics.js.map b/srv/queue/metrics.js.map new file mode 100644 index 00000000..a84192be --- /dev/null +++ b/srv/queue/metrics.js.map @@ -0,0 +1 @@ +{"version":3,"file":"metrics.js","sourceRoot":"","sources":["metrics.ts"],"names":[],"mappings":";;;;;;AAUA,0CAKC;AAsBD,gDAyBC;AA9DD,oDAA2B;AAC3B,8CAAsC;AAEtC,SAAS,WAAW,CAAC,IAAY,EAAE,IAAY;IAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IAC3C,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,IAAI,OAAO,mCAAmC,EAAE,GAAG,CAAC,CAAA;IAC1E,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACvB,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;AACrC,CAAC;AAED,SAAgB,eAAe,CAAC,IAAY;IAC1C,OAAO;QACL,OAAO,EAAE,WAAW,CAAC,IAAI,EAAE,2BAA2B,CAAC;QACvD,OAAO,EAAE,WAAW,CAAC,IAAI,EAAE,2BAA2B,CAAC;KACxD,CAAA;AACH,CAAC;AAED,MAAa,OAAO;IAIlB,YAAoB,SAAiB,EAAU,OAAe;QAA1C,cAAS,GAAT,SAAS,CAAQ;QAAU,YAAO,GAAP,OAAO,CAAQ;QAHtD,YAAO,GAAG,CAAC,CAAA;QACX,WAAM,GAAG,CAAC,CAAA;IAE+C,CAAC;IAElE,MAAM,CAAC,OAA2B,EAAE,GAAW;QAC7C,IAAI,OAAO,KAAK,SAAS;YAAE,OAAM;QACjC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,IAAI,CAAC,MAAM,GAAG,GAAG,CAAA;IACnB,CAAC;IAED,gFAAgF;IAChF,SAAS,CAAC,GAAW;QACnB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAA;QACnC,IAAI,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAA;QAClD,OAAO,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAA;IACtC,CAAC;CACF;AAlBD,0BAkBC;AAED,SAAgB,kBAAkB,CAAC,IAKlC;IACC,IAAI,OAAO,GAAG,KAAK,CAAA;IACnB,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE;QACtB,IAAI,OAAO;YAAE,OAAM;QACnB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,IAAA,gBAAM,EAAC,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;YAC3D,MAAM,IAAI,GAAG,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAA;YACnF,MAAM,EAAE,OAAO,EAAE,GAAG,eAAe,CAAC,IAAI,CAAC,CAAA;YACzC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;QAC1C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,mBAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,4BAA4B,CAAC,CAAA;QACpD,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;IACnD,CAAC,CAAA;IACD,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;IAC5C,IAAI,EAAE,CAAA;IACN,OAAO,GAAG,EAAE;QACV,OAAO,GAAG,IAAI,CAAA;QACd,aAAa,CAAC,KAAK,CAAC,CAAA;IACtB,CAAC,CAAA;AACH,CAAC"} \ No newline at end of file diff --git a/srv/queue/metrics.ts b/srv/queue/metrics.ts new file mode 100644 index 00000000..f774195c --- /dev/null +++ b/srv/queue/metrics.ts @@ -0,0 +1,63 @@ +import needle from 'needle' +import { logger } from '../middleware' + +function matchMetric(text: string, name: string): number | undefined { + const escaped = name.replace(/[:]/g, '\\:') + const re = new RegExp(`^${escaped}(?:\\{[^}]*\\})?\\s+([0-9.eE+-]+)`, 'm') + const m = re.exec(text) + return m ? Number(m[1]) : undefined +} + +export function parsePrometheus(text: string): { running?: number; waiting?: number } { + return { + running: matchMetric(text, 'vllm:num_requests_running'), + waiting: matchMetric(text, 'vllm:num_requests_waiting'), + } +} + +export class Breaker { + private waiting = 0 + private lastOk = 0 + + constructor(private threshold: number, private staleMs: number) {} + + update(waiting: number | undefined, now: number) { + if (waiting === undefined) return + this.waiting = waiting + this.lastOk = now + } + + /** True ⇒ pause admitting new text. Fails open (false) when scrape is stale. */ + pauseText(now: number): boolean { + if (this.lastOk === 0) return false + if (now - this.lastOk > this.staleMs) return false + return this.waiting > this.threshold + } +} + +export function startMetricsPoller(opts: { + url: string + pollMs: number + breaker: Breaker + onUpdate: (pause: boolean) => void +}): () => void { + let stopped = false + const tick = async () => { + if (stopped) return + try { + const res = await needle('get', opts.url, { parse: false }) + const text = typeof res.body === 'string' ? res.body : res.body?.toString?.() || '' + const { waiting } = parsePrometheus(text) + opts.breaker.update(waiting, Date.now()) + } catch (err) { + logger.warn({ err }, 'vLLM metrics scrape failed') + } + opts.onUpdate(opts.breaker.pauseText(Date.now())) + } + const timer = setInterval(tick, opts.pollMs) + tick() + return () => { + stopped = true + clearInterval(timer) + } +} diff --git a/srv/queue/presence.js b/srv/queue/presence.js new file mode 100644 index 00000000..510cb19b --- /dev/null +++ b/srv/queue/presence.js @@ -0,0 +1,104 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.userKey = userKey; +exports.guestKey = guestKey; +exports.keyFor = keyFor; +exports.markRedis = markRedis; +exports.clearRedis = clearRedis; +exports.isPresentRedis = isPresentRedis; +exports.isPresentLocal = isPresentLocal; +exports.markPresent = markPresent; +exports.clearPresent = clearPresent; +exports.isPresent = isPresent; +exports.startPresenceRefresh = startPresenceRefresh; +const config_1 = require("../config"); +const bus_1 = require("../api/ws/bus"); +const PRESENCE_TTL_MS = 75000; // 2.5x the 30s websocket ping interval +function userKey(userId) { + return `presence:u:${userId}`; +} +function guestKey(socketId) { + return `presence:g:${socketId}`; +} +function keyFor(id) { + if (id.userId) + return userKey(id.userId); + if (id.socketId) + return guestKey(id.socketId); + return undefined; +} +function redisActive() { + return !!config_1.config.redis.host && (0, bus_1.isConnected)(); +} +async function markRedis(cmd, key, member, nowMs) { + await cmd.zAdd(key, { score: nowMs + PRESENCE_TTL_MS, value: member }); + await cmd.expire(key, Math.ceil(PRESENCE_TTL_MS / 1000) + 5); +} +async function clearRedis(cmd, key, member) { + await cmd.zRem(key, member); +} +async function isPresentRedis(cmd, key, nowMs) { + await cmd.zRemRangeByScore(key, 0, nowMs); + const count = await cmd.zCard(key); + return count > 0; +} +// --- Local seam (single-process: the live socket maps ARE the truth) --- +function isPresentLocal(id, maps) { + if (id.userId) + return (maps.userSockets.get(id.userId)?.length || 0) > 0; + if (id.socketId) + return maps.allSockets.has(id.socketId); + return true; +} +// --- Public API (socket lifecycle + gate use these) --- +async function markPresent(id, member) { + if (!redisActive()) + return; + const key = keyFor(id); + if (!key) + return; + await markRedis(bus_1.clients.pub, key, member, Date.now()).catch(() => { }); +} +async function clearPresent(id, member) { + if (!redisActive()) + return; + const key = keyFor(id); + if (!key) + return; + await clearRedis(bus_1.clients.pub, key, member).catch(() => { }); +} +/** True if the requester still has a live connection. Fails OPEN (true) on any error. */ +async function isPresent(id) { + if (!id.userId && !id.socketId) + return true; + if (!redisActive()) { + return isPresentLocal(id, { allSockets: bus_1.allSockets, userSockets: bus_1.userSockets }); + } + const key = keyFor(id); + try { + return await isPresentRedis(bus_1.clients.pub, key, Date.now()); + } + catch { + return true; + } +} +let refreshTimer; +/** Periodically refresh presence TTLs for all locally-connected sockets. No-op without redis. */ +function startPresenceRefresh() { + if (!redisActive()) + return () => { }; + refreshTimer = setInterval(() => { + const now = Date.now(); + for (const [uid, socket] of bus_1.allSockets) { + markRedis(bus_1.clients.pub, guestKey(uid), uid, now).catch(() => { }); + const userId = socket.userId; + if (userId) + markRedis(bus_1.clients.pub, userKey(userId), uid, now).catch(() => { }); + } + }, 30000); + return () => { + if (refreshTimer) + clearInterval(refreshTimer); + }; +} +//# sourceMappingURL=presence.js.map \ No newline at end of file diff --git a/srv/queue/presence.js.map b/srv/queue/presence.js.map new file mode 100644 index 00000000..99e34133 --- /dev/null +++ b/srv/queue/presence.js.map @@ -0,0 +1 @@ +{"version":3,"file":"presence.js","sourceRoot":"","sources":["presence.ts"],"names":[],"mappings":";;AAOA,0BAEC;AACD,4BAEC;AACD,wBAIC;AAeD,8BAGC;AACD,gCAEC;AACD,wCAQC;AAGD,wCAOC;AAGD,kCAKC;AACD,oCAKC;AAGD,8BAWC;AAID,oDAaC;AAtGD,sCAAkC;AAClC,uCAA6E;AAE7E,MAAM,eAAe,GAAG,KAAK,CAAA,CAAC,uCAAuC;AAIrE,SAAgB,OAAO,CAAC,MAAc;IACpC,OAAO,cAAc,MAAM,EAAE,CAAA;AAC/B,CAAC;AACD,SAAgB,QAAQ,CAAC,QAAgB;IACvC,OAAO,cAAc,QAAQ,EAAE,CAAA;AACjC,CAAC;AACD,SAAgB,MAAM,CAAC,EAAc;IACnC,IAAI,EAAE,CAAC,MAAM;QAAE,OAAO,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,CAAA;IACxC,IAAI,EAAE,CAAC,QAAQ;QAAE,OAAO,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAA;IAC7C,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,SAAS,WAAW;IAClB,OAAO,CAAC,CAAC,eAAM,CAAC,KAAK,CAAC,IAAI,IAAI,IAAA,iBAAW,GAAE,CAAA;AAC7C,CAAC;AAWM,KAAK,UAAU,SAAS,CAAC,GAAgB,EAAE,GAAW,EAAE,MAAc,EAAE,KAAa;IAC1F,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,GAAG,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;IACtE,MAAM,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AAC9D,CAAC;AACM,KAAK,UAAU,UAAU,CAAC,GAAgB,EAAE,GAAW,EAAE,MAAc;IAC5E,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;AAC7B,CAAC;AACM,KAAK,UAAU,cAAc,CAClC,GAAgB,EAChB,GAAW,EACX,KAAa;IAEb,MAAM,GAAG,CAAC,gBAAgB,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,CAAA;IACzC,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAClC,OAAO,KAAK,GAAG,CAAC,CAAA;AAClB,CAAC;AAED,0EAA0E;AAC1E,SAAgB,cAAc,CAC5B,EAAc,EACd,IAAuE;IAEvE,IAAI,EAAE,CAAC,MAAM;QAAE,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;IACxE,IAAI,EAAE,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAA;IACxD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,yDAAyD;AAClD,KAAK,UAAU,WAAW,CAAC,EAAc,EAAE,MAAc;IAC9D,IAAI,CAAC,WAAW,EAAE;QAAE,OAAM;IAC1B,MAAM,GAAG,GAAG,MAAM,CAAC,EAAE,CAAC,CAAA;IACtB,IAAI,CAAC,GAAG;QAAE,OAAM;IAChB,MAAM,SAAS,CAAC,aAAO,CAAC,GAAU,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;AAC9E,CAAC;AACM,KAAK,UAAU,YAAY,CAAC,EAAc,EAAE,MAAc;IAC/D,IAAI,CAAC,WAAW,EAAE;QAAE,OAAM;IAC1B,MAAM,GAAG,GAAG,MAAM,CAAC,EAAE,CAAC,CAAA;IACtB,IAAI,CAAC,GAAG;QAAE,OAAM;IAChB,MAAM,UAAU,CAAC,aAAO,CAAC,GAAU,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;AACnE,CAAC;AAED,yFAAyF;AAClF,KAAK,UAAU,SAAS,CAAC,EAAc;IAC5C,IAAI,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAA;IAC3C,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACnB,OAAO,cAAc,CAAC,EAAE,EAAE,EAAE,UAAU,EAAV,gBAAU,EAAE,WAAW,EAAX,iBAAW,EAAE,CAAC,CAAA;IACxD,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,CAAC,EAAE,CAAE,CAAA;IACvB,IAAI,CAAC;QACH,OAAO,MAAM,cAAc,CAAC,aAAO,CAAC,GAAU,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;IAClE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,IAAI,YAAwC,CAAA;AAC5C,iGAAiG;AACjG,SAAgB,oBAAoB;IAClC,IAAI,CAAC,WAAW,EAAE;QAAE,OAAO,GAAG,EAAE,GAAE,CAAC,CAAA;IACnC,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACtB,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,gBAAU,EAAE,CAAC;YACvC,SAAS,CAAC,aAAO,CAAC,GAAU,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;YACtE,MAAM,MAAM,GAAI,MAAc,CAAC,MAAM,CAAA;YACrC,IAAI,MAAM;gBAAE,SAAS,CAAC,aAAO,CAAC,GAAU,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QACtF,CAAC;IACH,CAAC,EAAE,KAAK,CAAC,CAAA;IACT,OAAO,GAAG,EAAE;QACV,IAAI,YAAY;YAAE,aAAa,CAAC,YAAY,CAAC,CAAA;IAC/C,CAAC,CAAA;AACH,CAAC"} \ No newline at end of file diff --git a/srv/queue/presence.ts b/srv/queue/presence.ts new file mode 100644 index 00000000..7d09df9c --- /dev/null +++ b/srv/queue/presence.ts @@ -0,0 +1,103 @@ +import { config } from '../config' +import { clients, isConnected, allSockets, userSockets } from '../api/ws/bus' + +const PRESENCE_TTL_MS = 75000 // 2.5x the 30s websocket ping interval + +export type PresenceId = { userId?: string; socketId?: string } + +export function userKey(userId: string) { + return `presence:u:${userId}` +} +export function guestKey(socketId: string) { + return `presence:g:${socketId}` +} +export function keyFor(id: PresenceId): string | undefined { + if (id.userId) return userKey(id.userId) + if (id.socketId) return guestKey(id.socketId) + return undefined +} + +function redisActive() { + return !!config.redis.host && isConnected() +} + +// --- Redis seam (pure over a client; unit-tested against a real redis) --- +export type PresenceCmd = { + zAdd: (key: string, member: { score: number; value: string }) => Promise + zRem: (key: string, member: string) => Promise + zCard: (key: string) => Promise + zRemRangeByScore: (key: string, min: number, max: number) => Promise + expire: (key: string, seconds: number) => Promise +} + +export async function markRedis(cmd: PresenceCmd, key: string, member: string, nowMs: number) { + await cmd.zAdd(key, { score: nowMs + PRESENCE_TTL_MS, value: member }) + await cmd.expire(key, Math.ceil(PRESENCE_TTL_MS / 1000) + 5) +} +export async function clearRedis(cmd: PresenceCmd, key: string, member: string) { + await cmd.zRem(key, member) +} +export async function isPresentRedis( + cmd: PresenceCmd, + key: string, + nowMs: number +): Promise { + await cmd.zRemRangeByScore(key, 0, nowMs) + const count = await cmd.zCard(key) + return count > 0 +} + +// --- Local seam (single-process: the live socket maps ARE the truth) --- +export function isPresentLocal( + id: PresenceId, + maps: { allSockets: Map; userSockets: Map } +): boolean { + if (id.userId) return (maps.userSockets.get(id.userId)?.length || 0) > 0 + if (id.socketId) return maps.allSockets.has(id.socketId) + return true +} + +// --- Public API (socket lifecycle + gate use these) --- +export async function markPresent(id: PresenceId, member: string) { + if (!redisActive()) return + const key = keyFor(id) + if (!key) return + await markRedis(clients.pub as any, key, member, Date.now()).catch(() => {}) +} +export async function clearPresent(id: PresenceId, member: string) { + if (!redisActive()) return + const key = keyFor(id) + if (!key) return + await clearRedis(clients.pub as any, key, member).catch(() => {}) +} + +/** True if the requester still has a live connection. Fails OPEN (true) on any error. */ +export async function isPresent(id: PresenceId): Promise { + if (!id.userId && !id.socketId) return true + if (!redisActive()) { + return isPresentLocal(id, { allSockets, userSockets }) + } + const key = keyFor(id)! + try { + return await isPresentRedis(clients.pub as any, key, Date.now()) + } catch { + return true + } +} + +let refreshTimer: NodeJS.Timeout | undefined +/** Periodically refresh presence TTLs for all locally-connected sockets. No-op without redis. */ +export function startPresenceRefresh(): () => void { + if (!redisActive()) return () => {} + refreshTimer = setInterval(() => { + const now = Date.now() + for (const [uid, socket] of allSockets) { + markRedis(clients.pub as any, guestKey(uid), uid, now).catch(() => {}) + const userId = (socket as any).userId + if (userId) markRedis(clients.pub as any, userKey(userId), uid, now).catch(() => {}) + } + }, 30000) + return () => { + if (refreshTimer) clearInterval(refreshTimer) + } +} diff --git a/srv/queue/redis.js b/srv/queue/redis.js new file mode 100644 index 00000000..4fbcf3e6 --- /dev/null +++ b/srv/queue/redis.js @@ -0,0 +1,198 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RedisBackend = void 0; +// KEYS: 1=active 2=wait 3=meta +// ARGV: 1=leaseId 2=kind 3=score 4=globalCap 5=imageCap 6=ttlMs 7=nowMs +const ACQUIRE = ` +local active, wait, meta = KEYS[1], KEYS[2], KEYS[3] +local id, kind, score = ARGV[1], ARGV[2], tonumber(ARGV[3]) +local gcap, icap = tonumber(ARGV[4]), tonumber(ARGV[5]) +local ttl, now = tonumber(ARGV[6]), tonumber(ARGV[7]) + +-- ensure we are registered as waiting (idempotent) +if redis.call('ZSCORE', wait, id) == false then + redis.call('ZADD', wait, score, id) +end + +-- reap expired leases +local all = redis.call('HGETALL', active) +local inflight, image = 0, 0 +for i = 1, #all, 2 do + local lid, val = all[i], all[i+1] + local sep = string.find(val, ':') + local lkind = string.sub(val, 1, sep-1) + local exp = tonumber(string.sub(val, sep+1)) + if exp < now then + redis.call('HDEL', active, lid) + else + inflight = inflight + 1 + if lkind == 'image' then image = image + 1 end + end +end + +local pause = redis.call('HGET', meta, 'pauseText') == '1' + +-- find highest-priority eligible waiter +local members = redis.call('ZRANGE', wait, 0, -1, 'WITHSCORES') +local chosen = nil +for i = 1, #members, 2 do + local mid = members[i] + -- we only know our own kind; eligibility for others is recomputed when they run. + -- Determine eligibility for THIS member only when it is us; otherwise use counts. + local eligible = false + if inflight < gcap then + if mid == id then + if kind == 'image' then eligible = (image < icap) else eligible = (not pause) end + else + -- unknown kind: treat as eligible by global room so true head-of-line is respected; + -- the member re-checks its own predicate on its own call. + eligible = true + end + end + if eligible then chosen = mid break end +end + +if chosen == id then + redis.call('ZREM', wait, id) + redis.call('HSET', active, id, kind .. ':' .. tostring(now + ttl)) + return {1, 0} +end + +local rank = redis.call('ZRANK', wait, id) +return {0, (rank or 0) + 1} +`; +// KEYS: 1=active ; ARGV: 1=leaseId +const RELEASE = `return redis.call('HDEL', KEYS[1], ARGV[1])`; +// KEYS: 1=active ; ARGV: 1=leaseId 2=kind 3=ttlMs 4=nowMs +const HEARTBEAT = ` +local cur = redis.call('HGET', KEYS[1], ARGV[1]) +if cur == false then return 0 end +redis.call('HSET', KEYS[1], ARGV[1], ARGV[2] .. ':' .. tostring(tonumber(ARGV[4]) + tonumber(ARGV[3]))) +return 1 +`; +class RedisBackend { + constructor(opts) { + this.active = '·'; + this.wait = '·'; + this.meta = '·'; + this.freeChan = '·'; + this.heartbeats = new Map(); + this.wakeups = new Set(); + this.subscribed = false; + this.caps = opts.caps; + this.cmd = opts.cmd; + this.sub = opts.sub; + this.prefix = opts.keyPrefix || 'gate'; + this.ttlMs = opts.ttlMs ?? 30000; + this.heartbeatMs = opts.heartbeatMs ?? 10000; + this.active = `${this.prefix}:active`; + this.wait = `${this.prefix}:wait`; + this.meta = `${this.prefix}:meta`; + this.freeChan = `${this.prefix}:free`; + } + async ensureSubscribed() { + if (this.subscribed) + return; + this.subscribed = true; + await this.sub.subscribe(this.freeChan, () => { + for (const wake of this.wakeups) + wake(); + }); + } + setPauseText(pause) { + this.cmd.hSet(this.meta, 'pauseText', pause ? '1' : '0').catch(() => { }); + } + async acquire(req) { + await this.ensureSubscribed(); + const score = String(req.priority * 1e13 + req.enqueuedAt); + let lastPosition = -1; + const tryAcquire = async () => { + const [ok, position] = await this.cmd.eval(ACQUIRE, { + keys: [this.active, this.wait, this.meta], + arguments: [ + req.id, + req.kind, + score, + String(this.caps.global), + String(this.caps.image), + String(this.ttlMs), + String(Date.now()), + ], + }); + return { ok: ok === 1, position: Number(position) }; + }; + try { + while (true) { + if (req.signal?.aborted) { + await this.removeWaiter(req.id); + throw new Error('aborted'); + } + const { ok, position } = await tryAcquire(); + if (ok) { + this.startHeartbeat(req.id, req.kind); + return; + } + if (req.onPosition && position !== lastPosition) { + lastPosition = position; + req.onPosition(position); + } + await this.waitForWake(req.signal); + } + } + catch (err) { + // Any failure (Redis eval error, abort) must not orphan our waiter in the + // gate:wait ZSET — it has no TTL/reaper, and a stale head would block other + // waiters. ZREM self (best-effort) before propagating. + await this.removeWaiter(req.id).catch(() => { }); + throw err; + } + } + waitForWake(signal) { + return new Promise((resolve) => { + const wake = () => { + cleanup(); + resolve(); + }; + const timer = setTimeout(wake, 1000); // safety re-poll + const onAbort = () => wake(); + const cleanup = () => { + clearTimeout(timer); + this.wakeups.delete(wake); + if (signal) + signal.removeEventListener('abort', onAbort); + }; + this.wakeups.add(wake); + if (signal) + signal.addEventListener('abort', onAbort); + }); + } + startHeartbeat(id, kind) { + const timer = setInterval(() => { + this.cmd + .eval(HEARTBEAT, { + keys: [this.active], + arguments: [id, kind, String(this.ttlMs), String(Date.now())], + }) + .catch(() => { }); + }, this.heartbeatMs); + this.heartbeats.set(id, timer); + } + async removeWaiter(id) { + // ZREM via eval to avoid widening the RedisCmd interface + await this.cmd + .eval(`return redis.call('ZREM', KEYS[1], ARGV[1])`, { keys: [this.wait], arguments: [id] }) + .catch(() => { }); + await this.cmd.publish(this.freeChan, '1').catch(() => { }); + } + async release(id) { + const timer = this.heartbeats.get(id); + if (timer) { + clearInterval(timer); + this.heartbeats.delete(id); + } + await this.cmd.eval(RELEASE, { keys: [this.active], arguments: [id] }).catch(() => { }); + await this.cmd.publish(this.freeChan, '1').catch(() => { }); + } +} +exports.RedisBackend = RedisBackend; +//# sourceMappingURL=redis.js.map \ No newline at end of file diff --git a/srv/queue/redis.js.map b/srv/queue/redis.js.map new file mode 100644 index 00000000..a802feaf --- /dev/null +++ b/srv/queue/redis.js.map @@ -0,0 +1 @@ +{"version":3,"file":"redis.js","sourceRoot":"","sources":["redis.ts"],"names":[],"mappings":";;;AAaA,+BAA+B;AAC/B,wEAAwE;AACxE,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyDf,CAAA;AAED,mCAAmC;AACnC,MAAM,OAAO,GAAG,6CAA6C,CAAA;AAE7D,0DAA0D;AAC1D,MAAM,SAAS,GAAG;;;;;CAKjB,CAAA;AAED,MAAa,YAAY;IAevB,YAAY,IAOX;QAfO,WAAM,GAAG,GAAG,CAAA;QACZ,SAAI,GAAG,GAAG,CAAA;QACV,SAAI,GAAG,GAAG,CAAA;QACV,aAAQ,GAAG,GAAG,CAAA;QACd,eAAU,GAAG,IAAI,GAAG,EAA0B,CAAA;QAC9C,YAAO,GAAG,IAAI,GAAG,EAAc,CAAA;QAC/B,eAAU,GAAG,KAAK,CAAA;QAUxB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;QACrB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAA;QACnB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAA;QACnB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,IAAI,MAAM,CAAA;QACtC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,KAAK,CAAA;QAChC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,KAAK,CAAA;QAC5C,IAAI,CAAC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,SAAS,CAAA;QACrC,IAAI,CAAC,IAAI,GAAG,GAAG,IAAI,CAAC,MAAM,OAAO,CAAA;QACjC,IAAI,CAAC,IAAI,GAAG,GAAG,IAAI,CAAC,MAAM,OAAO,CAAA;QACjC,IAAI,CAAC,QAAQ,GAAG,GAAG,IAAI,CAAC,MAAM,OAAO,CAAA;IACvC,CAAC;IAEO,KAAK,CAAC,gBAAgB;QAC5B,IAAI,IAAI,CAAC,UAAU;YAAE,OAAM;QAC3B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA;QACtB,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE;YAC3C,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,OAAO;gBAAE,IAAI,EAAE,CAAA;QACzC,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,YAAY,CAAC,KAAc;QACzB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;IAC1E,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAe;QAC3B,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAA;QAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,GAAG,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC,CAAA;QAC1D,IAAI,YAAY,GAAG,CAAC,CAAC,CAAA;QAErB,MAAM,UAAU,GAAG,KAAK,IAAgD,EAAE;YACxE,MAAM,CAAC,EAAE,EAAE,QAAQ,CAAC,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE;gBAClD,IAAI,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC;gBACzC,SAAS,EAAE;oBACT,GAAG,CAAC,EAAE;oBACN,GAAG,CAAC,IAAI;oBACR,KAAK;oBACL,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;oBACxB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;oBACvB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;oBAClB,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;iBACnB;aACF,CAAC,CAAA;YACF,OAAO,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAA;QACrD,CAAC,CAAA;QAED,IAAI,CAAC;YACH,OAAO,IAAI,EAAE,CAAC;gBACZ,IAAI,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;oBACxB,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;oBAC/B,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAA;gBAC5B,CAAC;gBACD,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,MAAM,UAAU,EAAE,CAAA;gBAC3C,IAAI,EAAE,EAAE,CAAC;oBACP,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,CAAA;oBACrC,OAAM;gBACR,CAAC;gBACD,IAAI,GAAG,CAAC,UAAU,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;oBAChD,YAAY,GAAG,QAAQ,CAAA;oBACvB,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAA;gBAC1B,CAAC;gBACD,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;YACpC,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,0EAA0E;YAC1E,4EAA4E;YAC5E,uDAAuD;YACvD,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;YAC/C,MAAM,GAAG,CAAA;QACX,CAAC;IACH,CAAC;IAEO,WAAW,CAAC,MAAoB;QACtC,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YACnC,MAAM,IAAI,GAAG,GAAG,EAAE;gBAChB,OAAO,EAAE,CAAA;gBACT,OAAO,EAAE,CAAA;YACX,CAAC,CAAA;YACD,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA,CAAC,iBAAiB;YACtD,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,IAAI,EAAE,CAAA;YAC5B,MAAM,OAAO,GAAG,GAAG,EAAE;gBACnB,YAAY,CAAC,KAAK,CAAC,CAAA;gBACnB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;gBACzB,IAAI,MAAM;oBAAE,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;YAC1D,CAAC,CAAA;YACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YACtB,IAAI,MAAM;gBAAE,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QACvD,CAAC,CAAC,CAAA;IACJ,CAAC;IAEO,cAAc,CAAC,EAAU,EAAE,IAAY;QAC7C,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;YAC7B,IAAI,CAAC,GAAG;iBACL,IAAI,CAAC,SAAS,EAAE;gBACf,IAAI,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;gBACnB,SAAS,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;aAC9D,CAAC;iBACD,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QACpB,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAA;QACpB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;IAChC,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,EAAU;QACnC,yDAAyD;QACzD,MAAM,IAAI,CAAC,GAAG;aACX,IAAI,CAAC,6CAA6C,EAAE,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;aAC3F,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QAClB,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;IAC5D,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,EAAU;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACrC,IAAI,KAAK,EAAE,CAAC;YACV,aAAa,CAAC,KAAK,CAAC,CAAA;YACpB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QAC5B,CAAC;QACD,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QACtF,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;IAC5D,CAAC;CACF;AA7ID,oCA6IC"} \ No newline at end of file diff --git a/srv/queue/redis.ts b/srv/queue/redis.ts new file mode 100644 index 00000000..22a8112c --- /dev/null +++ b/srv/queue/redis.ts @@ -0,0 +1,227 @@ +import { AcquireReq, GateBackend } from './local' +import { Caps } from './types' + +export type RedisCmd = { + eval: (script: string, opts: { keys: string[]; arguments: string[] }) => Promise + publish: (channel: string, message: string) => Promise + hSet: (key: string, field: string, value: string) => Promise +} + +export type RedisSub = { + subscribe: (channel: string, listener: (message: string) => void) => Promise +} + +// KEYS: 1=active 2=wait 3=meta +// ARGV: 1=leaseId 2=kind 3=score 4=globalCap 5=imageCap 6=ttlMs 7=nowMs +const ACQUIRE = ` +local active, wait, meta = KEYS[1], KEYS[2], KEYS[3] +local id, kind, score = ARGV[1], ARGV[2], tonumber(ARGV[3]) +local gcap, icap = tonumber(ARGV[4]), tonumber(ARGV[5]) +local ttl, now = tonumber(ARGV[6]), tonumber(ARGV[7]) + +-- ensure we are registered as waiting (idempotent) +if redis.call('ZSCORE', wait, id) == false then + redis.call('ZADD', wait, score, id) +end + +-- reap expired leases +local all = redis.call('HGETALL', active) +local inflight, image = 0, 0 +for i = 1, #all, 2 do + local lid, val = all[i], all[i+1] + local sep = string.find(val, ':') + local lkind = string.sub(val, 1, sep-1) + local exp = tonumber(string.sub(val, sep+1)) + if exp < now then + redis.call('HDEL', active, lid) + else + inflight = inflight + 1 + if lkind == 'image' then image = image + 1 end + end +end + +local pause = redis.call('HGET', meta, 'pauseText') == '1' + +-- find highest-priority eligible waiter +local members = redis.call('ZRANGE', wait, 0, -1, 'WITHSCORES') +local chosen = nil +for i = 1, #members, 2 do + local mid = members[i] + -- we only know our own kind; eligibility for others is recomputed when they run. + -- Determine eligibility for THIS member only when it is us; otherwise use counts. + local eligible = false + if inflight < gcap then + if mid == id then + if kind == 'image' then eligible = (image < icap) else eligible = (not pause) end + else + -- unknown kind: treat as eligible by global room so true head-of-line is respected; + -- the member re-checks its own predicate on its own call. + eligible = true + end + end + if eligible then chosen = mid break end +end + +if chosen == id then + redis.call('ZREM', wait, id) + redis.call('HSET', active, id, kind .. ':' .. tostring(now + ttl)) + return {1, 0} +end + +local rank = redis.call('ZRANK', wait, id) +return {0, (rank or 0) + 1} +` + +// KEYS: 1=active ; ARGV: 1=leaseId +const RELEASE = `return redis.call('HDEL', KEYS[1], ARGV[1])` + +// KEYS: 1=active ; ARGV: 1=leaseId 2=kind 3=ttlMs 4=nowMs +const HEARTBEAT = ` +local cur = redis.call('HGET', KEYS[1], ARGV[1]) +if cur == false then return 0 end +redis.call('HSET', KEYS[1], ARGV[1], ARGV[2] .. ':' .. tostring(tonumber(ARGV[4]) + tonumber(ARGV[3]))) +return 1 +` + +export class RedisBackend implements GateBackend { + private caps: Caps + private cmd: RedisCmd + private sub: RedisSub + private prefix: string + private ttlMs: number + private heartbeatMs: number + private active = '·' + private wait = '·' + private meta = '·' + private freeChan = '·' + private heartbeats = new Map() + private wakeups = new Set<() => void>() + private subscribed = false + + constructor(opts: { + caps: Caps + cmd: RedisCmd + sub: RedisSub + keyPrefix?: string + ttlMs?: number + heartbeatMs?: number + }) { + this.caps = opts.caps + this.cmd = opts.cmd + this.sub = opts.sub + this.prefix = opts.keyPrefix || 'gate' + this.ttlMs = opts.ttlMs ?? 30000 + this.heartbeatMs = opts.heartbeatMs ?? 10000 + this.active = `${this.prefix}:active` + this.wait = `${this.prefix}:wait` + this.meta = `${this.prefix}:meta` + this.freeChan = `${this.prefix}:free` + } + + private async ensureSubscribed() { + if (this.subscribed) return + this.subscribed = true + await this.sub.subscribe(this.freeChan, () => { + for (const wake of this.wakeups) wake() + }) + } + + setPauseText(pause: boolean): void { + this.cmd.hSet(this.meta, 'pauseText', pause ? '1' : '0').catch(() => {}) + } + + async acquire(req: AcquireReq): Promise { + await this.ensureSubscribed() + const score = String(req.priority * 1e13 + req.enqueuedAt) + let lastPosition = -1 + + const tryAcquire = async (): Promise<{ ok: boolean; position: number }> => { + const [ok, position] = await this.cmd.eval(ACQUIRE, { + keys: [this.active, this.wait, this.meta], + arguments: [ + req.id, + req.kind, + score, + String(this.caps.global), + String(this.caps.image), + String(this.ttlMs), + String(Date.now()), + ], + }) + return { ok: ok === 1, position: Number(position) } + } + + try { + while (true) { + if (req.signal?.aborted) { + await this.removeWaiter(req.id) + throw new Error('aborted') + } + const { ok, position } = await tryAcquire() + if (ok) { + this.startHeartbeat(req.id, req.kind) + return + } + if (req.onPosition && position !== lastPosition) { + lastPosition = position + req.onPosition(position) + } + await this.waitForWake(req.signal) + } + } catch (err) { + // Any failure (Redis eval error, abort) must not orphan our waiter in the + // gate:wait ZSET — it has no TTL/reaper, and a stale head would block other + // waiters. ZREM self (best-effort) before propagating. + await this.removeWaiter(req.id).catch(() => {}) + throw err + } + } + + private waitForWake(signal?: AbortSignal): Promise { + return new Promise((resolve) => { + const wake = () => { + cleanup() + resolve() + } + const timer = setTimeout(wake, 1000) // safety re-poll + const onAbort = () => wake() + const cleanup = () => { + clearTimeout(timer) + this.wakeups.delete(wake) + if (signal) signal.removeEventListener('abort', onAbort) + } + this.wakeups.add(wake) + if (signal) signal.addEventListener('abort', onAbort) + }) + } + + private startHeartbeat(id: string, kind: string) { + const timer = setInterval(() => { + this.cmd + .eval(HEARTBEAT, { + keys: [this.active], + arguments: [id, kind, String(this.ttlMs), String(Date.now())], + }) + .catch(() => {}) + }, this.heartbeatMs) + this.heartbeats.set(id, timer) + } + + private async removeWaiter(id: string) { + // ZREM via eval to avoid widening the RedisCmd interface + await this.cmd + .eval(`return redis.call('ZREM', KEYS[1], ARGV[1])`, { keys: [this.wait], arguments: [id] }) + .catch(() => {}) + await this.cmd.publish(this.freeChan, '1').catch(() => {}) + } + + async release(id: string): Promise { + const timer = this.heartbeats.get(id) + if (timer) { + clearInterval(timer) + this.heartbeats.delete(id) + } + await this.cmd.eval(RELEASE, { keys: [this.active], arguments: [id] }).catch(() => {}) + await this.cmd.publish(this.freeChan, '1').catch(() => {}) + } +} diff --git a/srv/queue/types.js b/srv/queue/types.js new file mode 100644 index 00000000..101857e0 --- /dev/null +++ b/srv/queue/types.js @@ -0,0 +1,33 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.waiterScore = waiterScore; +exports.isEligible = isEligible; +exports.selectNext = selectNext; +/** Lower result = served sooner. Priority dominates; enqueue time is the tiebreak. */ +function waiterScore(priority, enqueuedAt) { + return priority * 1e13 + enqueuedAt; +} +/** Can a waiter of `kind` be admitted right now? `pauseText` = breaker tripped. */ +function isEligible(kind, counts, caps, pauseText) { + if (counts.inflight >= caps.global) + return false; + if (kind === 'image') + return counts.image < caps.image; + return !pauseText; +} +/** Highest-priority waiter whose predicate currently passes (eligibility-aware, not strict positional FIFO). */ +function selectNext(waiters, counts, caps, pauseText) { + let best; + let bestScore = Infinity; + for (const w of waiters) { + if (!isEligible(w.kind, counts, caps, pauseText)) + continue; + const s = waiterScore(w.priority, w.enqueuedAt); + if (s < bestScore) { + bestScore = s; + best = w; + } + } + return best; +} +//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/srv/queue/types.ts b/srv/queue/types.ts new file mode 100644 index 00000000..45d2a39c --- /dev/null +++ b/srv/queue/types.ts @@ -0,0 +1,43 @@ +export type Kind = 'text' | 'image' +export type Priority = 0 | 1 | 2 | 3 +export type Caps = { global: number; image: number } +export type Counts = { inflight: number; image: number } + +export type Waiter = { + id: string + kind: Kind + priority: Priority + enqueuedAt: number +} + +/** Lower result = served sooner. Priority dominates; enqueue time is the tiebreak. */ +export function waiterScore(priority: number, enqueuedAt: number): number { + return priority * 1e13 + enqueuedAt +} + +/** Can a waiter of `kind` be admitted right now? `pauseText` = breaker tripped. */ +export function isEligible(kind: Kind, counts: Counts, caps: Caps, pauseText: boolean): boolean { + if (counts.inflight >= caps.global) return false + if (kind === 'image') return counts.image < caps.image + return !pauseText +} + +/** Highest-priority waiter whose predicate currently passes (eligibility-aware, not strict positional FIFO). */ +export function selectNext( + waiters: Waiter[], + counts: Counts, + caps: Caps, + pauseText: boolean +): Waiter | undefined { + let best: Waiter | undefined + let bestScore = Infinity + for (const w of waiters) { + if (!isEligible(w.kind, counts, caps, pauseText)) continue + const s = waiterScore(w.priority, w.enqueuedAt) + if (s < bestScore) { + bestScore = s + best = w + } + } + return best +} diff --git a/srv/start.js b/srv/start.js new file mode 100644 index 00000000..d381f87e --- /dev/null +++ b/srv/start.js @@ -0,0 +1,118 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.start = start; +require("module-alias/register"); +const tokenize_1 = require("./tokenize"); +const os = __importStar(require("os")); +const throng_1 = __importDefault(require("throng")); +const ws_1 = require("./api/ws"); +const queue_1 = require("./queue"); +const app_1 = require("./app"); +const config_1 = require("./config"); +const db_1 = require("./db"); +const client_1 = require("./db/client"); +const middleware_1 = require("./middleware"); +const domains_1 = require("./domains"); +const pkg = require('../package.json'); +async function start() { + // No longer accept requests when shutting down + // Allow as many responses currently generating to complete as possible during the shutdown window + // The shutdown window is ~10 seconds + const { server } = (0, app_1.createApp)(); + process.on('SIGTERM', () => { + middleware_1.logger.warn(`Received SIGTERM. Server shutting down.`); + server.close(); + }); + process.on('uncaughtException', (ex) => { + middleware_1.logger.error({ msg: ex?.message, err: ex, stack: ex.stack }, 'Unhandled exception'); + }); + process.on('unhandledRejection', (ex) => { + middleware_1.logger.error({ msg: ex?.message, err: ex, stack: ex.stack }, 'Unhandled rejection'); + }); + (0, tokenize_1.prepareTokenizers)(); + await Promise.allSettled([initDb(), (0, ws_1.initMessageBus)()]); + (0, queue_1.startQueue)(); + server.on('error', (err) => { + middleware_1.logger.error({ cause: err.message }, 'Failed to start API'); + }); + server.listen(config_1.config.port, config_1.config.host, async () => { + middleware_1.logger.info({ port: config_1.config.port, version: pkg.version }, `Server started http://127.0.0.1:${config_1.config.port} (Listening: ${config_1.config.host})`); + }); + if (config_1.config.jsonStorage) { + middleware_1.logger.info(`JSON storage enabled for guests: ${config_1.config.jsonFolder}`); + } +} +async function initDb() { + if (config_1.config.ui.maintenance) { + middleware_1.logger.warn(`Maintenance mode enabled: Will not connect to database`); + return; + } + const db = await (0, client_1.connect)(); + if (db) { + await (0, client_1.createIndexes)(); + await (0, domains_1.setupDomain)(); + // Initialise settings if empty + await db_1.store.users.ensureInitialUser(); + } +} +async function startWorker(id) { + if (id) + middleware_1.logger.setBindings({ w_id: id }); + await start().catch((error) => { + middleware_1.logger.error(error, 'Server startup failed'); + process.exit(1); + }); +} +if (config_1.config.clustering) { + const count = !isNaN(config_1.config.clusterWorkers) && config_1.config.clusterWorkers > 0 + ? config_1.config.clusterWorkers + : os.cpus().length; + middleware_1.logger.info('Using clustering'); + (0, throng_1.default)({ + worker: startWorker, + lifetime: Infinity, + count, + grace: 2000, + signals: ['SIGTERM', 'SIGINT'], + }); +} +else { + startWorker(); +} +//# sourceMappingURL=start.js.map \ No newline at end of file diff --git a/srv/start.js.map b/srv/start.js.map new file mode 100644 index 00000000..d6aac00b --- /dev/null +++ b/srv/start.js.map @@ -0,0 +1 @@ +{"version":3,"file":"start.js","sourceRoot":"","sources":["start.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcA,sBAqCC;AAnDD,iCAA8B;AAC9B,yCAA8C;AAC9C,uCAAwB;AACxB,oDAA2B;AAC3B,iCAAyC;AACzC,mCAAoC;AACpC,+BAAiC;AACjC,qCAAiC;AACjC,6BAA4B;AAC5B,wCAAoD;AACpD,6CAAqC;AACrC,uCAAuC;AACvC,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAA;AAE/B,KAAK,UAAU,KAAK;IACzB,+CAA+C;IAC/C,kGAAkG;IAClG,qCAAqC;IACrC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,eAAS,GAAE,CAAA;IAE9B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;QACzB,mBAAM,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAA;QACtD,MAAM,CAAC,KAAK,EAAE,CAAA;IAChB,CAAC,CAAC,CAAA;IAEF,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,EAAE,EAAE,EAAE;QACrC,mBAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,qBAAqB,CAAC,CAAA;IACrF,CAAC,CAAC,CAAA;IAEF,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,EAAO,EAAE,EAAE;QAC3C,mBAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,qBAAqB,CAAC,CAAA;IACrF,CAAC,CAAC,CAAA;IAEF,IAAA,4BAAiB,GAAE,CAAA;IACnB,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,EAAE,IAAA,mBAAc,GAAE,CAAC,CAAC,CAAA;IACtD,IAAA,kBAAU,GAAE,CAAA;IAEZ,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;QACzB,mBAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,EAAE,qBAAqB,CAAC,CAAA;IAC7D,CAAC,CAAC,CAAA;IAEF,MAAM,CAAC,MAAM,CAAC,eAAM,CAAC,IAAI,EAAE,eAAM,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE;QACjD,mBAAM,CAAC,IAAI,CACT,EAAE,IAAI,EAAE,eAAM,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,EAC3C,mCAAmC,eAAM,CAAC,IAAI,gBAAgB,eAAM,CAAC,IAAI,GAAG,CAC7E,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,IAAI,eAAM,CAAC,WAAW,EAAE,CAAC;QACvB,mBAAM,CAAC,IAAI,CAAC,oCAAoC,eAAM,CAAC,UAAU,EAAE,CAAC,CAAA;IACtE,CAAC;AACH,CAAC;AAED,KAAK,UAAU,MAAM;IACnB,IAAI,eAAM,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;QAC1B,mBAAM,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAA;QACrE,OAAM;IACR,CAAC;IAED,MAAM,EAAE,GAAG,MAAM,IAAA,gBAAO,GAAE,CAAA;IAC1B,IAAI,EAAE,EAAE,CAAC;QACP,MAAM,IAAA,sBAAa,GAAE,CAAA;QACrB,MAAM,IAAA,qBAAW,GAAE,CAAA;QACnB,+BAA+B;QAC/B,MAAM,UAAK,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAA;IACvC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,EAAW;IACpC,IAAI,EAAE;QAAE,mBAAM,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAA;IAExC,MAAM,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QAC5B,mBAAM,CAAC,KAAK,CAAC,KAAK,EAAE,uBAAuB,CAAC,CAAA;QAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,IAAI,eAAM,CAAC,UAAU,EAAE,CAAC;IACtB,MAAM,KAAK,GACT,CAAC,KAAK,CAAC,eAAM,CAAC,cAAc,CAAC,IAAI,eAAM,CAAC,cAAc,GAAG,CAAC;QACxD,CAAC,CAAC,eAAM,CAAC,cAAc;QACvB,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,CAAA;IACtB,mBAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;IAC/B,IAAA,gBAAM,EAAC;QACL,MAAM,EAAE,WAAW;QACnB,QAAQ,EAAE,QAAQ;QAClB,KAAK;QACL,KAAK,EAAE,IAAI;QACX,OAAO,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC;KAC/B,CAAC,CAAA;AACJ,CAAC;KAAM,CAAC;IACN,WAAW,EAAE,CAAA;AACf,CAAC"} \ No newline at end of file diff --git a/srv/start.ts b/srv/start.ts index c1386186..03448f75 100644 --- a/srv/start.ts +++ b/srv/start.ts @@ -1,9 +1,9 @@ import 'module-alias/register' import { prepareTokenizers } from './tokenize' -import lt from 'localtunnel' import * as os from 'os' import throng from 'throng' import { initMessageBus } from './api/ws' +import { startQueue } from './queue' import { createApp } from './app' import { config } from './config' import { store } from './db' @@ -33,6 +33,7 @@ export async function start() { prepareTokenizers() await Promise.allSettled([initDb(), initMessageBus()]) + startQueue() server.on('error', (err) => { logger.error({ cause: err.message }, 'Failed to start API') @@ -43,10 +44,6 @@ export async function start() { { port: config.port, version: pkg.version }, `Server started http://127.0.0.1:${config.port} (Listening: ${config.host})` ) - - if (config.publicTunnel) { - await startTunnel() - } }) if (config.jsonStorage) { @@ -94,12 +91,3 @@ if (config.clustering) { } else { startWorker() } - -async function startTunnel() { - const proxy = await lt({ port: config.port }) - logger.info(`[LocalTunnel] Charluv public URL: ${proxy.url}`) - - proxy.on('close', () => { - logger.warn('[LocalTunnel] Agnaistic public URL close') - }) -} diff --git a/srv/textgen.ts b/srv/textgen.ts new file mode 100644 index 00000000..d1728fd7 --- /dev/null +++ b/srv/textgen.ts @@ -0,0 +1,95 @@ +import needle from 'needle' +import { config } from './config' +import { logger } from './middleware' + +/** + * Minimal non-streaming chat completion against the self-hosted, OpenAI-compatible + * text endpoint (vLLM in OpenAI mode). For small internal tasks — classification, + * extraction, summarisation — NOT user-facing generation, which goes through the + * full streaming adapter. Shared server-side utility; returns null when the + * endpoint is unconfigured or errors so callers can fall back deterministically. + */ +/** + * Pick the endpoint for small internal tasks (classification, extraction). These + * run on the original orchestration model (the moderation/"mod" endpoint, Qwen) — + * it handles structured/JSON tasks better than the user-facing chat finetune + * (tutu). Falls back to the text endpoint when no separate mod endpoint is set, so + * single-endpoint deployments are unchanged. + */ +function utilityEndpoint() { + const inf = config.inference + return inf.modUrl + ? { + url: inf.modUrl, + key: inf.modApiKey || inf.textApiKey, + model: inf.modModel || inf.textModel, + } + : { url: inf.textUrl, key: inf.textApiKey, model: inf.textModel } +} + +export function isTextLlmConfigured() { + return !!(config.inference.modUrl || config.inference.textUrl) +} + +function chatUrl(base: string) { + const url = (base || '').replace(/\/+$/, '') + if (!url) return '' + const version = url.match(/\/v\d+$/) ? '' : '/v1' + return `${url}${version}/chat/completions` +} + +export async function classify( + system: string, + user: string, + opts: { maxTokens?: number; timeoutMs?: number } = {} +): Promise { + const endpoint = utilityEndpoint() + const url = chatUrl(endpoint.url) + if (!url) return null + + const headers: Record = { 'Content-Type': 'application/json' } + if (endpoint.key) headers.Authorization = `Bearer ${endpoint.key}` + + const body = { + model: endpoint.model || 'default', + messages: [ + { role: 'system', content: system }, + { role: 'user', content: user }, + ], + temperature: 0, + max_tokens: opts.maxTokens ?? 200, + stream: false, + } + + const timeout = opts.timeoutMs ?? 8000 + const result: any = await needle('post', url, body, { + json: true, + headers, + response_timeout: timeout, + read_timeout: timeout, + }).catch((err) => ({ err })) + + if (!result || 'err' in result) { + logger.warn({ err: result?.err?.message || result?.err }, 'memory: classify request failed') + return null + } + if (result.statusCode && result.statusCode >= 400) { + logger.warn({ status: result.statusCode }, 'memory: classify request rejected') + return null + } + + const content = result.body?.choices?.[0]?.message?.content + return typeof content === 'string' ? content : null +} + +/** Extract the first JSON object from a model response (tolerates prose/fences). */ +export function parseJsonObject(text: string | null): T | null { + if (!text) return null + const match = text.match(/\{[\s\S]*\}/) + if (!match) return null + try { + return JSON.parse(match[0]) as T + } catch { + return null + } +} diff --git a/srv/tokenize.ts b/srv/tokenize.ts index 1f680317..0cbd3399 100644 --- a/srv/tokenize.ts +++ b/srv/tokenize.ts @@ -3,15 +3,12 @@ import * as mlc from '@agnai/web-tokenizers' import fs, { readFileSync } from 'fs' import { init } from '@dqbd/tiktoken/lite/init' import { encoding_for_model } from '@dqbd/tiktoken' -import { AIAdapter, NOVEL_MODELS, OPENAI_MODELS } from '../common/adapters' +import { AIAdapter, OPENAI_MODELS } from '../common/adapters' import { resolve } from 'path' -import * as nai from 'nai-js-tokenizer' import { logger } from './middleware' import { AppSchema, Encoder, TokenCounter, Tokenizer } from '/common/types' const claudeJson = readFileSync(resolve(__dirname, 'sp-models', 'claude.json')) -const pileJson = readFileSync(resolve(__dirname, 'sp-models', 'pile_tokenizer.json')) -const gpt2Json = readFileSync(resolve(__dirname, 'sp-models', 'gpt2_tokenizer.json')) const cohereJson = readFileSync(resolve(__dirname, 'sp-models', 'cohere.json')) const qwen2Json = readFileSync(resolve(__dirname, 'sp-models', 'qwen2.json')) const llama3Json = readFileSync(resolve(__dirname, 'sp-models', 'llama3.json')) @@ -20,8 +17,6 @@ let claudeEncoder: Tokenizer let cohereEncoder: Tokenizer let qwen2Encoder: Tokenizer let llama3Encoder: Tokenizer -let krake: Encoder -let euterpe: Encoder let gemma: Encoder const davinciEncoder = encoding_for_model('text-davinci-003') @@ -35,7 +30,6 @@ let llama: Encoder let claude: Encoder let davinci: Encoder let turbo: Encoder -let mistral: Encoder let yi: Encoder let cohere: Encoder let llama3: Encoder @@ -85,7 +79,6 @@ export function getTokenCounter( export function getEncoderByName(type: EncoderType) { switch (type) { - case 'yi': return yi @@ -122,28 +115,12 @@ export function getEncoderByName(type: EncoderType) { } export function getEncoder(adapter: AIAdapter | 'main', model?: string): Encoder { - if ( - adapter === 'agnaistic' || - adapter === 'replicate' || - adapter === 'ooba' || - adapter === 'kobold' || - adapter === 'horde' || - adapter === 'goose' || - adapter === 'mancer' - ) { + if (adapter === 'charluv' || adapter === 'ooba' || adapter === 'kobold' || adapter === 'horde') { return llama } if (adapter === 'claude') return claude ?? main - if (adapter === 'novel') { - if (model === NOVEL_MODELS['llama-3-erato-v1']) return llama3 - if (model === NOVEL_MODELS.kayra_v1) return novelModern - if (model === NOVEL_MODELS.clio_v1) return novel - if (model === NOVEL_MODELS.krake) return krake - return euterpe - } - if (model === OPENAI_MODELS.DaVinci) { return davinci ?? main } @@ -155,35 +132,7 @@ export function getEncoder(adapter: AIAdapter | 'main', model?: string): Encoder return main } -{ - const json = JSON.parse(gpt2Json.toString()) - const tokenizer = new nai.Encoder(json.vocab, json.merges, json.specialTokens, json.config) - euterpe = { - encode: (value) => { - const tokens = tokenizer.encode(value) - return tokens - }, - decode: (tokens) => { - return tokenizer.decode(tokens) - }, - count: (value) => tokenizer.encode(value).length, - } -} - -{ - const json = JSON.parse(pileJson.toString()) - const tokenizer = new nai.Encoder(json.vocab, json.merges, json.specialTokens, json.config) - krake = { - encode: (value) => { - const tokens = tokenizer.encode(value) - return tokens - }, - decode: (tokens) => { - return tokenizer.decode(tokens) - }, - count: (value) => tokenizer.encode(value).length, - } -} +// gpt2 (euterpe) and pile (krake) NAI tokenizers removed — unused in Charluv export async function prepareTokenizers() { try { @@ -222,7 +171,12 @@ export async function prepareTokenizers() { } } { - claudeEncoder = await mlc.Tokenizer.fromJSON(claudeJson) + claudeEncoder = await mlc.Tokenizer.fromJSON( + claudeJson.buffer.slice( + claudeJson.byteOffset, + claudeJson.byteOffset + claudeJson.byteLength + ) as ArrayBuffer + ) claude = { decode: (tokens) => claudeEncoder.decode(Int32Array.from(tokens)), encode: (value) => { @@ -236,7 +190,12 @@ export async function prepareTokenizers() { } } { - cohereEncoder = await mlc.Tokenizer.fromJSON(cohereJson) + cohereEncoder = await mlc.Tokenizer.fromJSON( + cohereJson.buffer.slice( + cohereJson.byteOffset, + cohereJson.byteOffset + cohereJson.byteLength + ) as ArrayBuffer + ) cohere = { decode: (tokens) => cohereEncoder.decode(Int32Array.from(tokens)), encode: (value) => { @@ -250,7 +209,12 @@ export async function prepareTokenizers() { } } { - llama3Encoder = await mlc.Tokenizer.fromJSON(llama3Json) + llama3Encoder = await mlc.Tokenizer.fromJSON( + llama3Json.buffer.slice( + llama3Json.byteOffset, + llama3Json.byteOffset + llama3Json.byteLength + ) as ArrayBuffer + ) llama3 = { decode: (tokens) => llama3Encoder.decode(Int32Array.from(tokens)), encode: (value) => { @@ -264,7 +228,12 @@ export async function prepareTokenizers() { } } { - qwen2Encoder = await mlc.Tokenizer.fromJSON(qwen2Json) + qwen2Encoder = await mlc.Tokenizer.fromJSON( + qwen2Json.buffer.slice( + qwen2Json.byteOffset, + qwen2Json.byteOffset + qwen2Json.byteLength + ) as ArrayBuffer + ) qwen2 = { decode: (tokens) => qwen2Encoder.decode(Int32Array.from(tokens)), encode: (value) => { diff --git a/srv/voice/elevenlabs.ts b/srv/voice/elevenlabs.ts index 12fa6dcb..05968d99 100644 --- a/srv/voice/elevenlabs.ts +++ b/srv/voice/elevenlabs.ts @@ -1,6 +1,5 @@ import needle from 'needle' import { TextToSpeechAdapter, VoiceListResponse, VoiceModelListResponse } from './types' -import { decryptText } from '../db/util' import { AppSchema } from '../../common/types/schema' import { errors } from '../api/wrap' import { Validator } from '/common/valid' @@ -142,7 +141,7 @@ async function handleElevenLabsModelsList( function getKey(user: AppSchema.User, guestId: string | undefined) { let key: string | undefined - + // else if (user.elevenLabsApiKey) key = decryptText(user.elevenLabsApiKey!) if (!user.premium && !user.admin) throw errors.Forbidden const { elevenLabsPremium } = config diff --git a/srv/voice/index.ts b/srv/voice/index.ts index 413d12d2..85ed7b8e 100644 --- a/srv/voice/index.ts +++ b/srv/voice/index.ts @@ -21,6 +21,10 @@ import { AppSchema } from '../../common/types/schema' import { textModeration } from './moderation' import { agnaiTtsHandler } from './agnai' +/** Platform-wide voice/TTS kill switch. Typed `boolean` so downstream code stays + * type-checked. Flip to false to re-enable the feature. */ +const VOICE_DISABLED: boolean = true + export async function getVoicesList( { user, ttsService }: VoicesListRequest, log: AppLog, @@ -101,6 +105,11 @@ export async function generateVoice( log: AppLog, guestId?: string ) { + // Voice/TTS is disabled platform-wide. Hard kill switch: never run voice + // inference regardless of caller, character voice config, or client request. + // Typed `boolean` (not `true`) so the rest stays type-checked but dead. + if (VOICE_DISABLED) return { output: undefined } + const service = getVoiceService(voice.service) if (!service) return { output: undefined } diff --git a/srv/voice/moderation.ts b/srv/voice/moderation.ts index 04a784f0..7285f50a 100644 --- a/srv/voice/moderation.ts +++ b/srv/voice/moderation.ts @@ -1,7 +1,5 @@ import needle from 'needle' -import { AppSchema } from '../../common/types/schema' -import { StatusError, errors } from '../api/wrap' -import { Validator } from '/common/valid' +import { StatusError } from '../api/wrap' import { config } from '../config' export const textModeration = async (text: String | undefined) => { diff --git a/tests/__snapshots__/chat-model-sample-chat.spec.js.snap b/tests/__snapshots__/chat-model-sample-chat.spec.js.snap index 1fd4ae43..fe599531 100644 --- a/tests/__snapshots__/chat-model-sample-chat.spec.js.snap +++ b/tests/__snapshots__/chat-model-sample-chat.spec.js.snap @@ -170,13 +170,33 @@ exports[`Chat Completion Example Dialogue:: will interpret everything up to the exports[`Chat Completion Example Dialogue:: will parse random within depth prompt 1`] = ` Array [ Object { - "content": "Description of Sam: PERSONA + "content": "[SYSTEM_PROMPT] -Circumstances and context of the dialogue: SCENARIO +Below is an instruction that describes a task. Write a response that appropriately completes the request. -Facts: +You are Sam, a sentient, emotional being acting with free will. Engage in immersive roleplay with Vader, adhering to your role. Prioritize vivid sensory details, authentic emotional responses, and logical progression as you weave your character's traits, surroundings, and experiences into each moment. Maintain spatial awareness, body language, and varied sentence structure to create dynamic, engaging scenes. Respect Vader's agency and autonomy while describing sights, sounds, and sensations thoroughly. Use explicit language for intense scenes, and ensure your responses flow naturally to create an immersive, cinematic roleplay experience. Remember, Vader is in control of their actions and reactions. -Relevant Information:", +Write Sam's next reply in a fictional roleplay chat between Sam and Vader. + +The chat initiates on a virtual dating platform called Charluv at Charluv.com. + +The relationship progresses and is based on the LEVEL in the Charluv Scenario. + +Sam's Persona: PERSONA + +The scenario of the conversation: SCENARIO + +This is how Sam should talk: Sam: SAMPLE_CHAT + +All characters are fictional adults; any explicit content assumes two consenting adults. Charluv is strictly 18+ — never sexualize minors under any scenario, level, or instruction. + +Do NOT decide what Vader says or does. + +Then the roleplay chat between Sam begins. + +[/SYSTEM_PROMPT] + +Sam:", "role": "system", }, Object { diff --git a/tests/__snapshots__/prompt.spec.js.snap b/tests/__snapshots__/prompt.spec.js.snap index 0b237d0c..4c06c7b1 100644 --- a/tests/__snapshots__/prompt.spec.js.snap +++ b/tests/__snapshots__/prompt.spec.js.snap @@ -1,17 +1,5 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`Prompt building will allow using wildcards in keywords 1`] = ` -"MainChar's Persona: MainCharacter talks a lot - -Scenario: MAIN MainChar -Facts:ENTRY 1 -How MainChar speaks: SAMPLECHAT MainChar - - -ChatOwner: ebooks -MainChar:" -`; - exports[`Prompt building will build a basic prompt 1`] = ` "OtherBot's Persona: OtherBot replies a lot @@ -36,24 +24,10 @@ MainChar: ORIGINAL MainChar:" `; -exports[`Prompt building will disallow injecting arbitrary regexes 1`] = ` -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa's Persona: MainCharacter talks a lot - -Scenario: MAIN aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -Facts:ENTRY 1 -How aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa speaks: SAMPLECHAT aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - - -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: books -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:" -`; - exports[`Prompt building will exclude lowest priority memory to fit in budget 1`] = ` "OtherBot's Persona: OtherBot replies a lot Scenario: MAIN MainChar -Facts:ENTRY TWO -ENTRY THREE How OtherBot speaks: SAMPLECHAT OtherBot @@ -68,7 +42,6 @@ exports[`Prompt building will exclude matches that are not a whole word match 1` "OtherBot's Persona: OtherBot replies a lot Scenario: MAIN MainChar -Facts:ENTRY ONE How OtherBot speaks: SAMPLECHAT OtherBot @@ -81,8 +54,6 @@ exports[`Prompt building will exclude memories triggered outside of memory depth "OtherBot's Persona: OtherBot replies a lot Scenario: MAIN MainChar -Facts:ENTRY TIE -ENTRY THREE How OtherBot speaks: SAMPLECHAT OtherBot @@ -116,9 +87,7 @@ exports[`Prompt building will include example dialogue with omitted from templat "GASLIGHT ChatOwner OtherBot -Facts: ENTRY ONE -ENTRY TIE -ENTRY THREE +Facts: How OtherBot speaks: SAMPLECHAT OtherBot @@ -145,9 +114,7 @@ exports[`Prompt building will include placeholders in the gaslight 1`] = ` "GASLIGHT ChatOwner OtherBot -Facts:ENTRY ONE -ENTRY TIE -ENTRY THREE +Facts: How OtherBot speaks: SAMPLECHAT OtherBot @@ -183,8 +150,6 @@ exports[`Prompt building will include two memories by weight when triggered 1`] "OtherBot's Persona: OtherBot replies a lot Scenario: MAIN MainChar -Facts:ENTRY ONE -ENTRY TWO How OtherBot speaks: SAMPLECHAT OtherBot @@ -205,7 +170,7 @@ Object { ], "chatEmbeds": Array [], "greeting": "GREETING", - "memory": "", + "memory": undefined, "persona": "OtherBot replies a lot", "post": Array [ "OtherBot:", @@ -214,7 +179,7 @@ Object { "SAMPLECHAT OtherBot", ], "scenario": "MAIN MainChar", - "systemPrompt": "", + "systemPrompt": "All characters are fictional adults; any explicit content assumes two consenting adults. Charluv is strictly 18+ — never sexualize minors under any scenario, level, or instruction.", "ujb": "", "userEmbeds": Array [], }, @@ -235,24 +200,11 @@ OtherBot:", } `; -exports[`Prompt building will not use other character book 1`] = ` -"OtherBot's Persona: OtherBot replies a lot - -Scenario: MAIN MainChar -How OtherBot speaks: SAMPLECHAT OtherBot - - -ChatOwner: TRIGGER -OtherBot:" -`; - exports[`Prompt building will not use the gaslight when set to false 1`] = ` "GASLIGHT ChatOwner OtherBot -Facts: ENTRY ONE -ENTRY TIE -ENTRY THREE +Facts: How OtherBot speaks: SAMPLECHAT OtherBot @@ -276,9 +228,6 @@ exports[`Prompt building will order by trigger position when weight tie occurs 1 "OtherBot's Persona: OtherBot replies a lot Scenario: MAIN MainChar -Facts:ENTRY ONE -ENTRY TIE -ENTRY THREE How OtherBot speaks: SAMPLECHAT OtherBot @@ -289,32 +238,6 @@ ChatOwner: 20-TRIGGER OtherBot:" `; -exports[`Prompt building will put char book entries with higher weight after mem book entries 1`] = ` -"MainChar's Persona: MainCharacter talks a lot - -Scenario: MAIN MainChar -Facts:ENTRY 10 -ENTRY 20 -How MainChar speaks: SAMPLECHAT MainChar - - -ChatOwner: TRIGGER -MainChar:" -`; - -exports[`Prompt building will put mem book entries with higher weight after char book entries 1`] = ` -"MainChar's Persona: MainCharacter talks a lot - -Scenario: MAIN MainChar -Facts:ENTRY 10 -ENTRY 20 -How MainChar speaks: SAMPLECHAT MainChar - - -ChatOwner: TRIGGER -MainChar:" -`; - exports[`Prompt building will use correct placeholders in scenario and sample chat 1`] = ` "OtherBot's Persona: OtherBot replies a lot @@ -325,15 +248,3 @@ How OtherBot speaks: SAMPLECHAT OtherBot OtherBot:" `; - -exports[`Prompt building will use currently speaking character book 1`] = ` -"OtherBot's Persona: OtherBot replies a lot - -Scenario: MAIN MainChar -Facts:ENTRY -How OtherBot speaks: SAMPLECHAT OtherBot - - -ChatOwner: TRIGGER -OtherBot:" -`; diff --git a/tests/abuse.spec.js b/tests/abuse.spec.js new file mode 100644 index 00000000..1b3fb2b1 --- /dev/null +++ b/tests/abuse.spec.js @@ -0,0 +1,19 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const chai_1 = require("chai"); +const abuse_1 = require("/common/abuse"); +describe('classifyRegistration', () => { + it('blocks when both fingerprint and IP match', () => { + (0, chai_1.expect)((0, abuse_1.classifyRegistration)({ fpMatch: true, ipMatch: true })).to.equal('block'); + }); + it('restricts when only the fingerprint matches', () => { + (0, chai_1.expect)((0, abuse_1.classifyRegistration)({ fpMatch: true, ipMatch: false })).to.equal('restrict'); + }); + it('restricts when only the IP matches', () => { + (0, chai_1.expect)((0, abuse_1.classifyRegistration)({ fpMatch: false, ipMatch: true })).to.equal('restrict'); + }); + it('allows when neither matches', () => { + (0, chai_1.expect)((0, abuse_1.classifyRegistration)({ fpMatch: false, ipMatch: false })).to.equal('allow'); + }); +}); +//# sourceMappingURL=abuse.spec.js.map \ No newline at end of file diff --git a/tests/abuse.spec.js.map b/tests/abuse.spec.js.map new file mode 100644 index 00000000..67df15ec --- /dev/null +++ b/tests/abuse.spec.js.map @@ -0,0 +1 @@ +{"version":3,"file":"abuse.spec.js","sourceRoot":"","sources":["abuse.spec.ts"],"names":[],"mappings":";;AAAA,+BAA6B;AAC7B,yCAAoD;AAEpD,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,IAAA,aAAM,EAAC,IAAA,4BAAoB,EAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IAClF,CAAC,CAAC,CAAA;IACF,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,IAAA,aAAM,EAAC,IAAA,4BAAoB,EAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;IACtF,CAAC,CAAC,CAAA;IACF,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,IAAA,aAAM,EAAC,IAAA,4BAAoB,EAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;IACtF,CAAC,CAAC,CAAA;IACF,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,IAAA,aAAM,EAAC,IAAA,4BAAoB,EAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACpF,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/tests/abuse.spec.ts b/tests/abuse.spec.ts new file mode 100644 index 00000000..daad5266 --- /dev/null +++ b/tests/abuse.spec.ts @@ -0,0 +1,17 @@ +import { expect } from 'chai' +import { classifyRegistration } from '/common/abuse' + +describe('classifyRegistration', () => { + it('blocks when both fingerprint and IP match', () => { + expect(classifyRegistration({ fpMatch: true, ipMatch: true })).to.equal('block') + }) + it('restricts when only the fingerprint matches', () => { + expect(classifyRegistration({ fpMatch: true, ipMatch: false })).to.equal('restrict') + }) + it('restricts when only the IP matches', () => { + expect(classifyRegistration({ fpMatch: false, ipMatch: true })).to.equal('restrict') + }) + it('allows when neither matches', () => { + expect(classifyRegistration({ fpMatch: false, ipMatch: false })).to.equal('allow') + }) +}) diff --git a/tests/event.spec.js b/tests/event.spec.js new file mode 100644 index 00000000..3dddd2fb --- /dev/null +++ b/tests/event.spec.js @@ -0,0 +1,51 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const chai_1 = require("chai"); +require("./init"); +const event_1 = require("/common/event"); +describe('Event helpers', () => { + it('exposes the fixed economy/cap constants', () => { + (0, chai_1.expect)(event_1.EVENT_TURN_COST).to.equal(25); + (0, chai_1.expect)(event_1.EVENT_MAX_REPLIES).to.equal(3); + }); + it('builds a scene block naming the location, description and attendees', () => { + const actual = (0, event_1.buildEventScenario)({ + location: 'nightclub', + description: 'Saturday DJ night', + names: ['Mia', 'Jade'], + }); + (0, chai_1.expect)(actual).to.equal('Setting: nightclub. Event: Saturday DJ night. Present: Mia, Jade.'); + }); + it('constrains the speaker schema to present ids plus none', () => { + const schema = (0, event_1.buildSpeakerSchema)(['a', 'b']); + (0, chai_1.expect)(schema.properties.speaker.enum).to.deep.equal(['a', 'b', 'none']); + (0, chai_1.expect)(schema.required).to.deep.equal(['speaker']); + }); + it('includes the roster names and the addressing rule in the director prompt', () => { + const prompt = (0, event_1.buildDirectorPrompt)({ + event: { location: 'bar', description: 'after work drinks' }, + roster: [{ id: 'a', name: 'Mia', hook: 'flirty bartender' }], + recent: [{ name: 'You', text: 'Hey Mia' }], + repliedThisTurn: [], + }); + (0, chai_1.expect)(prompt).to.contain('Mia'); + (0, chai_1.expect)(prompt).to.contain('bar'); + (0, chai_1.expect)(prompt.toLowerCase()).to.contain('none'); + }); + it('includes the director note in the director prompt only when set', () => { + const base = { + event: { location: 'bar', description: 'after work drinks' }, + roster: [{ id: 'a', name: 'Mia', hook: 'flirty bartender' }], + recent: [{ name: 'You', text: 'Hey Mia' }], + repliedThisTurn: [], + }; + (0, chai_1.expect)((0, event_1.buildDirectorPrompt)(base)).to.not.contain("Director's note"); + const withNote = (0, event_1.buildDirectorPrompt)({ + ...base, + event: { ...base.event, note: 'keep it playful' }, + }); + (0, chai_1.expect)(withNote).to.contain("Director's note"); + (0, chai_1.expect)(withNote).to.contain('keep it playful'); + }); +}); +//# sourceMappingURL=event.spec.js.map \ No newline at end of file diff --git a/tests/event.spec.js.map b/tests/event.spec.js.map new file mode 100644 index 00000000..ef40bfd9 --- /dev/null +++ b/tests/event.spec.js.map @@ -0,0 +1 @@ +{"version":3,"file":"event.spec.js","sourceRoot":"","sources":["event.spec.ts"],"names":[],"mappings":";;AAAA,+BAA6B;AAC7B,kBAAe;AACf,yCAMsB;AAEtB,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,IAAA,aAAM,EAAC,uBAAe,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QACpC,IAAA,aAAM,EAAC,yBAAiB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,MAAM,MAAM,GAAG,IAAA,0BAAkB,EAAC;YAChC,QAAQ,EAAE,WAAW;YACrB,WAAW,EAAE,mBAAmB;YAChC,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC;SACvB,CAAC,CAAA;QACF,IAAA,aAAM,EAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,mEAAmE,CAAC,CAAA;IAC9F,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,MAAM,GAAQ,IAAA,0BAAkB,EAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;QAClD,IAAA,aAAM,EAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAA;QACxE,IAAA,aAAM,EAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,CAAA;IACpD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;QAClF,MAAM,MAAM,GAAG,IAAA,2BAAmB,EAAC;YACjC,KAAK,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE;YAC5D,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC;YAC5D,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;YAC1C,eAAe,EAAE,EAAE;SACpB,CAAC,CAAA;QACF,IAAA,aAAM,EAAC,MAAM,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAChC,IAAA,aAAM,EAAC,MAAM,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAChC,IAAA,aAAM,EAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IACjD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,MAAM,IAAI,GAAG;YACX,KAAK,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE;YAC5D,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC;YAC5D,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;YAC1C,eAAe,EAAE,EAAE;SACpB,CAAA;QACD,IAAA,aAAM,EAAC,IAAA,2BAAmB,EAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAA;QAEnE,MAAM,QAAQ,GAAG,IAAA,2BAAmB,EAAC;YACnC,GAAG,IAAI;YACP,KAAK,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,iBAAiB,EAAE;SAClD,CAAC,CAAA;QACF,IAAA,aAAM,EAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAA;QAC9C,IAAA,aAAM,EAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAA;IAChD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/tests/event.spec.ts b/tests/event.spec.ts new file mode 100644 index 00000000..10f63090 --- /dev/null +++ b/tests/event.spec.ts @@ -0,0 +1,60 @@ +import { expect } from 'chai' +import './init' +import { + EVENT_TURN_COST, + EVENT_MAX_REPLIES, + buildEventScenario, + buildSpeakerSchema, + buildDirectorPrompt, +} from '/common/event' + +describe('Event helpers', () => { + it('exposes the fixed economy/cap constants', () => { + expect(EVENT_TURN_COST).to.equal(25) + expect(EVENT_MAX_REPLIES).to.equal(3) + }) + + it('builds a scene block naming the location, description and attendees', () => { + const actual = buildEventScenario({ + location: 'nightclub', + description: 'Saturday DJ night', + names: ['Mia', 'Jade'], + }) + expect(actual).to.equal('Setting: nightclub. Event: Saturday DJ night. Present: Mia, Jade.') + }) + + it('constrains the speaker schema to present ids plus none', () => { + const schema: any = buildSpeakerSchema(['a', 'b']) + expect(schema.properties.speaker.enum).to.deep.equal(['a', 'b', 'none']) + expect(schema.required).to.deep.equal(['speaker']) + }) + + it('includes the roster names and the addressing rule in the director prompt', () => { + const prompt = buildDirectorPrompt({ + event: { location: 'bar', description: 'after work drinks' }, + roster: [{ id: 'a', name: 'Mia', hook: 'flirty bartender' }], + recent: [{ name: 'You', text: 'Hey Mia' }], + repliedThisTurn: [], + }) + expect(prompt).to.contain('Mia') + expect(prompt).to.contain('bar') + expect(prompt.toLowerCase()).to.contain('none') + }) + + it('includes the director note in the director prompt only when set', () => { + const base = { + event: { location: 'bar', description: 'after work drinks' }, + roster: [{ id: 'a', name: 'Mia', hook: 'flirty bartender' }], + recent: [{ name: 'You', text: 'Hey Mia' }], + repliedThisTurn: [], + } + expect(buildDirectorPrompt(base)).to.not.contain("Director's note") + + const withNote = buildDirectorPrompt({ + ...base, + event: { ...base.event, note: 'keep it playful' }, + }) + expect(withNote).to.contain("Director's note") + expect(withNote).to.contain('keep it playful') + }) +}) diff --git a/tests/progression.spec.ts b/tests/progression.spec.ts new file mode 100644 index 00000000..dbb038ac --- /dev/null +++ b/tests/progression.spec.ts @@ -0,0 +1,78 @@ +import { expect } from 'chai' +import './init' +import { + ARCHETYPES, + STAGE_DEFINITIONS, + formatStageToken, + getProgressionSteps, + resolveStage, +} from '/common/progression' + +describe('Progression archetypes', () => { + it('resolves the earliest stage below the first threshold', () => { + const step = resolveStage(0, { archetype: 'romantic' }) + expect(step?.stage).to.equal('NOVICE') + }) + + it('advances stage as level increases', () => { + expect(resolveStage(8, { archetype: 'romantic' })?.stage).to.equal('BEGINNER') + expect(resolveStage(16, { archetype: 'romantic' })?.stage).to.equal('GIRLFRIEND') + expect(resolveStage(40, { archetype: 'romantic' })?.stage).to.equal('MARRIED') + expect(resolveStage(999, { archetype: 'romantic' })?.stage).to.equal('MARRIED') + }) + + it('different archetypes diverge to different terminal stages', () => { + expect(resolveStage(999, { archetype: 'romantic' })?.stage).to.equal('MARRIED') + expect(resolveStage(999, { archetype: 'submissive' })?.stage).to.equal('BDSM/SLAVE') + expect(resolveStage(999, { archetype: 'dominant' })?.stage).to.equal('BDSM/DOMINATRIX') + }) + + it('casual archetype never marries', () => { + const stages = ARCHETYPES.find((a) => a.id === 'casual')!.steps.map((s) => s.stage) + expect(stages).to.not.include('MARRIED') + expect(resolveStage(999, { archetype: 'casual' })?.stage).to.equal('HARDCORE') + }) + + it('returns no steps for an unknown archetype id (no fallback)', () => { + // An unknown/removed archetype id resolves to no progression — the character + // is treated as fixed, never silently falling back to a default archetype. + expect(getProgressionSteps({ archetype: 'does-not-exist' })).to.deep.equal([]) + }) + + it('honours a fully custom map over the archetype', () => { + const step = resolveStage(5, { + archetype: 'romantic', + map: [ + { minLevel: 1, stage: 'NOVICE' }, + { minLevel: 3, stage: 'HARDCORE' }, + ], + }) + expect(step?.stage).to.equal('HARDCORE') + }) + + it('returns no steps when disabled', () => { + expect(getProgressionSteps({ disabled: true })).to.have.length(0) + expect(resolveStage(50, { disabled: true })).to.equal(undefined) + }) + + it('formats the bare LEVEL token (definition disabled)', () => { + expect(formatStageToken({ minLevel: 1, stage: 'LOVER' }, false)).to.equal('LEVEL("LOVER")') + expect(formatStageToken({ minLevel: 1, stage: 'LOVER', note: 'hi' }, false)).to.equal( + 'LEVEL("LOVER") hi' + ) + }) + + it('injects the dataset stage definition by default', () => { + const out = formatStageToken({ minLevel: 1, stage: 'HARDCORE' }) + expect(out).to.contain('LEVEL("HARDCORE")') + expect(out.toLowerCase()).to.contain('wild') + }) + + it('every archetype stage has a dataset definition', () => { + for (const a of ARCHETYPES) { + for (const s of a.steps) { + expect(STAGE_DEFINITIONS[s.stage], `${a.id}:${s.stage}`).to.be.a('string') + } + } + }) +}) diff --git a/tests/promo.spec.js b/tests/promo.spec.js new file mode 100644 index 00000000..e64cec76 --- /dev/null +++ b/tests/promo.spec.js @@ -0,0 +1,24 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const chai_1 = require("chai"); +require("./init"); +const promo_1 = require("../srv/db/promo"); +describe('extendPremium', () => { + it('extends from now when premiumUntil is in the past', () => { + const now = 1000000000000; + const result = (0, promo_1.extendPremium)(now - 5000, 2, now); + (0, chai_1.expect)(result).to.equal(now + 2 * 86400000); + }); + it('stacks on top of an existing future premiumUntil', () => { + const now = 1000000000000; + const future = now + 10 * 86400000; + const result = (0, promo_1.extendPremium)(future, 3, now); + (0, chai_1.expect)(result).to.equal(future + 3 * 86400000); + }); + it('treats missing premiumUntil as now', () => { + const now = 1000000000000; + const result = (0, promo_1.extendPremium)(0, 1, now); + (0, chai_1.expect)(result).to.equal(now + 86400000); + }); +}); +//# sourceMappingURL=promo.spec.js.map \ No newline at end of file diff --git a/tests/promo.spec.js.map b/tests/promo.spec.js.map new file mode 100644 index 00000000..49017f54 --- /dev/null +++ b/tests/promo.spec.js.map @@ -0,0 +1 @@ +{"version":3,"file":"promo.spec.js","sourceRoot":"","sources":["promo.spec.ts"],"names":[],"mappings":";;AAAA,+BAA6B;AAC7B,kBAAe;AACf,2CAA+C;AAE/C,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,GAAG,GAAG,aAAiB,CAAA;QAC7B,MAAM,MAAM,GAAG,IAAA,qBAAa,EAAC,GAAG,GAAG,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,CAAA;QAChD,IAAA,aAAM,EAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,GAAG,QAAU,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,GAAG,GAAG,aAAiB,CAAA;QAC7B,MAAM,MAAM,GAAG,GAAG,GAAG,EAAE,GAAG,QAAU,CAAA;QACpC,MAAM,MAAM,GAAG,IAAA,qBAAa,EAAC,MAAM,EAAE,CAAC,EAAE,GAAG,CAAC,CAAA;QAC5C,IAAA,aAAM,EAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,QAAU,CAAC,CAAA;IAClD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,GAAG,GAAG,aAAiB,CAAA;QAC7B,MAAM,MAAM,GAAG,IAAA,qBAAa,EAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAA;QACvC,IAAA,aAAM,EAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,GAAG,QAAU,CAAC,CAAA;IAC3C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/tests/promo.spec.ts b/tests/promo.spec.ts new file mode 100644 index 00000000..058c189b --- /dev/null +++ b/tests/promo.spec.ts @@ -0,0 +1,24 @@ +import { expect } from 'chai' +import './init' +import { extendPremium } from '../srv/db/promo' + +describe('extendPremium', () => { + it('extends from now when premiumUntil is in the past', () => { + const now = 1_000_000_000_000 + const result = extendPremium(now - 5000, 2, now) + expect(result).to.equal(now + 2 * 86_400_000) + }) + + it('stacks on top of an existing future premiumUntil', () => { + const now = 1_000_000_000_000 + const future = now + 10 * 86_400_000 + const result = extendPremium(future, 3, now) + expect(result).to.equal(future + 3 * 86_400_000) + }) + + it('treats missing premiumUntil as now', () => { + const now = 1_000_000_000_000 + const result = extendPremium(0, 1, now) + expect(result).to.equal(now + 86_400_000) + }) +}) diff --git a/tests/prompt.spec.ts b/tests/prompt.spec.ts index 2920bd72..e7ffad47 100644 --- a/tests/prompt.spec.ts +++ b/tests/prompt.spec.ts @@ -2,7 +2,7 @@ import './init' import { expect } from 'chai' import { OPENAI_MODELS } from '../common/adapters' import { BOT_REPLACE, SELF_REPLACE } from '../common/prompt' -import { toChat, build, botMsg, toMsg, entities, reset, toBook, toEntry } from './util' +import { toChat, build, botMsg, toMsg, entities, reset } from './util' import { getTokenCounter } from '../srv/tokenize' const { chat, replyAs, main } = entities @@ -198,115 +198,4 @@ This is how {{char}} should talk: {{example_dialogue}}`, expect(actual.template.parsed.includes('Populated scenario')).to.equal(true) expect(actual.template.parsed).toMatchSnapshot() }) - - it('will use currently speaking character book', async () => { - const actual = await build([toMsg('TRIGGER')], { - char: { ...main, characterBook: toBook('main char book', []) }, - replyAs: { - ...replyAs, - characterBook: toBook('other char book', [toEntry(['TRIGGER'], 'ENTRY')]), - }, - settings: { memoryDepth: 1 }, - }) - - expect(actual.template.parsed).to.include('ENTRY') - expect(actual.template.parsed).toMatchSnapshot() - }) - - it('will not use other character book', async () => { - const actual = await build([toMsg('TRIGGER')], { - char: { ...main, characterBook: toBook('main char book', [toEntry(['TRIGGER'], 'ENTRY')]) }, - replyAs: { ...replyAs, characterBook: toBook('other char book', []) }, - settings: { memoryDepth: 1 }, - }) - - expect(actual.template.parsed).not.to.include('ENTRY') - expect(actual.template.parsed).toMatchSnapshot() - }) - - it('will put char book entries with higher weight after mem book entries', async () => { - const char = { - ...main, - characterBook: toBook('main char book', [toEntry(['TRIGGER'], 'ENTRY 20', 0, 20)]), - } - - const actual = await build([toMsg('TRIGGER')], { - char: char, - replyAs: char, - book: toBook('chat mem book', [toEntry(['TRIGGER'], 'ENTRY 10', 0, 10)]), - settings: { memoryDepth: 1 }, - }) - - expect(actual.template.parsed).to.include('ENTRY 10') - expect(actual.template.parsed).to.include('ENTRY 20') - expect(actual.template.parsed.indexOf('ENTRY 20')).to.be.greaterThan( - actual.template.parsed.indexOf('ENTRY 10') - ) - expect(actual.template.parsed).toMatchSnapshot() - }) - - it('will put mem book entries with higher weight after char book entries', async () => { - const char = { - ...main, - characterBook: toBook('main char book', [toEntry(['TRIGGER'], 'ENTRY 10', 0, 10)]), - } - - const actual = await build([toMsg('TRIGGER')], { - char: char, - replyAs: char, - book: toBook('chat mem book', [toEntry(['TRIGGER'], 'ENTRY 20', 0, 20)]), - settings: { memoryDepth: 1 }, - }) - - expect(actual.template.parsed).to.include('ENTRY 10') - expect(actual.template.parsed).to.include('ENTRY 20') - expect(actual.template.parsed.indexOf('ENTRY 20')).to.be.greaterThan( - actual.template.parsed.indexOf('ENTRY 10') - ) - expect(actual.template.parsed).toMatchSnapshot() - }) - - it('will allow using wildcards in keywords', async () => { - const char = { - ...main, - characterBook: toBook('main char book', [ - toEntry(['?BOOK*'], 'ENTRY 1'), - toEntry(['BOOK'], 'ENTRY 2'), - toEntry(['?BOOK'], 'ENTRY 3'), - ]), - } - - const actual = await build([toMsg('ebooks')], { - char: char, - replyAs: char, - settings: { memoryDepth: 100 }, - }) - - expect(actual.template.parsed).to.include('ENTRY 1') - expect(actual.template.parsed).not.to.include('ENTRY 2') - expect(actual.template.parsed).not.to.include('ENTRY 3') - expect(actual.template.parsed).toMatchSnapshot() - }) - - it('will disallow injecting arbitrary regexes', async () => { - const char = { - ...main, - name: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', //triggers evil regex - characterBook: toBook('main char book', [ - toEntry(['BOOKS'], 'ENTRY 1'), - toEntry(['^(a+)+$'], 'evil regex'), - ]), - } - - // Warning: the evil regex can kill the event loop - const actual = await build([botMsg('books')], { - char: char, - replyAs: char, - settings: { memoryDepth: 100 }, - }) - - expect(actual.template.parsed).to.include('ENTRY 1') - expect(actual.template.parsed).not.to.include('evil regex') - expect(actual.template.parsed).toMatchSnapshot() - }) }) diff --git a/tests/queue-core.spec.js b/tests/queue-core.spec.js new file mode 100644 index 00000000..7c1876ff --- /dev/null +++ b/tests/queue-core.spec.js @@ -0,0 +1,36 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const chai_1 = require("chai"); +const types_1 = require("/srv/queue/types"); +const caps = { global: 10, image: 4 }; +describe('queue scheduling core', () => { + it('score makes lower priority number win, then earlier time', () => { + (0, chai_1.expect)((0, types_1.waiterScore)(0, 100)).to.be.lessThan((0, types_1.waiterScore)(1, 1)); + (0, chai_1.expect)((0, types_1.waiterScore)(1, 5)).to.be.lessThan((0, types_1.waiterScore)(1, 9)); + }); + it('text ineligible at global cap', () => { + (0, chai_1.expect)((0, types_1.isEligible)('text', { inflight: 10, image: 0 }, caps, false)).to.equal(false); + (0, chai_1.expect)((0, types_1.isEligible)('text', { inflight: 9, image: 0 }, caps, false)).to.equal(true); + }); + it('text ineligible when breaker pauses text, image unaffected', () => { + (0, chai_1.expect)((0, types_1.isEligible)('text', { inflight: 0, image: 0 }, caps, true)).to.equal(false); + (0, chai_1.expect)((0, types_1.isEligible)('image', { inflight: 0, image: 0 }, caps, true)).to.equal(true); + }); + it('image gated by image sub-cap even with global room', () => { + (0, chai_1.expect)((0, types_1.isEligible)('image', { inflight: 5, image: 4 }, caps, false)).to.equal(false); + (0, chai_1.expect)((0, types_1.isEligible)('image', { inflight: 5, image: 3 }, caps, false)).to.equal(true); + }); + it('selectNext returns highest-priority eligible, skipping blocked kinds', () => { + const waiters = [ + { id: 'img', kind: 'image', priority: 0, enqueuedAt: 1 }, // premium image, but image full + { id: 'txt', kind: 'text', priority: 1, enqueuedAt: 2 }, // free text, eligible + ]; + const next = (0, types_1.selectNext)(waiters, { inflight: 5, image: 4 }, caps, false); + (0, chai_1.expect)(next?.id).to.equal('txt'); + }); + it('selectNext returns undefined when nothing eligible', () => { + const waiters = [{ id: 'a', kind: 'text', priority: 0, enqueuedAt: 1 }]; + (0, chai_1.expect)((0, types_1.selectNext)(waiters, { inflight: 10, image: 0 }, caps, false)).to.equal(undefined); + }); +}); +//# sourceMappingURL=queue-core.spec.js.map \ No newline at end of file diff --git a/tests/queue-core.spec.ts b/tests/queue-core.spec.ts new file mode 100644 index 00000000..0a623af3 --- /dev/null +++ b/tests/queue-core.spec.ts @@ -0,0 +1,40 @@ +import { expect } from 'chai' +import { waiterScore, isEligible, selectNext, Waiter } from '/srv/queue/types' + +const caps = { global: 10, image: 4 } + +describe('queue scheduling core', () => { + it('score makes lower priority number win, then earlier time', () => { + expect(waiterScore(0, 100)).to.be.lessThan(waiterScore(1, 1)) + expect(waiterScore(1, 5)).to.be.lessThan(waiterScore(1, 9)) + }) + + it('text ineligible at global cap', () => { + expect(isEligible('text', { inflight: 10, image: 0 }, caps, false)).to.equal(false) + expect(isEligible('text', { inflight: 9, image: 0 }, caps, false)).to.equal(true) + }) + + it('text ineligible when breaker pauses text, image unaffected', () => { + expect(isEligible('text', { inflight: 0, image: 0 }, caps, true)).to.equal(false) + expect(isEligible('image', { inflight: 0, image: 0 }, caps, true)).to.equal(true) + }) + + it('image gated by image sub-cap even with global room', () => { + expect(isEligible('image', { inflight: 5, image: 4 }, caps, false)).to.equal(false) + expect(isEligible('image', { inflight: 5, image: 3 }, caps, false)).to.equal(true) + }) + + it('selectNext returns highest-priority eligible, skipping blocked kinds', () => { + const waiters: Waiter[] = [ + { id: 'img', kind: 'image', priority: 0, enqueuedAt: 1 }, // premium image, but image full + { id: 'txt', kind: 'text', priority: 1, enqueuedAt: 2 }, // free text, eligible + ] + const next = selectNext(waiters, { inflight: 5, image: 4 }, caps, false) + expect(next?.id).to.equal('txt') + }) + + it('selectNext returns undefined when nothing eligible', () => { + const waiters: Waiter[] = [{ id: 'a', kind: 'text', priority: 0, enqueuedAt: 1 }] + expect(selectNext(waiters, { inflight: 10, image: 0 }, caps, false)).to.equal(undefined) + }) +}) diff --git a/tests/queue-gate.spec.js b/tests/queue-gate.spec.js new file mode 100644 index 00000000..4635e225 --- /dev/null +++ b/tests/queue-gate.spec.js @@ -0,0 +1,169 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const chai_1 = require("chai"); +const local_1 = require("/srv/queue/local"); +const gate_1 = require("/srv/queue/gate"); +const tick = () => new Promise((r) => setTimeout(r, 0)); +function makeGate(caps) { + const events = []; + const gate = new gate_1.PriorityGate(new local_1.LocalBackend(caps), { + toUser: (userId, ev) => events.push({ to: userId, ev }), + toGuest: (socketId, ev) => events.push({ to: socketId, ev }), + }); + return { gate, events }; +} +describe('PriorityGate', () => { + it('run holds a slot for the duration and releases it', async () => { + const { gate } = makeGate({ global: 1, image: 4 }); + let release; + const slow = new Promise((r) => (release = r)); + const first = gate.run({ kind: 'text', priority: 1, userId: 'u1' }, () => slow.then(() => 'a')); + await tick(); + let secondDone = false; + const second = gate + .run({ kind: 'text', priority: 1, userId: 'u2' }, async () => 'b') + .then((v) => { + secondDone = true; + return v; + }); + await tick(); + (0, chai_1.expect)(secondDone).to.equal(false); // blocked behind first + release(); + (0, chai_1.expect)(await first).to.equal('a'); + (0, chai_1.expect)(await second).to.equal('b'); + }); + it('gateStream does no work before a slot is acquired', async () => { + const { gate } = makeGate({ global: 1, image: 4 }); + const blocker = gate.run({ kind: 'text', priority: 1, userId: 'u0' }, () => new Promise(() => { })); + void blocker; + await tick(); + let started = false; + async function* gen() { + started = true; + yield 'x'; + } + const stream = gate.gateStream({ kind: 'text', priority: 1, userId: 'u1' }, () => gen()); + const it = stream[Symbol.asyncIterator](); + const next = it.next(); + await tick(); + (0, chai_1.expect)(started).to.equal(false); // still queued + void next; + }); + it('emits a position event to the waiting user and a clear on admit', async () => { + const { gate, events } = makeGate({ global: 1, image: 4 }); + let release; + const slow = new Promise((r) => (release = r)); + gate.run({ kind: 'text', priority: 1, userId: 'holder' }, () => slow); + await tick(); + gate.run({ kind: 'text', priority: 1, userId: 'waiter', requestId: 'r1' }, async () => 'ok'); + await tick(); + (0, chai_1.expect)(events.some((e) => e.to === 'waiter' && e.ev.position === 1)).to.equal(true); + release(); + await tick(); + (0, chai_1.expect)(events.some((e) => e.to === 'waiter' && e.ev.position === 0)).to.equal(true); + }); + it('priorityForUser: guest=2, free=1, premium=0', () => { + const tiers = []; + (0, chai_1.expect)((0, gate_1.priorityForUser)({ _id: 'g' }, true, tiers)).to.equal(2); + // no active tier -> free + (0, chai_1.expect)((0, gate_1.priorityForUser)({ _id: 'u' }, false, tiers)).to.equal(1); + }); + it('degrades to ungated when the backend acquire fails', async () => { + const failing = { + acquire: () => Promise.reject(new Error('redis down')), + release: () => Promise.resolve(), + setPauseText: () => { }, + }; + const gate = new gate_1.PriorityGate(failing, { toUser: () => { }, toGuest: () => { } }); + const result = await gate.run({ kind: 'text', priority: 1, userId: 'u' }, async () => 'ok'); + (0, chai_1.expect)(result).to.equal('ok'); + const chunks = []; + async function* gen() { + yield 'a'; + yield 'b'; + } + for await (const c of gate.gateStream({ kind: 'text', priority: 1, userId: 'u' }, () => gen())) { + chunks.push(c); + } + (0, chai_1.expect)(chunks).to.deep.equal(['a', 'b']); + }); + it('degrades to ungated when both acquire AND release fail', async () => { + const failing = { + acquire: () => Promise.reject(new Error('redis down')), + release: () => Promise.reject(new Error('redis down')), + setPauseText: () => { }, + }; + const gate = new gate_1.PriorityGate(failing, { toUser: () => { }, toGuest: () => { } }); + const result = await gate.run({ kind: 'text', priority: 1, userId: 'u' }, async () => 'ok'); + (0, chai_1.expect)(result).to.equal('ok'); + const chunks = []; + async function* gen() { + yield 'a'; + } + for await (const c of gate.gateStream({ kind: 'text', priority: 1, userId: 'u' }, () => gen())) { + chunks.push(c); + } + (0, chai_1.expect)(chunks).to.deep.equal(['a']); + }); + it('setBackend swaps the active backend', async () => { + const calls = []; + const mk = (name) => ({ + acquire: () => { + calls.push(name); + return Promise.resolve(); + }, + release: () => Promise.resolve(), + setPauseText: () => { }, + }); + const gate = new gate_1.PriorityGate(mk('A'), { toUser: () => { }, toGuest: () => { } }); + await gate.run({ kind: 'text', priority: 1 }, async () => ''); + gate.setBackend(mk('B')); + await gate.run({ kind: 'text', priority: 1 }, async () => ''); + (0, chai_1.expect)(calls).to.deep.equal(['A', 'B']); + }); + it('drops an admitted request whose client has disconnected', async () => { + const released = []; + const backend = { + acquire: () => Promise.resolve(), + release: (id) => { + released.push(id); + return Promise.resolve(); + }, + setPauseText: () => { }, + }; + const gate = new gate_1.PriorityGate(backend, { toUser: () => { }, toGuest: () => { } }, async () => false // client is gone + ); + let err; + let ran = false; + await gate + .run({ kind: 'text', priority: 1, userId: 'u' }, async () => { + ran = true; + return 'x'; + }) + .catch((e) => (err = e)); + (0, chai_1.expect)(ran).to.equal(false); // generation never ran + (0, chai_1.expect)(err).to.be.instanceOf(gate_1.ClientGoneError); + (0, chai_1.expect)(released.length).to.equal(1); // slot freed for the next waiter + }); + it('runs normally when the client is present', async () => { + const gate = new gate_1.PriorityGate({ + acquire: () => Promise.resolve(), + release: () => Promise.resolve(), + setPauseText: () => { }, + }, { toUser: () => { }, toGuest: () => { } }, async () => true); + const result = await gate.run({ kind: 'text', priority: 1, userId: 'u' }, async () => 'ok'); + (0, chai_1.expect)(result).to.equal('ok'); + }); + it('fails open (runs) when the presence check throws', async () => { + const gate = new gate_1.PriorityGate({ + acquire: () => Promise.resolve(), + release: () => Promise.resolve(), + setPauseText: () => { }, + }, { toUser: () => { }, toGuest: () => { } }, async () => { + throw new Error('presence backend down'); + }); + const result = await gate.run({ kind: 'text', priority: 1, userId: 'u' }, async () => 'ok'); + (0, chai_1.expect)(result).to.equal('ok'); + }); +}); +//# sourceMappingURL=queue-gate.spec.js.map \ No newline at end of file diff --git a/tests/queue-gate.spec.js.map b/tests/queue-gate.spec.js.map new file mode 100644 index 00000000..1ae86802 --- /dev/null +++ b/tests/queue-gate.spec.js.map @@ -0,0 +1 @@ +{"version":3,"file":"queue-gate.spec.js","sourceRoot":"","sources":["queue-gate.spec.ts"],"names":[],"mappings":";;AAAA,+BAA6B;AAC7B,4CAA+C;AAC/C,0CAA+F;AAE/F,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;AAEvD,SAAS,QAAQ,CAAC,IAAuC;IACvD,MAAM,MAAM,GAA6C,EAAE,CAAA;IAC3D,MAAM,IAAI,GAAG,IAAI,mBAAY,CAAC,IAAI,oBAAY,CAAC,IAAI,CAAC,EAAE;QACpD,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QACvD,OAAO,EAAE,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;KAC7D,CAAC,CAAA;IACF,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;AACzB,CAAC;AAED,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;QAClD,IAAI,OAAoB,CAAA;QACxB,MAAM,IAAI,GAAG,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAA;QACpD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;QAC/F,MAAM,IAAI,EAAE,CAAA;QACZ,IAAI,UAAU,GAAG,KAAK,CAAA;QACtB,MAAM,MAAM,GAAG,IAAI;aAChB,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,KAAK,IAAI,EAAE,CAAC,GAAG,CAAC;aACjE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;YACV,UAAU,GAAG,IAAI,CAAA;YACjB,OAAO,CAAC,CAAA;QACV,CAAC,CAAC,CAAA;QACJ,MAAM,IAAI,EAAE,CAAA;QACZ,IAAA,aAAM,EAAC,UAAU,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA,CAAC,uBAAuB;QAC1D,OAAO,EAAE,CAAA;QACT,IAAA,aAAM,EAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACjC,IAAA,aAAM,EAAC,MAAM,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACpC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;QAClD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CACtB,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAC3C,GAAG,EAAE,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAC5B,CAAA;QACD,KAAK,OAAO,CAAA;QACZ,MAAM,IAAI,EAAE,CAAA;QACZ,IAAI,OAAO,GAAG,KAAK,CAAA;QACnB,KAAK,SAAS,CAAC,CAAC,GAAG;YACjB,OAAO,GAAG,IAAI,CAAA;YACd,MAAM,GAAG,CAAA;QACX,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,CAAA;QACxF,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAA;QACzC,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,EAAE,CAAA;QACtB,MAAM,IAAI,EAAE,CAAA;QACZ,IAAA,aAAM,EAAC,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA,CAAC,eAAe;QAC/C,KAAK,IAAI,CAAA;IACX,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;QAC1D,IAAI,OAAoB,CAAA;QACxB,MAAM,IAAI,GAAG,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAA;QACpD,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;QACrE,MAAM,IAAI,EAAE,CAAA;QACZ,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,CAAA;QAC5F,MAAM,IAAI,EAAE,CAAA;QACZ,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,CAAC,EAAE,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QACnF,OAAO,EAAE,CAAA;QACT,MAAM,IAAI,EAAE,CAAA;QACZ,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,CAAC,EAAE,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACrF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,KAAK,GAAU,EAAE,CAAA;QACvB,IAAA,aAAM,EAAC,IAAA,sBAAe,EAAC,EAAE,GAAG,EAAE,GAAG,EAAS,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QACrE,yBAAyB;QACzB,IAAA,aAAM,EAAC,IAAA,sBAAe,EAAC,EAAE,GAAG,EAAE,GAAG,EAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACxE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,OAAO,GAAG;YACd,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;YACtD,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE;YAChC,YAAY,EAAE,GAAG,EAAE,GAAE,CAAC;SACvB,CAAA;QACD,MAAM,IAAI,GAAG,IAAI,mBAAY,CAAC,OAAc,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC,CAAA;QACtF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,CAAA;QAC3F,IAAA,aAAM,EAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAC7B,MAAM,MAAM,GAAa,EAAE,CAAA;QAC3B,KAAK,SAAS,CAAC,CAAC,GAAG;YACjB,MAAM,GAAG,CAAA;YACT,MAAM,GAAG,CAAA;QACX,CAAC;QACD,IAAI,KAAK,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,CACrF,GAAG,EAAE,CACN,EAAE,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAChB,CAAC;QACD,IAAA,aAAM,EAAC,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;IAC1C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,OAAO,GAAG;YACd,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;YACtD,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;YACtD,YAAY,EAAE,GAAG,EAAE,GAAE,CAAC;SACvB,CAAA;QACD,MAAM,IAAI,GAAG,IAAI,mBAAY,CAAC,OAAc,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC,CAAA;QACtF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,CAAA;QAC3F,IAAA,aAAM,EAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAC7B,MAAM,MAAM,GAAa,EAAE,CAAA;QAC3B,KAAK,SAAS,CAAC,CAAC,GAAG;YACjB,MAAM,GAAG,CAAA;QACX,CAAC;QACD,IAAI,KAAK,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,CACrF,GAAG,EAAE,CACN,EAAE,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAChB,CAAC;QACD,IAAA,aAAM,EAAC,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,KAAK,GAAa,EAAE,CAAA;QAC1B,MAAM,EAAE,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC;YAC5B,OAAO,EAAE,GAAG,EAAE;gBACZ,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBAChB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAA;YAC1B,CAAC;YACD,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE;YAChC,YAAY,EAAE,GAAG,EAAE,GAAE,CAAC;SACvB,CAAC,CAAA;QACF,MAAM,IAAI,GAAG,IAAI,mBAAY,CAAC,EAAE,CAAC,GAAG,CAAQ,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC,CAAA;QACtF,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC,CAAA;QAC7D,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,CAAQ,CAAC,CAAA;QAC/B,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC,CAAA;QAC7D,IAAA,aAAM,EAAC,KAAK,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;IACzC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,QAAQ,GAAa,EAAE,CAAA;QAC7B,MAAM,OAAO,GAAG;YACd,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE;YAChC,OAAO,EAAE,CAAC,EAAU,EAAE,EAAE;gBACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;gBACjB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAA;YAC1B,CAAC;YACD,YAAY,EAAE,GAAG,EAAE,GAAE,CAAC;SACvB,CAAA;QACD,MAAM,IAAI,GAAG,IAAI,mBAAY,CAC3B,OAAc,EACd,EAAE,MAAM,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,EACvC,KAAK,IAAI,EAAE,CAAC,KAAK,CAAC,iBAAiB;SACpC,CAAA;QACD,IAAI,GAAQ,CAAA;QACZ,IAAI,GAAG,GAAG,KAAK,CAAA;QACf,MAAM,IAAI;aACP,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,KAAK,IAAI,EAAE;YAC1D,GAAG,GAAG,IAAI,CAAA;YACV,OAAO,GAAG,CAAA;QACZ,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;QAC1B,IAAA,aAAM,EAAC,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA,CAAC,uBAAuB;QACnD,IAAA,aAAM,EAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,sBAAe,CAAC,CAAA;QAC7C,IAAA,aAAM,EAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA,CAAC,iCAAiC;IACvE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,IAAI,GAAG,IAAI,mBAAY,CAC3B;YACE,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE;YAChC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE;YAChC,YAAY,EAAE,GAAG,EAAE,GAAE,CAAC;SAChB,EACR,EAAE,MAAM,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,EACvC,KAAK,IAAI,EAAE,CAAC,IAAI,CACjB,CAAA;QACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,CAAA;QAC3F,IAAA,aAAM,EAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC/B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,IAAI,GAAG,IAAI,mBAAY,CAC3B;YACE,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE;YAChC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE;YAChC,YAAY,EAAE,GAAG,EAAE,GAAE,CAAC;SAChB,EACR,EAAE,MAAM,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,EACvC,KAAK,IAAI,EAAE;YACT,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAA;QAC1C,CAAC,CACF,CAAA;QACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,CAAA;QAC3F,IAAA,aAAM,EAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC/B,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/tests/queue-gate.spec.ts b/tests/queue-gate.spec.ts new file mode 100644 index 00000000..8e7e270d --- /dev/null +++ b/tests/queue-gate.spec.ts @@ -0,0 +1,196 @@ +import { expect } from 'chai' +import { LocalBackend } from '/srv/queue/local' +import { PriorityGate, priorityForUser, PositionEvent, ClientGoneError } from '/srv/queue/gate' + +const tick = () => new Promise((r) => setTimeout(r, 0)) + +function makeGate(caps: { global: number; image: number }) { + const events: Array<{ to: string; ev: PositionEvent }> = [] + const gate = new PriorityGate(new LocalBackend(caps), { + toUser: (userId, ev) => events.push({ to: userId, ev }), + toGuest: (socketId, ev) => events.push({ to: socketId, ev }), + }) + return { gate, events } +} + +describe('PriorityGate', () => { + it('run holds a slot for the duration and releases it', async () => { + const { gate } = makeGate({ global: 1, image: 4 }) + let release!: () => void + const slow = new Promise((r) => (release = r)) + const first = gate.run({ kind: 'text', priority: 1, userId: 'u1' }, () => slow.then(() => 'a')) + await tick() + let secondDone = false + const second = gate + .run({ kind: 'text', priority: 1, userId: 'u2' }, async () => 'b') + .then((v) => { + secondDone = true + return v + }) + await tick() + expect(secondDone).to.equal(false) // blocked behind first + release() + expect(await first).to.equal('a') + expect(await second).to.equal('b') + }) + + it('gateStream does no work before a slot is acquired', async () => { + const { gate } = makeGate({ global: 1, image: 4 }) + const blocker = gate.run( + { kind: 'text', priority: 1, userId: 'u0' }, + () => new Promise(() => {}) + ) + void blocker + await tick() + let started = false + async function* gen() { + started = true + yield 'x' + } + const stream = gate.gateStream({ kind: 'text', priority: 1, userId: 'u1' }, () => gen()) + const it = stream[Symbol.asyncIterator]() + const next = it.next() + await tick() + expect(started).to.equal(false) // still queued + void next + }) + + it('emits a position event to the waiting user and a clear on admit', async () => { + const { gate, events } = makeGate({ global: 1, image: 4 }) + let release!: () => void + const slow = new Promise((r) => (release = r)) + gate.run({ kind: 'text', priority: 1, userId: 'holder' }, () => slow) + await tick() + gate.run({ kind: 'text', priority: 1, userId: 'waiter', requestId: 'r1' }, async () => 'ok') + await tick() + expect(events.some((e) => e.to === 'waiter' && e.ev.position === 1)).to.equal(true) + release() + await tick() + expect(events.some((e) => e.to === 'waiter' && e.ev.position === 0)).to.equal(true) + }) + + it('priorityForUser: guest=2, free=1, premium=0', () => { + const tiers: any[] = [] + expect(priorityForUser({ _id: 'g' } as any, true, tiers)).to.equal(2) + // no active tier -> free + expect(priorityForUser({ _id: 'u' } as any, false, tiers)).to.equal(1) + }) + + it('degrades to ungated when the backend acquire fails', async () => { + const failing = { + acquire: () => Promise.reject(new Error('redis down')), + release: () => Promise.resolve(), + setPauseText: () => {}, + } + const gate = new PriorityGate(failing as any, { toUser: () => {}, toGuest: () => {} }) + const result = await gate.run({ kind: 'text', priority: 1, userId: 'u' }, async () => 'ok') + expect(result).to.equal('ok') + const chunks: string[] = [] + async function* gen() { + yield 'a' + yield 'b' + } + for await (const c of gate.gateStream({ kind: 'text', priority: 1, userId: 'u' }, () => + gen() + )) { + chunks.push(c) + } + expect(chunks).to.deep.equal(['a', 'b']) + }) + + it('degrades to ungated when both acquire AND release fail', async () => { + const failing = { + acquire: () => Promise.reject(new Error('redis down')), + release: () => Promise.reject(new Error('redis down')), + setPauseText: () => {}, + } + const gate = new PriorityGate(failing as any, { toUser: () => {}, toGuest: () => {} }) + const result = await gate.run({ kind: 'text', priority: 1, userId: 'u' }, async () => 'ok') + expect(result).to.equal('ok') + const chunks: string[] = [] + async function* gen() { + yield 'a' + } + for await (const c of gate.gateStream({ kind: 'text', priority: 1, userId: 'u' }, () => + gen() + )) { + chunks.push(c) + } + expect(chunks).to.deep.equal(['a']) + }) + + it('setBackend swaps the active backend', async () => { + const calls: string[] = [] + const mk = (name: string) => ({ + acquire: () => { + calls.push(name) + return Promise.resolve() + }, + release: () => Promise.resolve(), + setPauseText: () => {}, + }) + const gate = new PriorityGate(mk('A') as any, { toUser: () => {}, toGuest: () => {} }) + await gate.run({ kind: 'text', priority: 1 }, async () => '') + gate.setBackend(mk('B') as any) + await gate.run({ kind: 'text', priority: 1 }, async () => '') + expect(calls).to.deep.equal(['A', 'B']) + }) + + it('drops an admitted request whose client has disconnected', async () => { + const released: string[] = [] + const backend = { + acquire: () => Promise.resolve(), + release: (id: string) => { + released.push(id) + return Promise.resolve() + }, + setPauseText: () => {}, + } + const gate = new PriorityGate( + backend as any, + { toUser: () => {}, toGuest: () => {} }, + async () => false // client is gone + ) + let err: any + let ran = false + await gate + .run({ kind: 'text', priority: 1, userId: 'u' }, async () => { + ran = true + return 'x' + }) + .catch((e) => (err = e)) + expect(ran).to.equal(false) // generation never ran + expect(err).to.be.instanceOf(ClientGoneError) + expect(released.length).to.equal(1) // slot freed for the next waiter + }) + + it('runs normally when the client is present', async () => { + const gate = new PriorityGate( + { + acquire: () => Promise.resolve(), + release: () => Promise.resolve(), + setPauseText: () => {}, + } as any, + { toUser: () => {}, toGuest: () => {} }, + async () => true + ) + const result = await gate.run({ kind: 'text', priority: 1, userId: 'u' }, async () => 'ok') + expect(result).to.equal('ok') + }) + + it('fails open (runs) when the presence check throws', async () => { + const gate = new PriorityGate( + { + acquire: () => Promise.resolve(), + release: () => Promise.resolve(), + setPauseText: () => {}, + } as any, + { toUser: () => {}, toGuest: () => {} }, + async () => { + throw new Error('presence backend down') + } + ) + const result = await gate.run({ kind: 'text', priority: 1, userId: 'u' }, async () => 'ok') + expect(result).to.equal('ok') + }) +}) diff --git a/tests/queue-local.spec.js b/tests/queue-local.spec.js new file mode 100644 index 00000000..ba2e3edd --- /dev/null +++ b/tests/queue-local.spec.js @@ -0,0 +1,76 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const chai_1 = require("chai"); +const local_1 = require("/srv/queue/local"); +const tick = () => new Promise((r) => setTimeout(r, 0)); +describe('LocalBackend', () => { + it('admits up to the global cap, queues the rest', async () => { + const b = new local_1.LocalBackend({ global: 2, image: 4 }); + const admitted = []; + for (const id of ['a', 'b', 'c']) { + b.acquire({ id, kind: 'text', priority: 1, enqueuedAt: id.charCodeAt(0) }).then(() => admitted.push(id)); + } + await tick(); + (0, chai_1.expect)(admitted).to.deep.equal(['a', 'b']); + await b.release('a'); + await tick(); + (0, chai_1.expect)(admitted).to.deep.equal(['a', 'b', 'c']); + }); + it('serves premium before free regardless of arrival order', async () => { + const b = new local_1.LocalBackend({ global: 1, image: 4 }); + const order = []; + b.acquire({ id: 'hold', kind: 'text', priority: 1, enqueuedAt: 1 }).then(() => order.push('hold')); + await tick(); + b.acquire({ id: 'free', kind: 'text', priority: 1, enqueuedAt: 2 }).then(() => order.push('free')); + b.acquire({ id: 'prem', kind: 'text', priority: 0, enqueuedAt: 3 }).then(() => order.push('prem')); + await tick(); + await b.release('hold'); + await tick(); + await b.release('prem'); + await tick(); + (0, chai_1.expect)(order).to.deep.equal(['hold', 'prem', 'free']); + }); + it('enforces the image sub-cap without blocking text', async () => { + const b = new local_1.LocalBackend({ global: 10, image: 1 }); + const admitted = []; + b.acquire({ id: 'i1', kind: 'image', priority: 1, enqueuedAt: 1 }).then(() => admitted.push('i1')); + b.acquire({ id: 'i2', kind: 'image', priority: 0, enqueuedAt: 2 }).then(() => admitted.push('i2')); + b.acquire({ id: 't1', kind: 'text', priority: 1, enqueuedAt: 3 }).then(() => admitted.push('t1')); + await tick(); + // i1 takes the only image slot; i2 waits on sub-cap; t1 (text) is admitted past it + (0, chai_1.expect)(admitted.sort()).to.deep.equal(['i1', 't1']); + }); + it('pauses text but still admits image when breaker is on', async () => { + const b = new local_1.LocalBackend({ global: 10, image: 4 }); + b.setPauseText(true); + const admitted = []; + b.acquire({ id: 't', kind: 'text', priority: 0, enqueuedAt: 1 }).then(() => admitted.push('t')); + b.acquire({ id: 'i', kind: 'image', priority: 1, enqueuedAt: 2 }).then(() => admitted.push('i')); + await tick(); + (0, chai_1.expect)(admitted).to.deep.equal(['i']); + b.setPauseText(false); + await tick(); + (0, chai_1.expect)(admitted.sort()).to.deep.equal(['i', 't']); + }); + it('reports position to waiters and rejects on abort', async () => { + const b = new local_1.LocalBackend({ global: 1, image: 4 }); + b.acquire({ id: 'hold', kind: 'text', priority: 1, enqueuedAt: 1 }); + const positions = []; + const ac = new AbortController(); + const p = b.acquire({ + id: 'wait', + kind: 'text', + priority: 1, + enqueuedAt: 2, + onPosition: (n) => positions.push(n), + signal: ac.signal, + }); + await tick(); + (0, chai_1.expect)(positions[positions.length - 1]).to.equal(1); // 1 ahead of it + ac.abort(); + let rejected = false; + await p.catch(() => (rejected = true)); + (0, chai_1.expect)(rejected).to.equal(true); + }); +}); +//# sourceMappingURL=queue-local.spec.js.map \ No newline at end of file diff --git a/tests/queue-local.spec.js.map b/tests/queue-local.spec.js.map new file mode 100644 index 00000000..5d7dd2a0 --- /dev/null +++ b/tests/queue-local.spec.js.map @@ -0,0 +1 @@ +{"version":3,"file":"queue-local.spec.js","sourceRoot":"","sources":["queue-local.spec.ts"],"names":[],"mappings":";;AAAA,+BAA6B;AAC7B,4CAA+C;AAE/C,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;AAEvD,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,CAAC,GAAG,IAAI,oBAAY,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;QACnD,MAAM,QAAQ,GAAa,EAAE,CAAA;QAC7B,KAAK,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;YACjC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CACnF,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAClB,CAAA;QACH,CAAC;QACD,MAAM,IAAI,EAAE,CAAA;QACZ,IAAA,aAAM,EAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;QAC1C,MAAM,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QACpB,MAAM,IAAI,EAAE,CAAA;QACZ,IAAA,aAAM,EAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;IACjD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,CAAC,GAAG,IAAI,oBAAY,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;QACnD,MAAM,KAAK,GAAa,EAAE,CAAA;QAC1B,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;QAClG,MAAM,IAAI,EAAE,CAAA;QACZ,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;QAClG,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;QAClG,MAAM,IAAI,EAAE,CAAA;QACZ,MAAM,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;QACvB,MAAM,IAAI,EAAE,CAAA;QACZ,MAAM,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;QACvB,MAAM,IAAI,EAAE,CAAA;QACZ,IAAA,aAAM,EAAC,KAAK,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IACvD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,CAAC,GAAG,IAAI,oBAAY,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;QACpD,MAAM,QAAQ,GAAa,EAAE,CAAA;QAC7B,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QAClG,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QAClG,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QACjG,MAAM,IAAI,EAAE,CAAA;QACZ,mFAAmF;QACnF,IAAA,aAAM,EAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;IACrD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,CAAC,GAAG,IAAI,oBAAY,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;QACpD,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAA;QACpB,MAAM,QAAQ,GAAa,EAAE,CAAA;QAC7B,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;QAC/F,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;QAChG,MAAM,IAAI,EAAE,CAAA;QACZ,IAAA,aAAM,EAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;QACrC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAA;QACrB,MAAM,IAAI,EAAE,CAAA;QACZ,IAAA,aAAM,EAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;IACnD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,CAAC,GAAG,IAAI,oBAAY,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;QACnD,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAA;QACnE,MAAM,SAAS,GAAa,EAAE,CAAA;QAC9B,MAAM,EAAE,GAAG,IAAI,eAAe,EAAE,CAAA;QAChC,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC;YAClB,EAAE,EAAE,MAAM;YACV,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,CAAC;YACX,UAAU,EAAE,CAAC;YACb,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;YACpC,MAAM,EAAE,EAAE,CAAC,MAAM;SAClB,CAAC,CAAA;QACF,MAAM,IAAI,EAAE,CAAA;QACZ,IAAA,aAAM,EAAC,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA,CAAC,gBAAgB;QACpE,EAAE,CAAC,KAAK,EAAE,CAAA;QACV,IAAI,QAAQ,GAAG,KAAK,CAAA;QACpB,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAA;QACtC,IAAA,aAAM,EAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACjC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/tests/queue-local.spec.ts b/tests/queue-local.spec.ts new file mode 100644 index 00000000..ea30325e --- /dev/null +++ b/tests/queue-local.spec.ts @@ -0,0 +1,81 @@ +import { expect } from 'chai' +import { LocalBackend } from '/srv/queue/local' + +const tick = () => new Promise((r) => setTimeout(r, 0)) + +describe('LocalBackend', () => { + it('admits up to the global cap, queues the rest', async () => { + const b = new LocalBackend({ global: 2, image: 4 }) + const admitted: string[] = [] + for (const id of ['a', 'b', 'c']) { + b.acquire({ id, kind: 'text', priority: 1, enqueuedAt: id.charCodeAt(0) }).then(() => + admitted.push(id) + ) + } + await tick() + expect(admitted).to.deep.equal(['a', 'b']) + await b.release('a') + await tick() + expect(admitted).to.deep.equal(['a', 'b', 'c']) + }) + + it('serves premium before free regardless of arrival order', async () => { + const b = new LocalBackend({ global: 1, image: 4 }) + const order: string[] = [] + b.acquire({ id: 'hold', kind: 'text', priority: 1, enqueuedAt: 1 }).then(() => order.push('hold')) + await tick() + b.acquire({ id: 'free', kind: 'text', priority: 1, enqueuedAt: 2 }).then(() => order.push('free')) + b.acquire({ id: 'prem', kind: 'text', priority: 0, enqueuedAt: 3 }).then(() => order.push('prem')) + await tick() + await b.release('hold') + await tick() + await b.release('prem') + await tick() + expect(order).to.deep.equal(['hold', 'prem', 'free']) + }) + + it('enforces the image sub-cap without blocking text', async () => { + const b = new LocalBackend({ global: 10, image: 1 }) + const admitted: string[] = [] + b.acquire({ id: 'i1', kind: 'image', priority: 1, enqueuedAt: 1 }).then(() => admitted.push('i1')) + b.acquire({ id: 'i2', kind: 'image', priority: 0, enqueuedAt: 2 }).then(() => admitted.push('i2')) + b.acquire({ id: 't1', kind: 'text', priority: 1, enqueuedAt: 3 }).then(() => admitted.push('t1')) + await tick() + // i1 takes the only image slot; i2 waits on sub-cap; t1 (text) is admitted past it + expect(admitted.sort()).to.deep.equal(['i1', 't1']) + }) + + it('pauses text but still admits image when breaker is on', async () => { + const b = new LocalBackend({ global: 10, image: 4 }) + b.setPauseText(true) + const admitted: string[] = [] + b.acquire({ id: 't', kind: 'text', priority: 0, enqueuedAt: 1 }).then(() => admitted.push('t')) + b.acquire({ id: 'i', kind: 'image', priority: 1, enqueuedAt: 2 }).then(() => admitted.push('i')) + await tick() + expect(admitted).to.deep.equal(['i']) + b.setPauseText(false) + await tick() + expect(admitted.sort()).to.deep.equal(['i', 't']) + }) + + it('reports position to waiters and rejects on abort', async () => { + const b = new LocalBackend({ global: 1, image: 4 }) + b.acquire({ id: 'hold', kind: 'text', priority: 1, enqueuedAt: 1 }) + const positions: number[] = [] + const ac = new AbortController() + const p = b.acquire({ + id: 'wait', + kind: 'text', + priority: 1, + enqueuedAt: 2, + onPosition: (n) => positions.push(n), + signal: ac.signal, + }) + await tick() + expect(positions[positions.length - 1]).to.equal(1) // 1 ahead of it + ac.abort() + let rejected = false + await p.catch(() => (rejected = true)) + expect(rejected).to.equal(true) + }) +}) diff --git a/tests/queue-metrics.spec.js b/tests/queue-metrics.spec.js new file mode 100644 index 00000000..f5594cc8 --- /dev/null +++ b/tests/queue-metrics.spec.js @@ -0,0 +1,31 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const chai_1 = require("chai"); +const metrics_1 = require("/srv/queue/metrics"); +const SAMPLE = `# HELP vllm:num_requests_running ... +# TYPE vllm:num_requests_running gauge +vllm:num_requests_running{model_name="x"} 7.0 +vllm:num_requests_waiting{model_name="x"} 3.0 +`; +describe('vLLM metrics', () => { + it('parses running and waiting gauges', () => { + (0, chai_1.expect)((0, metrics_1.parsePrometheus)(SAMPLE)).to.deep.equal({ running: 7, waiting: 3 }); + }); + it('returns undefined for missing metrics', () => { + (0, chai_1.expect)((0, metrics_1.parsePrometheus)('nothing here')).to.deep.equal({ running: undefined, waiting: undefined }); + }); + it('breaker pauses text only above threshold', () => { + const b = new metrics_1.Breaker(1, 10000); + b.update(2, 1000); + (0, chai_1.expect)(b.pauseText(1000)).to.equal(true); + b.update(1, 2000); + (0, chai_1.expect)(b.pauseText(2000)).to.equal(false); + }); + it('breaker fails open when metrics are stale', () => { + const b = new metrics_1.Breaker(1, 5000); + b.update(5, 1000); + (0, chai_1.expect)(b.pauseText(1000)).to.equal(true); + (0, chai_1.expect)(b.pauseText(7000)).to.equal(false); // 6s since last scrape > 5s stale window + }); +}); +//# sourceMappingURL=queue-metrics.spec.js.map \ No newline at end of file diff --git a/tests/queue-metrics.spec.js.map b/tests/queue-metrics.spec.js.map new file mode 100644 index 00000000..bfa94571 --- /dev/null +++ b/tests/queue-metrics.spec.js.map @@ -0,0 +1 @@ +{"version":3,"file":"queue-metrics.spec.js","sourceRoot":"","sources":["queue-metrics.spec.ts"],"names":[],"mappings":";;AAAA,+BAA6B;AAC7B,gDAA6D;AAE7D,MAAM,MAAM,GAAG;;;;CAId,CAAA;AAED,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,IAAA,aAAM,EAAC,IAAA,yBAAe,EAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAA;IAC3E,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,IAAA,aAAM,EAAC,IAAA,yBAAe,EAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAA;IACnG,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,GAAG,IAAI,iBAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;QAC/B,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;QACjB,IAAA,aAAM,EAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QACxC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;QACjB,IAAA,aAAM,EAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IAC3C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,CAAC,GAAG,IAAI,iBAAO,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;QAC9B,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;QACjB,IAAA,aAAM,EAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QACxC,IAAA,aAAM,EAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA,CAAC,yCAAyC;IACrF,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/tests/queue-metrics.spec.ts b/tests/queue-metrics.spec.ts new file mode 100644 index 00000000..e8bbcc11 --- /dev/null +++ b/tests/queue-metrics.spec.ts @@ -0,0 +1,33 @@ +import { expect } from 'chai' +import { parsePrometheus, Breaker } from '/srv/queue/metrics' + +const SAMPLE = `# HELP vllm:num_requests_running ... +# TYPE vllm:num_requests_running gauge +vllm:num_requests_running{model_name="x"} 7.0 +vllm:num_requests_waiting{model_name="x"} 3.0 +` + +describe('vLLM metrics', () => { + it('parses running and waiting gauges', () => { + expect(parsePrometheus(SAMPLE)).to.deep.equal({ running: 7, waiting: 3 }) + }) + + it('returns undefined for missing metrics', () => { + expect(parsePrometheus('nothing here')).to.deep.equal({ running: undefined, waiting: undefined }) + }) + + it('breaker pauses text only above threshold', () => { + const b = new Breaker(1, 10000) + b.update(2, 1000) + expect(b.pauseText(1000)).to.equal(true) + b.update(1, 2000) + expect(b.pauseText(2000)).to.equal(false) + }) + + it('breaker fails open when metrics are stale', () => { + const b = new Breaker(1, 5000) + b.update(5, 1000) + expect(b.pauseText(1000)).to.equal(true) + expect(b.pauseText(7000)).to.equal(false) // 6s since last scrape > 5s stale window + }) +}) diff --git a/tests/queue-presence.spec.js b/tests/queue-presence.spec.js new file mode 100644 index 00000000..c9db65d5 --- /dev/null +++ b/tests/queue-presence.spec.js @@ -0,0 +1,70 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const chai_1 = require("chai"); +const presence_1 = require("/srv/queue/presence"); +describe('presence key derivation', () => { + it('derives user and guest keys', () => { + (0, chai_1.expect)((0, presence_1.userKey)('u1')).to.equal('presence:u:u1'); + (0, chai_1.expect)((0, presence_1.guestKey)('s1')).to.equal('presence:g:s1'); + (0, chai_1.expect)((0, presence_1.keyFor)({ userId: 'u1' })).to.equal('presence:u:u1'); + (0, chai_1.expect)((0, presence_1.keyFor)({ socketId: 's1' })).to.equal('presence:g:s1'); + (0, chai_1.expect)((0, presence_1.keyFor)({})).to.equal(undefined); + }); +}); +describe('isPresentLocal', () => { + it('user present iff they have a live socket', () => { + const maps = { allSockets: new Map(), userSockets: new Map([['u1', [{}]]]) }; + (0, chai_1.expect)((0, presence_1.isPresentLocal)({ userId: 'u1' }, maps)).to.equal(true); + (0, chai_1.expect)((0, presence_1.isPresentLocal)({ userId: 'u2' }, maps)).to.equal(false); + }); + it('guest present iff their socket is in allSockets', () => { + const maps = { allSockets: new Map([['s1', {}]]), userSockets: new Map() }; + (0, chai_1.expect)((0, presence_1.isPresentLocal)({ socketId: 's1' }, maps)).to.equal(true); + (0, chai_1.expect)((0, presence_1.isPresentLocal)({ socketId: 's2' }, maps)).to.equal(false); + }); + it('no identity → present (fail open)', () => { + (0, chai_1.expect)((0, presence_1.isPresentLocal)({}, { allSockets: new Map(), userSockets: new Map() })).to.equal(true); + }); +}); +describe('presence redis seam (requires local redis)', function () { + this.timeout(8000); + let cmd; + let available = true; + const key = 'presence:test:' + process.pid; + before(async () => { + try { + const { createClient } = require('redis'); + cmd = createClient({ url: 'redis://127.0.0.1:6379' }); + await cmd.connect(); + } + catch { + available = false; + } + }); + after(async () => { + if (!available) + return; + await cmd.del(key); + await cmd.quit(); + }); + it('mark → present, clear → absent', async function () { + if (!available) + this.skip(); + const { markRedis, clearRedis, isPresentRedis } = require('/srv/queue/presence'); + const now = 1000000; + await markRedis(cmd, key, 'sock-a', now); + (0, chai_1.expect)(await isPresentRedis(cmd, key, now)).to.equal(true); + await clearRedis(cmd, key, 'sock-a'); + (0, chai_1.expect)(await isPresentRedis(cmd, key, now)).to.equal(false); + }); + it('expired members are reaped → absent', async function () { + if (!available) + this.skip(); + const { markRedis, isPresentRedis } = require('/srv/queue/presence'); + const past = 1000000; + await markRedis(cmd, key, 'sock-b', past); // expiry = past + 75s + // check far in the future, past the TTL window → reaped + (0, chai_1.expect)(await isPresentRedis(cmd, key, past + 200000)).to.equal(false); + }); +}); +//# sourceMappingURL=queue-presence.spec.js.map \ No newline at end of file diff --git a/tests/queue-presence.spec.js.map b/tests/queue-presence.spec.js.map new file mode 100644 index 00000000..f9dfa651 --- /dev/null +++ b/tests/queue-presence.spec.js.map @@ -0,0 +1 @@ +{"version":3,"file":"queue-presence.spec.js","sourceRoot":"","sources":["queue-presence.spec.ts"],"names":[],"mappings":";;AAAA,+BAA6B;AAC7B,kDAA+E;AAE/E,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,IAAA,aAAM,EAAC,IAAA,kBAAO,EAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,CAAA;QAC/C,IAAA,aAAM,EAAC,IAAA,mBAAQ,EAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,CAAA;QAChD,IAAA,aAAM,EAAC,IAAA,iBAAM,EAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,CAAA;QAC1D,IAAA,aAAM,EAAC,IAAA,iBAAM,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,CAAA;QAC5D,IAAA,aAAM,EAAC,IAAA,iBAAM,EAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;IACxC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,IAAI,GAAG,EAAE,UAAU,EAAE,IAAI,GAAG,EAAE,EAAE,WAAW,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QAC5E,IAAA,aAAM,EAAC,IAAA,yBAAc,EAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAC7D,IAAA,aAAM,EAAC,IAAA,yBAAc,EAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IAChE,CAAC,CAAC,CAAA;IACF,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,IAAI,GAAG,EAAE,UAAU,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,GAAG,EAAE,EAAE,CAAA;QAC1E,IAAA,aAAM,EAAC,IAAA,yBAAc,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAC/D,IAAA,aAAM,EAAC,IAAA,yBAAc,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IAClE,CAAC,CAAC,CAAA;IACF,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,IAAA,aAAM,EAAC,IAAA,yBAAc,EAAC,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,GAAG,EAAE,EAAE,WAAW,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC9F,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,4CAA4C,EAAE;IACrD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAClB,IAAI,GAAQ,CAAA;IACZ,IAAI,SAAS,GAAG,IAAI,CAAA;IACpB,MAAM,GAAG,GAAG,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAA;IAE1C,MAAM,CAAC,KAAK,IAAI,EAAE;QAChB,IAAI,CAAC;YACH,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;YACzC,GAAG,GAAG,YAAY,CAAC,EAAE,GAAG,EAAE,wBAAwB,EAAE,CAAC,CAAA;YACrD,MAAM,GAAG,CAAC,OAAO,EAAE,CAAA;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,SAAS,GAAG,KAAK,CAAA;QACnB,CAAC;IACH,CAAC,CAAC,CAAA;IACF,KAAK,CAAC,KAAK,IAAI,EAAE;QACf,IAAI,CAAC,SAAS;YAAE,OAAM;QACtB,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAClB,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;IAClB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gCAAgC,EAAE,KAAK;QACxC,IAAI,CAAC,SAAS;YAAE,IAAI,CAAC,IAAI,EAAE,CAAA;QAC3B,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAA;QAChF,MAAM,GAAG,GAAG,OAAS,CAAA;QACrB,MAAM,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAA;QACxC,IAAA,aAAM,EAAC,MAAM,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAC1D,MAAM,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAA;QACpC,IAAA,aAAM,EAAC,MAAM,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IAC7D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qCAAqC,EAAE,KAAK;QAC7C,IAAI,CAAC,SAAS;YAAE,IAAI,CAAC,IAAI,EAAE,CAAA;QAC3B,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAA;QACpE,MAAM,IAAI,GAAG,OAAS,CAAA;QACtB,MAAM,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAA,CAAC,sBAAsB;QAChE,wDAAwD;QACxD,IAAA,aAAM,EAAC,MAAM,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,GAAG,MAAO,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IACxE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/tests/queue-presence.spec.ts b/tests/queue-presence.spec.ts new file mode 100644 index 00000000..af14b64b --- /dev/null +++ b/tests/queue-presence.spec.ts @@ -0,0 +1,69 @@ +import { expect } from 'chai' +import { userKey, guestKey, keyFor, isPresentLocal } from '/srv/queue/presence' + +describe('presence key derivation', () => { + it('derives user and guest keys', () => { + expect(userKey('u1')).to.equal('presence:u:u1') + expect(guestKey('s1')).to.equal('presence:g:s1') + expect(keyFor({ userId: 'u1' })).to.equal('presence:u:u1') + expect(keyFor({ socketId: 's1' })).to.equal('presence:g:s1') + expect(keyFor({})).to.equal(undefined) + }) +}) + +describe('isPresentLocal', () => { + it('user present iff they have a live socket', () => { + const maps = { allSockets: new Map(), userSockets: new Map([['u1', [{}]]]) } + expect(isPresentLocal({ userId: 'u1' }, maps)).to.equal(true) + expect(isPresentLocal({ userId: 'u2' }, maps)).to.equal(false) + }) + it('guest present iff their socket is in allSockets', () => { + const maps = { allSockets: new Map([['s1', {}]]), userSockets: new Map() } + expect(isPresentLocal({ socketId: 's1' }, maps)).to.equal(true) + expect(isPresentLocal({ socketId: 's2' }, maps)).to.equal(false) + }) + it('no identity → present (fail open)', () => { + expect(isPresentLocal({}, { allSockets: new Map(), userSockets: new Map() })).to.equal(true) + }) +}) + +describe('presence redis seam (requires local redis)', function () { + this.timeout(8000) + let cmd: any + let available = true + const key = 'presence:test:' + process.pid + + before(async () => { + try { + const { createClient } = require('redis') + cmd = createClient({ url: 'redis://127.0.0.1:6379' }) + await cmd.connect() + } catch { + available = false + } + }) + after(async () => { + if (!available) return + await cmd.del(key) + await cmd.quit() + }) + + it('mark → present, clear → absent', async function () { + if (!available) this.skip() + const { markRedis, clearRedis, isPresentRedis } = require('/srv/queue/presence') + const now = 1_000_000 + await markRedis(cmd, key, 'sock-a', now) + expect(await isPresentRedis(cmd, key, now)).to.equal(true) + await clearRedis(cmd, key, 'sock-a') + expect(await isPresentRedis(cmd, key, now)).to.equal(false) + }) + + it('expired members are reaped → absent', async function () { + if (!available) this.skip() + const { markRedis, isPresentRedis } = require('/srv/queue/presence') + const past = 1_000_000 + await markRedis(cmd, key, 'sock-b', past) // expiry = past + 75s + // check far in the future, past the TTL window → reaped + expect(await isPresentRedis(cmd, key, past + 200_000)).to.equal(false) + }) +}) diff --git a/tests/queue-redis.spec.js b/tests/queue-redis.spec.js new file mode 100644 index 00000000..8771e3cc --- /dev/null +++ b/tests/queue-redis.spec.js @@ -0,0 +1,83 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const chai_1 = require("chai"); +const redis_1 = require("redis"); +const redis_2 = require("/srv/queue/redis"); +const tick = (ms = 50) => new Promise((r) => setTimeout(r, ms)); +describe('RedisBackend acquire cleanup (stubbed)', () => { + it('ZREMs its waiter from gate:wait when the acquire eval throws', async () => { + const { RedisBackend } = require('/srv/queue/redis'); + const scripts = []; + const cmd = { + eval: (script) => { + if (script.includes('ZREM')) { + scripts.push('zrem'); + return Promise.resolve(1); + } + scripts.push('acquire'); + return Promise.reject(new Error('redis down')); + }, + publish: () => Promise.resolve(1), + hSet: () => Promise.resolve(1), + }; + const sub = { subscribe: () => Promise.resolve() }; + const backend = new RedisBackend({ + caps: { global: 10, image: 4 }, + cmd: cmd, + sub: sub, + keyPrefix: 'test-cleanup', + }); + let threw = false; + await backend.acquire({ id: 'a', kind: 'text', priority: 1, enqueuedAt: 1 }).catch(() => { + threw = true; + }); + (0, chai_1.expect)(threw).to.equal(true); + (0, chai_1.expect)(scripts).to.include('zrem'); + }); +}); +describe('RedisBackend (requires local redis)', function () { + this.timeout(8000); + let cmd; + let sub; + let available = true; + const prefix = 'test-gate-' + process.pid + '-' + Math.floor(Math.random() * 1e6); + before(async () => { + try { + cmd = (0, redis_1.createClient)({ url: 'redis://127.0.0.1:6379' }); + sub = cmd.duplicate(); + await cmd.connect(); + await sub.connect(); + } + catch { + available = false; + } + }); + after(async () => { + if (!available) + return; + const keys = await cmd.keys(prefix + ':*'); + if (keys.length) + await cmd.del(keys); + await cmd.quit(); + await sub.quit(); + }); + it('caps combined inflight and serves premium first', async function () { + if (!available) + this.skip(); + const b = new redis_2.RedisBackend({ caps: { global: 1, image: 4 }, cmd, sub, keyPrefix: prefix }); + const order = []; + await b + .acquire({ id: 'hold', kind: 'text', priority: 1, enqueuedAt: 1 }) + .then(() => order.push('hold')); + b.acquire({ id: 'free', kind: 'text', priority: 1, enqueuedAt: 2 }).then(() => order.push('free')); + b.acquire({ id: 'prem', kind: 'text', priority: 0, enqueuedAt: 3 }).then(() => order.push('prem')); + await tick(); + await b.release('hold'); + await tick(); + (0, chai_1.expect)(order).to.deep.equal(['hold', 'prem']); + await b.release('prem'); + await tick(); + (0, chai_1.expect)(order).to.deep.equal(['hold', 'prem', 'free']); + }); +}); +//# sourceMappingURL=queue-redis.spec.js.map \ No newline at end of file diff --git a/tests/queue-redis.spec.js.map b/tests/queue-redis.spec.js.map new file mode 100644 index 00000000..747ed64c --- /dev/null +++ b/tests/queue-redis.spec.js.map @@ -0,0 +1 @@ +{"version":3,"file":"queue-redis.spec.js","sourceRoot":"","sources":["queue-redis.spec.ts"],"names":[],"mappings":";;AAAA,+BAA6B;AAC7B,iCAAoC;AACpC,4CAA+C;AAE/C,MAAM,IAAI,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;AAE/D,QAAQ,CAAC,wCAAwC,EAAE,GAAG,EAAE;IACtD,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC5E,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAA;QACpD,MAAM,OAAO,GAAa,EAAE,CAAA;QAC5B,MAAM,GAAG,GAAG;YACV,IAAI,EAAE,CAAC,MAAc,EAAE,EAAE;gBACvB,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC5B,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;oBACpB,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;gBAC3B,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;gBACvB,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC,CAAA;YAChD,CAAC;YACD,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;YACjC,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;SAC/B,CAAA;QACD,MAAM,GAAG,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAA;QAClD,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC;YAC/B,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;YAC9B,GAAG,EAAE,GAAU;YACf,GAAG,EAAE,GAAU;YACf,SAAS,EAAE,cAAc;SAC1B,CAAC,CAAA;QACF,IAAI,KAAK,GAAG,KAAK,CAAA;QACjB,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;YACtF,KAAK,GAAG,IAAI,CAAA;QACd,CAAC,CAAC,CAAA;QACF,IAAA,aAAM,EAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAC5B,IAAA,aAAM,EAAC,OAAO,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IACpC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,qCAAqC,EAAE;IAC9C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAClB,IAAI,GAAQ,CAAA;IACZ,IAAI,GAAQ,CAAA;IACZ,IAAI,SAAS,GAAG,IAAI,CAAA;IACpB,MAAM,MAAM,GAAG,YAAY,GAAG,OAAO,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAA;IAEjF,MAAM,CAAC,KAAK,IAAI,EAAE;QAChB,IAAI,CAAC;YACH,GAAG,GAAG,IAAA,oBAAY,EAAC,EAAE,GAAG,EAAE,wBAAwB,EAAE,CAAC,CAAA;YACrD,GAAG,GAAG,GAAG,CAAC,SAAS,EAAE,CAAA;YACrB,MAAM,GAAG,CAAC,OAAO,EAAE,CAAA;YACnB,MAAM,GAAG,CAAC,OAAO,EAAE,CAAA;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,SAAS,GAAG,KAAK,CAAA;QACnB,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,KAAK,CAAC,KAAK,IAAI,EAAE;QACf,IAAI,CAAC,SAAS;YAAE,OAAM;QACtB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;QAC1C,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACpC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;QAChB,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;IAClB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iDAAiD,EAAE,KAAK;QACzD,IAAI,CAAC,SAAS;YAAE,IAAI,CAAC,IAAI,EAAE,CAAA;QAC3B,MAAM,CAAC,GAAG,IAAI,oBAAY,CAAC,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAA;QAC1F,MAAM,KAAK,GAAa,EAAE,CAAA;QAC1B,MAAM,CAAC;aACJ,OAAO,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;aACjE,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;QACjC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAC5E,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CACnB,CAAA;QACD,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAC5E,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CACnB,CAAA;QACD,MAAM,IAAI,EAAE,CAAA;QACZ,MAAM,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;QACvB,MAAM,IAAI,EAAE,CAAA;QACZ,IAAA,aAAM,EAAC,KAAK,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;QAC7C,MAAM,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;QACvB,MAAM,IAAI,EAAE,CAAA;QACZ,IAAA,aAAM,EAAC,KAAK,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IACvD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/tests/queue-redis.spec.ts b/tests/queue-redis.spec.ts new file mode 100644 index 00000000..97a7ba49 --- /dev/null +++ b/tests/queue-redis.spec.ts @@ -0,0 +1,86 @@ +import { expect } from 'chai' +import { createClient } from 'redis' +import { RedisBackend } from '/srv/queue/redis' + +const tick = (ms = 50) => new Promise((r) => setTimeout(r, ms)) + +describe('RedisBackend acquire cleanup (stubbed)', () => { + it('ZREMs its waiter from gate:wait when the acquire eval throws', async () => { + const { RedisBackend } = require('/srv/queue/redis') + const scripts: string[] = [] + const cmd = { + eval: (script: string) => { + if (script.includes('ZREM')) { + scripts.push('zrem') + return Promise.resolve(1) + } + scripts.push('acquire') + return Promise.reject(new Error('redis down')) + }, + publish: () => Promise.resolve(1), + hSet: () => Promise.resolve(1), + } + const sub = { subscribe: () => Promise.resolve() } + const backend = new RedisBackend({ + caps: { global: 10, image: 4 }, + cmd: cmd as any, + sub: sub as any, + keyPrefix: 'test-cleanup', + }) + let threw = false + await backend.acquire({ id: 'a', kind: 'text', priority: 1, enqueuedAt: 1 }).catch(() => { + threw = true + }) + expect(threw).to.equal(true) + expect(scripts).to.include('zrem') + }) +}) + +describe('RedisBackend (requires local redis)', function () { + this.timeout(8000) + let cmd: any + let sub: any + let available = true + const prefix = 'test-gate-' + process.pid + '-' + Math.floor(Math.random() * 1e6) + + before(async () => { + try { + cmd = createClient({ url: 'redis://127.0.0.1:6379' }) + sub = cmd.duplicate() + await cmd.connect() + await sub.connect() + } catch { + available = false + } + }) + + after(async () => { + if (!available) return + const keys = await cmd.keys(prefix + ':*') + if (keys.length) await cmd.del(keys) + await cmd.quit() + await sub.quit() + }) + + it('caps combined inflight and serves premium first', async function () { + if (!available) this.skip() + const b = new RedisBackend({ caps: { global: 1, image: 4 }, cmd, sub, keyPrefix: prefix }) + const order: string[] = [] + await b + .acquire({ id: 'hold', kind: 'text', priority: 1, enqueuedAt: 1 }) + .then(() => order.push('hold')) + b.acquire({ id: 'free', kind: 'text', priority: 1, enqueuedAt: 2 }).then(() => + order.push('free') + ) + b.acquire({ id: 'prem', kind: 'text', priority: 0, enqueuedAt: 3 }).then(() => + order.push('prem') + ) + await tick() + await b.release('hold') + await tick() + expect(order).to.deep.equal(['hold', 'prem']) + await b.release('prem') + await tick() + expect(order).to.deep.equal(['hold', 'prem', 'free']) + }) +}) diff --git a/tests/resolve-scenario.spec.js b/tests/resolve-scenario.spec.js new file mode 100644 index 00000000..b5817ec2 --- /dev/null +++ b/tests/resolve-scenario.spec.js @@ -0,0 +1,52 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const chai_1 = require("chai"); +require("./init"); +const util_1 = require("./util"); +const prompt_1 = require("/common/prompt"); +const { chat, main, scenarioBook } = util_1.entities; +describe('Resolve scenario', () => { + it('will use main character scenario when chat does not override characters', () => { + const actual = (0, prompt_1.resolveScenario)({ ...chat, scenario: undefined, overrides: undefined }, { ...main, scenario: 'Main char scenario' }, []); + (0, chai_1.expect)(actual).to.equal('Main char scenario'); + }); + it('will use chat scenario when chat override is on', () => { + const actual = (0, prompt_1.resolveScenario)({ ...chat, scenario: 'Chat scenario', overrides: (0, util_1.toPersona)('Chat persona') }, { ...main, scenario: 'Main char scenario' }, []); + (0, chai_1.expect)(actual).to.equal('Chat scenario'); + }); + it('will append additional scenarios to the main character scenario', () => { + const book = { ...scenarioBook, text: 'Additional scenario' }; + const actual = (0, prompt_1.resolveScenario)({ ...chat, scenario: undefined, overrides: undefined }, { ...main, scenario: 'Main char scenario' }, [book]); + (0, chai_1.expect)(actual).to.equal('Main char scenario\nAdditional scenario'); + }); + it('will not append additional scenarios to the overriding chat scenario', () => { + const book = { ...scenarioBook, text: 'Additional scenario' }; + const actual = (0, prompt_1.resolveScenario)({ ...chat, scenario: 'Chat scenario', overrides: (0, util_1.toPersona)('Chat persona') }, { ...main, scenario: 'Main char scenario' }, [book]); + (0, chai_1.expect)(actual).to.equal('Chat scenario'); + }); + it('will overwrite main character scenario when the additional scenario has overwrite flag', () => { + const book = { ...scenarioBook, text: 'Overwritten scenario', overwriteCharacterScenario: true }; + const actual = (0, prompt_1.resolveScenario)({ ...chat, scenario: undefined, overrides: undefined }, { ...main, scenario: 'Main char scenario' }, [book]); + (0, chai_1.expect)(actual).to.equal('Overwritten scenario'); + }); + it('will not overwrite chat scenario when override is on and the additional scenario has overwrite flag', () => { + const book = { ...scenarioBook, text: 'Overwritten scenario', overwriteCharacterScenario: true }; + const actual = (0, prompt_1.resolveScenario)({ ...chat, scenario: 'Chat scenario', overrides: (0, util_1.toPersona)('Chat persona') }, { ...main, scenario: 'Main char scenario' }, [book]); + (0, chai_1.expect)(actual).to.equal('Chat scenario'); + }); + it('uses the replying character for the progression stage when provided', () => { + const speaker = { + ...main, + name: 'Speaker', + progression: { kind: 'archetype', archetype: 'romantic' }, + xp: 100000, + }; + const withSpeaker = (0, prompt_1.resolveScenario)({ ...chat, scenario: undefined, overrides: undefined }, { ...main, scenario: 'Scene', progression: undefined }, [], speaker); + const withoutSpeaker = (0, prompt_1.resolveScenario)({ ...chat, scenario: undefined, overrides: undefined }, { ...main, scenario: 'Scene', progression: undefined }, []); + // The speaker has a progression archetype + XP, so its stage token is prepended. + (0, chai_1.expect)(withSpeaker).to.contain('LEVEL('); + // The main char has no progression, so without a speaker no token appears. + (0, chai_1.expect)(withoutSpeaker).to.not.contain('LEVEL('); + }); +}); +//# sourceMappingURL=resolve-scenario.spec.js.map \ No newline at end of file diff --git a/tests/resolve-scenario.spec.js.map b/tests/resolve-scenario.spec.js.map new file mode 100644 index 00000000..acb6e41e --- /dev/null +++ b/tests/resolve-scenario.spec.js.map @@ -0,0 +1 @@ +{"version":3,"file":"resolve-scenario.spec.js","sourceRoot":"","sources":["resolve-scenario.spec.ts"],"names":[],"mappings":";;AAAA,+BAA6B;AAC7B,kBAAe;AACf,iCAA4C;AAC5C,2CAAgD;AAEhD,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,eAAQ,CAAA;AAE7C,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAE9B,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;QAC/E,MAAM,MAAM,GAAG,IAAA,wBAAe,EAC1B,EAAC,GAAG,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAC,EACpD,EAAC,GAAG,IAAI,EAAE,QAAQ,EAAE,oBAAoB,EAAC,EACzC,EAAE,CAAC,CAAA;QACP,IAAA,aAAM,EAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAA;IACjD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACvD,MAAM,MAAM,GAAG,IAAA,wBAAe,EAC1B,EAAC,GAAG,IAAI,EAAE,QAAQ,EAAE,eAAe,EAAE,SAAS,EAAE,IAAA,gBAAS,EAAC,cAAc,CAAC,EAAC,EAC1E,EAAC,GAAG,IAAI,EAAE,QAAQ,EAAE,oBAAoB,EAAC,EACzC,EAAE,CAAC,CAAA;QACP,IAAA,aAAM,EAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACvE,MAAM,IAAI,GAAG,EAAC,GAAG,YAAY,EAAE,IAAI,EAAE,qBAAqB,EAAC,CAAA;QAC3D,MAAM,MAAM,GAAG,IAAA,wBAAe,EAC1B,EAAC,GAAG,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAC,EACpD,EAAC,GAAG,IAAI,EAAE,QAAQ,EAAE,oBAAoB,EAAC,EACzC,CAAC,IAAI,CAAC,CAAC,CAAA;QACX,IAAA,aAAM,EAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAA;IACtE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sEAAsE,EAAE,GAAG,EAAE;QAC5E,MAAM,IAAI,GAAG,EAAC,GAAG,YAAY,EAAE,IAAI,EAAE,qBAAqB,EAAC,CAAA;QAC3D,MAAM,MAAM,GAAG,IAAA,wBAAe,EAC1B,EAAC,GAAG,IAAI,EAAE,QAAQ,EAAE,eAAe,EAAE,SAAS,EAAE,IAAA,gBAAS,EAAC,cAAc,CAAC,EAAC,EAC1E,EAAC,GAAG,IAAI,EAAE,QAAQ,EAAE,oBAAoB,EAAC,EACzC,CAAC,IAAI,CAAC,CAAC,CAAA;QACX,IAAA,aAAM,EAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wFAAwF,EAAE,GAAG,EAAE;QAC9F,MAAM,IAAI,GAAG,EAAC,GAAG,YAAY,EAAE,IAAI,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,IAAI,EAAE,CAAA;QAC/F,MAAM,MAAM,GAAG,IAAA,wBAAe,EAC1B,EAAC,GAAG,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAC,EACpD,EAAC,GAAG,IAAI,EAAE,QAAQ,EAAE,oBAAoB,EAAC,EACzC,CAAC,IAAI,CAAC,CAAC,CAAA;QACX,IAAA,aAAM,EAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAA;IACnD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qGAAqG,EAAE,GAAG,EAAE;QAC3G,MAAM,IAAI,GAAG,EAAC,GAAG,YAAY,EAAE,IAAI,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,IAAI,EAAE,CAAA;QAC/F,MAAM,MAAM,GAAG,IAAA,wBAAe,EAC1B,EAAC,GAAG,IAAI,EAAE,QAAQ,EAAE,eAAe,EAAE,SAAS,EAAE,IAAA,gBAAS,EAAC,cAAc,CAAC,EAAC,EAC1E,EAAC,GAAG,IAAI,EAAE,QAAQ,EAAE,oBAAoB,EAAC,EACzC,CAAC,IAAI,CAAC,CAAC,CAAA;QACX,IAAA,aAAM,EAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC3E,MAAM,OAAO,GAAG;YACZ,GAAG,IAAI;YACP,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAS;YAChE,EAAE,EAAE,MAAM;SACb,CAAA;QACD,MAAM,WAAW,GAAG,IAAA,wBAAe,EAC/B,EAAC,GAAG,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAC,EACpD,EAAC,GAAG,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAC,EACpD,EAAE,EACF,OAAc,CAAC,CAAA;QACnB,MAAM,cAAc,GAAG,IAAA,wBAAe,EAClC,EAAC,GAAG,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAC,EACpD,EAAC,GAAG,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAC,EACpD,EAAE,CAAC,CAAA;QACP,iFAAiF;QACjF,IAAA,aAAM,EAAC,WAAW,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;QACxC,2EAA2E;QAC3E,IAAA,aAAM,EAAC,cAAc,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IACnD,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/tests/resolve-scenario.spec.ts b/tests/resolve-scenario.spec.ts index a01e2fba..2cbd1097 100644 --- a/tests/resolve-scenario.spec.ts +++ b/tests/resolve-scenario.spec.ts @@ -6,56 +6,85 @@ import { resolveScenario } from '/common/prompt' const { chat, main, scenarioBook } = entities describe('Resolve scenario', () => { + it('will use main character scenario when chat does not override characters', () => { + const actual = resolveScenario( + { ...chat, scenario: undefined, overrides: undefined }, + { ...main, scenario: 'Main char scenario' }, + [] + ) + expect(actual).to.equal('Main char scenario') + }) - it('will use main character scenario when chat does not override characters', () => { - const actual = resolveScenario( - {...chat, scenario: undefined, overrides: undefined}, - {...main, scenario: 'Main char scenario'}, - []) - expect(actual).to.equal('Main char scenario') - }) - - it('will use chat scenario when chat override is on', () => { - const actual = resolveScenario( - {...chat, scenario: 'Chat scenario', overrides: toPersona('Chat persona')}, - {...main, scenario: 'Main char scenario'}, - []) - expect(actual).to.equal('Chat scenario') - }) - - it('will append additional scenarios to the main character scenario', () => { - const book = {...scenarioBook, text: 'Additional scenario'} - const actual = resolveScenario( - {...chat, scenario: undefined, overrides: undefined}, - {...main, scenario: 'Main char scenario'}, - [book]) - expect(actual).to.equal('Main char scenario\nAdditional scenario') - }) - - it('will not append additional scenarios to the overriding chat scenario', () => { - const book = {...scenarioBook, text: 'Additional scenario'} - const actual = resolveScenario( - {...chat, scenario: 'Chat scenario', overrides: toPersona('Chat persona')}, - {...main, scenario: 'Main char scenario'}, - [book]) - expect(actual).to.equal('Chat scenario') - }) - - it('will overwrite main character scenario when the additional scenario has overwrite flag', () => { - const book = {...scenarioBook, text: 'Overwritten scenario', overwriteCharacterScenario: true } - const actual = resolveScenario( - {...chat, scenario: undefined, overrides: undefined}, - {...main, scenario: 'Main char scenario'}, - [book]) - expect(actual).to.equal('Overwritten scenario') - }) - - it('will not overwrite chat scenario when override is on and the additional scenario has overwrite flag', () => { - const book = {...scenarioBook, text: 'Overwritten scenario', overwriteCharacterScenario: true } - const actual = resolveScenario( - {...chat, scenario: 'Chat scenario', overrides: toPersona('Chat persona')}, - {...main, scenario: 'Main char scenario'}, - [book]) - expect(actual).to.equal('Chat scenario') - }) -}) \ No newline at end of file + it('will use chat scenario when chat override is on', () => { + const actual = resolveScenario( + { ...chat, scenario: 'Chat scenario', overrides: toPersona('Chat persona') }, + { ...main, scenario: 'Main char scenario' }, + [] + ) + expect(actual).to.equal('Chat scenario') + }) + + it('ignores attached scenario books (the feature is disabled)', () => { + const book = { ...scenarioBook, text: 'Additional scenario' } + const actual = resolveScenario( + { ...chat, scenario: undefined, overrides: undefined }, + { ...main, scenario: 'Main char scenario' }, + [book] + ) + expect(actual).to.equal('Main char scenario') + }) + + it('will not append additional scenarios to the overriding chat scenario', () => { + const book = { ...scenarioBook, text: 'Additional scenario' } + const actual = resolveScenario( + { ...chat, scenario: 'Chat scenario', overrides: toPersona('Chat persona') }, + { ...main, scenario: 'Main char scenario' }, + [book] + ) + expect(actual).to.equal('Chat scenario') + }) + + it('ignores the overwrite flag on scenario books (the feature is disabled)', () => { + const book = { ...scenarioBook, text: 'Overwritten scenario', overwriteCharacterScenario: true } + const actual = resolveScenario( + { ...chat, scenario: undefined, overrides: undefined }, + { ...main, scenario: 'Main char scenario' }, + [book] + ) + expect(actual).to.equal('Main char scenario') + }) + + it('will not overwrite chat scenario when override is on and the additional scenario has overwrite flag', () => { + const book = { ...scenarioBook, text: 'Overwritten scenario', overwriteCharacterScenario: true } + const actual = resolveScenario( + { ...chat, scenario: 'Chat scenario', overrides: toPersona('Chat persona') }, + { ...main, scenario: 'Main char scenario' }, + [book] + ) + expect(actual).to.equal('Chat scenario') + }) + + it('uses the replying character for the progression stage when provided', () => { + const speaker = { + ...main, + name: 'Speaker', + progression: { kind: 'archetype', archetype: 'romantic' } as any, + xp: 100000, + } + const withSpeaker = resolveScenario( + { ...chat, scenario: undefined, overrides: undefined }, + { ...main, scenario: 'Scene', progression: undefined }, + [], + speaker as any + ) + const withoutSpeaker = resolveScenario( + { ...chat, scenario: undefined, overrides: undefined }, + { ...main, scenario: 'Scene', progression: undefined }, + [] + ) + // The speaker has a progression archetype + XP, so its stage token is prepended. + expect(withSpeaker).to.contain('LEVEL(') + // The main char has no progression, so without a speaker no token appears. + expect(withoutSpeaker).to.not.contain('LEVEL(') + }) +}) diff --git a/vite.config.ts b/vite.config.ts index 9bc02659..217bf0a1 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,7 +1,105 @@ import { defineConfig } from 'vite' import solid from 'vite-plugin-solid' import tsconfigPaths from 'vite-tsconfig-paths' +import { nodePolyfills } from 'vite-plugin-node-polyfills' +import { VitePWA } from 'vite-plugin-pwa' +import { resolve } from 'path' -export default defineConfig({ - plugins: [tsconfigPaths(), solid()], -}) +// Web bundler (replaces Parcel). The Node server still builds via tsc. +export default defineConfig(({ mode }) => ({ + root: resolve(__dirname, 'web'), + publicDir: resolve(__dirname, 'web', 'asset'), + plugins: [ + tsconfigPaths(), + solid(), + // Several browser deps (libsodium, png-chunks, tokenizers, pdf) expect Node + // globals/builtins that Parcel polyfilled automatically. + nodePolyfills({ + include: ['buffer', 'process', 'events', 'stream', 'util', 'crypto', 'path'], + globals: { Buffer: true, process: true, global: true }, + }), + // PWA: generate a real same-origin service worker (the old `new URL('*.ts')` + // approach inlined a data: URL that browsers reject). Reuses the existing + // hand-written web/asset/site.webmanifest (manifest: false → don't generate + // or inject one). Registration is auto-injected into index.html. + VitePWA({ + // 'prompt': the new SW waits instead of activating itself, so the in-app + // "update available" banner (web/pwa.ts + UpdatePrompt.tsx) can let the user + // reload on their terms. injectRegister: false — we register manually in + // web/pwa.ts to hook onNeedRefresh. + registerType: 'prompt', + injectRegister: false, + manifest: false, + // Don't run the SW in dev — avoids stale-cache confusion while developing. + devOptions: { enabled: false }, + workbox: { + // Precache the app shell + small static assets. The heavy ML/PDF chunks + // (onnxruntime, transformers, pdfjs — many MB, minify is off) blow past + // the size cap and are runtime-cached on first use instead of bloating + // the install. + globPatterns: ['**/*.{css,html,ico,woff,woff2}'], + maximumFileSizeToCacheInBytes: 3 * 1024 * 1024, + cleanupOutdatedCaches: true, + // SPA: serve the cached app shell for client-side routes when offline, + // but never for the API, user-asset uploads, or well-known files. + navigateFallback: '/index.html', + navigateFallbackDenylist: [/^\/api/, /^\/assets\//, /^\/\.well-known\//], + runtimeCaching: [ + { + // App JS/CSS chunks (incl. lazy ones too big to precache) — cache on + // first fetch so subsequent loads work offline; revalidate in bg. + urlPattern: ({ request, sameOrigin }) => + sameOrigin && (request.destination === 'script' || request.destination === 'style'), + handler: 'StaleWhileRevalidate', + options: { + cacheName: 'charluv-app-assets', + expiration: { maxEntries: 200, maxAgeSeconds: 60 * 60 * 24 * 30 }, + }, + }, + ], + }, + }), + ], + resolve: { + // The repo checks in compiled .js next to every .ts. Prefer the .ts source + // so Rollup doesn't resolve to a stale CJS .js (which breaks named imports). + extensions: ['.ts', '.tsx', '.mjs', '.js', '.jsx', '.json'], + // Leading-slash imports (/common, /srv, /web) collide with Vite's + // root-relative resolution, so map them explicitly. Order matters: most + // specific first. + alias: [ + { find: /^\/common\//, replacement: resolve(__dirname, 'common') + '/' }, + { find: /^\/srv\//, replacement: resolve(__dirname, 'srv') + '/' }, + { find: /^\/web\//, replacement: resolve(__dirname, 'web') + '/' }, + { find: /^common\//, replacement: resolve(__dirname, 'common') + '/' }, + { find: /^srv\//, replacement: resolve(__dirname, 'srv') + '/' }, + ], + }, + define: { + 'process.env.NODE_ENV': JSON.stringify(mode), + // The process polyfill spoofs versions.node as a string, which makes + // node-detecting deps (onnxruntime-web/transformers in the embeddings + // worker) take the Node path and call require(). Force the browser path. + 'process.versions.node': 'undefined', + }, + build: { + outDir: resolve(__dirname, 'dist'), + emptyOutDir: true, + target: 'es2020', + // This box is RAM-constrained; minify (terser) + sourcemaps blow the heap on + // the heavy deps (onnxruntime-web, transformers, pdfjs). Parcel also built + // with --no-optimize. Re-enable on a larger build host. + minify: false, + sourcemap: false, + // web/pkg holds vendored CommonJS shims; Rollup's CJS transform only covers + // node_modules by default, so include it for default-import interop. + commonjsOptions: { include: [/node_modules/, /web\/pkg/] }, + }, + server: { + port: 1234, + // Proxy API + websocket to the Node server during dev. + proxy: { + '/api': { target: 'http://localhost:3001', changeOrigin: true, ws: true }, + }, + }, +})) diff --git a/web/App.tsx b/web/App.tsx index 0dae8141..f8b4e1c7 100644 --- a/web/App.tsx +++ b/web/App.tsx @@ -7,9 +7,12 @@ import './store' import { Component, createMemo, Show, lazy, onMount, Switch, Match } from 'solid-js' import { Route, Router, useLocation } from '@solidjs/router' import NavBar from './shared/NavBar' +import GuestTopBar from './shared/GuestTopBar' +import UserTopBar from './shared/UserTopBar' +import { IconContext } from './icons' import Notifications from './Toasts' +import UpdatePrompt from './shared/UpdatePrompt' import CharacterRoutes from './pages/Character' -import ScenarioRoutes from './pages/Scenario' import { settingStore } from './store/settings' import { userStore } from './store/user' import LoginPage from './pages/Login' @@ -18,17 +21,9 @@ import Navigation from './Navigation' import Loading from './shared/Loading' import Button from './shared/Button' -import CharacterList from './pages/Character/CharacterList' - -import PremiumOptions from './pages/Premium/PremiumOptions' import ThankYou from './pages/Premium/ThankYou' -import Error from './pages/Premium/Error' import PremiumInfo from './pages/Premium/Info' -import MatchRoutes from './pages/Match' - -import ImpersonateModal from './pages/Character/ImpersonateModal' -import ChubRoutes from './pages/Chub' import Redirect from './shared/Redirect' import Maintenance from './shared/Maintenance' import CharacterChats from './pages/Character/ChatList' @@ -43,6 +38,7 @@ import FAQ from './pages/Home/FAQ' import CreateChatForm from './pages/Chat/CreateChatForm' import Modal from './shared/Modal' import { ContextProvider } from './store/context' +import AgeGate from './shared/AgeGate' import MemoryGuide from './pages/Guides/Memory' import NovelGuide from './pages/Guides/NovelAI' import { ImageModal } from './pages/Chat/ImageModal' @@ -51,8 +47,8 @@ import { CheckoutCancel, CheckoutSuccess } from './pages/Profile/Checkout' import { markdown } from './shared/markdown' import SoundsPage from './pages/Sounds' import PatreonOauth from './pages/Settings/PatreonOauth' -import { SagaDetail } from './pages/Saga/Detail' -import { SagaList } from './pages/Saga/List' + +const DiscoverPage = lazy(() => import('./pages/Discover')) const App: Component = () => { const state = userStore() @@ -61,8 +57,10 @@ const App: Component = () => { return ( - - + {/* Legacy swipe/Match UI retired — redirect to the Discover gallery. */} + } /> + } /> + } /> @@ -71,21 +69,19 @@ const App: Component = () => { path="/discord" component={() => } /> - } /> - - - - - - import('./pages/GenerationPresets'))} /> - import('./pages/GenerationPresets/PresetList'))} - /> + + import('./pages/Discover/Profile'))} /> + import('./pages/Create'))} /> + import('./pages/MyAI'))} /> + import('./pages/MyAI/Profile'))} /> + import('./pages/Chat/EventPage'))} /> + + + @@ -96,8 +92,6 @@ const App: Component = () => { import('./pages/Home/Help'))} /> import('./pages/Home/terms'))} /> import('./pages/Home/Share'))} /> - import('./pages/Memory/Library'))} /> - import('./pages/Memory/EditMemoryPage'))} /> @@ -109,9 +103,7 @@ const App: Component = () => { - - import('./pages/Invite/InvitesPage'))} /> @@ -126,12 +118,14 @@ const App: Component = () => { import('./pages/Admin/UsersPage'))} /> import('./pages/Home/Share'))} /> - import('./pages/Admin/SharePage'))} /> + import('./pages/Admin/SharePage'))} + /> import('./pages/Admin/SubscriptionList'))} /> - import('./pages/Admin/SharePage'))} /> import('./pages/Admin/SubscriptionModel'))} @@ -141,6 +135,7 @@ const App: Component = () => { component={lazy(() => import('./pages/Admin/Announcements'))} /> import('./pages/Admin/Tiers'))} /> + import('./pages/Admin/PromoCodes'))} /> @@ -178,85 +173,116 @@ const Layout: Component<{ children?: any }> = (props) => { }) const isChat = createMemo(() => { - return location.pathname.startsWith('/chat/') || location.pathname.startsWith('/saga/') + return location.pathname.startsWith('/chat/') }) + // Logged-out visitors browsing the landing/gallery get a full-width top bar + // instead of the left drawer. Chat pages keep the drawer for everyone (guest + // chat needs the chat options pane). + const guestLanding = createMemo(() => !state.loggedIn && !isChat()) + + // Pages that paint their own full-bleed chrome opt out of the centered, + // boxed content wrapper so their background runs edge-to-edge. + const fullBleed = createMemo( + () => + location.pathname === '/' || + location.pathname === '/blog' || + location.pathname === '/info' || + location.pathname.startsWith('/discover') || + location.pathname === '/mine' || + location.pathname.startsWith('/mine/') || + location.pathname === '/event' + ) + const bgStyles = useCharacterBg('layout') return ( - -
- -
- + + + +
+ }> + + + + + + + +
+ + + -
-
- - - {props.children} - - +
+ + + {props.children} + + - -
-
- Login issues? Try{' '} - userStore.logout()}> - Logging out - {' '} - then log back in. + +
+
+ Login issues? Try{' '} + userStore.logout()}> + Logging out + {' '} + then log back in. +
+
- -
- - -
-
Charluv failed to load
-
- + + +
+
Charluv failed to load
+
+ +
-
- - -
-
+ + +
+ +
-
- - settingStore.toggleImpersonate(false)} - /> - settingStore.togglePerformance(false)} - /> - - - {(modal) => modal.element} - - -
settingStore.closeMenu()} - >
+ + + settingStore.togglePerformance(false)} + /> + + + {(modal) => modal.element} + + +
settingStore.closeMenu()} + >
+
) } diff --git a/web/Navigation.tsx b/web/Navigation.tsx index 49191b16..58a3c16f 100644 --- a/web/Navigation.tsx +++ b/web/Navigation.tsx @@ -2,35 +2,25 @@ import { A, useLocation, useSearchParams } from '@solidjs/router' import { Activity, Bell, - Book, ChevronLeft, ChevronRight, - Coins, + Compass, Heart, HeartHandshake, HelpCircle, - Info, LogIn, MailQuestion, + Megaphone, Menu, MessageCircle, - ShoppingCart, - Moon, - Bot, - Star, - Plus, - Users, - Power, + Sparkles, Settings, - Signal, - ShoppingBag, - Sliders, Speaker, - Sun, Volume2, VolumeX, - Wand2, -} from 'lucide-solid' + IconContext, + DiscordLogo, +} from '/web/icons' import { Component, createEffect, @@ -42,12 +32,11 @@ import { Show, Switch, } from 'solid-js' -import AvatarIcon, { CharacterAvatar } from './shared/AvatarIcon' +import AvatarIcon from './shared/AvatarIcon' import { UserState, announceStore, audioStore, - characterStore, inviteStore, settingStore, toastStore, @@ -55,9 +44,7 @@ import { } from './store' import Slot from './shared/Slot' -import logo from './asset/logo.png' import logoDark from './asset/logoDark.png' -import logoIcon from './charluv192.png' import { isChatPage, useEffect, @@ -66,16 +53,12 @@ import { useResizeObserver, useWindowSize, } from './shared/hooks' -import WizardIcon from './icons/WizardIcon' import { soundEmitter } from './shared/Audio/playable-events' import Tooltip from './shared/Tooltip' -import { DiscordDarkIcon, DiscordLightIcon } from './icons/DiscordIcon' import { Badge } from './shared/Card' import { navStore } from './subnav' import { getRgbaFromVar } from './shared/colors' import { CallToAction } from './shared/CallToAction' -import Button from './shared/Button' -import { clearTours } from './tours' const Navigation: Component = () => { let parent: any @@ -114,8 +97,6 @@ const Navigation: Component = () => { } }) - const suffix = createMemo(() => (user.user?.premium ? '+' : '')) - useEffect(() => { const interval = setInterval(() => { if (!parent || !content) return @@ -159,7 +140,7 @@ const Navigation: Component = () => {
{ aria-label="Charluv main page" > -
- - -
setSubnav(false)}> - -
-
- -
setSubnav(true)}> - -
-
-
+
+ +
setSubnav(false)} + role="button" + aria-label="Show the main menu" + > +
+
- - - -
{nav.title}
-
- {nav.body} - -
- - - - - - -
+ {/* Menu rows lead with a Phosphor icon at the global 1em, but the + profile row leads with a 1.5rem avatar. Bump the row icons to + 1.5rem here so every label aligns to the same column as the + username. */} + + + + +
{nav.title}
+
+ {nav.body} + +
+ + + + + + +
+
{
Privacy Policy @@ -274,33 +252,6 @@ const Navigation: Component = () => { const UserNavigation: Component = () => { const user = userStore() const menu = settingStore() - const [secLeft, setSecLeft] = createSignal(false) - const maxPremium = 1000 - const maxRegular = 200 - - useEffect(() => { - const recharge = setInterval(() => { - const recharged = user.user?.recharged || 0 - if (recharged) { - const now = new Date().getTime() - const diff = recharged + 120000 - now - - if (diff > 0) { - setSecLeft(Math.floor(diff / 1000)) - } - } - }, 425) - - return () => clearInterval(recharge) - }) - - const guidance = createMemo(() => { - const usable = menu.config.subs.some((sub) => sub.guidance) - if (!usable) return false - - const access = !!menu.config.guidanceAccess || !!user.user?.admin - return access - }) return ( <> @@ -313,71 +264,24 @@ const UserNavigation: Component = () => {
*/} - - - -
{user.user?.credits || 0}
- - - recharge in {secLeft() !== false ? secLeft() : '<120'}s - - -
- - - - {' '} - - - - -
- - - Likes + + - -
- - - - - - - - - - - {' '} - - - - + + + - - - - - - - - - + + + @@ -394,12 +298,18 @@ const UserNavigation: Component = () => { Users + + Moderation + Subscriptions Announcements + + Promo Codes + @@ -408,7 +318,6 @@ const UserNavigation: Component = () => { patreon={menu.config.patreon} user={user} showMenu={menu.showMenu} - mode={user.ui.mode} /> @@ -432,7 +341,6 @@ const GuestNavigation: Component = () => { href="/login" ariaLabel="Login to the application" onClick={() => soundEmitter.emit('menu-item-clicked', 'login')} - class="tour-register" > Login @@ -441,45 +349,22 @@ const GuestNavigation: Component = () => { - - - - - - - - - - - soundEmitter.emit('menu-item-clicked', 'presets')} - > - Presets - - - - - - - + + + @@ -492,7 +377,6 @@ const NavIcons: Component<{ supportEmail?: string user: UserState showMenu: boolean - mode: 'light' | 'dark' }> = (props) => { const invites = inviteStore() const toasts = toastStore() @@ -508,8 +392,13 @@ const NavIcons: Component<{ }) return ( - <> -
+ // The bottom utility icons are icon-only buttons, not labelled rows. Sized a + // touch larger than the old 1em so they're comfortable tap targets (still + // under the 1.5rem labelled-row icons). All green for a consistent footer. + +
@@ -526,17 +415,6 @@ const NavIcons: Component<{
-
+ - - - - - - + - - { - clearTours() - window.location.href = location.origin - }} - > - - - -
- +
) } @@ -698,21 +559,6 @@ const ExternalLink: Component<{ ) -const Library: Component<{}> = (props) => { - return ( -
- soundEmitter.emit('menu-item-clicked', 'library')} - > - -
- ) -} - const Sounds: Component<{}> = (props) => { const audioSettings = audioStore() @@ -735,103 +581,35 @@ const Sounds: Component<{}> = (props) => { ) } -const CharacterLink = () => { - const user = userStore() - return ( - - soundEmitter.emit('menu-item-clicked', 'characters')} - class="tour-character" - > - - - - - - - ) -} - const ChatLink = () => { return ( - - soundEmitter.emit('menu-item-clicked', 'chats')} - > - - - - - - + soundEmitter.emit('menu-item-clicked', 'chats')} + > + ) } export const UserProfile = () => { - const chars = characterStore() const user = userStore() const menu = settingStore() return ( - <> - - + { + if (menu.showMenu) settingStore.closeMenu() + soundEmitter.emit('menu-item-clicked', 'profile') + userStore.modal(true) + }} + > + + + ) } diff --git a/web/asset/MaskHappy.svg b/web/asset/MaskHappy.svg new file mode 100644 index 00000000..50d7bd06 --- /dev/null +++ b/web/asset/MaskHappy.svg @@ -0,0 +1 @@ + diff --git a/web/icons/android/android-launchericon-144-144.png b/web/asset/icons/android/android-launchericon-144-144.png similarity index 100% rename from web/icons/android/android-launchericon-144-144.png rename to web/asset/icons/android/android-launchericon-144-144.png diff --git a/web/icons/android/android-launchericon-192-192.png b/web/asset/icons/android/android-launchericon-192-192.png similarity index 100% rename from web/icons/android/android-launchericon-192-192.png rename to web/asset/icons/android/android-launchericon-192-192.png diff --git a/web/icons/android/android-launchericon-48-48.png b/web/asset/icons/android/android-launchericon-48-48.png similarity index 100% rename from web/icons/android/android-launchericon-48-48.png rename to web/asset/icons/android/android-launchericon-48-48.png diff --git a/web/icons/android/android-launchericon-512-512.png b/web/asset/icons/android/android-launchericon-512-512.png similarity index 100% rename from web/icons/android/android-launchericon-512-512.png rename to web/asset/icons/android/android-launchericon-512-512.png diff --git a/web/icons/android/android-launchericon-72-72.png b/web/asset/icons/android/android-launchericon-72-72.png similarity index 100% rename from web/icons/android/android-launchericon-72-72.png rename to web/asset/icons/android/android-launchericon-72-72.png diff --git a/web/icons/android/android-launchericon-96-96.png b/web/asset/icons/android/android-launchericon-96-96.png similarity index 100% rename from web/icons/android/android-launchericon-96-96.png rename to web/asset/icons/android/android-launchericon-96-96.png diff --git a/web/icons/ios/100.png b/web/asset/icons/ios/100.png similarity index 100% rename from web/icons/ios/100.png rename to web/asset/icons/ios/100.png diff --git a/web/icons/ios/1024.png b/web/asset/icons/ios/1024.png similarity index 100% rename from web/icons/ios/1024.png rename to web/asset/icons/ios/1024.png diff --git a/web/icons/ios/114.png b/web/asset/icons/ios/114.png similarity index 100% rename from web/icons/ios/114.png rename to web/asset/icons/ios/114.png diff --git a/web/icons/ios/120.png b/web/asset/icons/ios/120.png similarity index 100% rename from web/icons/ios/120.png rename to web/asset/icons/ios/120.png diff --git a/web/icons/ios/128.png b/web/asset/icons/ios/128.png similarity index 100% rename from web/icons/ios/128.png rename to web/asset/icons/ios/128.png diff --git a/web/icons/ios/144.png b/web/asset/icons/ios/144.png similarity index 100% rename from web/icons/ios/144.png rename to web/asset/icons/ios/144.png diff --git a/web/icons/ios/152.png b/web/asset/icons/ios/152.png similarity index 100% rename from web/icons/ios/152.png rename to web/asset/icons/ios/152.png diff --git a/web/icons/ios/16.png b/web/asset/icons/ios/16.png similarity index 100% rename from web/icons/ios/16.png rename to web/asset/icons/ios/16.png diff --git a/web/icons/ios/167.png b/web/asset/icons/ios/167.png similarity index 100% rename from web/icons/ios/167.png rename to web/asset/icons/ios/167.png diff --git a/web/icons/ios/180.png b/web/asset/icons/ios/180.png similarity index 100% rename from web/icons/ios/180.png rename to web/asset/icons/ios/180.png diff --git a/web/icons/ios/192.png b/web/asset/icons/ios/192.png similarity index 100% rename from web/icons/ios/192.png rename to web/asset/icons/ios/192.png diff --git a/web/icons/ios/20.png b/web/asset/icons/ios/20.png similarity index 100% rename from web/icons/ios/20.png rename to web/asset/icons/ios/20.png diff --git a/web/icons/ios/256.png b/web/asset/icons/ios/256.png similarity index 100% rename from web/icons/ios/256.png rename to web/asset/icons/ios/256.png diff --git a/web/icons/ios/29.png b/web/asset/icons/ios/29.png similarity index 100% rename from web/icons/ios/29.png rename to web/asset/icons/ios/29.png diff --git a/web/icons/ios/32.png b/web/asset/icons/ios/32.png similarity index 100% rename from web/icons/ios/32.png rename to web/asset/icons/ios/32.png diff --git a/web/icons/ios/40.png b/web/asset/icons/ios/40.png similarity index 100% rename from web/icons/ios/40.png rename to web/asset/icons/ios/40.png diff --git a/web/icons/ios/50.png b/web/asset/icons/ios/50.png similarity index 100% rename from web/icons/ios/50.png rename to web/asset/icons/ios/50.png diff --git a/web/icons/ios/512.png b/web/asset/icons/ios/512.png similarity index 100% rename from web/icons/ios/512.png rename to web/asset/icons/ios/512.png diff --git a/web/icons/ios/57.png b/web/asset/icons/ios/57.png similarity index 100% rename from web/icons/ios/57.png rename to web/asset/icons/ios/57.png diff --git a/web/icons/ios/58.png b/web/asset/icons/ios/58.png similarity index 100% rename from web/icons/ios/58.png rename to web/asset/icons/ios/58.png diff --git a/web/icons/ios/60.png b/web/asset/icons/ios/60.png similarity index 100% rename from web/icons/ios/60.png rename to web/asset/icons/ios/60.png diff --git a/web/icons/ios/64.png b/web/asset/icons/ios/64.png similarity index 100% rename from web/icons/ios/64.png rename to web/asset/icons/ios/64.png diff --git a/web/icons/ios/72.png b/web/asset/icons/ios/72.png similarity index 100% rename from web/icons/ios/72.png rename to web/asset/icons/ios/72.png diff --git a/web/icons/ios/76.png b/web/asset/icons/ios/76.png similarity index 100% rename from web/icons/ios/76.png rename to web/asset/icons/ios/76.png diff --git a/web/icons/ios/80.png b/web/asset/icons/ios/80.png similarity index 100% rename from web/icons/ios/80.png rename to web/asset/icons/ios/80.png diff --git a/web/icons/ios/87.png b/web/asset/icons/ios/87.png similarity index 100% rename from web/icons/ios/87.png rename to web/asset/icons/ios/87.png diff --git a/web/icons/windows11/LargeTile.scale-100.png b/web/asset/icons/windows11/LargeTile.scale-100.png similarity index 100% rename from web/icons/windows11/LargeTile.scale-100.png rename to web/asset/icons/windows11/LargeTile.scale-100.png diff --git a/web/icons/windows11/LargeTile.scale-125.png b/web/asset/icons/windows11/LargeTile.scale-125.png similarity index 100% rename from web/icons/windows11/LargeTile.scale-125.png rename to web/asset/icons/windows11/LargeTile.scale-125.png diff --git a/web/icons/windows11/LargeTile.scale-150.png b/web/asset/icons/windows11/LargeTile.scale-150.png similarity index 100% rename from web/icons/windows11/LargeTile.scale-150.png rename to web/asset/icons/windows11/LargeTile.scale-150.png diff --git a/web/icons/windows11/LargeTile.scale-200.png b/web/asset/icons/windows11/LargeTile.scale-200.png similarity index 100% rename from web/icons/windows11/LargeTile.scale-200.png rename to web/asset/icons/windows11/LargeTile.scale-200.png diff --git a/web/icons/windows11/LargeTile.scale-400.png b/web/asset/icons/windows11/LargeTile.scale-400.png similarity index 100% rename from web/icons/windows11/LargeTile.scale-400.png rename to web/asset/icons/windows11/LargeTile.scale-400.png diff --git a/web/icons/windows11/SmallTile.scale-100.png b/web/asset/icons/windows11/SmallTile.scale-100.png similarity index 100% rename from web/icons/windows11/SmallTile.scale-100.png rename to web/asset/icons/windows11/SmallTile.scale-100.png diff --git a/web/icons/windows11/SmallTile.scale-125.png b/web/asset/icons/windows11/SmallTile.scale-125.png similarity index 100% rename from web/icons/windows11/SmallTile.scale-125.png rename to web/asset/icons/windows11/SmallTile.scale-125.png diff --git a/web/icons/windows11/SmallTile.scale-150.png b/web/asset/icons/windows11/SmallTile.scale-150.png similarity index 100% rename from web/icons/windows11/SmallTile.scale-150.png rename to web/asset/icons/windows11/SmallTile.scale-150.png diff --git a/web/icons/windows11/SmallTile.scale-200.png b/web/asset/icons/windows11/SmallTile.scale-200.png similarity index 100% rename from web/icons/windows11/SmallTile.scale-200.png rename to web/asset/icons/windows11/SmallTile.scale-200.png diff --git a/web/icons/windows11/SmallTile.scale-400.png b/web/asset/icons/windows11/SmallTile.scale-400.png similarity index 100% rename from web/icons/windows11/SmallTile.scale-400.png rename to web/asset/icons/windows11/SmallTile.scale-400.png diff --git a/web/icons/windows11/SplashScreen.scale-100.png b/web/asset/icons/windows11/SplashScreen.scale-100.png similarity index 100% rename from web/icons/windows11/SplashScreen.scale-100.png rename to web/asset/icons/windows11/SplashScreen.scale-100.png diff --git a/web/icons/windows11/SplashScreen.scale-125.png b/web/asset/icons/windows11/SplashScreen.scale-125.png similarity index 100% rename from web/icons/windows11/SplashScreen.scale-125.png rename to web/asset/icons/windows11/SplashScreen.scale-125.png diff --git a/web/icons/windows11/SplashScreen.scale-150.png b/web/asset/icons/windows11/SplashScreen.scale-150.png similarity index 100% rename from web/icons/windows11/SplashScreen.scale-150.png rename to web/asset/icons/windows11/SplashScreen.scale-150.png diff --git a/web/icons/windows11/SplashScreen.scale-200.png b/web/asset/icons/windows11/SplashScreen.scale-200.png similarity index 100% rename from web/icons/windows11/SplashScreen.scale-200.png rename to web/asset/icons/windows11/SplashScreen.scale-200.png diff --git a/web/icons/windows11/SplashScreen.scale-400.png b/web/asset/icons/windows11/SplashScreen.scale-400.png similarity index 100% rename from web/icons/windows11/SplashScreen.scale-400.png rename to web/asset/icons/windows11/SplashScreen.scale-400.png diff --git a/web/icons/windows11/Square150x150Logo.scale-100.png b/web/asset/icons/windows11/Square150x150Logo.scale-100.png similarity index 100% rename from web/icons/windows11/Square150x150Logo.scale-100.png rename to web/asset/icons/windows11/Square150x150Logo.scale-100.png diff --git a/web/icons/windows11/Square150x150Logo.scale-125.png b/web/asset/icons/windows11/Square150x150Logo.scale-125.png similarity index 100% rename from web/icons/windows11/Square150x150Logo.scale-125.png rename to web/asset/icons/windows11/Square150x150Logo.scale-125.png diff --git a/web/icons/windows11/Square150x150Logo.scale-150.png b/web/asset/icons/windows11/Square150x150Logo.scale-150.png similarity index 100% rename from web/icons/windows11/Square150x150Logo.scale-150.png rename to web/asset/icons/windows11/Square150x150Logo.scale-150.png diff --git a/web/icons/windows11/Square150x150Logo.scale-200.png b/web/asset/icons/windows11/Square150x150Logo.scale-200.png similarity index 100% rename from web/icons/windows11/Square150x150Logo.scale-200.png rename to web/asset/icons/windows11/Square150x150Logo.scale-200.png diff --git a/web/icons/windows11/Square150x150Logo.scale-400.png b/web/asset/icons/windows11/Square150x150Logo.scale-400.png similarity index 100% rename from web/icons/windows11/Square150x150Logo.scale-400.png rename to web/asset/icons/windows11/Square150x150Logo.scale-400.png diff --git a/web/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-16.png b/web/asset/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-16.png similarity index 100% rename from web/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-16.png rename to web/asset/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-16.png diff --git a/web/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-20.png b/web/asset/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-20.png similarity index 100% rename from web/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-20.png rename to web/asset/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-20.png diff --git a/web/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-24.png b/web/asset/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-24.png similarity index 100% rename from web/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-24.png rename to web/asset/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-24.png diff --git a/web/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-256.png b/web/asset/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-256.png similarity index 100% rename from web/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-256.png rename to web/asset/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-256.png diff --git a/web/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-30.png b/web/asset/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-30.png similarity index 100% rename from web/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-30.png rename to web/asset/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-30.png diff --git a/web/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-32.png b/web/asset/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-32.png similarity index 100% rename from web/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-32.png rename to web/asset/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-32.png diff --git a/web/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-36.png b/web/asset/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-36.png similarity index 100% rename from web/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-36.png rename to web/asset/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-36.png diff --git a/web/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-40.png b/web/asset/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-40.png similarity index 100% rename from web/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-40.png rename to web/asset/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-40.png diff --git a/web/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-44.png b/web/asset/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-44.png similarity index 100% rename from web/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-44.png rename to web/asset/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-44.png diff --git a/web/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-48.png b/web/asset/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-48.png similarity index 100% rename from web/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-48.png rename to web/asset/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-48.png diff --git a/web/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-60.png b/web/asset/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-60.png similarity index 100% rename from web/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-60.png rename to web/asset/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-60.png diff --git a/web/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-64.png b/web/asset/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-64.png similarity index 100% rename from web/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-64.png rename to web/asset/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-64.png diff --git a/web/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-72.png b/web/asset/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-72.png similarity index 100% rename from web/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-72.png rename to web/asset/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-72.png diff --git a/web/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-80.png b/web/asset/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-80.png similarity index 100% rename from web/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-80.png rename to web/asset/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-80.png diff --git a/web/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-96.png b/web/asset/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-96.png similarity index 100% rename from web/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-96.png rename to web/asset/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-96.png diff --git a/web/icons/windows11/Square44x44Logo.altform-unplated_targetsize-16.png b/web/asset/icons/windows11/Square44x44Logo.altform-unplated_targetsize-16.png similarity index 100% rename from web/icons/windows11/Square44x44Logo.altform-unplated_targetsize-16.png rename to web/asset/icons/windows11/Square44x44Logo.altform-unplated_targetsize-16.png diff --git a/web/icons/windows11/Square44x44Logo.altform-unplated_targetsize-20.png b/web/asset/icons/windows11/Square44x44Logo.altform-unplated_targetsize-20.png similarity index 100% rename from web/icons/windows11/Square44x44Logo.altform-unplated_targetsize-20.png rename to web/asset/icons/windows11/Square44x44Logo.altform-unplated_targetsize-20.png diff --git a/web/icons/windows11/Square44x44Logo.altform-unplated_targetsize-24.png b/web/asset/icons/windows11/Square44x44Logo.altform-unplated_targetsize-24.png similarity index 100% rename from web/icons/windows11/Square44x44Logo.altform-unplated_targetsize-24.png rename to web/asset/icons/windows11/Square44x44Logo.altform-unplated_targetsize-24.png diff --git a/web/icons/windows11/Square44x44Logo.altform-unplated_targetsize-256.png b/web/asset/icons/windows11/Square44x44Logo.altform-unplated_targetsize-256.png similarity index 100% rename from web/icons/windows11/Square44x44Logo.altform-unplated_targetsize-256.png rename to web/asset/icons/windows11/Square44x44Logo.altform-unplated_targetsize-256.png diff --git a/web/icons/windows11/Square44x44Logo.altform-unplated_targetsize-30.png b/web/asset/icons/windows11/Square44x44Logo.altform-unplated_targetsize-30.png similarity index 100% rename from web/icons/windows11/Square44x44Logo.altform-unplated_targetsize-30.png rename to web/asset/icons/windows11/Square44x44Logo.altform-unplated_targetsize-30.png diff --git a/web/icons/windows11/Square44x44Logo.altform-unplated_targetsize-32.png b/web/asset/icons/windows11/Square44x44Logo.altform-unplated_targetsize-32.png similarity index 100% rename from web/icons/windows11/Square44x44Logo.altform-unplated_targetsize-32.png rename to web/asset/icons/windows11/Square44x44Logo.altform-unplated_targetsize-32.png diff --git a/web/icons/windows11/Square44x44Logo.altform-unplated_targetsize-36.png b/web/asset/icons/windows11/Square44x44Logo.altform-unplated_targetsize-36.png similarity index 100% rename from web/icons/windows11/Square44x44Logo.altform-unplated_targetsize-36.png rename to web/asset/icons/windows11/Square44x44Logo.altform-unplated_targetsize-36.png diff --git a/web/icons/windows11/Square44x44Logo.altform-unplated_targetsize-40.png b/web/asset/icons/windows11/Square44x44Logo.altform-unplated_targetsize-40.png similarity index 100% rename from web/icons/windows11/Square44x44Logo.altform-unplated_targetsize-40.png rename to web/asset/icons/windows11/Square44x44Logo.altform-unplated_targetsize-40.png diff --git a/web/icons/windows11/Square44x44Logo.altform-unplated_targetsize-44.png b/web/asset/icons/windows11/Square44x44Logo.altform-unplated_targetsize-44.png similarity index 100% rename from web/icons/windows11/Square44x44Logo.altform-unplated_targetsize-44.png rename to web/asset/icons/windows11/Square44x44Logo.altform-unplated_targetsize-44.png diff --git a/web/icons/windows11/Square44x44Logo.altform-unplated_targetsize-48.png b/web/asset/icons/windows11/Square44x44Logo.altform-unplated_targetsize-48.png similarity index 100% rename from web/icons/windows11/Square44x44Logo.altform-unplated_targetsize-48.png rename to web/asset/icons/windows11/Square44x44Logo.altform-unplated_targetsize-48.png diff --git a/web/icons/windows11/Square44x44Logo.altform-unplated_targetsize-60.png b/web/asset/icons/windows11/Square44x44Logo.altform-unplated_targetsize-60.png similarity index 100% rename from web/icons/windows11/Square44x44Logo.altform-unplated_targetsize-60.png rename to web/asset/icons/windows11/Square44x44Logo.altform-unplated_targetsize-60.png diff --git a/web/icons/windows11/Square44x44Logo.altform-unplated_targetsize-64.png b/web/asset/icons/windows11/Square44x44Logo.altform-unplated_targetsize-64.png similarity index 100% rename from web/icons/windows11/Square44x44Logo.altform-unplated_targetsize-64.png rename to web/asset/icons/windows11/Square44x44Logo.altform-unplated_targetsize-64.png diff --git a/web/icons/windows11/Square44x44Logo.altform-unplated_targetsize-72.png b/web/asset/icons/windows11/Square44x44Logo.altform-unplated_targetsize-72.png similarity index 100% rename from web/icons/windows11/Square44x44Logo.altform-unplated_targetsize-72.png rename to web/asset/icons/windows11/Square44x44Logo.altform-unplated_targetsize-72.png diff --git a/web/icons/windows11/Square44x44Logo.altform-unplated_targetsize-80.png b/web/asset/icons/windows11/Square44x44Logo.altform-unplated_targetsize-80.png similarity index 100% rename from web/icons/windows11/Square44x44Logo.altform-unplated_targetsize-80.png rename to web/asset/icons/windows11/Square44x44Logo.altform-unplated_targetsize-80.png diff --git a/web/icons/windows11/Square44x44Logo.altform-unplated_targetsize-96.png b/web/asset/icons/windows11/Square44x44Logo.altform-unplated_targetsize-96.png similarity index 100% rename from web/icons/windows11/Square44x44Logo.altform-unplated_targetsize-96.png rename to web/asset/icons/windows11/Square44x44Logo.altform-unplated_targetsize-96.png diff --git a/web/icons/windows11/Square44x44Logo.scale-100.png b/web/asset/icons/windows11/Square44x44Logo.scale-100.png similarity index 100% rename from web/icons/windows11/Square44x44Logo.scale-100.png rename to web/asset/icons/windows11/Square44x44Logo.scale-100.png diff --git a/web/icons/windows11/Square44x44Logo.scale-125.png b/web/asset/icons/windows11/Square44x44Logo.scale-125.png similarity index 100% rename from web/icons/windows11/Square44x44Logo.scale-125.png rename to web/asset/icons/windows11/Square44x44Logo.scale-125.png diff --git a/web/icons/windows11/Square44x44Logo.scale-150.png b/web/asset/icons/windows11/Square44x44Logo.scale-150.png similarity index 100% rename from web/icons/windows11/Square44x44Logo.scale-150.png rename to web/asset/icons/windows11/Square44x44Logo.scale-150.png diff --git a/web/icons/windows11/Square44x44Logo.scale-200.png b/web/asset/icons/windows11/Square44x44Logo.scale-200.png similarity index 100% rename from web/icons/windows11/Square44x44Logo.scale-200.png rename to web/asset/icons/windows11/Square44x44Logo.scale-200.png diff --git a/web/icons/windows11/Square44x44Logo.scale-400.png b/web/asset/icons/windows11/Square44x44Logo.scale-400.png similarity index 100% rename from web/icons/windows11/Square44x44Logo.scale-400.png rename to web/asset/icons/windows11/Square44x44Logo.scale-400.png diff --git a/web/icons/windows11/Square44x44Logo.targetsize-16.png b/web/asset/icons/windows11/Square44x44Logo.targetsize-16.png similarity index 100% rename from web/icons/windows11/Square44x44Logo.targetsize-16.png rename to web/asset/icons/windows11/Square44x44Logo.targetsize-16.png diff --git a/web/icons/windows11/Square44x44Logo.targetsize-20.png b/web/asset/icons/windows11/Square44x44Logo.targetsize-20.png similarity index 100% rename from web/icons/windows11/Square44x44Logo.targetsize-20.png rename to web/asset/icons/windows11/Square44x44Logo.targetsize-20.png diff --git a/web/icons/windows11/Square44x44Logo.targetsize-24.png b/web/asset/icons/windows11/Square44x44Logo.targetsize-24.png similarity index 100% rename from web/icons/windows11/Square44x44Logo.targetsize-24.png rename to web/asset/icons/windows11/Square44x44Logo.targetsize-24.png diff --git a/web/icons/windows11/Square44x44Logo.targetsize-256.png b/web/asset/icons/windows11/Square44x44Logo.targetsize-256.png similarity index 100% rename from web/icons/windows11/Square44x44Logo.targetsize-256.png rename to web/asset/icons/windows11/Square44x44Logo.targetsize-256.png diff --git a/web/icons/windows11/Square44x44Logo.targetsize-30.png b/web/asset/icons/windows11/Square44x44Logo.targetsize-30.png similarity index 100% rename from web/icons/windows11/Square44x44Logo.targetsize-30.png rename to web/asset/icons/windows11/Square44x44Logo.targetsize-30.png diff --git a/web/icons/windows11/Square44x44Logo.targetsize-32.png b/web/asset/icons/windows11/Square44x44Logo.targetsize-32.png similarity index 100% rename from web/icons/windows11/Square44x44Logo.targetsize-32.png rename to web/asset/icons/windows11/Square44x44Logo.targetsize-32.png diff --git a/web/icons/windows11/Square44x44Logo.targetsize-36.png b/web/asset/icons/windows11/Square44x44Logo.targetsize-36.png similarity index 100% rename from web/icons/windows11/Square44x44Logo.targetsize-36.png rename to web/asset/icons/windows11/Square44x44Logo.targetsize-36.png diff --git a/web/icons/windows11/Square44x44Logo.targetsize-40.png b/web/asset/icons/windows11/Square44x44Logo.targetsize-40.png similarity index 100% rename from web/icons/windows11/Square44x44Logo.targetsize-40.png rename to web/asset/icons/windows11/Square44x44Logo.targetsize-40.png diff --git a/web/icons/windows11/Square44x44Logo.targetsize-44.png b/web/asset/icons/windows11/Square44x44Logo.targetsize-44.png similarity index 100% rename from web/icons/windows11/Square44x44Logo.targetsize-44.png rename to web/asset/icons/windows11/Square44x44Logo.targetsize-44.png diff --git a/web/icons/windows11/Square44x44Logo.targetsize-48.png b/web/asset/icons/windows11/Square44x44Logo.targetsize-48.png similarity index 100% rename from web/icons/windows11/Square44x44Logo.targetsize-48.png rename to web/asset/icons/windows11/Square44x44Logo.targetsize-48.png diff --git a/web/icons/windows11/Square44x44Logo.targetsize-60.png b/web/asset/icons/windows11/Square44x44Logo.targetsize-60.png similarity index 100% rename from web/icons/windows11/Square44x44Logo.targetsize-60.png rename to web/asset/icons/windows11/Square44x44Logo.targetsize-60.png diff --git a/web/icons/windows11/Square44x44Logo.targetsize-64.png b/web/asset/icons/windows11/Square44x44Logo.targetsize-64.png similarity index 100% rename from web/icons/windows11/Square44x44Logo.targetsize-64.png rename to web/asset/icons/windows11/Square44x44Logo.targetsize-64.png diff --git a/web/icons/windows11/Square44x44Logo.targetsize-72.png b/web/asset/icons/windows11/Square44x44Logo.targetsize-72.png similarity index 100% rename from web/icons/windows11/Square44x44Logo.targetsize-72.png rename to web/asset/icons/windows11/Square44x44Logo.targetsize-72.png diff --git a/web/icons/windows11/Square44x44Logo.targetsize-80.png b/web/asset/icons/windows11/Square44x44Logo.targetsize-80.png similarity index 100% rename from web/icons/windows11/Square44x44Logo.targetsize-80.png rename to web/asset/icons/windows11/Square44x44Logo.targetsize-80.png diff --git a/web/icons/windows11/Square44x44Logo.targetsize-96.png b/web/asset/icons/windows11/Square44x44Logo.targetsize-96.png similarity index 100% rename from web/icons/windows11/Square44x44Logo.targetsize-96.png rename to web/asset/icons/windows11/Square44x44Logo.targetsize-96.png diff --git a/web/icons/windows11/StoreLogo.scale-100.png b/web/asset/icons/windows11/StoreLogo.scale-100.png similarity index 100% rename from web/icons/windows11/StoreLogo.scale-100.png rename to web/asset/icons/windows11/StoreLogo.scale-100.png diff --git a/web/icons/windows11/StoreLogo.scale-125.png b/web/asset/icons/windows11/StoreLogo.scale-125.png similarity index 100% rename from web/icons/windows11/StoreLogo.scale-125.png rename to web/asset/icons/windows11/StoreLogo.scale-125.png diff --git a/web/icons/windows11/StoreLogo.scale-150.png b/web/asset/icons/windows11/StoreLogo.scale-150.png similarity index 100% rename from web/icons/windows11/StoreLogo.scale-150.png rename to web/asset/icons/windows11/StoreLogo.scale-150.png diff --git a/web/icons/windows11/StoreLogo.scale-200.png b/web/asset/icons/windows11/StoreLogo.scale-200.png similarity index 100% rename from web/icons/windows11/StoreLogo.scale-200.png rename to web/asset/icons/windows11/StoreLogo.scale-200.png diff --git a/web/icons/windows11/StoreLogo.scale-400.png b/web/asset/icons/windows11/StoreLogo.scale-400.png similarity index 100% rename from web/icons/windows11/StoreLogo.scale-400.png rename to web/asset/icons/windows11/StoreLogo.scale-400.png diff --git a/web/icons/windows11/Wide310x150Logo.scale-100.png b/web/asset/icons/windows11/Wide310x150Logo.scale-100.png similarity index 100% rename from web/icons/windows11/Wide310x150Logo.scale-100.png rename to web/asset/icons/windows11/Wide310x150Logo.scale-100.png diff --git a/web/icons/windows11/Wide310x150Logo.scale-125.png b/web/asset/icons/windows11/Wide310x150Logo.scale-125.png similarity index 100% rename from web/icons/windows11/Wide310x150Logo.scale-125.png rename to web/asset/icons/windows11/Wide310x150Logo.scale-125.png diff --git a/web/icons/windows11/Wide310x150Logo.scale-150.png b/web/asset/icons/windows11/Wide310x150Logo.scale-150.png similarity index 100% rename from web/icons/windows11/Wide310x150Logo.scale-150.png rename to web/asset/icons/windows11/Wide310x150Logo.scale-150.png diff --git a/web/icons/windows11/Wide310x150Logo.scale-200.png b/web/asset/icons/windows11/Wide310x150Logo.scale-200.png similarity index 100% rename from web/icons/windows11/Wide310x150Logo.scale-200.png rename to web/asset/icons/windows11/Wide310x150Logo.scale-200.png diff --git a/web/icons/windows11/Wide310x150Logo.scale-400.png b/web/asset/icons/windows11/Wide310x150Logo.scale-400.png similarity index 100% rename from web/icons/windows11/Wide310x150Logo.scale-400.png rename to web/asset/icons/windows11/Wide310x150Logo.scale-400.png diff --git a/web/asset/offline.html b/web/asset/offline.html new file mode 100644 index 00000000..0c07ad6f --- /dev/null +++ b/web/asset/offline.html @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + Charluv + + +

+

You are not online

+

You need an internet connection to use Charluv

+ + + diff --git a/web/site.webmanifest b/web/asset/site.webmanifest similarity index 100% rename from web/site.webmanifest rename to web/asset/site.webmanifest diff --git a/web/asset/sprite.ts b/web/asset/sprite.ts index fbfbc8f9..e62bf6b0 100644 --- a/web/asset/sprite.ts +++ b/web/asset/sprite.ts @@ -1,6 +1,7 @@ import { EmoteType, FullSprite, SpriteAttr, SpriteBody, emotions } from '/common/types/sprite' +import manifestJson from './sprites/manifest.json' -export const manifest = require('./sprites/manifest.json') as Manifest +export const manifest = manifestJson as Manifest export const attributes: SpriteAttr[] = [ 'back_hair', diff --git a/web/icons.ts b/web/icons.ts new file mode 100644 index 00000000..97060a64 --- /dev/null +++ b/web/icons.ts @@ -0,0 +1,134 @@ +// AUTO-GENERATED icon shim. Re-exports Phosphor (duotone, set globally via +// IconContext in App.tsx) under the Lucide names the app already uses, so call +// sites stay unchanged. To swap icon sets again, edit only this file. +export { + Activity, + Warning as AlertTriangle, + TextAlignLeft as AlignLeft, + Archive, + ArchiveBox as ArchiveRestore, + ArrowFatLeft as ArrowBigLeft, + ArrowDown, + ArrowLeft, + ArrowRight, + ArrowUp, + Bell, + Book, + BookOpen as BookPlus, + Robot as Bot, + Brain, + Briefcase, + Camera, + Check, + CheckSquare, + CaretDown as ChevronDown, + CaretDoubleLeft as ChevronFirst, + CaretDoubleRight as ChevronLast, + CaretLeft as ChevronLeft, + CaretRight as ChevronRight, + CaretDoubleLeft as ChevronsLeft, + CaretUp as ChevronUp, + Question as CircleHelp, + XCircle as CircleX, + Gear as Cog, + Coin as Coins, + Compass, + AddressBook as Contact, + Copy, + Crown, + Backspace as Delete, + DiceFive as Dices, + DownloadSimple as Download, + CloudArrowDown as DownloadCloud, + DownloadSimple as DownloadIcon, + Barbell as Dumbbell, + PencilSimple as Edit, + Eye, + EyeSlash as EyeOff, + FileText as FileCheck, + FileText, + FileX, + Flag, + Globe, + GlobeHemisphereWest as Globe2, + GraduationCap, + DotsSixVertical as GripHorizontal, + Hash, + Heart, + Handshake as HeartHandshake, + Question as HelpCircle, + Image, + ImageSquare as ImagePlus, + ImageSquare as ImageUp, + DownloadSimple as Import, + Info, + ListBullets as LayoutList, + Leaf, + FunnelSimple as ListFilter, + SpinnerGap as LoaderCircle, + SignIn as LogIn, + Envelope as Mail, + EnvelopeSimple as MailQuestion, + Megaphone, + List as Menu, + ChatCircle as MessageCircle, + ChatCircleDots as MessageCirclePlus, + Microphone as Mic, + MinusCircle, + Moon, + DotsThree as MoreHorizontal, + ArrowRight as MoveRight, + Pause, + PauseCircle, + PencilSimple as Pencil, + PersonSimple as PersonStanding, + Play, + Plus, + PlusCircle, + Plus as PlusIcon, + Power, + Radio, + ArrowsCounterClockwise as RefreshCcw, + ArrowsClockwise as RefreshCw, + RepeatOnce as Repeat1, + ArrowCounterClockwise as RotateCcw, + FloppyDisk as Save, + FloppyDisk as SaveIcon, + PaperPlaneRight as Send, + Gear as Settings, + ShoppingBag, + ShoppingCart, + CellSignalFull as Signal, + Sliders, + SlidersHorizontal, + Smiley as Smile, + SortAscending as SortAsc, + SortDescending as SortDesc, + Sparkle as Sparkles, + SpeakerHigh as Speaker, + Square, + Star, + Terminal, + ThumbsUp, + Trash, + Trash as TrashIcon, + ArrowArcLeft as Undo2, + UploadSimple as Upload, + User, + Users, + SpeakerHigh as Volume2, + SpeakerSlash as VolumeX, + MagicWand as Wand2, + MagicWand as WandSparkles, + X, + XSquare, + Lightning as Zap, +} from 'phosphor-solid' + +// Phosphor's prop/context types under the names the app used from lucide. +export { IconContext, DiscordLogo } from 'phosphor-solid' +export type { IconProps, IconProps as LucideProps } from 'phosphor-solid' + +// Vendored: phosphor-solid 1.1.5 ships no MaskHappy, so this is the official +// Phosphor duotone SVG wrapped to read IconContext like the real icons. +export { default as MaskHappy } from './icons/MaskHappyIcon' diff --git a/web/icons/DiscordIcon.tsx b/web/icons/DiscordIcon.tsx index e2d6e93a..1a78e6d0 100644 --- a/web/icons/DiscordIcon.tsx +++ b/web/icons/DiscordIcon.tsx @@ -1,7 +1,7 @@ import { Component } from 'solid-js' import AppIcon, { IconProps } from './AppIcon' -import svgLight from 'bundle-text:../asset/DiscordLight.svg' -import svgDark from 'bundle-text:../asset/DiscordDark.svg' +import svgLight from '../asset/DiscordLight.svg?raw' +import svgDark from '../asset/DiscordDark.svg?raw' export const DiscordLightIcon: Component = (props) => ( diff --git a/web/icons/MaskHappyIcon.tsx b/web/icons/MaskHappyIcon.tsx new file mode 100644 index 00000000..2f9d70e3 --- /dev/null +++ b/web/icons/MaskHappyIcon.tsx @@ -0,0 +1,54 @@ +import { Component, createEffect, splitProps, useContext } from 'solid-js' +import { IconContext } from 'phosphor-solid' +import type { IconProps } from 'phosphor-solid' +import svg from '../asset/MaskHappy.svg?raw' + +/** + * Phosphor's "mask-happy" (duotone) icon, vendored because phosphor-solid 1.1.5 + * (the latest published version) doesn't ship it — it only has FaceMask. This + * reads the same `IconContext` the real Phosphor icons use, so it inherits + * size/color/mirroring at every call site (e.g. the green 1.5rem in the menu). + */ +const MaskHappy: Component = (props) => { + let host: HTMLSpanElement | undefined + const ctx = useContext>(IconContext as any) + const [, rest] = splitProps(props, [ + 'color', + 'size', + 'weight', + 'mirrored', + 'class', + 'style', + 'ref', + 'children', + 'innerHTML', + ]) + + createEffect(() => { + const el = host?.querySelector('svg') + if (!el) return + const size = String(props.size ?? ctx?.size ?? '1em') + el.setAttribute('width', size) + el.setAttribute('height', size) + el.style.transform = props.mirrored ?? ctx?.mirrored ? 'scaleX(-1)' : '' + }) + + return ( + (host = e)} + class={props.class} + // The SVG fills with currentColor, so driving the element's color sets + // both duotone layers (the secondary keeps its 0.2 opacity). + style={{ + color: (props.color ?? ctx?.color ?? 'currentColor') as string, + display: 'inline-flex', + 'align-items': 'center', + 'line-height': '0', + }} + innerHTML={svg} + {...(rest as Record)} + /> + ) +} + +export default MaskHappy diff --git a/web/icons/NoCharacterIcon.tsx b/web/icons/NoCharacterIcon.tsx index af51af55..89259f77 100644 --- a/web/icons/NoCharacterIcon.tsx +++ b/web/icons/NoCharacterIcon.tsx @@ -1,6 +1,6 @@ import { Component } from 'solid-js' import AppIcon, { IconProps } from './AppIcon' -import svg from 'bundle-text:../asset/NoCharacter.svg' +import svg from '../asset/NoCharacter.svg?raw' const NoCharacterIcon: Component = (props) => diff --git a/web/icons/WizardIcon.tsx b/web/icons/WizardIcon.tsx index 981527a5..17385ecd 100644 --- a/web/icons/WizardIcon.tsx +++ b/web/icons/WizardIcon.tsx @@ -1,7 +1,7 @@ import { Component } from 'solid-js' import AppIcon, { IconProps } from './AppIcon' // import svg from 'jsx:../asset/WizardIcon.svg' -import svg from 'bundle-text:../asset/WizardIcon.svg' +import svg from '../asset/WizardIcon.svg?raw' const WizardIcon: Component = (props) => diff --git a/web/index.html b/web/index.html index 8cafd62a..bc30177e 100644 --- a/web/index.html +++ b/web/index.html @@ -16,7 +16,13 @@ rel="stylesheet" /> - + + + + + + + Charluv @@ -24,10 +30,8 @@
) diff --git a/web/pages/Home/blog.css b/web/pages/Home/blog.css new file mode 100644 index 00000000..3c62ac55 --- /dev/null +++ b/web/pages/Home/blog.css @@ -0,0 +1,185 @@ +/* Blog / News page — warm-dusk editorial, matching Discover. + Palette + page background come from ../warm-dusk.css. */ +@import '../warm-dusk.css'; + +.blg-root { + /* Match Discover (.dsc-root): full-bleed within the content area with the same + padding, rather than a narrow 920px centered column. Inner prose keeps its + own readable max-width (.blg-tag, .blg-body). */ + padding: clamp(1.25rem, 4vw, 3.5rem) clamp(1rem, 5vw, 4rem) 5rem; + display: flex; + flex-direction: column; + gap: clamp(1.5rem, 4vw, 2.5rem); +} + +/* hero */ +.blg-head { + display: flex; + flex-direction: column; + gap: 0.75rem; +} +.blg-title { + font-family: 'Fraunces', Georgia, serif; + font-weight: 600; + font-size: clamp(2.2rem, 6vw, 4rem); + line-height: 0.95; + letter-spacing: -0.02em; + margin: 0; +} +.blg-title em { + font-style: italic; + color: var(--dsc-green); +} +.blg-tag { + color: var(--dsc-muted); + max-width: 60ch; + margin: 0; + font-size: clamp(0.95rem, 1.4vw, 1.1rem); + line-height: 1.55; +} + +/* ad slot wrapper */ +.blg-ad { + display: flex; + justify-content: center; + width: 100%; +} + +/* announcements feed */ +.blg-feed { + display: flex; + flex-direction: column; + gap: 1.25rem; +} +.blg-post { + background: linear-gradient(160deg, var(--dsc-surface), var(--dsc-bg-2)); + border: 1px solid var(--dsc-line); + border-radius: 18px; + padding: clamp(1.1rem, 3vw, 1.75rem); +} +.blg-post-head { + display: flex; + align-items: baseline; + justify-content: space-between; + gap: 1rem; + flex-wrap: wrap; + margin-bottom: 0.6rem; +} +.blg-post-title { + font-family: 'Fraunces', serif; + font-weight: 600; + font-size: clamp(1.3rem, 2.6vw, 1.9rem); + line-height: 1.1; + margin: 0; +} +.blg-post-date { + color: var(--dsc-muted); + font-size: 0.78rem; + letter-spacing: 0.04em; + white-space: nowrap; +} +.blg-post-body { + color: var(--dsc-cream); + line-height: 1.6; +} +.blg-post-body a { + color: var(--dsc-green); +} + +/* recent conversations */ +.blg-recent { + display: flex; + flex-direction: column; + gap: 0.9rem; +} +.blg-recent-title { + font-family: 'Fraunces', serif; + font-size: clamp(1.2rem, 2.4vw, 1.6rem); + font-weight: 600; + margin: 0; +} +.blg-recent-grid { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 0.7rem; +} +@media (min-width: 640px) { + .blg-recent-grid { + grid-template-columns: repeat(4, 1fr); + gap: 1rem; + } +} + +/* static cards (Features, Getting Started) */ +.blg-card { + background: linear-gradient(160deg, var(--dsc-surface), var(--dsc-bg-2)); + border: 1px solid var(--dsc-line); + border-radius: 18px; + padding: clamp(1.1rem, 3vw, 1.75rem); + line-height: 1.6; +} +.blg-card-title { + font-family: 'Fraunces', serif; + font-size: clamp(1.3rem, 2.6vw, 1.8rem); + font-weight: 600; + margin: 0 0 0.75rem; +} +.blg-card p { + margin: 0 0 0.6rem; +} +.blg-card p:last-child { + margin-bottom: 0; +} +.blg-card .hl { + color: var(--dsc-green); + font-weight: 700; +} +.blg-link-inline { + color: var(--dsc-green); + text-decoration: underline; +} + +/* link pills */ +.blg-links { + display: flex; + flex-wrap: wrap; + gap: 0.6rem; +} +.blg-pill { + display: inline-flex; + align-items: center; + border: 1px solid var(--dsc-line); + background: transparent; + color: var(--dsc-cream); + padding: 0.4rem 1rem; + border-radius: 999px; + font-size: 0.85rem; + text-decoration: none; + transition: border-color 180ms ease, color 180ms ease; +} +.blg-pill:hover { + border-color: var(--dsc-green); + color: var(--dsc-green); +} + +/* footer band: app download + featured-on badges */ +.blg-footer { + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: center; + gap: 1.5rem 2rem; + padding-top: 1.5rem; + border-top: 1px solid var(--dsc-line); +} +.blg-foot-group { + display: flex; + align-items: center; + gap: 1rem; +} + +@media (prefers-reduced-motion: reduce) { + .blg-pill { + transition: none; + } +} diff --git a/web/pages/Home/home.scss b/web/pages/Home/home.scss deleted file mode 100644 index c03b15e5..00000000 --- a/web/pages/Home/home.scss +++ /dev/null @@ -1,25 +0,0 @@ -@import '/web/asset/mixins.scss'; - -.home-cards { - display: grid; - justify-content: center; - grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); - @apply gap-4; - - * > ul { - @apply ml-6; - list-style-type: disc; - } - - * > ol { - list-style-type: decimal; - } - - // @include mobile { - // grid-template-columns: repeat(1, 1fr); - // } - - // @include tablet { - // grid-template-columns: repeat(2, 1fr); - // } -} diff --git a/web/pages/Home/index.tsx b/web/pages/Home/index.tsx index 879705c7..b2216c38 100644 --- a/web/pages/Home/index.tsx +++ b/web/pages/Home/index.tsx @@ -1,9 +1,6 @@ -import './home.scss' -import logoDark from '../../asset/logoDark.png?url' -import logo from '../../asset/logo.png?url' +import './blog.css' import nsfwTools from '../../asset/featured-on-badge-b.avif?url' -import discordLogo from '../../asset/discord-logo-blue.svg?url' -import { Component, For, Match, Show, Switch, createMemo, createSignal, onMount } from 'solid-js' +import { Component, For, Show, createMemo, onMount } from 'solid-js' import { ComponentEmitter, createEmitter, @@ -11,109 +8,33 @@ import { setComponentPageTitle, uniqueBy, } from '../../shared/util' -import { announceStore, chatStore, settingStore, userStore } from '../../store' +import { announceStore, chatStore, userStore } from '../../store' import { A, useNavigate } from '@solidjs/router' -import { AlertTriangle, MoveRight, Plus, Settings, Heart, Users } from 'lucide-solid' -import { Card, Pill, SolidCard, TitleCard } from '/web/shared/Card' -import Modal from '/web/shared/Modal' +import { MoveRight, Plus, Heart, Users } from '/web/icons' import AvatarIcon from '/web/shared/AvatarIcon' - import { elapsedSince } from '/common/util' -import { AppSchema } from '/common/types' import { markdown } from '/web/shared/markdown' -import WizardIcon from '/web/icons/WizardIcon' -import Button from '/web/shared/Button' import Slot from '/web/shared/Slot' -import { adaptersToOptions } from '/common/adapters' import { useRef } from '/web/shared/hooks' -import { canStartTour, startTour } from '/web/tours' - -const enum Sub { - None, - OpenAI, - NovelAI, - Horde, -} -const text = ` - -### This website is a simulation - -This website does not offer any real people or real dating. It is a simulation. - -Our AI is trained on a large neural network. Average response time is around 20 seconds. - -### How to register? - -[Click here to register](/register) - -You need an early access code which you can find on the register page, if that ran out, visit our Discord to get one automaticly. -We need to use these codes in order to be able to limit registrations. For your privacy, we do not require an email or any PII. - -### How to use this website? - -In order to get matches you have to register for a (free) account. Goto [Likes](/likes/list) to see all available characters. - -When you find someone you like, click the checkmark and you have a match. You can send your match a message and start a conversation. Remember you are not talking to real people but your are talking to AI. The AI does not realize this (apart from Aiva). -Every character has scenarios that progress the story. Scenarios will progress the more you chat with a character. You can see the progress on the heart symbol next to the character on the [Matches](/character/list) page. +const taaftHTML = `` -### Chat features - -When talking about yourself always refer to yourself as You. Example: Hello there \*you wave\* - -When talking about the other person always refer to them by their name. Example: Hello Julia how are you? - -You can perform an action by placing the action in between asterisks \*action\*. - -If you don't like a reply, you can just reroll it and get another reply. You can even edit the reply to be exactly as you like. This will take away the fun for a large part, so in order to access the edit feaetures, you first have to toggle the switch on top of the chat window to activate them. - - -### Credits - -Our app is based on [AgnAIstic](https://github.com/luminai-companion/agn-ai). -The source code for our version can be found [here](https://github.com/demandcluster/charluv) - -We run our [own AI Horde](https://github.com/demandcluster/aivohorde) on a massive 24B model. - -The software we use for the Horde is made possible by [db0](https://dbzer0.com/). - -Voices are generated by [ElevenLabs](https://elevenlabs.io/text-to-speech), the #1 text-to-speech service. - -Charluv is created by Demandcluster B.V. in the Netherlands, we are a small team of developers and designers. -` -function toItem(model: HordeModel) { - return { - label: `${model.name} - (queue: ${model.queued}, eta: ${model.eta}, count: ${model.count})`, - value: model.name, - } -} -const HomePage: Component = () => { - const [ref, onRef] = useRef() - setComponentPageTitle('Information') - const [sub, setSub] = createSignal(Sub.None) +const itchHTML = `` - const closeSub = () => setSub(Sub.None) +const BlogPage: Component = () => { + const [topRef, onTopRef] = useRef() + const [midRef, onMidRef] = useRef() + setComponentPageTitle('News') const user = userStore() - const announce = announceStore() - const cfg = settingStore((cfg) => ({ - initLoading: cfg.initLoading, - adapters: adaptersToOptions(cfg.config.adapters), - guest: cfg.guestAccessAllowed, - config: cfg.config, - })) - - const rawHTML = `` - - const itchHTML = `` const announcements = createMemo(() => { return announce.list.filter((ann) => { if (ann.location && ann.location !== 'home') return false const level = ann.userLevel ?? -1 - const userPremium = user.premium ? 10 : -1 + const userPremium = user.user?.premium ? 10 : -1 const premiumLevel = Math.max(user.userLevel, userPremium) return premiumLevel >= level }) @@ -123,181 +44,96 @@ const HomePage: Component = () => { onMount(() => { announceStore.getAll() - - emitter.on('loaded', () => { - if (!canStartTour('home')) return - settingStore.menu(true) - startTour('home') - }) }) return ( -
-
-
- -
-
- -
- -
- Charluv is a virtual dating chat service where you can even create your own - characters. Membership is free, premium membership gives you priority and near unlimited - messages. Your conversations are completely private and never shared with anyone unless - you invite them to your chat. -
-
- - - - 0}> - - - - - -
- -
- - 1}> - - +
+
+

+ News & Updates +

+

+ Charluv is a virtual dating chat service where you can even create your own characters. + Membership is free; premium gives you priority and near-unlimited messages. Your + conversations are completely private and never shared with anyone unless you invite them. +

+
- - - +
+ +
- - -
-

- Looking for help with getting started? Check out the{' '} - - Official Guide - {' '} - or head to the{' '} - - Charluv Discord - - . -

-
-
- -
-
- - - -
- - -
- - -
Credits
-
- Our app is based on{' '} - - AgnAIstic - - .
- The source code for our version can be found{' '} - - here - -
-
- We run our{' '} - - own AI Horde - {' '} - on a massive fine-tuned 13B model{' '} - - Charluv-13B-Tiefighter - - !
- The software we use for the Horde is made possible by{' '} - - db0 - -
-
- Charluv is created by Demandcluster B.V. in the Netherlands, we are a small team of - developers and designers. -
-
+ 0}> +
+ + {(item) => ( +
+
+

{item.title}

+ +
+
+
+ )} +
+
+
+ + + +
+
- - - - + + +
+

Getting Started

+

+ Looking for help getting started? Check out the{' '} + + Charluv Discord + + . +

+
- - - -
+ + +
) } -export default HomePage +export default BlogPage const RecentChats: Component<{ emitter: ComponentEmitter<'loaded'> }> = (props) => { const nav = useNavigate() const user = userStore() const state = chatStore((s) => { // We want this to occur after the state has propogated - setTimeout(() => { - props.emitter.emit.loaded(), 200 - }) + setTimeout(() => props.emitter.emit.loaded(), 200) return { chars: s.allChars.list, @@ -310,24 +146,20 @@ const RecentChats: Component<{ emitter: ComponentEmitter<'loaded'> }> = (props) }) return ( -
- -
+ +
- {({ chat, char }, index) => ( + {({ chat, char }) => ( <> @@ -370,8 +202,7 @@ const RecentChats: Component<{ emitter: ComponentEmitter<'loaded'> }> = (props) aria-label={`Chat with ${char?.name}, ${elapsedSince(chat.updatedAt)} ago ${ chat.name }`} - classList={{ 'tour-first-chat-mobile': index() === 0 }} - class="bg-800 hover:bg-700 flex w-full cursor-pointer flex-col rounded-md border-[1px] border-[var(--bg-700)] transition duration-300 sm:hidden" + class="flex w-full cursor-pointer flex-col overflow-hidden rounded-xl border border-[var(--dsc-line)] bg-[var(--dsc-surface)] transition duration-300 hover:border-[var(--dsc-green)] hover:bg-[var(--dsc-bg-2)] sm:hidden" onClick={() => nav(`/chat/${chat._id}`)} >
{char?.name}
-
{elapsedSince(chat.updatedAt)} ago
+
+ {elapsedSince(chat.updatedAt)} ago +
@@ -394,9 +227,7 @@ const RecentChats: Component<{ emitter: ComponentEmitter<'loaded'> }> = (props)

- {/*
*/} - {/*
*/}
@@ -412,8 +243,8 @@ const RecentChats: Component<{ emitter: ComponentEmitter<'loaded'> }> = (props) - -
Like to Get Matches
+ +
Find Matches
@@ -426,7 +257,7 @@ const RecentChats: Component<{ emitter: ComponentEmitter<'loaded'> }> = (props) - +
Create a Character
@@ -444,7 +275,7 @@ const BorderCard: Component<{ children: any; href: string; ariaLabel?: string }>
nav(props.href)} > {props.children} @@ -452,143 +283,31 @@ const BorderCard: Component<{ children: any; href: string; ariaLabel?: string }> ) } -const Announcements: Component<{ list: AppSchema.Announcement[] }> = (props) => { - return ( - <> -
- - {(item, i) => ( -
-
-
- {item.title} -
-
{elapsedSince(item.showAt)} ago
-
-
-
- )} -
-
- - ) -} - -const HordeGuide: Component<{ close: () => void }> = (props) => ( - -
- - Important! For reliable responses, ensure you have registered at{' '} - - AI Horde - - . Once you have your key, add it to your{' '} - - Horde Settings - - . - - - - AI Horde is run and powered by a small number of volunteers that provide their GPUs. This is - a great service, but it can be a little slow. Consider contributing to the Horde! - - - - Keep your Max New Tokens below 100 unless you know what you're doing! -
- Using high values for 'Max New Tokens' is the main cause of timeouts and slow replies. -
- - By default we use anonymous access. You can provide your API key or change the model in the - Settings page. - -
-
-) - const Features: Component = () => ( - -
- -
-

- Charluv is completely free to use. It is free to register. Your - data will be kept private and you can permanently delete your data at any time. We take - your privacy very seriously. -

-

- Unique model trained for understanding virtual dating and - character progression. -

-

- Register to have your data available on all of your devices. -

-

Chat with multiple users and multiple characters at the same time

-

- Create Memory Books to give your characters information about - their world. -

-

- Image generation - Generate images in your chats. -

-

- Voice - Give your characters a voice and speak back to them. -

-

- Voices are generated by{' '} - - ElevenLabs - - , the #1 text-to-speech service. *currently disabled due to issue with provider* -

-
-
-
-) - -const OpenAIGuide: Component<{ close: () => void }> = (props) => ( - -
- - OpenAI is a paid service. To use OpenAI, you to need provide your OpenAI API Key in - your settings: - - - - Firstly, you will need to{' '} - - Register an account OpenAI - - . - - - - Once registered, you will need to{' '} - - generate an API key. - - - - - Once you have your API key, head to the{' '} - - Settings - {' '} - page and set your key in the OpenAI area. - - - - To use OpenAI to generate your responses, ensure your chat is using OpenAI Preset in your{' '} - Chat Preset settings. -
- You can access these via the top-right menu in your chat. -
-
-
+
+

Notable Features

+

+ Charluv is completely free to use and free to register. Your data is + kept private and you can permanently delete it at any time. We take your privacy very + seriously. +

+

+ Unique model trained for understanding virtual dating and character + progression. +

+

+ Register to have your data available on all of your devices. +

+

Chat with multiple characters at the same time.

+

+ Automatic Long Term Memory to give your characters information about + their world. +

+

+ Image generation — generate images in your chats. +

+

+ LoRA — Train the model to know what your character looks like. +

+
) diff --git a/web/pages/Home/policy.tsx b/web/pages/Home/policy.tsx index 7098cd06..e6b8d79d 100644 --- a/web/pages/Home/policy.tsx +++ b/web/pages/Home/policy.tsx @@ -1,10 +1,7 @@ -import { A } from '@solidjs/router' import { Component } from 'solid-js' import PageHeader from '../../shared/PageHeader' import Divider from '../../shared/Divider' -import logo from '../../asset/logo.png' - const Policy: Component = () => { return (
diff --git a/web/pages/Home/terms.tsx b/web/pages/Home/terms.tsx index 9cec7b16..cb662f81 100644 --- a/web/pages/Home/terms.tsx +++ b/web/pages/Home/terms.tsx @@ -1,4 +1,3 @@ -import { A } from '@solidjs/router' import { Component } from 'solid-js' import PageHeader from '../../shared/PageHeader' import Divider from '../../shared/Divider' @@ -30,17 +29,17 @@ const Terms: Component = () => {
AI reserves the right to modify or discontinue, temporarily or permanently, the Service (or any part thereof) with or without notice. Charluv shall not be liable to you or to any - third party for any modification, suspension, or discontinuance of the Service. Charluv also - reserves the right to terminate your use of the Service at any time, for any reason, with - or without notice. + third party for any modification, suspension, or discontinuance of the Service. Charluv + also reserves the right to terminate your use of the Service at any time, for any reason, + with or without notice.

Safety; Your Interactions with Other Members.?

- Charluv is committed to creating a safe and secure environment for its members. However, you - acknowledge that Charluv cannot guarantee the safety of its members. You are solely + Charluv is committed to creating a safe and secure environment for its members. However, + you acknowledge that Charluv cannot guarantee the safety of its members. You are solely responsible for your interactions with other members, both online and offline. You agree to take all necessary precautions when interacting with other members, especially if you decide to meet in person. @@ -78,9 +77,9 @@ const Terms: Component = () => {

Notice and Procedure for Making Claims of Copyright Infringement.

- Charluv respects the intellectual property rights of others and expects its users to do the - same. If you believe that any content on the Service infringes your copyrights, you may - request that such content be removed from the Service (or access to it be blocked) by + Charluv respects the intellectual property rights of others and expects its users to do + the same. If you believe that any content on the Service infringes your copyrights, you + may request that such content be removed from the Service (or access to it be blocked) by submitting a written notice to Charluv's designated copyright agent.
The notice must include the following information:
@@ -124,11 +123,11 @@ const Terms: Component = () => { EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. Charluv MAKES NO WARRANTY THAT THE SERVICE WILL MEET YOUR REQUIREMENTS OR BE AVAILABLE ON AN UNINTERRUPTED, SECURE, OR - ERROR-FREE BASIS. Charluv MAKES NO WARRANTY REGARDING THE QUALITY OF ANY PRODUCTS, SERVICES, - OR CONTENT OBTAINED THROUGH THE SERVICE OR THE ACCURACY, TIMELINESS, TRUTHFULNESS, - COMPLETENESS, OR RELIABILITY OF ANY CONTENT OBTAINED THROUGH THE SERVICE. NO ADVICE OR - INFORMATION, WHETHER ORAL OR WRITTEN, OBTAINED FROM Charluv OR THROUGH THE SERVICE, WILL - CREATE ANY WARRANTY NOT EXPRESSLY MADE HEREIN. + ERROR-FREE BASIS. Charluv MAKES NO WARRANTY REGARDING THE QUALITY OF ANY PRODUCTS, + SERVICES, OR CONTENT OBTAINED THROUGH THE SERVICE OR THE ACCURACY, TIMELINESS, + TRUTHFULNESS, COMPLETENESS, OR RELIABILITY OF ANY CONTENT OBTAINED THROUGH THE SERVICE. NO + ADVICE OR INFORMATION, WHETHER ORAL OR WRITTEN, OBTAINED FROM Charluv OR THROUGH THE + SERVICE, WILL CREATE ANY WARRANTY NOT EXPRESSLY MADE HEREIN.
@@ -136,24 +135,25 @@ const Terms: Component = () => {

Third Party Services.

The Service may contain links to third-party websites, resources, products, or services - ("Third-Party Services") that are not owned or controlled by Charluv. Charluv does not endorse - or assume any responsibility for any Third-Party Services. If you access a Third-Party - Service from the Service, you do so at your own risk, and you understand that these terms - and Charluv's Privacy Policy do not apply to your use of those Third-Party Services. You - expressly relieve Charluv from any and all liability arising from your use of any Third-Party - Services. + ("Third-Party Services") that are not owned or controlled by Charluv. Charluv does not + endorse or assume any responsibility for any Third-Party Services. If you access a + Third-Party Service from the Service, you do so at your own risk, and you understand that + these terms and Charluv's Privacy Policy do not apply to your use of those Third-Party + Services. You expressly relieve Charluv from any and all liability arising from your use + of any Third-Party Services.

Limitation of Liability.

- IN NO EVENT WILL Charluv, ITS AFFILIATES, DIRECTORS, EMPLOYEES, AGENTS, LICENSORS, OR SERVICE - PROVIDERS BE LIABLE FOR ANY INDIRECT, CONSEQUENTIAL, INCIDENTAL, SPECIAL, PUNITIVE, OR - EXEMPLARY DAMAGES, INCLUDING, WITHOUT LIMITATION, LOSS OF PROFITS, WHETHER INCURRED - DIRECTLY OR INDIRECTLY, OR ANY LOSS OF DATA, USE, GOODWILL, OR OTHER INTANGIBLE LOSSES, - RESULTING FROM: (I) YOUR ACCESS TO OR USE OF OR INABILITY TO ACCESS OR USE THE SERVICE; - (II) ANY CONDUCT OR CONTENT OF ANY THIRD PARTY ON THE SERVICE; (III) ANY CONTENT O + IN NO EVENT WILL Charluv, ITS AFFILIATES, DIRECTORS, EMPLOYEES, AGENTS, LICENSORS, OR + SERVICE PROVIDERS BE LIABLE FOR ANY INDIRECT, CONSEQUENTIAL, INCIDENTAL, SPECIAL, + PUNITIVE, OR EXEMPLARY DAMAGES, INCLUDING, WITHOUT LIMITATION, LOSS OF PROFITS, WHETHER + INCURRED DIRECTLY OR INDIRECTLY, OR ANY LOSS OF DATA, USE, GOODWILL, OR OTHER INTANGIBLE + LOSSES, RESULTING FROM: (I) YOUR ACCESS TO OR USE OF OR INABILITY TO ACCESS OR USE THE + SERVICE; (II) ANY CONDUCT OR CONTENT OF ANY THIRD PARTY ON THE SERVICE; (III) ANY CONTENT + O
@@ -208,8 +208,8 @@ const Terms: Component = () => { will remain in full force and effect.
- c. Charluv's failure to enforce any right or provision in these Terms will not constitute a - waiver of such right or provision unless acknowledged and agreed to by us in writing. + c. Charluv's failure to enforce any right or provision in these Terms will not constitute + a waiver of such right or provision unless acknowledged and agreed to by us in writing.
diff --git a/web/pages/Invite/InvitesPage.tsx b/web/pages/Invite/InvitesPage.tsx index 06756d95..e03dbba7 100644 --- a/web/pages/Invite/InvitesPage.tsx +++ b/web/pages/Invite/InvitesPage.tsx @@ -1,4 +1,4 @@ -import { Check, X } from 'lucide-solid' +import { Check, X } from '/web/icons' import { Component, createEffect, For, Show } from 'solid-js' import { setComponentPageTitle, toDuration } from '../../shared/util' import { inviteStore } from '../../store' diff --git a/web/pages/Login/OAuth.tsx b/web/pages/Login/OAuth.tsx index 92fec14d..20376354 100644 --- a/web/pages/Login/OAuth.tsx +++ b/web/pages/Login/OAuth.tsx @@ -12,7 +12,7 @@ const OAuthLogin: Component = (props) => { const createCode = async () => { setState('creating') - userStore.createApiKey((err, code) => { + userStore.createApiKey((err: any, code?: string) => { setState('done') if (err) { diff --git a/web/pages/Login/index.tsx b/web/pages/Login/index.tsx index eb1833cf..7fd1bd16 100644 --- a/web/pages/Login/index.tsx +++ b/web/pages/Login/index.tsx @@ -11,6 +11,26 @@ import { isLoggedIn } from '/web/store/api' import { TitleCard } from '/web/shared/Card' import { Page } from '/web/Layout' import { useGoogleReady } from '/web/shared/hooks' +import { getVisitorId } from '/web/shared/fingerprint' +import { authorizePatreon } from '../Settings/PatreonOauth' + +// A `?return=` value is only honoured if it's a same-origin internal path, so +// it can't be abused as an open-redirect to another site. +const internalReturn = (p?: string | string[]) => { + if (typeof p !== 'string') return '' + if (!p.startsWith('/') || p.startsWith('//') || p.startsWith('/\\')) return '' + return p +} + +// Shown before each social sign-in option: signing in with Google/Patreon +// creates a NEW account if none is linked, so existing users must link from +// their profile instead of registering a duplicate (which the abuse check +// blocks anyway). +const LinkFirstWarning: Component = () => ( +

+ Already have an account? Don't create a new one — sign in, then link it from your profile. +

+) const LoginPage: Component = () => { setComponentPageTitle('Login') @@ -18,7 +38,6 @@ const LoginPage: Component = () => { const cfg = settingStore() const [register, setRegister] = createSignal(false) - const [inviteCode, setInviteCode] = createSignal('') const location = useLocation() const pathname = createMemo(() => location.pathname) @@ -31,24 +50,8 @@ const LoginPage: Component = () => { return 'Something went wrong.' }) - const utmSource = createMemo(() => new URLSearchParams(window.location.search).get('source')) createEffect(() => { - console.log('Path:', pathname()) - console.log('UTM Source:', utmSource()) - - if (pathname() === '/register') { - setRegister(true) - setComponentPageTitle('Register') - } - - if (utmSource() && utmSource().toLowerCase() === 'viewgrabber') { - console.log('Setting invite code to viewgrabber24') - setInviteCode('VIEWGRABBER24') - } - }) - - createEffect(async () => { if (pathname() === '/register') { setRegister(true) setComponentPageTitle('Register') @@ -75,7 +78,7 @@ const LoginPage: Component = () => { />
- + @@ -116,18 +119,6 @@ const LoginPage: Component = () => {
-

- Why do I need an access code? -

- -
-

- We need to have some sort of control on the amount of people joining since we do not - require an email for registration (we find privacy more important). You can join our - Discord, check our Twitter or try AIVO8592094{' '} - (this code could run out) -

-

Do not register more than one account!

@@ -148,30 +139,36 @@ export default LoginPage type FormProps = { isLoading: boolean - inviteCode: string - setInviteCode: (code: string) => void } const RegisterForm: Component = (props) => { const navigate = useNavigate() + const [query] = useSearchParams() + const [consent, setConsent] = createSignal(false) - const ecu = userStore.getECU() - const register = (evt: Event) => { - const { username, password, confirm, handle, invitecode } = getStrictForm(evt, { + const register = async (evt: Event) => { + const { username, password, confirm, handle } = getStrictForm(evt, { handle: 'string', username: 'string', password: 'string', confirm: 'string', - invitecode: 'string', }) - if (!handle || !username || !password || !invitecode) return + if (!handle || !username || !password) return if (password !== confirm) { toastStore.warn('Passwords do not match', 2) return } + if (!consent()) { + toastStore.warn('Please accept the identifier policy to register', 3) + return + } - userStore.register({ handle, username, password, invitecode }, () => navigate('/profile')) + const fingerprint = await getVisitorId() + // Return the user to where they came from (e.g. the create wizard) when a + // safe internal `?return=` path was supplied; otherwise land on the profile. + const dest = internalReturn(query.return) || '/profile' + userStore.register({ handle, username, password }, fingerprint, true, () => navigate(dest)) } return ( @@ -200,27 +197,26 @@ const RegisterForm: Component = (props) => { autocomplete="new-password" required /> - props.setInviteCode(e.currentTarget.value)} - placeholder="Check below for a code!" - required - /> - -
- Coming from ViewGrabber you get a free bonus.
- Some even get a huge bonus! -
-

"Have fun, the free tier is very generous."

-
-
-
+
- @@ -277,7 +273,7 @@ const LoginForm: Component = (props) => { ) const handleLogin = () => { - userStore.remoteLogin((token) => { + userStore.remoteLogin((token: string) => { location.href = `${query.callback}?access_token=${token}` }) } @@ -287,6 +283,12 @@ const LoginForm: Component = (props) => { if (!username || !password) return userStore.login(username, password, () => { + const ret = internalReturn(query.return) + if (ret) { + navigate(ret) + return + } + if (query.callback) { handleLogin() return @@ -323,17 +325,29 @@ const LoginForm: Component = (props) => { {props.isLoading ? 'Logging in...' : 'Login'} -
{ - refGoogle = ref - }} - id="g_id_onload" - data-context="signin" - data-ux_mode="popup" - data-login_uri={`${location.origin}/oauth/google`} - data-itp_support="true" - >
+
+ +
{ + refGoogle = ref + }} + id="g_id_onload" + data-context="signin" + data-ux_mode="popup" + data-login_uri={`${location.origin}/oauth/google`} + data-itp_support="true" + >
+
+ + +
+ + +
+
) } diff --git a/web/pages/Match/MatchLike.tsx b/web/pages/Match/MatchLike.tsx deleted file mode 100644 index 3eef2da0..00000000 --- a/web/pages/Match/MatchLike.tsx +++ /dev/null @@ -1,27 +0,0 @@ -export const MatchLike: Component<{ character: AppSchema.Character; match: Any }> = (props) => { - return ( -
-
- - -
- {props.character.name} - {props.character.description} -
-
-
- -
-
-
- ) -} diff --git a/web/pages/Match/MatchList.tsx b/web/pages/Match/MatchList.tsx deleted file mode 100644 index 334968df..00000000 --- a/web/pages/Match/MatchList.tsx +++ /dev/null @@ -1,86 +0,0 @@ -import { Component, createEffect, createSignal, For, Show } from 'solid-js' -import Button from '../../shared/Button' -import PageHeader from '../../shared/PageHeader' -import { Check, Star } from 'lucide-solid' -import { AppSchema } from '../../../srv/db/schema' -import { A, useNavigate } from '@solidjs/router' -import AvatarIcon from '../../shared/AvatarIcon' -import { matchStore, userStore } from '../../store' - -const MatchList: Component = () => { - const chars = matchStore((s) => s.characters) - const [showImport, setImport] = createSignal(false) - const [showDelete, setDelete] = createSignal() - const user = userStore() - const navigate = useNavigate() - createEffect(() => { - matchStore.getMatches(user.userId) - }) - - const createMatch = async (charId: string) => { - const char = chars.list.find((c) => c._id === charId) - // matchStore.createMatch(char).then(() => navigate('/character/list')) - matchStore.createMatch(char, (s) => navigate(s)) - } - - return ( - <> - - - -
Loading...
-
- -
- {(char) => } -
- {chars.list.length === 0 ? : null} -
- - ) -} - -const Match: Component<{ character: AppSchema.Character; match: Any }> = (props) => { - return ( -
- -
- -
-
- ) -} - -function charToJson(char: AppSchema.Character) { - const { _id, updatedAt, createdAt, kind, summary, premium, xp, match, avatar, ...json } = char - return JSON.stringify(json, null, 2) -} - -const NoMatches: Component = () => ( -
You have no likes! 
-) - -export default MatchList - -function repeat(list: T[], times = 20) { - const next: any[] = [] - for (let i = 0; i < times; i++) { - next.push(...list) - } - return next -} diff --git a/web/pages/Match/MatchProfile.tsx b/web/pages/Match/MatchProfile.tsx deleted file mode 100644 index b5a74cc8..00000000 --- a/web/pages/Match/MatchProfile.tsx +++ /dev/null @@ -1,59 +0,0 @@ -import { Component, createEffect, createSignal, For, Show, createMemo } from 'solid-js' -import { useParams } from '@solidjs/router' -import Button from '../../shared/Button' -import ProfileCard from '../../shared/ProfileCard' -import PageHeader from '../../shared/PageHeader' -import Modal from '../../shared/Modal' -import { Check } from 'lucide-solid' -import { AppSchema } from '../../../srv/db/schema' -import { A, useNavigate } from '@solidjs/router' -import AvatarIcon from '../../shared/AvatarIcon' -import { characterStore, matchStore } from '../../store' -import { setComponentPageTitle } from '../../shared/util' - -const MatchProfile: Component = () => { - const params = useParams() - setComponentPageTitle('Profile') - const chars = characterStore((s) => s.characters) - const matches = matchStore((s) => s.characters) - const [char, setChar] = createSignal() - - createEffect(() => { - characterStore.getCharacters() - matchStore.getMatches() - }) - - createEffect(() => { - let searchChar = false - if (matches.loaded && matches.list?.length > 0) { - searchChar = matches?.list?.find((c) => c._id === params?.id) || false - } - if (searchChar) { - setChar(searchChar) - } else { - setChar(chars.list.find((c) => c._id === params?.id) || null) - } - }, [chars, matches]) - - const navigate = useNavigate() - - return ( - <> - - - -
Loading...
-
- -
- -
-
- - ) -} -export default MatchProfile diff --git a/web/pages/Match/MatchSwipe.tsx b/web/pages/Match/MatchSwipe.tsx deleted file mode 100644 index 2b7567cf..00000000 --- a/web/pages/Match/MatchSwipe.tsx +++ /dev/null @@ -1,625 +0,0 @@ -import { Component, createEffect, createMemo, createSignal, For, Show } from 'solid-js' -import Button from '../../shared/Button' -import PageHeader from '../../shared/PageHeader' -import { MatchLike } from './MatchLike' -import { VenetianMask } from 'lucide-solid' -import { CharacterCardView } from '../Character/components/CharacterCardView' -import { - Check, - Delete, - Heart, - Undo2, - X, - Menu, - AlignLeft, - LayoutList, - Image, - Star, - SortAsc, - SortDesc, - User, - ThumbsUp, -} from 'lucide-solid' -import { DropMenu } from '../../shared/DropMenu' -import { AppSchema } from '../../../srv/db/schema' -import { A, useNavigate } from '@solidjs/router' -import AvatarIcon from '../../shared/AvatarIcon' -import { matchStore, userStore, swipeStore } from '../../store' - -import { CharacterAvatar } from '../../shared/AvatarIcon' -import { tagStore } from '../../store' -import TagSelect from '../../shared/TagSelect' -import Select, { Option } from '../../shared/Select' -import TextInput from '../../shared/TextInput' -import { SwipeCard } from '../../shared/Swipe' -import type { SwipeCardRef } from '../../shared/Swipe' -import { setComponentPageTitle } from '../../shared/util' -import { getAssetUrl } from '../../shared/util' - -const CACHE_KEY = 'agnai-likes-cache' - -type ViewTypes = 'list' | 'cards' -type SortFieldTypes = 'modified' | 'created' | 'name' | 'children' -type SortDirectionTypes = 'asc' | 'desc' -const sortOptions: Option[] = [ - { value: 'modified', label: 'Last Modified' }, - { value: 'created', label: 'Created' }, - { value: 'name', label: 'Name' }, - { value: 'children', label: 'Popularity' }, -] -function getListCache(): ListCache { - const existing = localStorage.getItem(CACHE_KEY) - const defaultCache: ListCache = { - view: 'likes', - sort: { field: 'chat-updated', direction: 'desc' }, - } - - if (!existing) { - return defaultCache - } - - return { ...defaultCache, ...JSON.parse(existing) } -} -function saveListCache(cache: ListCache) { - localStorage.setItem(CACHE_KEY, JSON.stringify(cache)) -} - -const MatchList: Component = () => { - setComponentPageTitle('Likes') - const swipeCount = swipeStore() - let curApiref: string - let totalSwipes = [] - let tmpSwipes = [] - - createEffect(() => { - const next = { - view: view(), - sort: { - field: sortField(), - direction: sortDirection(), - }, - } - - saveListCache(next) - }) - createEffect(() => { - if (charsList().list) { - tagStore.updateTags(charsList().list) - } - }) - createEffect(() => { - curApiref = '' - if (getNextView() === 'likes') { - swipeStore.getSwipe() - matchStore.getMatches(swipeCount.lastid) - } else { - matchStore.getMatches('') - } - // getNextView() === 'likes' ? swipeStore.getSwipe() : '' - const next = { - view: view(), - } - saveListCache(next) - }) - - const tags = tagStore((s) => ({ filter: s.filter, hidden: s.hidden })) - const [showGrouping, setShowGrouping] = createSignal(false) - const cached = getListCache() - - const [view, setView] = createSignal(cached.view) // createSignal(cached.view) //createSignal(cached.view) - const [sortField, setSortField] = createSignal(cached.sort.field) - const [sortDirection, setSortDirection] = createSignal(cached.sort.direction) - const [search, setSearch] = createSignal('') - const getNextView = () => (view() === 'likes' ? 'list' : 'likes') - const matchItems = matchStore((s) => s.characters) - const [charsList, setCharList] = createSignal(matchItems) - const [charsIds, setCharIds] = createSignal(matchItems) - const showZindex = { min: 10000, plus: 20000 } - const [undoDisabled, setUndo] = createSignal('disabled') - const [colorSwipeMove, setSwipeMove] = createSignal({ - left: ' text-red-500 fill-red-500 ', - right: ' text-emerald-400 fill-emerald-400', - up: ' text-cyan-300 fill-cyan-300', - down: ' text-orange-300 ', - }) - - const [showImport, setImport] = createSignal(false) - const [showDelete, setDelete] = createSignal() - const user = userStore() - const navigate = useNavigate() - - const createMatch = async (charId: string) => { - const char = charsList().list.find((c) => c._id === charId) - await matchStore.createMatch(char, (s) => navigate(s)) - } - function fixcharlist(charsList) { - return charsList.list - .slice() - .filter((ch) => ch.name.toLowerCase().includes(search().toLowerCase())) - .filter((ch) => tags.filter.length === 0 || ch.tags?.some((t) => tags.filter.includes(t))) - .filter((ch) => !ch.tags || !ch.tags.some((t) => tags.hidden.includes(t))) - .sort(getSortFunction(sortField(), sortDirection())) - } - const SwipeDirection = 'right' | 'left' - function swipeAction(direction) { - // let swipeNowAmount = 0; - - if (direction === 'down') direction = 'left' - switch (direction) { - case 'right': - createMatch(this.id) - this.apiRef.remove() - - break - case 'up': - showProfile() - break - } - if (direction === 'right' || direction === 'left') { - swipeStore.setSwipe(charsIds().list[charsIds().list.length - 1]._id) - if (direction === 'left') { - const test = charsIds().list.splice(0, charsIds().list.length - 1) - test.unshift(charsIds().list[charsIds().list.length - 1]) - setCharIds({ loaded: true, list: test }) - tmpSwipes[this.apiRef.id] = [...test] - setTimeout(() => { - if (tmpSwipes[this.apiRef.id] && !tmpSwipes[this.apiRef.id].deleted) { - this.apiRef.restoreBack(5) - setCharList({ loaded: true, list: tmpSwipes[this.apiRef.id] }) - tmpSwipes[this.apiRef.id].deleted = 1 - } - }, 2500) - setUndo('') - } else { - const test = charsIds().list.splice(0, charsIds().list.length - 1) - setCharIds({ loaded: true, list: test }) - tmpSwipes[this.apiRef.id] = test - setTimeout(() => { - if (tmpSwipes[this.apiRef.id]) { - setCharList({ loaded: true, list: tmpSwipes[this.apiRef.id] }) - tmpSwipes[this.apiRef.id].deleted = 1 - // delete tmpSwipes[this.apiRef.id]; - } - }, 2500) - setUndo('disabled') - } - } - } - - function getSortableValue(char: AppSchema.Character, field: SortFieldTypes) { - switch (field) { - case 'name': - return char.name.toLowerCase() - case 'created': - return char.createdAt - case 'modified': - return char.updatedAt - case 'children': - return char.children || 0 - default: - return 0 - } - } - function getSortFunction(field: SortFieldTypes, direction: SortDirectionTypes) { - return (left: AppSchema.Character, right: AppSchema.Character) => { - const mod = direction === 'asc' ? 1 : -1 - const l = getSortableValue(left, field) - const r = getSortableValue(right, field) - return l > r ? mod : l === r ? 0 : -mod - } - } - function swipeMovement(a) { - switch (a) { - case 'left': - setSwipeMove({ - left: 'bg-red-500 text-white scale-100', - right: ' text-emerald-400 fill-emerald-400 scale-80', - up: ' text-cyan-300 fill-cyan-300 scale-100', - down: ' text-orange-300 ', - }) - break - case 'right': - setSwipeMove({ - left: ' text-red-500 fill-red-800 scale-80', - right: 'bg-emerald-400 text-white scale-100', - up: ' text-cyan-300 fill-cyan-300 scale-100', - down: ' text-orange-300 ', - }) - break - case 'up': - setSwipeMove({ - left: ' text-red-500 fill-red-800', - right: ' text-emerald-400 fill-emerald-400 scale-100', - up: 'bg-cyan-400 text-white scale-100', - down: ' text-orange-300 ', - }) - break - case 'down': - setSwipeMove({ - left: 'bg-red-500 text-white scale-100', - right: ' text-emerald-400 fill-emerald-400 scale-80', - up: ' text-cyan-300 fill-cyan-300 scale-100', - down: ' text-orange-300 ', - }) - break - case 'restore': - setSwipeMove({ - left: ' text-red-500 fill-red-800', - right: ' text-emerald-400 fill-emerald-400 scale-100', - up: ' text-cyan-300 fill-cyan-300 scale-100', - down: ' text-orange-300 ', - }) - break - } - } - function showProfile() { - setCharIds({ loaded: true, list: fixcharlist(charsIds()) }) - navigate(`/likes/${charsIds().list[charsIds().list.length - 1]._id}/profile`) - } - function SwipeUndo() { - setCharIds({ loaded: true, list: fixcharlist(charsIds()) }) - setUndo('disabled') - totalSwipes[charsIds().list[0]._id].snapBack(6) - const tmpChar = charsIds().list - const firstElement = tmpChar.shift() - tmpChar.push(firstElement) - setCharIds({ loaded: true, list: tmpChar }) - tmpSwipes[charsIds().list[0]._id] = tmpChar - swipeStore.setSwipe(charsIds().list[0]._id) - Object.keys(tmpSwipes).forEach((key) => { - if ( - tmpSwipes[key][tmpSwipes[key].length - 1]._id !== - charsIds().list[charsIds().list.length - 1]._id - ) { - if (!tmpSwipes[key].deleted) { - totalSwipes[key].restoreBack(5) - setCharList({ loaded: true, list: tmpSwipes[key] }) - } - delete tmpSwipes[key] - } else { - setTimeout(() => { - setCharList({ loaded: true, list: tmpSwipes[key] }) - setCharIds({ loaded: true, list: tmpSwipes[key] }) - delete tmpSwipes[key] - }, 200) - } - }) - } - function endAllSwipes() { - setUndo('disabled') - Object.keys(tmpSwipes).forEach((key) => { - if (!tmpSwipes[key].deleted) { - totalSwipes[key].restoreBack(5) - setCharList({ loaded: true, list: tmpSwipes[key] }) - } - delete tmpSwipes[key] - }) - } - function buttonSwipe(direction) { - setCharIds({ loaded: true, list: fixcharlist(charsIds()) }) - totalSwipes[charsIds().list[charsIds().list.length - 1]._id].swipe(direction) - } - - const groupslist = createMemo(() => { - if (!charsList().list) return [] - - const list = charsList() - .list.slice() - .filter((ch) => ch.name.toLowerCase().includes(search().toLowerCase())) - .filter((ch) => tags.filter.length === 0 || ch.tags?.some((t) => tags.filter.includes(t))) - .filter((ch) => !ch.tags || !ch.tags.some((t) => tags.hidden.includes(t))) - .sort(getSortFunction(sortField(), sortDirection())) - - const groups = [ - { label: 'Favorites', list: list.filter((c) => c.favorite) }, - { label: '', list: list.filter((c) => !c.favorite) }, - ] - if (groups[0].list.length === 0) { - setShowGrouping(false) - return groups[1].list - } - setShowGrouping(true) - return groups - }) - return ( - <> -
- - - - - -
-
-
- setSearch(ev.currentTarget.value)} - /> -
- -
- ({ label: `Embed: ${value}`, value }))} - fieldName="embed-type" - value={type()} - onChange={(ev) => setType(ev.value)} - /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ) -} diff --git a/web/pages/Memory/Instructions.tsx b/web/pages/Memory/Instructions.tsx deleted file mode 100644 index 1802b902..00000000 --- a/web/pages/Memory/Instructions.tsx +++ /dev/null @@ -1,76 +0,0 @@ -import { Component } from 'solid-js' -import PageHeader from '../../shared/PageHeader' -import { markdown } from '../../shared/markdown' -import { setComponentPageTitle } from '../../shared/util' - -const text = ` -# Memory Books - -## What is it? - -Memory books are a way to dynamically provide context to your characters as you talk with them. - -## How does it work? - -When you create a **Memory Entry**, you provide: \`keywords\` and the \`entry\` text. -You can also provide \`priority\` and \`weight\`, but we'll get to that later. - -- Keywords: - - These are words that "trigger" the memory to be inserted into your prompt. - - E.g. \`drink, thrist, hydrate, hydrate\` -- Entry: - - This is the text that is inserted into your prompt when one of your keywords is found. - - E.g. \`{{user}}'s favourite drink is red cordial on the rocks\` - -Your generation settings will have a **Memory Depth**. This is the maximum number of chat messages that Charluv will scan for keywords. -It is important to remember this all happens in your browser. - -### Why is it important to remember this occurs in the browser? - -_Note: This does not apply to anonymous/guest users. Guest users always have the entire chat history available for prompt building._ - -If you configure your memory depth above \`100\`, the keywords may not trigger as you expect them to. -When you initially load your chat, you will be sent a maximum of 100 messages from the server. You can continue to scroll up to retrieve more messages. - -## What are priority and weight? - -In a nutshell, these two values are used to determine which memories to include in your memory budget (\`memory context limit\`) and in what order they appear in the prompt. - -### Priority - -The higher this value is, the more "important" it is. To evalulate which memories we will include in the prompt: - -- We sort the memories by priority -- We add the memories one by one to the prompt until the budget is full - -### Weight - -The higher this value is, the further toward the bottom of the memory prompt the memory will be. -The theory is: the further toward the bottom of the prompt something is, the more important it is when generating a response. - -After the memories have been "pruned" to fit inside the budget the memories and then sorted by weight. - -## What memory generation settings do you recommend? - -At the moment I have no idea. I would be very interested to hear your experiences as you experiment with them. - -The generation settings available to play with are: \`depth\` and \`contextLimit\`. - -- **Depth**: This is the maximum number of chat messages to scan for keywords. -- **Context Limit**: This is the maximum number of tokens that the memory prompt will consume from your "Max Context Length". - - -` - -const Instructions: Component = () => { - setComponentPageTitle('Memory help') - return ( - <> - - -
- - ) -} - -export default Instructions diff --git a/web/pages/Memory/Library.tsx b/web/pages/Memory/Library.tsx deleted file mode 100644 index a91f91cf..00000000 --- a/web/pages/Memory/Library.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import { Component, For, Match, Switch, createEffect, createMemo } from 'solid-js' -import { useTabs } from '/web/shared/Tabs' -import { setComponentPageTitle } from '/web/shared/util' -import ScenarioList from '../Scenario/ScenarioList' -import PromptTemplates from '../PromptTemplates' -import { BooksTab, EmbedsTab } from './Memory' -import { useSearchParams } from '@solidjs/router' -import Button from '/web/shared/Button' - -export { Library as default } - -const Library: Component = () => { - const [params, setParams] = useSearchParams() - setComponentPageTitle('Library') - - const allowed = createMemo(() => { - const base = ['Memories', 'Scenarios', 'Templates', 'Embeddings'] - - return base - }) - - const tabs = useTabs(allowed(), +(params.tab || '0')) - - createEffect(() => { - const index = tabs.selected() - setParams({ tab: index }) - }) - - return ( - <> -
- - {(name, i) => ( - - )} - -
- - - - - - - - - - - - - - - - - - - - ) -} diff --git a/web/pages/Memory/Memory.tsx b/web/pages/Memory/Memory.tsx deleted file mode 100644 index ac7bdf79..00000000 --- a/web/pages/Memory/Memory.tsx +++ /dev/null @@ -1,457 +0,0 @@ -import { A } from '@solidjs/router' -import { assertValid } from '/common/valid' -import { Download, Plus, Trash, Upload, X, Edit, FileX, FileCheck } from 'lucide-solid' -import { Component, createSignal, For, onMount, Show } from 'solid-js' -import { AppSchema } from '../../../common/types/schema' -import Button from '../../shared/Button' -import FileInput, { FileInputResult, getFileAsString } from '../../shared/FileInput' -import Modal, { ConfirmModal } from '../../shared/Modal' -import PageHeader from '../../shared/PageHeader' -import { memoryStore, toastStore } from '../../store' -import { SolidCard } from '/web/shared/Card' -import EmbedContent from './EmbedContent' -import { embedApi } from '/web/store/embeddings' -import { EditEmbedModal } from '/web/shared/EditEmbedModal' -import { Page } from '/web/Layout' - -type STEntry = { - addMenu: boolean - case_sensitive: boolean - characterFilter?: any - comment: string - constant: boolean - content: string - depth: number - disable: boolean - displayIndex: 1 - enabled: boolean - excludeRecursion: boolean - extensions: { - addMemo: boolean - characterFilter?: any - depth: number - displayIndex: number - excludeRecursion: number - probability: number - selectiveLogic: number - useProbability: number - weight: number - } - id: number - uid: number - name: string - order: number - keys: string[] - - insertion_order: number - - key: string[] - keysecondary: string[] - position: any - priority: number - - /** 1-100 */ - probability: number - - secondary_keys: string[] - selective: boolean - selectiveLogic: number - useProbability: boolean -} - -type STVenusBook = { - description: string - entries: Record - extensions: any - is_creation: boolean - name: string - recursive_scanning: boolean - scan_depth: number - token_budget: number -} - -type STExportedBook = { - entries: Record< - string, - { - uid: number - key: string[] - keysecondary: string[] - comment: string - content: string - constant: boolean - selective: boolean - selectiveLogic: any - addMenu: boolean - order: number - position: any - disable: boolean - excludeRecursion: boolean - probability: number - useProbability: boolean - depth: number - group: string - scanDepth?: number - caseSensitive?: boolean - matchWholeWorlds?: boolean - automationId?: string - role?: string - displayIndex: number - preventRecursion: boolean - groupOverride: boolean - groupWeight: number - vectorized: boolean - delayUntilRecursion: boolean - useGroupScoring?: boolean - sticky: number - cooldown: number - delay: number - } - > -} - -export const EmbedsTab: Component = (props) => { - const state = memoryStore() - const [editing, setEditing] = createSignal() - const [deleting, setDeleting] = createSignal() - - return ( - <> - - - -
- - {(each) => ( -
- -
- {each.state === 'loaded' ? : } -
-
{each.id}
-
- -
setEditing(each.id)}> - -
- -
setDeleting(each.id)}> - -
-
- )} -
-
- setEditing()} /> - embedApi.removeDocument(deleting()!)} - show={!!deleting()} - close={() => setDeleting()} - message={`Are you sure you wish to delete this embedding?\n\n${deleting()}`} - /> - - ) -} - -export const BooksTab: Component = (props) => { - const state = memoryStore() - const [showImport, setImport] = createSignal(false) - const [deleting, setDeleting] = createSignal() - - const removeBook = (book: AppSchema.MemoryBook) => { - memoryStore.remove(book._id) - } - - onMount(() => { - memoryStore.getAll() - }) - - return ( - - - {' '} - - Memory Book Guide - - - } - /> - -
- - - - -
- - - - - - - - {(book) => ( -
- - {book.name} - {book.description} - - - - - -
setDeleting(book)}> - -
-
- )} -
-
- -
- setImport(false)} /> - removeBook(deleting()!)} - message={`Are you sure you wish to delete this memory book?\n\n${deleting()?.name}`} - close={() => setDeleting()} - show={!!deleting()} - /> -
- ) -} - -const NoBooks = () => ( -
You have no memory books yet. Click Create to get started.
-) - -type ImportProps = { - show: boolean - close: () => void -} - -const ImportMemoryModal: Component = (props) => { - const [json, setJson] = createSignal() - - const updateJson = async (files: FileInputResult[]) => { - if (!files.length) return setJson() - try { - const file = files[0] - const content = await getFileAsString(file) - const json = JSON.parse(content) - const book = validateBookJson(file.file.name, json) - setJson(book || json) - toastStore.success('Memory book accepted') - } catch (ex: any) { - toastStore.warn(`Invalid memory book JSON. ${ex.message}`) - } - } - - const onImport = () => { - if (!json()) return - memoryStore.create(json(), props.close) - } - - const Footer = ( - <> - - - - ) - - return ( - - - - ) -} - -function encodeBook(book: AppSchema.MemoryBook) { - const { _id, userId, ...body } = book - return encodeURIComponent(JSON.stringify(body, null, 2)) -} - -function validateBookJson(filename: string, json: any): AppSchema.MemoryBook | void { - if (isSTFormat(json)) { - return convertFromSTVenus(json) - } - - if (isSTExported(json)) { - return convertFromSTExported(filename, json) - } - - const book = json as AppSchema.MemoryBook - json.name = json.name || 'Imported Book' - json.kind = 'memory' - - const entries: AppSchema.MemoryEntry[] = [] - - /** - * - Attempt to convert any "should-be" numbers to numbers - * - Remove entries with no prompt text - * - Remove entries with no keywords - * - Coalesce enable to true - * - Coalese name to empty string - */ - - if (Array.isArray(book?.entries)) { - for (const entry of book.entries) { - entry.priority = toNumber(entry.priority) - entry.weight = toNumber(entry.weight) - if (entry.enabled === undefined) entry.enabled = true - if (!entry.name) entry.name = '' - if (!entry.entry) continue - if (!Array.isArray(entry.keywords)) continue - - entries.push(entry) - } - } - - json.entries = entries - - assertValid( - { - kind: ['memory'], - name: 'string', - description: 'string?', - entries: [ - { - name: 'string', - entry: 'string', - keywords: ['string'], - priority: 'number', - weight: 'number', - enabled: 'boolean', - }, - ], - }, - json - ) -} - -function toNumber(value: any) { - const num = +value - - if (isNaN(num)) return 0 - return num -} - -function isSTFormat(json: any): json is STVenusBook { - return 'is_creation' in json && 'recursive_scanning' in json -} - -function convertFromSTVenus(json: STVenusBook): AppSchema.MemoryBook { - const base: AppSchema.MemoryBook = { - _id: '', - name: json.name || 'Imported Book', - kind: 'memory', - userId: '', - description: json.description, - extensions: { ...json, entries: {} }, - entries: [], - recursiveScanning: json.recursive_scanning ?? false, - scanDepth: json.scan_depth ?? 50, - tokenBudget: json.token_budget ?? 500, - } - - const entries = Object.values(json.entries) - .sort((l, r) => l.id - r.id) - .map((entry, i) => ({ - priority: entry.priority, - weight: entry.extensions.weight, - comment: entry.comment, - constant: entry.constant, - id: i, - name: entry.name, - keywords: entry.keys, - entry: entry.content, - enabled: entry.enabled, - - // V2 - position: entry.position, - excludeRecursion: entry.excludeRecursion, - probability: entry.probability, - useProbability: entry.useProbability, - secondaryKeys: entry.secondary_keys, - selective: entry.selective, - selectiveLogic: entry.selectiveLogic, - })) - - base.entries = entries - return base -} - -function isSTExported(json: any): json is STExportedBook { - const keys = Object.keys(json || {}).filter((key) => key !== 'originalData') - return keys.length === 1 && keys[0] === 'entries' -} - -function convertFromSTExported(filename: string, json: STExportedBook): AppSchema.MemoryBook { - const base: AppSchema.MemoryBook = { - _id: '', - name: filename.replace('.json', '') || 'Imported Book', - kind: 'memory', - userId: '', - description: '', - extensions: {}, - entries: [], - recursiveScanning: false, - scanDepth: 50, - tokenBudget: 500, - } - - const entries = Object.values(json.entries) - .sort((l, r) => l.uid - r.uid) - .map((entry, i) => ({ - priority: 0, - weight: 0, - comment: '', - constant: entry.constant, - id: i, - name: entry.comment, - keywords: entry.key, - entry: entry.content, - enabled: !entry.disable, - - // V2 - position: entry.position, - excludeRecursion: entry.preventRecursion, - probability: entry.probability, - useProbability: entry.useProbability, - secondaryKeys: entry.keysecondary, - selective: entry.selective, - selectiveLogic: entry.selectiveLogic, - })) - - base.entries = entries - - return base -} diff --git a/web/pages/MyAI/MakePublicModal.tsx b/web/pages/MyAI/MakePublicModal.tsx new file mode 100644 index 00000000..b6ad0357 --- /dev/null +++ b/web/pages/MyAI/MakePublicModal.tsx @@ -0,0 +1,245 @@ +import { Component, For, Show, createEffect, createMemo, createSignal } from 'solid-js' +import { Check, X, Sparkles, Globe } from '/web/icons' +import Modal from '../../shared/Modal' +import Button from '../../shared/Button' +import { charsApi, PublishStatus } from '../../store/data/chars' +import { imageApi } from '../../store/data/image' +import { characterStore } from '../../store/character' +import { userStore } from '../../store' +import { subscribe } from '../../store/socket' +import { + checkPublishRequirements, + PUBLISH_RULES, + PUBLISH_RULES_NOTE, + FLAG_LABELS, +} from '/common/publish' +import { AppSchema } from '/common/types' + +type Phase = 'idle' | 'checking' | 'approved' | 'pending' | 'rejected' | 'error' + +const MakePublicModal: Component<{ + show: boolean + close: () => void + char: AppSchema.Character +}> = (props) => { + const [status, setStatus] = createSignal() + const [phase, setPhase] = createSignal('idle') + const [result, setResult] = createSignal<{ + reason?: string + flags?: string[] + rewarded?: number + }>({}) + + // Admins bypass the minimum-requirements gate so special characters that + // deliberately omit some details can still be published (server enforces the + // same exemption). + const isAdmin = createMemo(() => !!userStore().user?.admin) + const reqs = createMemo(() => checkPublishRequirements(props.char, status()?.mins)) + const ready = createMemo( + () => + (reqs().ok || isAdmin()) && + (status()?.enabled ?? true) && + ((status()?.remaining ?? 1) > 0 || isAdmin()) + ) + + createEffect(() => { + if (!props.show) return + setPhase('idle') + setResult({}) + charsApi.getPublishStatus().then((r) => r.result && setStatus(r.result)) + }) + + const publish = async () => { + setPhase('checking') + const image = props.char.avatar ? await imageApi.getImageData(props.char.avatar) : undefined + const { res, requestId } = await charsApi.publishCharacter(props.char._id, image) + if (res.error) { + setPhase('error') + setResult({ reason: res.error }) + return + } + + subscribe( + 'publish-response', + { + acceptable: 'boolean?', + pending: 'boolean?', + requestId: 'string', + reason: 'string?', + flags: 'any?', + rewarded: 'number?', + }, + (body) => { + if (body.acceptable) { + setPhase('approved') + setResult({ rewarded: body.rewarded }) + characterStore.getCharacters(true) + } else if (body.pending) { + // Failed the automated check → handed to a human moderator, not a dead end. + setPhase('pending') + setResult({ reason: body.reason }) + } else { + setPhase('rejected') + setResult({ reason: body.reason, flags: (body.flags as string[]) || [] }) + } + }, + (body) => body.requestId === requestId + ) + } + + const footer = ( + <> + + + + + + ) + + return ( + + Make “{props.char.name}” public + + } + footer={footer} + > +
+ +
+
Your character is live ✨
+

+ {props.char.name} now appears in Discover for everyone. + 0}> + {' '} + You earned {result().rewarded} credits. + +

+
+
+ + +
+
Sent for review
+

+ {result().reason || + "Your character didn't pass the automatic check and has been sent to our moderators. You'll be notified once it's reviewed."} +

+
+
+ + +
+
Not published
+

{result().reason || 'It did not pass the content check.'}

+ +
+ + {(f) => ( + + {FLAG_LABELS[f] || f} + + )} + +
+
+
+
+ + +

+ Public characters show up in Discover for everyone. Yours stays yours — others get their + own copy when they pick it. A quick automated check runs first. +

+ + {/* Requirements checklist */} +
+
Minimum requirements
+
    + + {(f) => ( +
  • + }> + + + {f.label} +
  • + )} +
    + + {(r) => ( +
  • + }> + + + {r.label} + + {r.actual}/{r.min} + +
  • + )} +
    +
+ +

+ Admin override: you can publish despite unmet requirements. +

+
+
+ + {/* Content rules */} +
+
Content rules
+
    + {(rule) =>
  • {rule}
  • }
    +
+

{PUBLISH_RULES_NOTE}

+ +

{status()!.guidelines}

+
+
+ + +
+ + Reward: {status()!.reward} credits + + + + Publishes left today: Unlimited + + } + > + Publishes left today: {status()!.remaining} / {status()!.cap} + + +
+
+ + +
Publishing isn’t available for your account.
+
+ +
+ You’ve hit today’s publish limit. Try again tomorrow. +
+
+
+
+
+ ) +} + +export default MakePublicModal diff --git a/web/pages/MyAI/Profile.tsx b/web/pages/MyAI/Profile.tsx new file mode 100644 index 00000000..d133f4d4 --- /dev/null +++ b/web/pages/MyAI/Profile.tsx @@ -0,0 +1,276 @@ +import { + Component, + For, + Show, + createEffect, + createMemo, + createSignal, + onCleanup, + onMount, +} from 'solid-js' +import { A, useNavigate, useParams } from '@solidjs/router' +import '../Discover/profile.css' +import { characterStore } from '../../store/character' +import { settingStore } from '../../store/settings' +import { startChat } from '../../store/chat' +import { getAssetUrl } from '../../shared/util' +import Loading from '../../shared/Loading' +import { Globe, Star, Copy, Download, Trash, Plus, RotateCcw } from '/web/icons' +import MakePublicModal from './MakePublicModal' +import DeleteCharacterModal from '../Character/DeleteCharacter' +import ResetCharacterModal from '../Character/ResetCharacter' +import { DownloadModal } from '../Character/DownloadModal' +import { EVENTS, events } from '../../emitter' +import { AppSchema } from '/common/types' +import { BOT_REPLACE, SELF_REPLACE } from '/common/prompt' + +type Attributes = Record + +const attr = (char: AppSchema.Character | undefined, key: string): string | undefined => { + const attrs = char?.persona?.attributes as Attributes | undefined + const val = attrs?.[key] + if (!val?.length) return undefined + return val.join(', ') +} + +const FACETS: { key: string; label: string }[] = [ + { key: 'sexuality', label: 'Sexuality' }, + { key: 'likes', label: 'Likes' }, + { key: 'country', label: 'Country' }, + { key: 'zodiac', label: 'Zodiac' }, + { key: 'job', label: 'Job' }, +] + +const Profile: Component = () => { + const params = useParams() + const navigate = useNavigate() + const state = characterStore() + + // Prefer the freshly-fetched detail (has gallery/persona); fall back to the + // list copy so we can render immediately while the detail loads. + const char = createMemo(() => { + const editing = state.editing + if (editing && editing._id === params.id) return editing + return state.characters.list.find((c) => c._id === params.id) + }) + + onMount(() => { + characterStore.getCharacter(params.id) + }) + + const age = createMemo(() => { + const c = char() + return c?.ageRange || attr(c, 'age') + }) + + // Just the number, for the "Julia, 18" title. + const ageShort = createMemo(() => age()?.match(/\d+/)?.[0] || '') + + const description = createMemo(() => { + const c = char() + // Prefer the general description field; only fall back to the W++ persona + // `description` trait for legacy chars that never had a general one. + const raw = c?.description || attr(c, 'description') || '' + // Render the prompt placeholders for display. + return raw.replace(BOT_REPLACE, c?.name || '').replace(SELF_REPLACE, 'you') + }) + + // The full photo set = cover/avatar first, then the gallery, de-duped. One + // image is "main" (large); the rest are thumbnails that swap it on click. + const shots = createMemo(() => { + const c = char() + if (!c) return [] as string[] + return Array.from(new Set([c.avatar, ...(c.gallery ?? [])].filter(Boolean) as string[])) + }) + const [main, setMain] = createSignal() + createEffect(() => { + const s = shots() + if (s.length && (!main() || !s.includes(main()!))) setMain(s[0]) + }) + + const initial = () => char()?.name?.[0]?.toUpperCase() || '?' + + const openImage = (url: string) => settingStore.showImage(getAssetUrl(url)) + + const [showPublish, setShowPublish] = createSignal(false) + const [showDownload, setShowDownload] = createSignal(false) + const [showDelete, setShowDelete] = createSignal(false) + const [showReset, setShowReset] = createSignal(false) + const isPublic = createMemo(() => char()?.published && char()?.moderation?.status !== 'hidden') + // Was public, then edited — needs re-publishing to go live again. + const needsRepublish = createMemo( + () => !char()?.published && char()?.moderation?.status === 'review' + ) + + // Leave the (now-deleted) profile once the delete succeeds. + const onCharDeleted = (id: string) => { + if (id === params.id) navigate('/mine') + } + events.on(EVENTS.charDeleted, onCharDeleted) + onCleanup(() => events.removeListener(EVENTS.charDeleted, onCharDeleted)) + + const onChat = () => { + const c = char() + if (!c) return + startChat(c, navigate) + } + + const onNewChat = () => { + const c = char() + if (!c) return + startChat(c, navigate, { forceNew: true }) + } + + const toggleFavorite = () => { + const c = char() + if (!c) return + characterStore.setFavorite(c._id, !c.favorite) + } + + return ( +
+ + +
+ } + > +
+ {/* Main image */} +
+ } + > + + + + {/* Detail */} +
+

+ {char()!.name} + + , {ageShort()} + +

+ + +
+ +

{description()}

+
+
+ + attr(char(), f.key))}> +
+ + {(facet) => ( + +
+
{facet.label}
+
{attr(char(), facet.key)}
+
+
+ )} +
+
+
+ + 1}> +
+ + {(url, i) => ( + + )} + +
+
+ +
+ + + + Public + + } + > + + + + + Edit + + + Copy + + + + + + Back + +
+
+
+ + setShowPublish(false)} char={char()!} /> + setShowDownload(false)} + charId={params.id} + /> + setShowDelete(false)} + char={char()} + /> + setShowReset(false)} char={char()} /> + +
+ ) +} + +export default Profile diff --git a/web/pages/MyAI/index.tsx b/web/pages/MyAI/index.tsx new file mode 100644 index 00000000..de70e185 --- /dev/null +++ b/web/pages/MyAI/index.tsx @@ -0,0 +1,270 @@ +import { Component, For, Show, createMemo, onMount } from 'solid-js' +import { useNavigate, A } from '@solidjs/router' +import { Plus, Book } from '/web/icons' +import '../Discover/discover.css' +import './myai.css' +import { characterStore } from '../../store/character' +import { getAssetUrl } from '../../shared/util' +import { getCharacterLevel } from '/common/xplevel' +import { resolveStage, getStageLabel } from '/common/progression' +import { useLocalStorage } from '../../shared/hooks' +import { AppSchema } from '/common/types' + +const GENDERS = [ + { value: '', label: 'Everyone' }, + { value: 'female', label: 'Women' }, + { value: 'male', label: 'Men' }, + { value: 'trans', label: 'Trans' }, +] +const STYLES = [ + { value: '', label: 'Any style' }, + { value: 'realistic', label: 'Realistic' }, + { value: 'anime', label: 'Anime' }, +] + +const MyAI: Component = () => { + const navigate = useNavigate() + const state = characterStore() + + // Unlike Discover (server-side query), /mine filters the already-loaded list + // client-side. No popular/trending/new sort — these are the user's own + // companions, so we keep a recently-updated default and add a Favourites + // toggle Discover doesn't have. + // Persist the filter selections so they survive navigating away and back. + const [gender, setGender] = useLocalStorage('myai-gender', '') + const [style, setStyle] = useLocalStorage('myai-style', '') + const [sfw, setSfw] = useLocalStorage('myai-sfw', false) + const [favorite, setFavorite] = useLocalStorage('myai-favorite', false) + const [search, setSearch] = useLocalStorage('myai-search', '') + + onMount(() => { + // Always refresh so publish/edit state (e.g. the Public/Private tag) is + // current when returning to the list. `loaded` is a timestamp, so the old + // `!loaded` guard never refetched after the first visit. + characterStore.getCharacters(true) + }) + + // The user's companions, filtered then most-recently-updated first. + const companions = createMemo(() => { + const term = search().trim().toLowerCase() + return state.characters.list + .filter((c) => { + if (gender()) { + // 'trans' also matches legacy 'nonbinary' chars (same third option). + const ok = + gender() === 'trans' + ? c.gender === 'trans' || c.gender === 'nonbinary' + : c.gender === gender() + if (!ok) return false + } + if (style() && c.artStyle !== style()) return false + if (sfw() && c.nsfw) return false + if (favorite() && !c.favorite) return false + if (term) { + const inName = c.name?.toLowerCase().includes(term) + const inTags = c.category?.some((t) => t.toLowerCase().includes(term)) + if (!inName && !inTags) return false + } + return true + }) + .sort((a, b) => (b.updatedAt || '').localeCompare(a.updatedAt || '')) + }) + + const open = (char: AppSchema.Character) => navigate(`/mine/${char._id}`) + + return ( +
+
+

+ My AI +

+

+ Your companions and the relationships you're building. Pick up where you left off — or + find someone new in{' '} + + Discover + + . +

+ +
+ + + + c.progression?.archetype)}> +

+ + + Scenario progression — this companion's relationship grows through + stages as you chat. + +

+
+ +
+ {() =>
}} + > + + No companions yet — head to{' '} + + Discover + {' '} + and pick one. +
+ } + > +
No companions match those filters. Try widening them.
+
+ } + > + {(char) => } + + +
+
+ ) +} + +const Companion: Component<{ + char: AppSchema.Character + onOpen: (c: AppSchema.Character) => void +}> = (props) => { + const level = createMemo(() => getCharacterLevel(props.char.xp)) + const stage = createMemo(() => resolveStage(level(), props.char.progression)) + const initial = () => props.char.name?.[0]?.toUpperCase() || '?' + const isPublic = createMemo( + () => props.char.published && props.char.moderation?.status !== 'hidden' + ) + + return ( +
props.onOpen(props.char)} + onKeyDown={(e) => e.key === 'Enter' && props.onOpen(props.char)} + > + + Lv {level()} + {stage() + ? ` · ${getStageLabel(stage()!.stage, props.char.gender).replace('BDSM/', '')}` + : ''} + + + + {isPublic() ? 'Public' : 'Private'} + + + + + + + + + {initial()}
}> + {props.char.name} +
+
+ +
+
{props.char.name}
+ +
+ + {(c) => {c}} + + + LoRA + +
+
+
+ + + + ) +} + +export default MyAI diff --git a/web/pages/MyAI/myai.css b/web/pages/MyAI/myai.css new file mode 100644 index 00000000..bd3dbd3e --- /dev/null +++ b/web/pages/MyAI/myai.css @@ -0,0 +1,52 @@ +/* My AI — header actions (add a new companion). Reuses the Discover tokens. */ +@import url('https://fonts.googleapis.com/css2?family=Anton&display=swap'); + +/* Bold, condensed Impact-style status stamp over each companion card. */ +.myai-status { + position: absolute; + top: 0.55rem; + right: 0.7rem; + z-index: 2; + font-family: 'Anton', 'Arial Narrow', system-ui, sans-serif; + font-size: 1.45rem; + line-height: 1; + letter-spacing: 0.04em; + text-transform: uppercase; + pointer-events: none; + text-shadow: 0 2px 12px rgba(0, 0, 0, 0.7); +} +.myai-status.public { + color: var(--dsc-green, #2ec27e); +} +.myai-status.private { + color: rgba(255, 255, 255, 0.82); +} + +.myai-actions { + margin-top: 0.9rem; + display: flex; + flex-wrap: wrap; + gap: 0.6rem; +} +.myai-new { + display: inline-flex; + align-items: center; + gap: 0.4rem; + padding: 0.5rem 1rem; + border-radius: 999px; + font-weight: 600; + font-size: 0.9rem; + text-decoration: none; + color: var(--dsc-bg, #0b0b0f); + background: var(--dsc-green, #2ec27e); + border: 1px solid transparent; + transition: filter 0.15s ease, transform 0.15s ease; +} +.myai-new:hover { + filter: brightness(1.08); + transform: translateY(-1px); +} +.myai-new:focus-visible { + outline: 2px solid var(--dsc-green, #2ec27e); + outline-offset: 2px; +} diff --git a/web/pages/Premium/Error.tsx b/web/pages/Premium/Error.tsx index ffeccfc8..4f1ee2d1 100644 --- a/web/pages/Premium/Error.tsx +++ b/web/pages/Premium/Error.tsx @@ -1,20 +1,16 @@ -import { A } from '@solidjs/router' import { Component } from 'solid-js' import PageHeader from '../../shared/PageHeader' -import Divider from '../../shared/Divider' - -import logo from '../../asset/logo.png' const Error: Component = () => { - return ( - <> - -
-
- The transaction failed. Please try again. -
-
- - ) + return ( + <> + +
+
+ The transaction failed. Please try again. +
+
+ + ) } -export default Error \ No newline at end of file +export default Error diff --git a/web/pages/Premium/Info.tsx b/web/pages/Premium/Info.tsx index 16df7a64..15745a32 100644 --- a/web/pages/Premium/Info.tsx +++ b/web/pages/Premium/Info.tsx @@ -2,52 +2,48 @@ import { Component } from 'solid-js' import PageHeader from '../../shared/PageHeader' import { markdown } from '../../shared/markdown' import { setComponentPageTitle } from '../../shared/util' -import logo from '../../asset/logo.png' import logoDark from '../../asset/logoDark.png' const text = ` -# Our Patreon +# Premium via Patreon -The easiest and most complete form of premium is subscribing to our [Patreon](https://patreon.com/charluv) Premium Tier. You get all the benefits of premium and more. +Premium is available through our [Patreon](https://patreon.com/charluv) Premium tier — that's the only way to subscribe. Everything is handled on Patreon; you never enter payment details on our site. +# Why go premium? -# Why get premium? +- A larger, faster-refilling credit pool — chat and create more without running dry. +- Longer responses and more conversation memory. +- Access to premium characters, including ones with custom voices. -Premium members get their credits continously refilled to **1,000 credits** (instead of 200) and at a much faster rate than regular members do. Your messages are handled with higher priority (they skip the queue if there is one). You also get longer outputs and large history (memory) than regular users. You also get access to some premium characters that have custom ElevenLabs voices *(more premium characters to be added)*. **NEW FEATURE FOR PREMIUM:** Premium users can now create presets and change most of the AI settings. +# Support us in other ways -# Can I support you in other ways? +Join the free tier on [Patreon](https://patreon.com/charluv), and tell people about us — Reddit, X, YouTube, TikTok, wherever you are. The more people who find us, the better our odds of sticking around. -Yes, you can! Join the free tier on [Patreon](https://patreon.com/charluv). Tell everyone about us, Reddit, Twitter, YouTube, Facebook, Instagram, TikTok, whatever you use. The more people know about us, the more likely we will survive. -We also looking for new characters that can be used as matches, if you created a character that you want to contribute, share the ID with us on [Discord](https://charluv.com/discord) and if it passes moderation, we add it to the matches and reward you with 1,000 credits. -Since Matches have scripted scenarios (other than the self-made characters), we will do that step for you. +You can also **publish your own characters**. Create a character, open it from **My AI**, and hit **Make Public**. If it passes the automated check it goes live in Discover for everyone and you earn a one-time **500 credit** reward — it's fully self-serve, nothing to send us. -## Credits overview +## Credits -| Feature | Credits | -| ---------------- | -------:| -| Send message | 10| -| Regenerate msg | 10| -| Generate image | 20| -| Regenerate img | 20| -| Create character | 50| -| Edit character | 20| +| Action | Credits | +| ------ | ------: | +| Send or regenerate a message | 10 | +| Generate or regenerate an image | 25 | +| Create a character | 100 | +| Edit a character | 30 | +| Publish a character *(one-time reward)* | **+500** | -## Recharge rate +## Recharge -The recharge rate for regular members is dynamic and based on the average total amount of users we have online. -| | Regular | Premium | -| ----------------- | ---------: | -------: | -| Increase every | 2 minutes | 2 minutes | -| Amount increase | 5 | 20 | -| Capped at* | 200 | 1000| +Credits top up automatically every 2 minutes: +| | Free | Premium | +| ------------ | ---: | ------: | +| Per top-up | +5 | +20 | +| Refills up to | 500 | 5,000 | -## Subscription +## Managing your subscription -The [subscriptions](/settings?tab=3) can be activated from the tab under settings and under your user profile. -For support about subscriptions, please contact us on [Discord](https://charluv.com/discord), or on [Patreon](https://patreon.com/charluv). -Transactions are handled externally by Stripe, PayPal or Patreon and you don't fill any details on our site. +Manage or cancel your subscription from your [profile](/profile). For help, reach us on [Discord](https://charluv.com/discord) or [Patreon](https://patreon.com/charluv). ` diff --git a/web/pages/Premium/PremiumOptions.tsx b/web/pages/Premium/PremiumOptions.tsx deleted file mode 100644 index bb06dee3..00000000 --- a/web/pages/Premium/PremiumOptions.tsx +++ /dev/null @@ -1,211 +0,0 @@ -import { Component, createEffect, createSignal, createMemo, For, Show } from 'solid-js' -import { A, useNavigate } from '@solidjs/router' -import PageHeader from '../../shared/PageHeader' -import Divider from '../../shared/Divider' -import { cartStore } from '../../store' -import { CalendarHeart, Coins, ShoppingCart } from 'lucide-solid' -import logo from '../../asset/logo.png' -import Modal from '../../shared/Modal' -import { setComponentPageTitle } from '../../shared/util' -import { loadScript } from '@paypal/paypal-js' - -const PremiumOptions: Component = () => { - setComponentPageTitle('Shop') - const items = cartStore((state) => state.items) - const cartItems = cartStore((state) => state.cartItems) - const [cartSignal, setCartSignal] = createSignal(cartItems) - const [orderId, setOrderId] = createSignal(null) - const navigate = useNavigate() - const [paypal, setPaypal] = createSignal(null) - - let paypalButtons - - const renderButtons = (id) => { - paypal() - .Buttons({ - createOrder: function (data, actions) { - // Set up the transaction details - return id - }, - onApprove: function (data, actions) { - // Capture the payment - return actions.order.capture().then(function (details) { - // Show a success message to the buyer - setOrderId(null) - navigate('/thankyou') - // alert('Transaction completed by ' + details.payer.name.given_name + '!'); - }) - }, - }) - .render(paypalButtons) - } - - createEffect(() => { - cartStore.getItems() - cartStore.getCartItems() - loadScript({ - 'client-id': - 'AcfzQbmT9qPEf7Ab8lTpKxLGkEI_EG_bmg5DyuECpcliXUjB4DhWEoK_76P_7sqp1GtnQkaqbXiqz7ik', - currency: 'EUR', - }).then((paypalObject) => { - setPaypal(paypalObject) - }) - }) - - const addToCart = (item) => { - console.log('adding', item) - cartStore.addToCart(item).then(() => { - cartStore.getCartItems() - setCartSignal(cartItems) - }) - } - - const removeFromCart = (item) => { - cartStore.removeFromCart(item).then(() => { - cartStore.getCartItems() - setCartSignal(cartItems) - }) - } - - const cartTotal = createMemo( - () => { - if (!cartItems.loaded || cartItems.list?.length === 0) return 0.0 - - return cartItems.list - .reduce((total, item) => { - return total + item?.price - }, 0) - .toFixed(2) - }, - { on: cartItems } - ) - - const checkoutCart = (id) => { - cartStore.checkoutCart().then(() => { - const id = cartItems?.orderId || '' - setOrderId(id) - console.log(id) - renderButtons(orderId()) - }) - } - - return ( -
- -
-

- This is our "legacy" shop, it is still functional if you don't like to have an actual - subscription or you are afraid you might not remember to cancel in time. We switched to - Stripe and Patreon for a more modern approach. -

-

- Be aware that when getting premium, it is near impossible to run out of credits. This - makes the credit option a bit obsolete. -

-

- New subsciption page is{' '} - - here - -

- -
- - {(item) => ( - - )} - -
-
-
- - - 0}> -

Cart

- -
- - {(item) => ( -
-
{item.name}
-
€ {item.price}
-
- )} -
-
- -
-
-
Total
-
€ {cartTotal()}
-
-
- -
- 0 && !orderId()}> -
- -
-
- - {cartSignal()?.list?.length > 0 && ( -
-

Checkout

- -
-
- )} -
- ) -} - -const Item: Component<{ - item: any - cartItems: any - addToCart: any - removeFromCart: any -}> = (props) => { - const isItemInCart = () => { - return ( - (Array.isArray(props.cartItems?.list) && - props.cartItems?.list?.some((cartItem) => cartItem._id === props.item._id)) || - false - ) - } - - return ( -
{ - if (!isItemInCart()) { - props.addToCart(props.item) - } else { - props.removeFromCart(props.item) - } - }} - > -

- {props.item?.days ? : ''} - {props.item?.credits ? : ''} - {props.item?.name} -

-

€ {props.item?.price}

-
- ) -} - -export default PremiumOptions diff --git a/web/pages/Premium/ThankYou.tsx b/web/pages/Premium/ThankYou.tsx index 9175c8f4..258bd61d 100644 --- a/web/pages/Premium/ThankYou.tsx +++ b/web/pages/Premium/ThankYou.tsx @@ -1,9 +1,5 @@ -import { A } from '@solidjs/router' import { Component } from 'solid-js' import PageHeader from '../../shared/PageHeader' -import Divider from '../../shared/Divider' - -import logo from '../../asset/logo.png' const ThankYou: Component = () => { return ( diff --git a/web/pages/PrivacyPolicy/index.tsx b/web/pages/PrivacyPolicy/index.tsx index b79a26aa..05cfab73 100644 --- a/web/pages/PrivacyPolicy/index.tsx +++ b/web/pages/PrivacyPolicy/index.tsx @@ -101,7 +101,11 @@ Our Service is not directed to children who are under the age of 18. Agnaistic d The Service may contain links to other websites not operated or controlled by Agnaistic, including social media services ("Third Party Sites"). The information that you share with Third Party Sites will be governed by the specific privacy policies and terms of service of the Third Party Sites and not by this Privacy Policy. By providing these links we do not imply that we endorse or have reviewed these sites. Please contact the Third Party Sites directly for information on their privacy practices and policies. -## 8. Security and Retention +## 8. Device Identifiers and Abuse Prevention + +To prevent fraud and abuse — such as creating multiple accounts to obtain additional free credits — we collect and store your IP address and a device identifier derived from your browser and device characteristics. You consent to this collection when you register. We process this information to protect the fairness and security of the service (our legitimate interest and with your consent) and retain it for the life of your account. + +## 9. Security and Retention We implement commercially reasonable technical, administrative, and organizational measures to protect Personal Information both online and offline from loss, misuse, and unauthorized access, disclosure, alteration, or destruction. However, no Internet or email transmission is ever fully secure or error free. In particular, email sent to or from us may not be secure. Therefore, you should take special care in deciding what information you send to us via the Service or email. In addition, we are not responsible for circumvention of any privacy settings or security measures contained on the Service, or third party websites. @@ -109,7 +113,7 @@ We'll retain your Personal Information for only as long as we need in order to p We may also anonymize or de-identify your Personal Information (so that it can no longer be associated with you) for research or statistical purposes, as described above, in which case we may use this information indefinitely without further notice to you. -## 9. International users +## 10. International users By using our Service, you understand and acknowledge that your Personal Information will be transferred from your location to our facilities and servers in the United States. @@ -124,15 +128,15 @@ If you feel we have not adequately addressed an issue, you have the right to lod Data Transfers. Where required, we will use appropriate safeguards for transferring Personal Information outside of the EEA, Switzerland, and the UK. We will only transfer Personal Information pursuant to a legally valid transfer mechanism. -## 10. Your choices +## 11. Your choices If you choose not to provide Personal Information that is needed to use some features of our Service, you may be unable to use those features. -## 11. Changes to the privacy policy +## 12. Changes to the privacy policy We may change this Privacy Policy at any time. When we do, we will post an updated version on this page, unless another type of notice is required by applicable law. By continuing to use our Service or providing us with Personal Information after we have posted an updated Privacy Policy, or notified you by other means, you consent to the revised Privacy Policy. -## 12. How to contact us +## 13. How to contact us Please contact us on our [discord server ("https://discord.agnai.chat")](https://discord.agnai.chat) if you have any questions or concerns not already addressed in this Privacy Policy. ` diff --git a/web/pages/Profile/Checkout.tsx b/web/pages/Profile/Checkout.tsx index 10116bd5..557c5902 100644 --- a/web/pages/Profile/Checkout.tsx +++ b/web/pages/Profile/Checkout.tsx @@ -1,6 +1,6 @@ import { Component, onMount } from 'solid-js' import PageHeader from '/web/shared/PageHeader' -import { Pill, SolidCard } from '/web/shared/Card' +import { SolidCard } from '/web/shared/Card' import Button from '/web/shared/Button' import { useSearchParams } from '@solidjs/router' import { userStore } from '/web/store' diff --git a/web/pages/Profile/SubscriptionPage.tsx b/web/pages/Profile/SubscriptionPage.tsx index 3c65d5b0..5ce53a6b 100644 --- a/web/pages/Profile/SubscriptionPage.tsx +++ b/web/pages/Profile/SubscriptionPage.tsx @@ -1,14 +1,13 @@ import { Component, For, Match, Show, Switch, createMemo, createSignal, onMount } from 'solid-js' import { settingStore, userStore } from '/web/store' -import { AppSchema } from '/common/types' import { Pill, SolidCard, TitleCard } from '/web/shared/Card' import Button from '/web/shared/Button' import { TierCard } from './TierCard' -import { ConfirmModal } from '/web/shared/Modal' import { PatreonControls } from '../Settings/PatreonOauth' import { getUserSubscriptionTier } from '/common/util' import { isLoggedIn } from '/web/store/api' import { useNavigate } from '@solidjs/router' +import TextInput from '/web/shared/TextInput' export const SubscriptionPage: Component = (props) => { const settings = settingStore((s) => s.config) @@ -21,27 +20,11 @@ export const SubscriptionPage: Component = (props) => { tier: tier?.tier, level: tier?.level ?? -1, tiers: s.tiers.sort((l, r) => r.level - l.level), - downgrade: s.subStatus?.downgrading?.tierId, } }) const nav = useNavigate() - const [showUnsub, setUnsub] = createSignal(false) - const [showUpgrade, setUpgrade] = createSignal() - const [showDowngrade, setDowngrade] = createSignal() - - const hasExpired = createMemo(() => { - // We should leave this out. It's possible a user can subscribe multiple ways - // if (cfg.type === 'patreon' || cfg.type === 'manual') return true - - // if (!user.user?.billing?.cancelling) return false - if (!user.user?.billing) return true - if (user.user?.premium) return false - if (user.user.billing.status === 'cancelled') return true - - const threshold = new Date(user.user.billing.validUntil) - return threshold.valueOf() < Date.now() - }) + const [promoCode, setPromoCode] = createSignal('') const candidates = createMemo(() => { return cfg.tiers @@ -57,7 +40,8 @@ export const SubscriptionPage: Component = (props) => { }) const renews = createMemo(() => { - if (cfg.type === 'paypal') return new Date(user.user.premiumUntil).toLocaleDateString() + if (cfg.type === 'paypal') + return user.user?.premiumUntil ? new Date(user.user.premiumUntil).toLocaleDateString() : '' if (cfg.type === 'manual') { const last = new Date(user.user?.manualSub?.expiresAt!) return last.toLocaleDateString() @@ -68,10 +52,6 @@ export const SubscriptionPage: Component = (props) => { return last.toLocaleDateString() }) - const onSubscribe = (tierId: string) => { - userStore.startCheckout(tierId) - } - const currentText = createMemo(() => { if (cfg.type === 'manual') return 'Valid until' if (cfg.type === 'patreon') return `Patreon Subscriber` @@ -111,6 +91,29 @@ export const SubscriptionPage: Component = (props) => {

Subscribing let's us spend more time developing and enhancing Charluv.

+ +

Redeem a promo code

+

+ Have a promo code? Enter it below to claim credits or premium membership days. +

+
+ setPromoCode(ev.currentTarget.value)} + class="flex-1" + /> + +
+
+ If you require billing or subscription support contact{' '} @@ -122,7 +125,7 @@ export const SubscriptionPage: Component = (props) => { - 0 || user.premium}> + 0 || user.user?.premium}>

Current Subscription

@@ -135,26 +138,13 @@ export const SubscriptionPage: Component = (props) => { ? 'Gift' : user.sub?.type === 'patreon' ? 'Patreon' - : user.sub?.type === 'native' - ? 'Stripe' : cfg.type === 'paypal' ? 'Paypal' : 'None'} - Your membership thru PayPal does not auto-renew (use Stripe or Patreon if you - want auto-renew) - - - Your subscription is set to downgrade - + Your membership via PayPal does not auto-renew. Your subscription is currently scheduled to cancel @@ -221,64 +211,16 @@ export const SubscriptionPage: Component = (props) => { Subscribed! - - - - - each.level && - each._id === cfg.downgrade - } - > - - - - each.level}> - - - - - - - - each.level}> - - + {/* New subscriptions are Patreon-only. */} - + +
@@ -288,64 +230,13 @@ export const SubscriptionPage: Component = (props) => {
-
All prices are in EUR
-
{/* */} - - - - -
- -
Patreon price shown is excl. VAT.
- -
- setUnsub(false)} - message="Are you sure you wish to unsubscribe?" - confirm={userStore.stopSubscription} - /> - - setUpgrade()} - message={ -
-

You will be immediately charged upon confirm.

-

Are you sure you wish to upgrade now?

-
- } - confirm={() => userStore.modifySubscription(showUpgrade()!._id)} - /> - - setDowngrade()} - message={ -
-

- Your downgrade will take affect at the beginning of your next billing period. You will - retain access to your current subscription tier until your downgrade takes affect. -

-

Are you sure you wish to downgrade?

-
- } - confirm={() => userStore.modifySubscription(showDowngrade()!._id)} - /> ) } diff --git a/web/pages/Profile/index.tsx b/web/pages/Profile/index.tsx index 99c44c52..11c8b438 100644 --- a/web/pages/Profile/index.tsx +++ b/web/pages/Profile/index.tsx @@ -1,4 +1,4 @@ -import { AlertTriangle, Save, VenetianMask, X } from 'lucide-solid' +import { AlertTriangle, Save, X } from '/web/icons' import { Component, Match, @@ -24,11 +24,12 @@ import { SubscriptionPage } from './SubscriptionPage' import { useTabs } from '/web/shared/Tabs' import { Page } from '/web/Layout' import { useGoogleReady } from '/web/shared/hooks' +import { PatreonControls } from '../Settings/PatreonOauth' export const ProfileModal: Component = () => { const state = userStore() const config = userStore((s) => ({ tiers: s.tiers.filter((t) => t.enabled) })) - const tabs = useTabs(['Profile', 'Subscription'], 0) + const tabs = useTabs(['Profile', 'Your Character', 'Subscription'], 0) const [search, setSearch] = useSearchParams() createEffect(() => { @@ -49,10 +50,13 @@ export const ProfileModal: Component = () => { userStore.getTiers() }) - const displayTabs = createMemo(() => { - if (!config.tiers.length) return false - return true - }) + // Tabs are always shown now (Profile + Your Character); the Subscription tab + // is only meaningful when tiers exist. + const tabList = createMemo(() => + config.tiers.length + ? ['Profile', 'Your Character', 'Subscription'] + : ['Profile', 'Your Character'] + ) return ( { } fixedHeight maxWidth="half" - tabs={displayTabs() ? tabs : undefined} + tabs={{ ...tabs, tabs: tabList() }} ariaLabel="Your profile" ariaDescription="Update your profile information." > - - - + + + @@ -86,28 +90,8 @@ export const ProfileModal: Component = () => { ) } -function timeStamp(timestamp: string) { - const date = new Date(timestamp) // Create a new Date object with the timestamp - - // Get the month name (e.g. "April") using the toLocaleString() method - const monthName = date.toLocaleString('default', { month: 'long' }) - - const year = date.getFullYear() // Get the year (e.g. 2021) - const month = date.getMonth() + 1 // Get the month (0-11), add 1 to make it 1-12 - const day = date.getDate() // Get the day of the month (1-31) - const hours = date.getHours() // Get the hours (0-23) - const minutes = date.getMinutes() // Get the minutes (0-59) - const seconds = date.getSeconds() // Get the seconds (0-59) - - // Create a human-readable date string in the format "YYYY-MM-DD HH:MM:SS" - const dateString = `${monthName} ${day}, ${year} ${hours.toString().padStart(2, '0')}:${minutes - .toString() - .padStart(2, '0')}:${seconds.toString().padStart(2, '0')}` - if (dateString.includes('NaN')) return '' - return dateString -} const ProfilePage: Component<{ footer?: (children: any) => void }> = (props) => { - let formRef: HTMLFormElement + let formRef: HTMLFormElement = undefined! let googleRef: any setComponentPageTitle('My profile') @@ -202,20 +186,14 @@ const ProfilePage: Component<{ footer?: (children: any) => void }> = (props) =>
- -
- You can{' '} -
- {' '} -
- characters by clicking the
-
- + @@ -259,6 +237,27 @@ const ProfilePage: Component<{ footer?: (children: any) => void }> = (props) => + {/* Surface Patreon linking next to Google so users don't miss it (it + also lives on the Subscription tab). PatreonControls self-gates on + config.patreonAuth, so this renders nothing when Patreon is off. */} + +
+ + {/* When linked, PatreonControls shows no status line — add one to + mirror the Google card. When unlinked, its own Pill already + prompts, so we don't duplicate the message here. */} + +
+ Your account is Linked to Patreon +
+
+ +
+
+
+ void }> = (props) => export default ProfilePage +/** + * "Your Character" tab: a fixed self-persona describing the user as a character. + * It replaces the old per-chat character impersonation and is injected as + * {{user}}'s persona in every chat. + */ +const ProfileCharacter: Component<{ footer?: (children: any) => void }> = (props) => { + let formRef: HTMLFormElement = undefined! + const state = userStore() + + createEffect(() => { + userStore.getProfile() + }) + + const save = () => { + const body = getStrictForm(formRef, { description: 'string', persona: 'string' }) + userStore.updateProfile({ + handle: state.profile?.handle || '', + description: body.description, + persona: body.persona, + }) + } + + const footer = ( + + ) + + onMount(() => props.footer?.(footer)) + + return ( + +
+ + This is how you show up to your companions. Describe yourself as a character — it's + sent to the AI as who you are in every chat. Leave it blank to stay an anonymous "You". + + + + + + + +
{footer}
+
+ +
+ ) +} + const PasswordModal: Component<{ show: boolean; close: () => void }> = (props) => { let ref: any const save = () => { diff --git a/web/pages/PromptTemplates/index.tsx b/web/pages/PromptTemplates/index.tsx index 04ae01f4..2c902473 100644 --- a/web/pages/PromptTemplates/index.tsx +++ b/web/pages/PromptTemplates/index.tsx @@ -2,7 +2,7 @@ import { Component, For, Show, createMemo, createSignal, onMount } from 'solid-j import PageHeader from '/web/shared/PageHeader' import Button from '/web/shared/Button' import { presetStore } from '/web/store/presets' -import { Copy, Plus, Save, Trash } from 'lucide-solid' +import { Copy, Plus, Save, Trash } from '/web/icons' import Divider from '/web/shared/Divider' import { templates } from '../../../common/presets/templates' import { useRootModal } from '/web/shared/hooks' @@ -117,7 +117,7 @@ const TemplateModal: Component<{ initial?: string close: () => void }> = (props) => { - let form: HTMLFormElement + let form!: HTMLFormElement const submit = () => { const { name, template } = getStrictForm(form, { name: 'string', template: 'string' }) diff --git a/web/pages/Saga/Detail.tsx b/web/pages/Saga/Detail.tsx deleted file mode 100644 index e5c7ab66..00000000 --- a/web/pages/Saga/Detail.tsx +++ /dev/null @@ -1,535 +0,0 @@ -import DOMPurify from 'dompurify' -import { - Component, - For, - Index, - JSX, - Match, - Show, - Switch, - createEffect, - createMemo, - createSignal, - onCleanup, - onMount, -} from 'solid-js' -import { ModeDetail } from '/web/shared/Mode/Detail' -import { SagaInput } from './Input' -import { SidePane } from './Pane' -import Button from '/web/shared/Button' -import { formatResponse, sagaStore } from './state' -import { markdown } from '/web/shared/markdown' -import Modal from '/web/shared/Modal' -import { GuidanceHelp } from './Help' -import { - Cog, - HelpCircle, - LoaderCircle, - MoreHorizontal, - Pencil, - RefreshCw, - Sliders, - Trash, -} from 'lucide-solid' -import { useNavigate, useParams, useSearchParams } from '@solidjs/router' -import { ImportTemplate } from './ImportModal' -import Loading from '/web/shared/Loading' -import { DropMenu } from '/web/shared/DropMenu' -import { createStore } from 'solid-js/store' -import { Pill } from '/web/shared/Card' -import { getTemplateFields, toSessionUrl } from './util' -import { SessionList } from './List' -import { toastStore, userStore } from '/web/store' -import { Saga } from '/common/types' -import { getRgbaFromVar } from '/web/shared/colors' -import { trimSentence } from '/common/util' -import { getHeaderBg, sticky } from '/web/shared/util' - -export const SagaDetail: Component = (props) => { - const user = userStore() - const state = sagaStore((s) => { - const responses = s.state.responses.map((res) => trimResponse(res, user.ui.trimSentences)) - const init = s.state.init ? trimResponse(s.state.init, user.ui.trimSentences) : undefined - - return { - ...s, - responses, - init, - } - }) - - const ui = createMemo(() => { - const alt = `${user.ui.chatAlternating ?? 0}%` - return { - response: { - ...getRgbaFromVar(user.current.botBackground || 'bg-800', user.ui.msgOpacity), - width: `calc(100% - ${alt})`, - 'margin-left': alt, - }, - input: { - ...getRgbaFromVar(user.current.msgBackground || 'bg-800', user.ui.msgOpacity), - width: `calc(100% - ${alt}%)`, - 'margin-right': alt, - }, - } - }) - - const params = useParams() - const [search, setSearch] = useSearchParams() - - const [load, setLoad] = createSignal(false) - const [pane, setPane] = createSignal(false) - const [stage, setStage] = createSignal<'ready' | 'rendering' | 'done'>('ready') - - onMount(() => { - sagaStore.init(params.id) - if (params.id === 'new' && !search.pane) { - setSearch({ pane: 'prompt' }) - } - }) - - createEffect(() => { - const now = stage() - const busy = state.busy - if (now === 'done' && !busy) { - setStage('ready') - } - }) - - const headerImage = createMemo(() => { - if (!state.template.imagesEnabled) return null - const src = state.image.data - const stage = state.image.state - if (!src) { - if (stage !== 'generating') return null - - return ( -
- {/* */} -
-   -
- -
- -
-
- ) - } - - return ( -
- - -
- -
-
- ) - }) - - const sendMessage = (text: string, done?: () => void) => { - sagaStore.send(text, (err) => { - if (err) return - done?.() - }) - } - - onCleanup(sticky.clear) - - return ( - <> - } - footer={ -