├── .gitattributes ├── pnpm-workspace.yaml ├── .gitignore ├── packages ├── random │ ├── src │ │ ├── index.ts │ │ ├── RandomWords.ts │ │ ├── __tests__ │ │ │ └── RandomWords.test.ts │ │ └── Random.ts │ ├── tsconfig.json │ ├── vitest.config.ts │ ├── package.json │ └── README.md ├── english-eff │ ├── src │ │ ├── long.ts │ │ ├── short1.ts │ │ ├── short2.ts │ │ ├── all.ts │ │ ├── scripts │ │ │ └── download.ts │ │ └── data │ │ │ ├── short1.json │ │ │ └── short2.json │ ├── tsconfig.json │ ├── README.md │ └── package.json └── english-wiktionary │ ├── src │ ├── wiktionary.ts │ └── scripts │ │ ├── unbzip2-stream.d.ts │ │ └── download.ts │ ├── tsconfig.json │ ├── README.md │ └── package.json ├── .prettierrc ├── tsconfig.base.json ├── package.json ├── LICENSE.md ├── README.md └── pnpm-lock.yaml /.gitattributes: -------------------------------------------------------------------------------- 1 | *.json linguist-detectable=false -------------------------------------------------------------------------------- /pnpm-workspace.yaml: -------------------------------------------------------------------------------- 1 | packages: 2 | - 'packages/*' 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | scripts/dumps/ 2 | node_modules/ 3 | .DS_Store 4 | dist/ -------------------------------------------------------------------------------- /packages/random/src/index.ts: -------------------------------------------------------------------------------- 1 | export { RandomWords } from "./RandomWords.js"; 2 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "trailingComma": "all", 3 | "arrowParens": "always", 4 | "quoteProps": "consistent" 5 | } 6 | -------------------------------------------------------------------------------- /packages/english-eff/src/long.ts: -------------------------------------------------------------------------------- 1 | import words from './data/long.json' with { type: 'json' }; 2 | export const long: string[] = words as string[]; 3 | -------------------------------------------------------------------------------- /packages/english-eff/src/short1.ts: -------------------------------------------------------------------------------- 1 | import words from './data/short1.json' with { type: 'json' }; 2 | export const short1: string[] = words as string[]; 3 | -------------------------------------------------------------------------------- /packages/english-eff/src/short2.ts: -------------------------------------------------------------------------------- 1 | import words from './data/short2.json' with { type: 'json' }; 2 | export const short2: string[] = words as string[]; 3 | -------------------------------------------------------------------------------- /packages/english-wiktionary/src/wiktionary.ts: -------------------------------------------------------------------------------- 1 | import words from './data/wiktionary.json' with { type: 'json' }; 2 | export const wiktionary: string[] = words as string[]; 3 | -------------------------------------------------------------------------------- /packages/random/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "outDir": "./dist", 4 | "rootDir": "./src" 5 | }, 6 | "extends": "../../tsconfig.base.json", 7 | "include": ["src/**/*"] 8 | } 9 | -------------------------------------------------------------------------------- /packages/english-eff/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "outDir": "./dist", 4 | "rootDir": "./src" 5 | }, 6 | "extends": "../../tsconfig.base.json", 7 | "include": ["src/**/*"] 8 | } 9 | -------------------------------------------------------------------------------- /packages/english-wiktionary/src/scripts/unbzip2-stream.d.ts: -------------------------------------------------------------------------------- 1 | declare module "unbzip2-stream" { 2 | import { Transform } from "stream"; 3 | 4 | function unbzip2(): Transform; 5 | 6 | export = unbzip2; 7 | } 8 | -------------------------------------------------------------------------------- /packages/english-wiktionary/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "outDir": "./dist", 4 | "rootDir": "./src" 5 | }, 6 | "extends": "../../tsconfig.base.json", 7 | "include": ["src/**/*"] 8 | } 9 | -------------------------------------------------------------------------------- /packages/english-eff/src/all.ts: -------------------------------------------------------------------------------- 1 | import { short1 } from "./short1.js"; 2 | import { short2 } from "./short2.js"; 3 | import { long } from "./long.js"; 4 | 5 | export const all: string[] = Array.from( 6 | new Set([...short1, ...short2, ...long]), 7 | ).sort(); 8 | -------------------------------------------------------------------------------- /tsconfig.base.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "declaration": true, 4 | "declarationMap": false, 5 | "esModuleInterop": true, 6 | "forceConsistentCasingInFileNames": true, 7 | "module": "NodeNext", 8 | "moduleResolution": "NodeNext", 9 | "newLine": "LF", 10 | "resolveJsonModule": true, 11 | "skipLibCheck": true, 12 | "sourceMap": false, 13 | "strict": true, 14 | "target": "ES2022" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@wordlist/root", 3 | "private": true, 4 | "type": "module", 5 | "scripts": { 6 | "build": "pnpm -r build", 7 | "test": "pnpm -r test", 8 | "clean": "pnpm -r clean" 9 | }, 10 | "devDependencies": { 11 | "@types/node": "^22.10.1", 12 | "typescript": "^5.7.2", 13 | "vitest": "^2.1.6", 14 | "unbzip2-stream": "^1.4.0" 15 | }, 16 | "packageManager": "pnpm@9.14.2", 17 | "engines": { 18 | "node": ">=18" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /packages/random/vitest.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vitest/config"; 2 | 3 | export default defineConfig({ 4 | test: { 5 | globals: false, 6 | environment: "node", 7 | include: [ 8 | "src/**/__tests__/**/*.test.ts", 9 | "src/**/__tests__/**/*.test.tsx", 10 | "src/__tests__/**/*.test.ts", 11 | "src/__tests__/**/*.test.tsx", 12 | ], 13 | coverage: { 14 | provider: "v8", 15 | reporter: ["text", "lcov"], 16 | include: ["src/**/*.ts"], 17 | exclude: ["src/**/__tests__/**"], 18 | }, 19 | }, 20 | }); 21 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | Copyright 2017 Xyfir, LLC 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /packages/english-wiktionary/README.md: -------------------------------------------------------------------------------- 1 | # `@wordlist/english-wiktionary` 2 | 3 | Large English word list extracted from the English [Wiktionary](https://en.wiktionary.org/wiki/Wiktionary:Main_Page). 4 | 5 | - **532,324 words** - The largest list in this collection 6 | - **Only a-z characters** - No numbers, symbols, spaces, diacritics, uppercase 7 | - **3-19 characters** - Excludes very long and short words 8 | - **Best-effort English-only** - Articles/words without "English" sections have been removed 9 | 10 | Please note that there is **NO CENSORING** of sensitive content and that there may be some oddities in here since this is from a public wiki. 11 | 12 | This word list is likely to be most useful as the foundation for a custom word list that has further filtering. 13 | 14 | ## Installation 15 | 16 | ```bash 17 | npm install @wordlist/english-wiktionary 18 | ``` 19 | 20 | ## Usage 21 | 22 | ```ts 23 | import { wiktionary } from "@wordlist/english-wiktionary"; 24 | 25 | console.log(wiktionary.length); // 532324 26 | console.log(wiktionary.includes("hello")); // true 27 | ``` 28 | 29 | ## Random Word Generator 30 | 31 | ```ts 32 | import { wiktionary } from "@wordlist/english-wiktionary"; 33 | import { RandomWords } from "@wordlist/random"; 34 | 35 | const random = new RandomWords(wiktionary); 36 | const words = await random.generate(5); 37 | console.log(words); 38 | ``` 39 | -------------------------------------------------------------------------------- /packages/english-wiktionary/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "Xyfir LLC (https://www.xyfir.com)", 3 | "bugs": { 4 | "url": "https://github.com/xyfir/wordlist/issues" 5 | }, 6 | "description": "Large English word list from Wiktionary with 530,000+ words", 7 | "devDependencies": { 8 | "@types/node": "^22.10.2", 9 | "tsx": "^4.19.2", 10 | "typescript": "^5.7.2", 11 | "unbzip2-stream": "^1.4.3" 12 | }, 13 | "engines": { 14 | "node": ">=18" 15 | }, 16 | "exports": { 17 | ".": { 18 | "import": "./dist/wiktionary.js", 19 | "types": "./dist/wiktionary.d.ts" 20 | } 21 | }, 22 | "files": [ 23 | "dist/wiktionary.js", 24 | "dist/wiktionary.d.ts", 25 | "dist/data" 26 | ], 27 | "homepage": "https://github.com/xyfir/wordlist/tree/main/packages/english-wiktionary#readme", 28 | "keywords": [ 29 | "words", 30 | "list", 31 | "word list", 32 | "english", 33 | "wiktionary" 34 | ], 35 | "license": "MIT", 36 | "name": "@wordlist/english-wiktionary", 37 | "publishConfig": { 38 | "access": "public" 39 | }, 40 | "repository": { 41 | "directory": "packages/english-wiktionary", 42 | "type": "git", 43 | "url": "git+https://github.com/xyfir/wordlist.git" 44 | }, 45 | "scripts": { 46 | "build": "rm -rf dist && tsc", 47 | "clean": "rm -rf dist", 48 | "download": "tsx scripts/download.ts" 49 | }, 50 | "sideEffects": false, 51 | "type": "module", 52 | "version": "1.0.1" 53 | } 54 | -------------------------------------------------------------------------------- /packages/random/src/RandomWords.ts: -------------------------------------------------------------------------------- 1 | import { Random } from "./Random.js"; 2 | 3 | export class RandomWords { 4 | private generations = 0; 5 | private seedChars: number[] | undefined; 6 | private words: string[] = []; 7 | 8 | /** 9 | * Creates a new RandomWords instance. 10 | * 11 | * @param words - The word list to use for generation 12 | * @param seed - Optional seed for reproducible random generation 13 | */ 14 | constructor(words: string[], seed?: string) { 15 | this.seedChars = seed 16 | ? Array.from(seed).map((c) => c.charCodeAt(0)) 17 | : undefined; 18 | 19 | this.load(words); 20 | } 21 | 22 | /** 23 | * Generate random words from the word list. 24 | * 25 | * @param count - Number of words to generate (default: 1) 26 | * @returns Array of randomly selected words 27 | */ 28 | public async generate(count: number = 1): Promise { 29 | if (count <= 0) return []; 30 | 31 | if (this.seedChars) { 32 | const results: string[] = []; 33 | for (let i = 0; i < count; i++) { 34 | const value = await Random.seededValue( 35 | this.seedChars, 36 | this.generations++, 37 | ); 38 | const index = Math.floor(value * this.words.length); 39 | results.push(this.words[index]); 40 | } 41 | return results; 42 | } 43 | 44 | return Random.indexes(this.words.length, count).map((i) => this.words[i]); 45 | } 46 | 47 | /** 48 | * Load a new word list. 49 | * 50 | * @param words - The new word list to load 51 | */ 52 | public load(words: string[]): void { 53 | this.words = words; 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /packages/random/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "Xyfir LLC (https://www.xyfir.com)", 3 | "bugs": { 4 | "url": "https://github.com/xyfir/wordlist/issues" 5 | }, 6 | "description": "A cryptographically secure random generator for word lists. Supports custom word lists and optional seeded generation.", 7 | "devDependencies": { 8 | "@types/node": "^22.10.2", 9 | "@wordlist/english-eff": "workspace:*" 10 | }, 11 | "engines": { 12 | "node": ">=18" 13 | }, 14 | "exports": { 15 | ".": { 16 | "import": "./dist/index.js", 17 | "types": "./dist/index.d.ts" 18 | } 19 | }, 20 | "files": [ 21 | "dist/index.d.ts", 22 | "dist/index.js", 23 | "dist/Random.d.ts", 24 | "dist/Random.js", 25 | "dist/RandomWords.d.ts", 26 | "dist/RandomWords.js" 27 | ], 28 | "homepage": "https://github.com/xyfir/wordlist/tree/main/packages/random#readme", 29 | "keywords": [ 30 | "random", 31 | "generate", 32 | "generator", 33 | "words", 34 | "word", 35 | "word list", 36 | "cryptographically secure", 37 | "csprng", 38 | "cprng" 39 | ], 40 | "license": "MIT", 41 | "main": "./dist/index.js", 42 | "name": "@wordlist/random", 43 | "publishConfig": { 44 | "access": "public" 45 | }, 46 | "repository": { 47 | "directory": "packages/random", 48 | "type": "git", 49 | "url": "git+https://github.com/xyfir/wordlist.git" 50 | }, 51 | "scripts": { 52 | "build": "rm -rf dist && tsc", 53 | "clean": "rm -rf dist", 54 | "test": "vitest run", 55 | "test:watch": "vitest" 56 | }, 57 | "sideEffects": false, 58 | "type": "module", 59 | "types": "./dist/index.d.ts", 60 | "version": "5.0.0" 61 | } 62 | -------------------------------------------------------------------------------- /packages/english-eff/README.md: -------------------------------------------------------------------------------- 1 | # `@wordlist/english-eff` 2 | 3 | EFF word lists commonly used for creating secure, memorable passphrases. Based on the [Electronic Frontier Foundation's Dice-Generated Passphrases](https://www.eff.org/dice). 4 | 5 | They are carefully curated to: 6 | 7 | - Avoid profanity and offensive words 8 | - Use words that are easy to type and remember 9 | - Minimize similar-sounding words that could cause confusion 10 | - Provide strong cryptographic security when combined properly 11 | 12 | ## Installation 13 | 14 | ```bash 15 | npm install @wordlist/english-eff 16 | ``` 17 | 18 | ## Word Lists 19 | 20 | ### All (All EFF Words) 21 | 22 | All EFF word lists combined and deduplicated. 8,429 words total. 23 | 24 | ```ts 25 | import { all } from "@wordlist/english-eff/all"; 26 | console.log(all.length); // 8429 27 | ``` 28 | 29 | ### EFF Short Wordlist 1 (`short1`) 30 | 31 | A short list of common short words. 1,296 total. 32 | 33 | ```ts 34 | import { short1 } from "@wordlist/english-eff/short1"; 35 | console.log(short1.length); // 1296 36 | ``` 37 | 38 | ### EFF Short Wordlist 2 (`short2`) 39 | 40 | A short list of longer common words. 1,296 total. 41 | 42 | ```ts 43 | import { short2 } from "@wordlist/english-eff/short2"; 44 | console.log(short2.length); // 1296 45 | ``` 46 | 47 | ### EFF Long Wordlist (`long`) 48 | 49 | A comparatively long list of mixed, mostly common words. 7,776 total. 50 | 51 | ```ts 52 | import { long } from "@wordlist/english-eff/long"; 53 | console.log(long.length); // 7776 54 | ``` 55 | 56 | ## Random Word Generator 57 | 58 | ```ts 59 | import { all } from "@wordlist/english-eff/all"; 60 | import { RandomWords } from "@wordlist/random"; 61 | 62 | const random = new RandomWords(all); 63 | const passphrase = await random.generate(6); 64 | console.log(passphrase.join("-")); 65 | ``` 66 | -------------------------------------------------------------------------------- /packages/english-eff/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "Xyfir LLC (https://www.xyfir.com)", 3 | "bugs": { 4 | "url": "https://github.com/xyfir/wordlist/issues" 5 | }, 6 | "description": "Electronic Frontier Foundation (EFF) dice word lists", 7 | "devDependencies": { 8 | "@types/node": "^22.10.2", 9 | "tsx": "^4.19.2", 10 | "typescript": "^5.7.2" 11 | }, 12 | "engines": { 13 | "node": ">=18" 14 | }, 15 | "exports": { 16 | "./all": { 17 | "import": "./dist/all.js", 18 | "types": "./dist/all.d.ts" 19 | }, 20 | "./long": { 21 | "import": "./dist/long.js", 22 | "types": "./dist/long.d.ts" 23 | }, 24 | "./short1": { 25 | "import": "./dist/short1.js", 26 | "types": "./dist/short1.d.ts" 27 | }, 28 | "./short2": { 29 | "import": "./dist/short2.js", 30 | "types": "./dist/short2.d.ts" 31 | } 32 | }, 33 | "files": [ 34 | "dist/all.js", 35 | "dist/all.d.ts", 36 | "dist/long.js", 37 | "dist/long.d.ts", 38 | "dist/short1.js", 39 | "dist/short1.d.ts", 40 | "dist/short2.js", 41 | "dist/short2.d.ts", 42 | "dist/data" 43 | ], 44 | "homepage": "https://github.com/xyfir/wordlist/tree/main/packages/english-eff#readme", 45 | "keywords": [ 46 | "words", 47 | "list", 48 | "word list", 49 | "english", 50 | "dice", 51 | "passphrase", 52 | "eff", 53 | "electronic frontier foundation", 54 | "diceware" 55 | ], 56 | "license": "MIT", 57 | "name": "@wordlist/english-eff", 58 | "publishConfig": { 59 | "access": "public" 60 | }, 61 | "repository": { 62 | "directory": "packages/english-eff", 63 | "type": "git", 64 | "url": "git+https://github.com/xyfir/wordlist.git" 65 | }, 66 | "scripts": { 67 | "build": "rm -rf dist && tsc", 68 | "clean": "rm -rf dist", 69 | "download": "tsx scripts/download.ts" 70 | }, 71 | "sideEffects": false, 72 | "type": "module", 73 | "version": "1.0.1" 74 | } 75 | -------------------------------------------------------------------------------- /packages/random/src/__tests__/RandomWords.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, it, expect, beforeEach } from "vitest"; 2 | import { short1 } from "@wordlist/english-eff/short1"; 3 | import { RandomWords } from "../RandomWords.js"; 4 | 5 | describe("RandomWords", () => { 6 | let random: RandomWords; 7 | 8 | beforeEach(() => { 9 | random = new RandomWords(short1); 10 | }); 11 | 12 | describe("generate()", () => { 13 | it("should return an array", async () => { 14 | expect(Array.isArray(await random.generate())).toBe(true); 15 | }); 16 | 17 | it("should return an array when count is specified", async () => { 18 | expect(Array.isArray(await random.generate(2))).toBe(true); 19 | }); 20 | 21 | it("should return the correct number of words", async () => { 22 | expect(await random.generate(15)).toHaveLength(15); 23 | expect(await random.generate(1)).toHaveLength(1); 24 | expect(await random.generate(0)).toHaveLength(0); 25 | }); 26 | 27 | it("should return strings", async () => { 28 | const words = await random.generate(5); 29 | words.forEach((word) => { 30 | expect(typeof word).toBe("string"); 31 | }); 32 | }); 33 | }); 34 | 35 | describe("seeded generation", () => { 36 | it("should produce identical results with the same seed", async () => { 37 | const seed = "abcdefghijklmnopqrstuvwxyz123"; 38 | const seeded1 = new RandomWords(short1, seed); 39 | const seeded2 = new RandomWords(short1, seed); 40 | expect(await seeded1.generate(5)).toEqual(await seeded2.generate(5)); 41 | }); 42 | 43 | it("should increment and produce different results on consecutive calls", async () => { 44 | const seed = "test-seed"; 45 | const seeded = new RandomWords(short1, seed); 46 | const first = await seeded.generate(5); 47 | const second = await seeded.generate(5); 48 | expect(first).not.toEqual(second); 49 | }); 50 | 51 | it("should produce stable results (algorithm regression test)", async () => { 52 | const seed = "abcdefghijklmnopqrstuvwxyz123"; 53 | const seeded = new RandomWords(short1, seed); 54 | expect(await seeded.generate(4)).toEqual([ 55 | "mango", 56 | "skies", 57 | "panic", 58 | "jam", 59 | ]); 60 | }); 61 | }); 62 | }); 63 | -------------------------------------------------------------------------------- /packages/english-eff/src/scripts/download.ts: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | import { writeFile, mkdir } from "fs/promises"; 3 | import { join, dirname } from "path"; 4 | import { fileURLToPath } from "url"; 5 | 6 | const __dirname = dirname(fileURLToPath(import.meta.url)); 7 | 8 | interface WordList { 9 | name: string; 10 | url: string; 11 | } 12 | 13 | const lists: WordList[] = [ 14 | { 15 | name: "short1", 16 | url: "https://www.eff.org/files/2016/09/08/eff_short_wordlist_1.txt", 17 | }, 18 | { 19 | name: "short2", 20 | url: "https://www.eff.org/files/2016/09/08/eff_short_wordlist_2_0.txt", 21 | }, 22 | { 23 | name: "long", 24 | url: "https://www.eff.org/files/2016/07/18/eff_large_wordlist.txt", 25 | }, 26 | ]; 27 | 28 | async function fetchText(url: string): Promise { 29 | const response = await fetch(url); 30 | if (!response.ok) { 31 | throw new Error( 32 | `Failed to fetch ${url}: ${response.status} ${response.statusText}`, 33 | ); 34 | } 35 | return response.text(); 36 | } 37 | 38 | function parseEFFList(text: string): string[] { 39 | const lines = text.trim().split(/\r?\n/); 40 | const words: string[] = []; 41 | const seen = new Set(); 42 | 43 | for (const line of lines) { 44 | const word = line.trim().split(/\s+/)[1]; 45 | if (word && !seen.has(word)) { 46 | seen.add(word); 47 | words.push(word); 48 | } 49 | } 50 | 51 | return words; 52 | } 53 | 54 | async function saveWordList( 55 | name: string, 56 | words: string[], 57 | dataDir: string, 58 | ): Promise { 59 | await mkdir(dataDir, { recursive: true }); 60 | const filePath = join(dataDir, `${name}.json`); 61 | await writeFile(filePath, JSON.stringify(words, null, 2) + "\n", "utf8"); 62 | console.log(`Saved ${name}.json (${words.length} words)`); 63 | } 64 | 65 | async function main(): Promise { 66 | const dataDir = join(__dirname, "..", "data"); 67 | const allWords = new Set(); 68 | 69 | for (const list of lists) { 70 | console.log(`Downloading ${list.name}...`); 71 | const text = await fetchText(list.url); 72 | const words = parseEFFList(text); 73 | 74 | words.forEach((word) => allWords.add(word)); 75 | await saveWordList(list.name, words, dataDir); 76 | } 77 | 78 | console.log(`\nTotal unique words across all lists: ${allWords.size}`); 79 | } 80 | 81 | main().catch((error) => { 82 | console.error("Error:", error); 83 | process.exit(1); 84 | }); 85 | -------------------------------------------------------------------------------- /packages/random/src/Random.ts: -------------------------------------------------------------------------------- 1 | export class Random { 2 | /** 3 | * Generate a random number between `0` (inclusive) and `1` (exclusive). A 4 | * drop in replacement for `Math.random()` 5 | */ 6 | private static value(): number { 7 | const array = new Uint32Array(2); 8 | globalThis.crypto.getRandomValues(array); 9 | // Combine two 32-bit values into a high-precision fraction. 10 | // Avoid forming a 64-bit integer (which would exceed JS safe integer 11 | // precision). Compute as two fractional parts instead so we preserve 12 | // as much entropy as a JavaScript `Number` can represent (~53 bits). 13 | return array[0] / 2 ** 32 + array[1] / 2 ** 64; 14 | } 15 | 16 | /** 17 | * Generate a random number between `min` (inclusive) and `max` (exclusive). 18 | */ 19 | private static range(min: number, max: number): number { 20 | return Math.floor(this.value() * (max - min) + min); 21 | } 22 | 23 | /** 24 | * Generate a seeded random number between `0` (inclusive) and `1` (exclusive). 25 | */ 26 | public static async seededValue( 27 | seedChars: number[], 28 | counter: number, 29 | ): Promise { 30 | const seedData = new Uint8Array(seedChars); 31 | 32 | // Import key for HMAC 33 | const key = await globalThis.crypto.subtle.importKey( 34 | "raw", 35 | seedData, 36 | { name: "HMAC", hash: "SHA-256" }, 37 | false, 38 | ["sign"], 39 | ); 40 | 41 | // Create counter buffer 42 | const counterBuffer = new ArrayBuffer(8); 43 | const counterView = new DataView(counterBuffer); 44 | counterView.setBigUint64(0, BigInt(counter), true); 45 | 46 | // Generate HMAC 47 | const signature = await globalThis.crypto.subtle.sign( 48 | "HMAC", 49 | key, 50 | counterBuffer, 51 | ); 52 | 53 | // Read first 8 bytes as little-endian uint64 54 | const hashView = new DataView(signature); 55 | const integer = hashView.getBigUint64(0, true); 56 | return Number(integer) / Math.pow(2, 64); 57 | } 58 | 59 | /** 60 | * Randomly generate numbers for indexes within the words array. 61 | * 62 | * @param length - The length of the words array. 63 | * @param count - How many indexes to generate. 64 | */ 65 | public static indexes(length: number, count: number): number[] { 66 | const indexes: number[] = []; 67 | while (true) { 68 | indexes.push(this.range(0, length)); 69 | if (indexes.length === count) break; 70 | } 71 | return indexes; 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # `@wordlist/*` 2 | 3 | A collection of packages for working with words. Use word lists directly for any purpose, or generate cryptographically secure random words from any provided list. 4 | 5 | | Package | Description | 6 | | ------------------------------------------------------------- | ----------------------------------------------------------- | 7 | | [@wordlist/random](./packages/random) | Cryptographically secure random word generator | 8 | | [@wordlist/english-eff](./packages/english-eff) | Popular short lists from the Electronic Frontier Foundation | 9 | | [@wordlist/english-wiktionary](./packages/english-wiktionary) | Very large word list from Wiktionary's public dictionary | 10 | 11 | ```bash 12 | npm install @wordlist/english-eff @wordlist/random 13 | ``` 14 | 15 | ## Using Word Lists Directly 16 | 17 | ```ts 18 | import { all } from "@wordlist/english-eff/all"; 19 | all.includes("apple"); // true 20 | ``` 21 | 22 | ## Generating Random Words 23 | 24 | ```ts 25 | import { all } from "@wordlist/english-eff/all"; 26 | import { RandomWords } from "@wordlist/random"; 27 | 28 | const random = new RandomWords(all); 29 | await random.generate(1); // ["author"] 30 | await random.generate(4); // ["audition","resisting","copy","attitude"] 31 | ``` 32 | 33 | ## v4 Migration Guide From `rword` 34 | 35 | 1. **Package scope**: All packages renamed under `@wordlist/` scope 36 | - `rword` → `@wordlist/random` 37 | 2. **Class renamed**: `Rword` → `RandomWords` 38 | 3. **API changes**: 39 | - `generate()` is now async to support browser environments 40 | - `shuffle()` and `getWords()` were removed 41 | - Internally, the word list you pass in is now used directly without creating a shuffled copy 42 | 4. **Word lists replaced**: The old `recommended` and `extended` lists have been removed and have no 1:1 replacements. We now instead have: 43 | - **`@wordlist/english-eff/...`** 44 | - **`@wordlist/english-wiktionary`** 45 | - You can still import and use the old lists with the new API 46 | 47 | ### Code Examples 48 | 49 | **v4:** 50 | 51 | ```ts 52 | import { words } from "rword-english-recommended"; 53 | import { Rword } from "rword"; 54 | 55 | const rword = new Rword(words); 56 | rword.generate(5); 57 | ``` 58 | 59 | **v5:** 60 | 61 | ```ts 62 | import { all } from "@wordlist/english-eff/all"; 63 | import { RandomWords } from "@wordlist/random"; 64 | 65 | const random = new RandomWords(all); 66 | await random.generate(5); 67 | ``` 68 | 69 | ### Important note about seeds 70 | 71 | Due to both the removal of internal word list shuffling and the removal of the old word lists, please note that a seeded generation from v4 will not match the equivalent generation from v5. If this matters to you, stay on v4 with both the old API and word lists. 72 | -------------------------------------------------------------------------------- /packages/random/README.md: -------------------------------------------------------------------------------- 1 | # `@wordlist/random` 2 | 3 | A cryptographically secure random word generator. Pair it with one of our ready-to-use English word lists, or provide your own custom word list. 4 | 5 | ```bash 6 | npm install @wordlist/english-eff @wordlist/random 7 | ``` 8 | 9 | ## Usage 10 | 11 | ### Basic Usage 12 | 13 | ```ts 14 | import { all } from "@wordlist/english-eff/all"; 15 | import { RandomWords } from "@wordlist/random"; 16 | 17 | const random = new RandomWords(all); 18 | await random.generate(1); // ["author"] 19 | await random.generate(4); // ["audition","resisting","copy","attitude"] 20 | ``` 21 | 22 | ### Seeded Generation 23 | 24 | Generate reproducible words using a seed: 25 | 26 | ```ts 27 | import { all } from "@wordlist/english-eff/all"; 28 | import { RandomWords } from "@wordlist/random"; 29 | 30 | const seeded1 = new RandomWords(all, "your_custom_seed_123"); 31 | await seeded1.generate(3); // ['abandon', 'gunpowder', 'pole'] 32 | 33 | const seeded2 = new RandomWords(all, "your_custom_seed_123"); 34 | await seeded2.generate(3); // ['abandon', 'gunpowder', 'pole'] - same result! 35 | ``` 36 | 37 | ### Custom Word Lists 38 | 39 | Use any string array as a word list: 40 | 41 | ```ts 42 | import { RandomWords } from "@wordlist/random"; 43 | 44 | const customWords = ["apple", "banana", "cherry", "date"]; 45 | const random = new RandomWords(customWords); 46 | await random.generate(2); // ['cherry', 'apple'] 47 | ``` 48 | 49 | ## API 50 | 51 | ### `new RandomWords(words, seed?)` 52 | 53 | Creates a new `RandomWords` instance. 54 | 55 | - `words: string[]` - The word list to use 56 | - `seed?: string` - Optional seed for reproducible generation 57 | 58 | ### `random.generate(count = 1): Promise` 59 | 60 | Generate an array of random words. 61 | 62 | ### `random.load(words: string[]): void` 63 | 64 | Load a new word list into the instance. 65 | 66 | ## v4 Migration Guide From `rword` 67 | 68 | 1. **Package scope**: All packages renamed under `@wordlist/` scope 69 | - `rword` → `@wordlist/random` 70 | 2. **Class renamed**: `Rword` → `RandomWords` 71 | 3. **API changes**: 72 | - `generate()` is now async to support browser environments 73 | - `shuffle()` and `getWords()` were removed 74 | - Internally, the word list you pass in is now used directly without creating a shuffled copy 75 | 4. **Word lists replaced**: The old `recommended` and `extended` lists have been removed and have no 1:1 replacements. We now instead have: 76 | - **`@wordlist/english-eff/...`** 77 | - **`@wordlist/english-wiktionary`** 78 | - You can still import and use the old lists with the new API 79 | 80 | ### Code Examples 81 | 82 | **v4:** 83 | 84 | ```ts 85 | import { words } from "rword-english-recommended"; 86 | import { Rword } from "rword"; 87 | 88 | const rword = new Rword(words); 89 | rword.generate(5); 90 | ``` 91 | 92 | **v5:** 93 | 94 | ```ts 95 | import { all } from "@wordlist/english-eff/all"; 96 | import { RandomWords } from "@wordlist/random"; 97 | 98 | const random = new RandomWords(all); 99 | await random.generate(5); 100 | ``` 101 | 102 | ### Important note about seeds 103 | 104 | Due to both the removal of internal word list shuffling and the removal of the old word lists, please note that a seeded generation from v4 will not match the equivalent generation from v5. If this matters to you, stay on v4 with both the old API and word lists. 105 | -------------------------------------------------------------------------------- /packages/english-wiktionary/src/scripts/download.ts: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | import { createReadStream, createWriteStream, existsSync } from "fs"; 3 | import { mkdir, stat, writeFile } from "fs/promises"; 4 | import { join, dirname } from "path"; 5 | import { fileURLToPath } from "url"; 6 | import { Readable } from "stream"; 7 | import unbzip2 from "unbzip2-stream"; 8 | 9 | const __dirname = dirname(fileURLToPath(import.meta.url)); 10 | 11 | interface CliArgs { 12 | lang: string; 13 | maxTitles: number; 14 | } 15 | 16 | interface ProgressStats { 17 | compressedBytes: number; 18 | contentLength: number; 19 | titlesSeen: number; 20 | words: number; 21 | } 22 | 23 | const LANGUAGE_NAMES: Record = { 24 | en: "English", 25 | es: "Spanish", 26 | fr: "French", 27 | de: "German", 28 | it: "Italian", 29 | la: "Latin", 30 | pt: "Portuguese", 31 | ru: "Russian", 32 | }; 33 | 34 | function parseArgs(argv: string[]): CliArgs { 35 | const args: CliArgs = { lang: "en", maxTitles: 0 }; 36 | 37 | for (let i = 0; i < argv.length; i++) { 38 | if (argv[i] === "--lang" && argv[i + 1]) { 39 | args.lang = argv[++i]; 40 | } else if (argv[i] === "--max-titles" && argv[i + 1]) { 41 | args.maxTitles = parseInt(argv[++i], 10) || 0; 42 | } else if (argv[i] === "--help" || argv[i] === "-h") { 43 | console.log("Usage: download.ts [--lang ] [--max-titles ]"); 44 | console.log("Example: download.ts --lang en --max-titles 1000"); 45 | process.exit(0); 46 | } 47 | } 48 | 49 | return args; 50 | } 51 | 52 | function getDumpUrl(lang: string): string { 53 | return `https://dumps.wikimedia.org/${lang}wiktionary/latest/${lang}wiktionary-latest-pages-articles.xml.bz2`; 54 | } 55 | 56 | function sanitizeToken(token: string): string { 57 | return token.normalize("NFD").replace(/\p{M}/gu, "").toLowerCase(); 58 | } 59 | 60 | function extractWordsFromTitle(title: string): string[] { 61 | if (!title || title.includes(":")) { 62 | return []; 63 | } 64 | 65 | const tokens = title.trim().split(/\s+/); 66 | const words: string[] = []; 67 | 68 | for (const token of tokens) { 69 | const sanitized = sanitizeToken(token); 70 | if (/^[a-z]{3,}$/.test(sanitized)) { 71 | words.push(sanitized); 72 | } 73 | } 74 | 75 | return words; 76 | } 77 | 78 | function hasLanguageSection(pageText: string, lang: string): boolean { 79 | const languageName = LANGUAGE_NAMES[lang] || lang; 80 | const headerPattern = new RegExp( 81 | `(^|\\n)\\s*={2,}\\s*${languageName}\\s*={2,}\\s*(\\n|$)`, 82 | "im", 83 | ); 84 | return headerPattern.test(pageText); 85 | } 86 | 87 | function extractLanguageSection(pageText: string, lang: string): string | null { 88 | const languageName = LANGUAGE_NAMES[lang] || lang; 89 | const headerPattern = new RegExp( 90 | `(^|\\n)\\s*(={2,})\\s*${languageName}\\s*={2,}\\s*(\\n|$)`, 91 | "im", 92 | ); 93 | 94 | const match = pageText.match(headerPattern); 95 | if (!match || match.index === undefined) { 96 | return null; 97 | } 98 | 99 | const start = match.index + match[0].length; 100 | const nextHeaderPattern = /\n\s*={2,}[^\n]*/g; 101 | nextHeaderPattern.lastIndex = start; 102 | 103 | const nextMatch = nextHeaderPattern.exec(pageText); 104 | const end = nextMatch ? nextMatch.index : pageText.length; 105 | 106 | return pageText.substring(start, end); 107 | } 108 | 109 | function isValidLanguageSection(section: string): boolean { 110 | const hasDefinitions = /^\s*#/m.test(section); 111 | const hasPartOfSpeech = 112 | /^\s*={3,}\s*(Noun|Verb|Adjective|Adverb|Proper noun|Pronunciation|Pronoun|Conjunction|Preposition|Interjection|Phrase)\b/im.test( 113 | section, 114 | ); 115 | return hasDefinitions || hasPartOfSpeech; 116 | } 117 | 118 | async function downloadDump(url: string, dumpsDir: string): Promise { 119 | await mkdir(dumpsDir, { recursive: true }); 120 | 121 | const filename = url.split("/").pop()!; 122 | const localPath = join(dumpsDir, filename); 123 | 124 | if (existsSync(localPath)) { 125 | console.log(`Using cached dump: ${localPath}`); 126 | return localPath; 127 | } 128 | 129 | console.log("Downloading dump from remote..."); 130 | const response = await fetch(url); 131 | if (!response.ok) { 132 | throw new Error( 133 | `Download failed: ${response.status} ${response.statusText}`, 134 | ); 135 | } 136 | 137 | const nodeStream = Readable.fromWeb(response.body as any); 138 | const fileStream = createWriteStream(localPath); 139 | 140 | await new Promise((resolve, reject) => { 141 | nodeStream.on("error", reject); 142 | fileStream.on("error", reject); 143 | fileStream.on("finish", resolve); 144 | nodeStream.pipe(fileStream); 145 | }); 146 | 147 | console.log(`Downloaded to ${localPath}`); 148 | return localPath; 149 | } 150 | 151 | async function extractWords( 152 | dumpPath: string, 153 | lang: string, 154 | maxTitles: number, 155 | progress: ProgressStats, 156 | ): Promise> { 157 | const words = new Set(); 158 | const decoder = new TextDecoder("utf-8"); 159 | let buffer = ""; 160 | let titlesSeen = 0; 161 | let compressedBytes = 0; 162 | 163 | const fileStream = createReadStream(dumpPath); 164 | fileStream.on("data", (chunk) => { 165 | compressedBytes += chunk.length; 166 | progress.compressedBytes = compressedBytes; 167 | }); 168 | 169 | const decompressed = fileStream.pipe(unbzip2()); 170 | 171 | return new Promise((resolve, reject) => { 172 | function processPage(pageText: string): boolean { 173 | const titleMatch = pageText.match(/([\s\S]*?)<\/title>/i); 174 | const textMatch = pageText.match(/<text[^>]*>([\s\S]*?)<\/text>/i); 175 | 176 | if (!titleMatch) { 177 | return false; 178 | } 179 | 180 | const title = titleMatch[1]; 181 | const text = textMatch ? textMatch[1] : ""; 182 | 183 | titlesSeen++; 184 | progress.titlesSeen = titlesSeen; 185 | 186 | if (maxTitles > 0 && titlesSeen > maxTitles) { 187 | return true; // Stop processing 188 | } 189 | 190 | if (hasLanguageSection(text, lang)) { 191 | const section = extractLanguageSection(text, lang); 192 | if (section && isValidLanguageSection(section)) { 193 | const extractedWords = extractWordsFromTitle(title); 194 | extractedWords.forEach((word) => { 195 | if (word.length >= 3 && word.length < 20) { 196 | words.add(word); 197 | } 198 | }); 199 | progress.words = words.size; 200 | } 201 | } 202 | 203 | return false; 204 | } 205 | 206 | function onData(chunk: Buffer): void { 207 | const str = decoder.decode(chunk, { stream: true }); 208 | buffer += str; 209 | 210 | let start = buffer.indexOf("<page>"); 211 | while (start !== -1) { 212 | const end = buffer.indexOf("</page>", start); 213 | if (end === -1) break; 214 | 215 | const pageBlock = buffer.substring(start, end + 7); 216 | buffer = buffer.substring(end + 7); 217 | 218 | if (processPage(pageBlock)) { 219 | decompressed.destroy(); 220 | resolve(words); 221 | return; 222 | } 223 | 224 | start = buffer.indexOf("<page>"); 225 | } 226 | 227 | // Prevent buffer from growing too large 228 | if (buffer.length > 1_000_000) { 229 | buffer = buffer.slice(-200_000); 230 | } 231 | } 232 | 233 | function onEnd(): void { 234 | // Process remaining buffer 235 | buffer += decoder.decode(); 236 | let start = buffer.indexOf("<page>"); 237 | while (start !== -1) { 238 | const end = buffer.indexOf("</page>", start); 239 | if (end === -1) break; 240 | 241 | const pageBlock = buffer.substring(start, end + 7); 242 | buffer = buffer.substring(end + 7); 243 | 244 | if (processPage(pageBlock)) break; 245 | start = buffer.indexOf("<page>"); 246 | } 247 | 248 | resolve(words); 249 | } 250 | 251 | decompressed.on("data", onData); 252 | decompressed.on("end", onEnd); 253 | decompressed.on("close", onEnd); 254 | decompressed.on("error", reject); 255 | }); 256 | } 257 | 258 | function formatBytes(bytes: number): string { 259 | if (!bytes) return "0 B"; 260 | const units = ["B", "KB", "MB", "GB", "TB"]; 261 | let value = bytes; 262 | let unitIndex = 0; 263 | 264 | while (value >= 1024 && unitIndex < units.length - 1) { 265 | value /= 1024; 266 | unitIndex++; 267 | } 268 | 269 | return `${value.toFixed(2)} ${units[unitIndex]}`; 270 | } 271 | 272 | async function main(): Promise<void> { 273 | const args = parseArgs(process.argv.slice(2)); 274 | const url = getDumpUrl(args.lang); 275 | const dataDir = join(__dirname, "..", "data"); 276 | const dumpsDir = join(__dirname, "..", "..", "..", "scripts", "dumps"); 277 | const outputPath = join(dataDir, "wiktionary.json"); 278 | 279 | console.log(`Downloading Wiktionary dump for '${args.lang}'`); 280 | console.log(url); 281 | 282 | const dumpPath = await downloadDump(url, dumpsDir); 283 | const dumpStats = await stat(dumpPath); 284 | 285 | const progress: ProgressStats = { 286 | compressedBytes: 0, 287 | contentLength: dumpStats.size, 288 | titlesSeen: 0, 289 | words: 0, 290 | }; 291 | 292 | let lastBytes = 0; 293 | let lastTime = Date.now(); 294 | 295 | const progressInterval = setInterval(() => { 296 | const now = Date.now(); 297 | const dt = Math.max(1, (now - lastTime) / 1000); 298 | const db = Math.max(0, progress.compressedBytes - lastBytes); 299 | const mbps = db / dt / (1024 * 1024); 300 | 301 | lastBytes = progress.compressedBytes; 302 | lastTime = now; 303 | 304 | console.log( 305 | `Progress: ${formatBytes(progress.compressedBytes)} / ${formatBytes( 306 | progress.contentLength, 307 | )} (${mbps.toFixed(2)} MB/s), titles ${ 308 | progress.titlesSeen 309 | }, unique words ${progress.words}`, 310 | ); 311 | }, 5000); 312 | 313 | const words = await extractWords( 314 | dumpPath, 315 | args.lang, 316 | args.maxTitles, 317 | progress, 318 | ); 319 | clearInterval(progressInterval); 320 | 321 | await mkdir(dataDir, { recursive: true }); 322 | const sortedWords = Array.from(words).sort(); 323 | await writeFile(outputPath, JSON.stringify(sortedWords, null, 2), "utf8"); 324 | 325 | console.log(`\nCollected ${sortedWords.length} unique words`); 326 | console.log(`Saved to ${outputPath}`); 327 | } 328 | 329 | main().catch((error) => { 330 | console.error("Error:", error); 331 | process.exit(1); 332 | }); 333 | -------------------------------------------------------------------------------- /packages/english-eff/src/data/short1.json: -------------------------------------------------------------------------------- 1 | [ 2 | "acid", 3 | "acorn", 4 | "acre", 5 | "acts", 6 | "afar", 7 | "affix", 8 | "aged", 9 | "agent", 10 | "agile", 11 | "aging", 12 | "agony", 13 | "ahead", 14 | "aide", 15 | "aids", 16 | "aim", 17 | "ajar", 18 | "alarm", 19 | "alias", 20 | "alibi", 21 | "alien", 22 | "alike", 23 | "alive", 24 | "aloe", 25 | "aloft", 26 | "aloha", 27 | "alone", 28 | "amend", 29 | "amino", 30 | "ample", 31 | "amuse", 32 | "angel", 33 | "anger", 34 | "angle", 35 | "ankle", 36 | "apple", 37 | "april", 38 | "apron", 39 | "aqua", 40 | "area", 41 | "arena", 42 | "argue", 43 | "arise", 44 | "armed", 45 | "armor", 46 | "army", 47 | "aroma", 48 | "array", 49 | "arson", 50 | "art", 51 | "ashen", 52 | "ashes", 53 | "atlas", 54 | "atom", 55 | "attic", 56 | "audio", 57 | "avert", 58 | "avoid", 59 | "awake", 60 | "award", 61 | "awoke", 62 | "axis", 63 | "bacon", 64 | "badge", 65 | "bagel", 66 | "baggy", 67 | "baked", 68 | "baker", 69 | "balmy", 70 | "banjo", 71 | "barge", 72 | "barn", 73 | "bash", 74 | "basil", 75 | "bask", 76 | "batch", 77 | "bath", 78 | "baton", 79 | "bats", 80 | "blade", 81 | "blank", 82 | "blast", 83 | "blaze", 84 | "bleak", 85 | "blend", 86 | "bless", 87 | "blimp", 88 | "blink", 89 | "bloat", 90 | "blob", 91 | "blog", 92 | "blot", 93 | "blunt", 94 | "blurt", 95 | "blush", 96 | "boast", 97 | "boat", 98 | "body", 99 | "boil", 100 | "bok", 101 | "bolt", 102 | "boned", 103 | "boney", 104 | "bonus", 105 | "bony", 106 | "book", 107 | "booth", 108 | "boots", 109 | "boss", 110 | "botch", 111 | "both", 112 | "boxer", 113 | "breed", 114 | "bribe", 115 | "brick", 116 | "bride", 117 | "brim", 118 | "bring", 119 | "brink", 120 | "brisk", 121 | "broad", 122 | "broil", 123 | "broke", 124 | "brook", 125 | "broom", 126 | "brush", 127 | "buck", 128 | "bud", 129 | "buggy", 130 | "bulge", 131 | "bulk", 132 | "bully", 133 | "bunch", 134 | "bunny", 135 | "bunt", 136 | "bush", 137 | "bust", 138 | "busy", 139 | "buzz", 140 | "cable", 141 | "cache", 142 | "cadet", 143 | "cage", 144 | "cake", 145 | "calm", 146 | "cameo", 147 | "canal", 148 | "candy", 149 | "cane", 150 | "canon", 151 | "cape", 152 | "card", 153 | "cargo", 154 | "carol", 155 | "carry", 156 | "carve", 157 | "case", 158 | "cash", 159 | "cause", 160 | "cedar", 161 | "chain", 162 | "chair", 163 | "chant", 164 | "chaos", 165 | "charm", 166 | "chase", 167 | "cheek", 168 | "cheer", 169 | "chef", 170 | "chess", 171 | "chest", 172 | "chew", 173 | "chief", 174 | "chili", 175 | "chill", 176 | "chip", 177 | "chomp", 178 | "chop", 179 | "chow", 180 | "chuck", 181 | "chump", 182 | "chunk", 183 | "churn", 184 | "chute", 185 | "cider", 186 | "cinch", 187 | "city", 188 | "civic", 189 | "civil", 190 | "clad", 191 | "claim", 192 | "clamp", 193 | "clap", 194 | "clash", 195 | "clasp", 196 | "class", 197 | "claw", 198 | "clay", 199 | "clean", 200 | "clear", 201 | "cleat", 202 | "cleft", 203 | "clerk", 204 | "click", 205 | "cling", 206 | "clink", 207 | "clip", 208 | "cloak", 209 | "clock", 210 | "clone", 211 | "cloth", 212 | "cloud", 213 | "clump", 214 | "coach", 215 | "coast", 216 | "coat", 217 | "cod", 218 | "coil", 219 | "coke", 220 | "cola", 221 | "cold", 222 | "colt", 223 | "coma", 224 | "come", 225 | "comic", 226 | "comma", 227 | "cone", 228 | "cope", 229 | "copy", 230 | "coral", 231 | "cork", 232 | "cost", 233 | "cot", 234 | "couch", 235 | "cough", 236 | "cover", 237 | "cozy", 238 | "craft", 239 | "cramp", 240 | "crane", 241 | "crank", 242 | "crate", 243 | "crave", 244 | "crawl", 245 | "crazy", 246 | "creme", 247 | "crepe", 248 | "crept", 249 | "crib", 250 | "cried", 251 | "crisp", 252 | "crook", 253 | "crop", 254 | "cross", 255 | "crowd", 256 | "crown", 257 | "crumb", 258 | "crush", 259 | "crust", 260 | "cub", 261 | "cult", 262 | "cupid", 263 | "cure", 264 | "curl", 265 | "curry", 266 | "curse", 267 | "curve", 268 | "curvy", 269 | "cushy", 270 | "cut", 271 | "cycle", 272 | "dab", 273 | "dad", 274 | "daily", 275 | "dairy", 276 | "daisy", 277 | "dance", 278 | "dandy", 279 | "darn", 280 | "dart", 281 | "dash", 282 | "data", 283 | "date", 284 | "dawn", 285 | "deaf", 286 | "deal", 287 | "dean", 288 | "debit", 289 | "debt", 290 | "debug", 291 | "decaf", 292 | "decal", 293 | "decay", 294 | "deck", 295 | "decor", 296 | "decoy", 297 | "deed", 298 | "delay", 299 | "denim", 300 | "dense", 301 | "dent", 302 | "depth", 303 | "derby", 304 | "desk", 305 | "dial", 306 | "diary", 307 | "dice", 308 | "dig", 309 | "dill", 310 | "dime", 311 | "dimly", 312 | "diner", 313 | "dingy", 314 | "disco", 315 | "dish", 316 | "disk", 317 | "ditch", 318 | "ditzy", 319 | "dizzy", 320 | "dock", 321 | "dodge", 322 | "doing", 323 | "doll", 324 | "dome", 325 | "donor", 326 | "donut", 327 | "dose", 328 | "dot", 329 | "dove", 330 | "down", 331 | "dowry", 332 | "doze", 333 | "drab", 334 | "drama", 335 | "drank", 336 | "draw", 337 | "dress", 338 | "dried", 339 | "drift", 340 | "drill", 341 | "drive", 342 | "drone", 343 | "droop", 344 | "drove", 345 | "drown", 346 | "drum", 347 | "dry", 348 | "duck", 349 | "duct", 350 | "dude", 351 | "dug", 352 | "duke", 353 | "duo", 354 | "dusk", 355 | "dust", 356 | "duty", 357 | "dwarf", 358 | "dwell", 359 | "eagle", 360 | "early", 361 | "earth", 362 | "easel", 363 | "east", 364 | "eaten", 365 | "eats", 366 | "ebay", 367 | "ebony", 368 | "ebook", 369 | "echo", 370 | "edge", 371 | "eel", 372 | "eject", 373 | "elbow", 374 | "elder", 375 | "elf", 376 | "elk", 377 | "elm", 378 | "elope", 379 | "elude", 380 | "elves", 381 | "email", 382 | "emit", 383 | "empty", 384 | "emu", 385 | "enter", 386 | "entry", 387 | "envoy", 388 | "equal", 389 | "erase", 390 | "error", 391 | "erupt", 392 | "essay", 393 | "etch", 394 | "evade", 395 | "even", 396 | "evict", 397 | "evil", 398 | "evoke", 399 | "exact", 400 | "exit", 401 | "fable", 402 | "faced", 403 | "fact", 404 | "fade", 405 | "fall", 406 | "false", 407 | "fancy", 408 | "fang", 409 | "fax", 410 | "feast", 411 | "feed", 412 | "femur", 413 | "fence", 414 | "fend", 415 | "ferry", 416 | "fetal", 417 | "fetch", 418 | "fever", 419 | "fiber", 420 | "fifth", 421 | "fifty", 422 | "film", 423 | "filth", 424 | "final", 425 | "finch", 426 | "fit", 427 | "five", 428 | "flag", 429 | "flaky", 430 | "flame", 431 | "flap", 432 | "flask", 433 | "fled", 434 | "flick", 435 | "fling", 436 | "flint", 437 | "flip", 438 | "flirt", 439 | "float", 440 | "flock", 441 | "flop", 442 | "floss", 443 | "flyer", 444 | "foam", 445 | "foe", 446 | "fog", 447 | "foil", 448 | "folic", 449 | "folk", 450 | "food", 451 | "fool", 452 | "found", 453 | "fox", 454 | "foyer", 455 | "frail", 456 | "frame", 457 | "fray", 458 | "fresh", 459 | "fried", 460 | "frill", 461 | "frisk", 462 | "from", 463 | "front", 464 | "frost", 465 | "froth", 466 | "frown", 467 | "froze", 468 | "fruit", 469 | "gag", 470 | "gains", 471 | "gala", 472 | "game", 473 | "gap", 474 | "gas", 475 | "gave", 476 | "gear", 477 | "gecko", 478 | "geek", 479 | "gem", 480 | "genre", 481 | "gift", 482 | "gig", 483 | "gills", 484 | "given", 485 | "giver", 486 | "glad", 487 | "glass", 488 | "glide", 489 | "gloss", 490 | "glove", 491 | "glow", 492 | "glue", 493 | "goal", 494 | "going", 495 | "golf", 496 | "gong", 497 | "good", 498 | "gooey", 499 | "goofy", 500 | "gore", 501 | "gown", 502 | "grab", 503 | "grain", 504 | "grant", 505 | "grape", 506 | "graph", 507 | "grasp", 508 | "grass", 509 | "grave", 510 | "gravy", 511 | "gray", 512 | "green", 513 | "greet", 514 | "grew", 515 | "grid", 516 | "grief", 517 | "grill", 518 | "grip", 519 | "grit", 520 | "groom", 521 | "grope", 522 | "growl", 523 | "grub", 524 | "grunt", 525 | "guide", 526 | "gulf", 527 | "gulp", 528 | "gummy", 529 | "guru", 530 | "gush", 531 | "gut", 532 | "guy", 533 | "habit", 534 | "half", 535 | "halo", 536 | "halt", 537 | "happy", 538 | "harm", 539 | "hash", 540 | "hasty", 541 | "hatch", 542 | "hate", 543 | "haven", 544 | "hazel", 545 | "hazy", 546 | "heap", 547 | "heat", 548 | "heave", 549 | "hedge", 550 | "hefty", 551 | "help", 552 | "herbs", 553 | "hers", 554 | "hub", 555 | "hug", 556 | "hula", 557 | "hull", 558 | "human", 559 | "humid", 560 | "hump", 561 | "hung", 562 | "hunk", 563 | "hunt", 564 | "hurry", 565 | "hurt", 566 | "hush", 567 | "hut", 568 | "ice", 569 | "icing", 570 | "icon", 571 | "icy", 572 | "igloo", 573 | "image", 574 | "ion", 575 | "iron", 576 | "islam", 577 | "issue", 578 | "item", 579 | "ivory", 580 | "ivy", 581 | "jab", 582 | "jam", 583 | "jaws", 584 | "jazz", 585 | "jeep", 586 | "jelly", 587 | "jet", 588 | "jiffy", 589 | "job", 590 | "jog", 591 | "jolly", 592 | "jolt", 593 | "jot", 594 | "joy", 595 | "judge", 596 | "juice", 597 | "juicy", 598 | "july", 599 | "jumbo", 600 | "jump", 601 | "junky", 602 | "juror", 603 | "jury", 604 | "keep", 605 | "keg", 606 | "kept", 607 | "kick", 608 | "kilt", 609 | "king", 610 | "kite", 611 | "kitty", 612 | "kiwi", 613 | "knee", 614 | "knelt", 615 | "koala", 616 | "kung", 617 | "ladle", 618 | "lady", 619 | "lair", 620 | "lake", 621 | "lance", 622 | "land", 623 | "lapel", 624 | "large", 625 | "lash", 626 | "lasso", 627 | "last", 628 | "latch", 629 | "late", 630 | "lazy", 631 | "left", 632 | "legal", 633 | "lemon", 634 | "lend", 635 | "lens", 636 | "lent", 637 | "level", 638 | "lever", 639 | "lid", 640 | "life", 641 | "lift", 642 | "lilac", 643 | "lily", 644 | "limb", 645 | "limes", 646 | "line", 647 | "lint", 648 | "lion", 649 | "lip", 650 | "list", 651 | "lived", 652 | "liver", 653 | "lunar", 654 | "lunch", 655 | "lung", 656 | "lurch", 657 | "lure", 658 | "lurk", 659 | "lying", 660 | "lyric", 661 | "mace", 662 | "maker", 663 | "malt", 664 | "mama", 665 | "mango", 666 | "manor", 667 | "many", 668 | "map", 669 | "march", 670 | "mardi", 671 | "marry", 672 | "mash", 673 | "match", 674 | "mate", 675 | "math", 676 | "moan", 677 | "mocha", 678 | "moist", 679 | "mold", 680 | "mom", 681 | "moody", 682 | "mop", 683 | "morse", 684 | "most", 685 | "motor", 686 | "motto", 687 | "mount", 688 | "mouse", 689 | "mousy", 690 | "mouth", 691 | "move", 692 | "movie", 693 | "mower", 694 | "mud", 695 | "mug", 696 | "mulch", 697 | "mule", 698 | "mull", 699 | "mumbo", 700 | "mummy", 701 | "mural", 702 | "muse", 703 | "music", 704 | "musky", 705 | "mute", 706 | "nacho", 707 | "nag", 708 | "nail", 709 | "name", 710 | "nanny", 711 | "nap", 712 | "navy", 713 | "near", 714 | "neat", 715 | "neon", 716 | "nerd", 717 | "nest", 718 | "net", 719 | "next", 720 | "niece", 721 | "ninth", 722 | "nutty", 723 | "oak", 724 | "oasis", 725 | "oat", 726 | "ocean", 727 | "oil", 728 | "old", 729 | "olive", 730 | "omen", 731 | "onion", 732 | "only", 733 | "ooze", 734 | "opal", 735 | "open", 736 | "opera", 737 | "opt", 738 | "otter", 739 | "ouch", 740 | "ounce", 741 | "outer", 742 | "oval", 743 | "oven", 744 | "owl", 745 | "ozone", 746 | "pace", 747 | "pagan", 748 | "pager", 749 | "palm", 750 | "panda", 751 | "panic", 752 | "pants", 753 | "panty", 754 | "paper", 755 | "park", 756 | "party", 757 | "pasta", 758 | "patch", 759 | "path", 760 | "patio", 761 | "payer", 762 | "pecan", 763 | "penny", 764 | "pep", 765 | "perch", 766 | "perky", 767 | "perm", 768 | "pest", 769 | "petal", 770 | "petri", 771 | "petty", 772 | "photo", 773 | "plank", 774 | "plant", 775 | "plaza", 776 | "plead", 777 | "plot", 778 | "plow", 779 | "pluck", 780 | "plug", 781 | "plus", 782 | "poach", 783 | "pod", 784 | "poem", 785 | "poet", 786 | "pogo", 787 | "point", 788 | "poise", 789 | "poker", 790 | "polar", 791 | "polio", 792 | "polka", 793 | "polo", 794 | "pond", 795 | "pony", 796 | "poppy", 797 | "pork", 798 | "poser", 799 | "pouch", 800 | "pound", 801 | "pout", 802 | "power", 803 | "prank", 804 | "press", 805 | "print", 806 | "prior", 807 | "prism", 808 | "prize", 809 | "probe", 810 | "prong", 811 | "proof", 812 | "props", 813 | "prude", 814 | "prune", 815 | "pry", 816 | "pug", 817 | "pull", 818 | "pulp", 819 | "pulse", 820 | "puma", 821 | "punch", 822 | "punk", 823 | "pupil", 824 | "puppy", 825 | "purr", 826 | "purse", 827 | "push", 828 | "putt", 829 | "quack", 830 | "quake", 831 | "query", 832 | "quiet", 833 | "quill", 834 | "quilt", 835 | "quit", 836 | "quota", 837 | "quote", 838 | "rabid", 839 | "race", 840 | "rack", 841 | "radar", 842 | "radio", 843 | "raft", 844 | "rage", 845 | "raid", 846 | "rail", 847 | "rake", 848 | "rally", 849 | "ramp", 850 | "ranch", 851 | "range", 852 | "rank", 853 | "rant", 854 | "rash", 855 | "raven", 856 | "reach", 857 | "react", 858 | "ream", 859 | "rebel", 860 | "recap", 861 | "relax", 862 | "relay", 863 | "relic", 864 | "remix", 865 | "repay", 866 | "repel", 867 | "reply", 868 | "rerun", 869 | "reset", 870 | "rhyme", 871 | "rice", 872 | "rich", 873 | "ride", 874 | "rigid", 875 | "rigor", 876 | "rinse", 877 | "riot", 878 | "ripen", 879 | "rise", 880 | "risk", 881 | "ritzy", 882 | "rival", 883 | "river", 884 | "roast", 885 | "robe", 886 | "robin", 887 | "rock", 888 | "rogue", 889 | "roman", 890 | "romp", 891 | "rope", 892 | "rover", 893 | "royal", 894 | "ruby", 895 | "rug", 896 | "ruin", 897 | "rule", 898 | "runny", 899 | "rush", 900 | "rust", 901 | "rut", 902 | "sadly", 903 | "sage", 904 | "said", 905 | "saint", 906 | "salad", 907 | "salon", 908 | "salsa", 909 | "salt", 910 | "same", 911 | "sandy", 912 | "santa", 913 | "satin", 914 | "sauna", 915 | "saved", 916 | "savor", 917 | "sax", 918 | "say", 919 | "scale", 920 | "scam", 921 | "scan", 922 | "scare", 923 | "scarf", 924 | "scary", 925 | "scoff", 926 | "scold", 927 | "scoop", 928 | "scoot", 929 | "scope", 930 | "score", 931 | "scorn", 932 | "scout", 933 | "scowl", 934 | "scrap", 935 | "scrub", 936 | "scuba", 937 | "scuff", 938 | "sect", 939 | "sedan", 940 | "self", 941 | "send", 942 | "sepia", 943 | "serve", 944 | "set", 945 | "seven", 946 | "shack", 947 | "shade", 948 | "shady", 949 | "shaft", 950 | "shaky", 951 | "sham", 952 | "shape", 953 | "share", 954 | "sharp", 955 | "shed", 956 | "sheep", 957 | "sheet", 958 | "shelf", 959 | "shell", 960 | "shine", 961 | "shiny", 962 | "ship", 963 | "shirt", 964 | "shock", 965 | "shop", 966 | "shore", 967 | "shout", 968 | "shove", 969 | "shown", 970 | "showy", 971 | "shred", 972 | "shrug", 973 | "shun", 974 | "shush", 975 | "shut", 976 | "shy", 977 | "sift", 978 | "silk", 979 | "silly", 980 | "silo", 981 | "sip", 982 | "siren", 983 | "sixth", 984 | "size", 985 | "skate", 986 | "skew", 987 | "skid", 988 | "skier", 989 | "skies", 990 | "skip", 991 | "skirt", 992 | "skit", 993 | "sky", 994 | "slab", 995 | "slack", 996 | "slain", 997 | "slam", 998 | "slang", 999 | "slash", 1000 | "slate", 1001 | "slaw", 1002 | "sled", 1003 | "sleek", 1004 | "sleep", 1005 | "sleet", 1006 | "slept", 1007 | "slice", 1008 | "slick", 1009 | "slimy", 1010 | "sling", 1011 | "slip", 1012 | "slit", 1013 | "slob", 1014 | "slot", 1015 | "slug", 1016 | "slum", 1017 | "slurp", 1018 | "slush", 1019 | "small", 1020 | "smash", 1021 | "smell", 1022 | "smile", 1023 | "smirk", 1024 | "smog", 1025 | "snack", 1026 | "snap", 1027 | "snare", 1028 | "snarl", 1029 | "sneak", 1030 | "sneer", 1031 | "sniff", 1032 | "snore", 1033 | "snort", 1034 | "snout", 1035 | "snowy", 1036 | "snub", 1037 | "snuff", 1038 | "speak", 1039 | "speed", 1040 | "spend", 1041 | "spent", 1042 | "spew", 1043 | "spied", 1044 | "spill", 1045 | "spiny", 1046 | "spoil", 1047 | "spoke", 1048 | "spoof", 1049 | "spool", 1050 | "spoon", 1051 | "sport", 1052 | "spot", 1053 | "spout", 1054 | "spray", 1055 | "spree", 1056 | "spur", 1057 | "squad", 1058 | "squat", 1059 | "squid", 1060 | "stack", 1061 | "staff", 1062 | "stage", 1063 | "stain", 1064 | "stall", 1065 | "stamp", 1066 | "stand", 1067 | "stank", 1068 | "stark", 1069 | "start", 1070 | "stash", 1071 | "state", 1072 | "stays", 1073 | "steam", 1074 | "steep", 1075 | "stem", 1076 | "step", 1077 | "stew", 1078 | "stick", 1079 | "sting", 1080 | "stir", 1081 | "stock", 1082 | "stole", 1083 | "stomp", 1084 | "stony", 1085 | "stood", 1086 | "stool", 1087 | "stoop", 1088 | "stop", 1089 | "storm", 1090 | "stout", 1091 | "stove", 1092 | "straw", 1093 | "stray", 1094 | "strut", 1095 | "stuck", 1096 | "stud", 1097 | "stuff", 1098 | "stump", 1099 | "stung", 1100 | "stunt", 1101 | "suds", 1102 | "sugar", 1103 | "sulk", 1104 | "surf", 1105 | "sushi", 1106 | "swab", 1107 | "swan", 1108 | "swarm", 1109 | "sway", 1110 | "swear", 1111 | "sweat", 1112 | "sweep", 1113 | "swell", 1114 | "swept", 1115 | "swim", 1116 | "swing", 1117 | "swipe", 1118 | "swirl", 1119 | "swoop", 1120 | "swore", 1121 | "syrup", 1122 | "tacky", 1123 | "taco", 1124 | "tag", 1125 | "take", 1126 | "tall", 1127 | "talon", 1128 | "tamer", 1129 | "tank", 1130 | "taper", 1131 | "taps", 1132 | "tarot", 1133 | "tart", 1134 | "task", 1135 | "taste", 1136 | "tasty", 1137 | "taunt", 1138 | "thank", 1139 | "thaw", 1140 | "theft", 1141 | "theme", 1142 | "thigh", 1143 | "thing", 1144 | "think", 1145 | "thong", 1146 | "thorn", 1147 | "those", 1148 | "throb", 1149 | "thud", 1150 | "thumb", 1151 | "thump", 1152 | "thus", 1153 | "tiara", 1154 | "tidal", 1155 | "tidy", 1156 | "tiger", 1157 | "tile", 1158 | "tilt", 1159 | "tint", 1160 | "tiny", 1161 | "trace", 1162 | "track", 1163 | "trade", 1164 | "train", 1165 | "trait", 1166 | "trap", 1167 | "trash", 1168 | "tray", 1169 | "treat", 1170 | "tree", 1171 | "trek", 1172 | "trend", 1173 | "trial", 1174 | "tribe", 1175 | "trick", 1176 | "trio", 1177 | "trout", 1178 | "truce", 1179 | "truck", 1180 | "trump", 1181 | "trunk", 1182 | "try", 1183 | "tug", 1184 | "tulip", 1185 | "tummy", 1186 | "turf", 1187 | "tusk", 1188 | "tutor", 1189 | "tutu", 1190 | "tux", 1191 | "tweak", 1192 | "tweet", 1193 | "twice", 1194 | "twine", 1195 | "twins", 1196 | "twirl", 1197 | "twist", 1198 | "uncle", 1199 | "uncut", 1200 | "undo", 1201 | "unify", 1202 | "union", 1203 | "unit", 1204 | "untie", 1205 | "upon", 1206 | "upper", 1207 | "urban", 1208 | "used", 1209 | "user", 1210 | "usher", 1211 | "utter", 1212 | "value", 1213 | "vapor", 1214 | "vegan", 1215 | "venue", 1216 | "verse", 1217 | "vest", 1218 | "veto", 1219 | "vice", 1220 | "video", 1221 | "view", 1222 | "viral", 1223 | "virus", 1224 | "visa", 1225 | "visor", 1226 | "vixen", 1227 | "vocal", 1228 | "voice", 1229 | "void", 1230 | "volt", 1231 | "voter", 1232 | "vowel", 1233 | "wad", 1234 | "wafer", 1235 | "wager", 1236 | "wages", 1237 | "wagon", 1238 | "wake", 1239 | "walk", 1240 | "wand", 1241 | "wasp", 1242 | "watch", 1243 | "water", 1244 | "wavy", 1245 | "wheat", 1246 | "whiff", 1247 | "whole", 1248 | "whoop", 1249 | "wick", 1250 | "widen", 1251 | "widow", 1252 | "width", 1253 | "wife", 1254 | "wifi", 1255 | "wilt", 1256 | "wimp", 1257 | "wind", 1258 | "wing", 1259 | "wink", 1260 | "wipe", 1261 | "wired", 1262 | "wiry", 1263 | "wise", 1264 | "wish", 1265 | "wispy", 1266 | "wok", 1267 | "wolf", 1268 | "womb", 1269 | "wool", 1270 | "woozy", 1271 | "word", 1272 | "work", 1273 | "worry", 1274 | "wound", 1275 | "woven", 1276 | "wrath", 1277 | "wreck", 1278 | "wrist", 1279 | "xerox", 1280 | "yahoo", 1281 | "yam", 1282 | "yard", 1283 | "year", 1284 | "yeast", 1285 | "yelp", 1286 | "yield", 1287 | "yo-yo", 1288 | "yodel", 1289 | "yoga", 1290 | "yoyo", 1291 | "yummy", 1292 | "zebra", 1293 | "zero", 1294 | "zesty", 1295 | "zippy", 1296 | "zone", 1297 | "zoom" 1298 | ] 1299 | -------------------------------------------------------------------------------- /packages/english-eff/src/data/short2.json: -------------------------------------------------------------------------------- 1 | [ 2 | "aardvark", 3 | "abandoned", 4 | "abbreviate", 5 | "abdomen", 6 | "abhorrence", 7 | "abiding", 8 | "abnormal", 9 | "abrasion", 10 | "absorbing", 11 | "abundant", 12 | "abyss", 13 | "academy", 14 | "accountant", 15 | "acetone", 16 | "achiness", 17 | "acid", 18 | "acoustics", 19 | "acquire", 20 | "acrobat", 21 | "actress", 22 | "acuteness", 23 | "aerosol", 24 | "aesthetic", 25 | "affidavit", 26 | "afloat", 27 | "afraid", 28 | "aftershave", 29 | "again", 30 | "agency", 31 | "aggressor", 32 | "aghast", 33 | "agitate", 34 | "agnostic", 35 | "agonizing", 36 | "agreeing", 37 | "aidless", 38 | "aimlessly", 39 | "ajar", 40 | "alarmclock", 41 | "albatross", 42 | "alchemy", 43 | "alfalfa", 44 | "algae", 45 | "aliens", 46 | "alkaline", 47 | "almanac", 48 | "alongside", 49 | "alphabet", 50 | "already", 51 | "also", 52 | "altitude", 53 | "aluminum", 54 | "always", 55 | "amazingly", 56 | "ambulance", 57 | "amendment", 58 | "amiable", 59 | "ammunition", 60 | "amnesty", 61 | "amoeba", 62 | "amplifier", 63 | "amuser", 64 | "anagram", 65 | "anchor", 66 | "android", 67 | "anesthesia", 68 | "angelfish", 69 | "animal", 70 | "anklet", 71 | "announcer", 72 | "anonymous", 73 | "answer", 74 | "antelope", 75 | "anxiety", 76 | "anyplace", 77 | "aorta", 78 | "apartment", 79 | "apnea", 80 | "apostrophe", 81 | "apple", 82 | "apricot", 83 | "aquamarine", 84 | "arachnid", 85 | "arbitrate", 86 | "ardently", 87 | "arena", 88 | "argument", 89 | "aristocrat", 90 | "armchair", 91 | "aromatic", 92 | "arrowhead", 93 | "arsonist", 94 | "artichoke", 95 | "asbestos", 96 | "ascend", 97 | "aseptic", 98 | "ashamed", 99 | "asinine", 100 | "asleep", 101 | "asocial", 102 | "asparagus", 103 | "astronaut", 104 | "asymmetric", 105 | "atlas", 106 | "atmosphere", 107 | "atom", 108 | "atrocious", 109 | "attic", 110 | "atypical", 111 | "auctioneer", 112 | "auditorium", 113 | "augmented", 114 | "auspicious", 115 | "automobile", 116 | "auxiliary", 117 | "avalanche", 118 | "avenue", 119 | "aviator", 120 | "avocado", 121 | "awareness", 122 | "awhile", 123 | "awkward", 124 | "awning", 125 | "awoke", 126 | "axially", 127 | "azalea", 128 | "babbling", 129 | "backpack", 130 | "badass", 131 | "bagpipe", 132 | "bakery", 133 | "balancing", 134 | "bamboo", 135 | "banana", 136 | "barracuda", 137 | "basket", 138 | "bathrobe", 139 | "bazooka", 140 | "blade", 141 | "blender", 142 | "blimp", 143 | "blouse", 144 | "blurred", 145 | "boatyard", 146 | "bobcat", 147 | "body", 148 | "bogusness", 149 | "bohemian", 150 | "boiler", 151 | "bonnet", 152 | "boots", 153 | "borough", 154 | "bossiness", 155 | "bottle", 156 | "bouquet", 157 | "boxlike", 158 | "breath", 159 | "briefcase", 160 | "broom", 161 | "brushes", 162 | "bubblegum", 163 | "buckle", 164 | "buddhist", 165 | "buffalo", 166 | "bullfrog", 167 | "bunny", 168 | "busboy", 169 | "buzzard", 170 | "cabin", 171 | "cactus", 172 | "cadillac", 173 | "cafeteria", 174 | "cage", 175 | "cahoots", 176 | "cajoling", 177 | "cakewalk", 178 | "calculator", 179 | "camera", 180 | "canister", 181 | "capsule", 182 | "carrot", 183 | "cashew", 184 | "cathedral", 185 | "caucasian", 186 | "caviar", 187 | "ceasefire", 188 | "cedar", 189 | "celery", 190 | "cement", 191 | "census", 192 | "ceramics", 193 | "cesspool", 194 | "chalkboard", 195 | "cheesecake", 196 | "chimney", 197 | "chlorine", 198 | "chopsticks", 199 | "chrome", 200 | "chute", 201 | "cilantro", 202 | "cinnamon", 203 | "circle", 204 | "cityscape", 205 | "civilian", 206 | "clay", 207 | "clergyman", 208 | "clipboard", 209 | "clock", 210 | "clubhouse", 211 | "coathanger", 212 | "cobweb", 213 | "coconut", 214 | "codeword", 215 | "coexistent", 216 | "coffeecake", 217 | "cognitive", 218 | "cohabitate", 219 | "collarbone", 220 | "computer", 221 | "confetti", 222 | "copier", 223 | "cornea", 224 | "cosmetics", 225 | "cotton", 226 | "couch", 227 | "coverless", 228 | "coyote", 229 | "coziness", 230 | "crawfish", 231 | "crewmember", 232 | "crib", 233 | "croissant", 234 | "crumble", 235 | "crystal", 236 | "cubical", 237 | "cucumber", 238 | "cuddly", 239 | "cufflink", 240 | "cuisine", 241 | "culprit", 242 | "cup", 243 | "curry", 244 | "cushion", 245 | "cuticle", 246 | "cybernetic", 247 | "cyclist", 248 | "cylinder", 249 | "cymbal", 250 | "cynicism", 251 | "cypress", 252 | "cytoplasm", 253 | "dachshund", 254 | "daffodil", 255 | "dagger", 256 | "dairy", 257 | "dalmatian", 258 | "dandelion", 259 | "dartboard", 260 | "dastardly", 261 | "datebook", 262 | "daughter", 263 | "dawn", 264 | "daytime", 265 | "dazzler", 266 | "dealer", 267 | "debris", 268 | "decal", 269 | "dedicate", 270 | "deepness", 271 | "defrost", 272 | "degree", 273 | "dehydrator", 274 | "deliverer", 275 | "democrat", 276 | "dentist", 277 | "deodorant", 278 | "depot", 279 | "deranged", 280 | "desktop", 281 | "detergent", 282 | "device", 283 | "dexterity", 284 | "diamond", 285 | "dibs", 286 | "dictionary", 287 | "diffuser", 288 | "digit", 289 | "dilated", 290 | "dimple", 291 | "dinnerware", 292 | "dioxide", 293 | "diploma", 294 | "directory", 295 | "dishcloth", 296 | "ditto", 297 | "dividers", 298 | "dizziness", 299 | "doctor", 300 | "dodge", 301 | "doll", 302 | "dominoes", 303 | "donut", 304 | "doorstep", 305 | "dorsal", 306 | "double", 307 | "downstairs", 308 | "dozed", 309 | "drainpipe", 310 | "dresser", 311 | "driftwood", 312 | "droppings", 313 | "drum", 314 | "dryer", 315 | "dubiously", 316 | "duckling", 317 | "duffel", 318 | "dugout", 319 | "dumpster", 320 | "duplex", 321 | "durable", 322 | "dustpan", 323 | "dutiful", 324 | "duvet", 325 | "dwarfism", 326 | "dwelling", 327 | "dwindling", 328 | "dynamite", 329 | "dyslexia", 330 | "eagerness", 331 | "earlobe", 332 | "easel", 333 | "eavesdrop", 334 | "ebook", 335 | "eccentric", 336 | "echoless", 337 | "eclipse", 338 | "ecosystem", 339 | "ecstasy", 340 | "edged", 341 | "editor", 342 | "educator", 343 | "eelworm", 344 | "eerie", 345 | "effects", 346 | "eggnog", 347 | "egomaniac", 348 | "ejection", 349 | "elastic", 350 | "elbow", 351 | "elderly", 352 | "elephant", 353 | "elfishly", 354 | "eliminator", 355 | "elk", 356 | "elliptical", 357 | "elongated", 358 | "elsewhere", 359 | "elusive", 360 | "elves", 361 | "emancipate", 362 | "embroidery", 363 | "emcee", 364 | "emerald", 365 | "emission", 366 | "emoticon", 367 | "emperor", 368 | "emulate", 369 | "enactment", 370 | "enchilada", 371 | "endorphin", 372 | "energy", 373 | "enforcer", 374 | "engine", 375 | "enhance", 376 | "enigmatic", 377 | "enjoyably", 378 | "enlarged", 379 | "enormous", 380 | "enquirer", 381 | "enrollment", 382 | "ensemble", 383 | "entryway", 384 | "enunciate", 385 | "envoy", 386 | "enzyme", 387 | "epidemic", 388 | "equipment", 389 | "erasable", 390 | "ergonomic", 391 | "erratic", 392 | "eruption", 393 | "escalator", 394 | "eskimo", 395 | "esophagus", 396 | "espresso", 397 | "essay", 398 | "estrogen", 399 | "etching", 400 | "eternal", 401 | "ethics", 402 | "etiquette", 403 | "eucalyptus", 404 | "eulogy", 405 | "euphemism", 406 | "euthanize", 407 | "evacuation", 408 | "evergreen", 409 | "evidence", 410 | "evolution", 411 | "exam", 412 | "excerpt", 413 | "exerciser", 414 | "exfoliate", 415 | "exhale", 416 | "exist", 417 | "exorcist", 418 | "explode", 419 | "exquisite", 420 | "exterior", 421 | "exuberant", 422 | "fabric", 423 | "factory", 424 | "faded", 425 | "failsafe", 426 | "falcon", 427 | "family", 428 | "fanfare", 429 | "fasten", 430 | "faucet", 431 | "favorite", 432 | "feasibly", 433 | "february", 434 | "federal", 435 | "feedback", 436 | "feigned", 437 | "feline", 438 | "femur", 439 | "fence", 440 | "ferret", 441 | "festival", 442 | "fettuccine", 443 | "feudalist", 444 | "feverish", 445 | "fiberglass", 446 | "fictitious", 447 | "fiddle", 448 | "figurine", 449 | "fillet", 450 | "finalist", 451 | "fiscally", 452 | "fixture", 453 | "flashlight", 454 | "fleshiness", 455 | "flight", 456 | "florist", 457 | "flypaper", 458 | "foamless", 459 | "focus", 460 | "foggy", 461 | "folksong", 462 | "fondue", 463 | "footpath", 464 | "fossil", 465 | "fountain", 466 | "fox", 467 | "fragment", 468 | "freeway", 469 | "fridge", 470 | "frosting", 471 | "fruit", 472 | "fryingpan", 473 | "gadget", 474 | "gainfully", 475 | "gallstone", 476 | "gamekeeper", 477 | "gangway", 478 | "garlic", 479 | "gaslight", 480 | "gathering", 481 | "gauntlet", 482 | "gearbox", 483 | "gecko", 484 | "gem", 485 | "generator", 486 | "geographer", 487 | "gerbil", 488 | "gesture", 489 | "getaway", 490 | "geyser", 491 | "ghoulishly", 492 | "gibberish", 493 | "giddiness", 494 | "giftshop", 495 | "gigabyte", 496 | "gimmick", 497 | "giraffe", 498 | "giveaway", 499 | "gizmo", 500 | "glasses", 501 | "gleeful", 502 | "glisten", 503 | "glove", 504 | "glucose", 505 | "glycerin", 506 | "gnarly", 507 | "gnomish", 508 | "goatskin", 509 | "goggles", 510 | "goldfish", 511 | "gong", 512 | "gooey", 513 | "gorgeous", 514 | "gosling", 515 | "gothic", 516 | "gourmet", 517 | "governor", 518 | "grape", 519 | "greyhound", 520 | "grill", 521 | "groundhog", 522 | "grumbling", 523 | "guacamole", 524 | "guerrilla", 525 | "guitar", 526 | "gullible", 527 | "gumdrop", 528 | "gurgling", 529 | "gusto", 530 | "gutless", 531 | "gymnast", 532 | "gynecology", 533 | "gyration", 534 | "habitat", 535 | "hacking", 536 | "haggard", 537 | "haiku", 538 | "halogen", 539 | "hamburger", 540 | "handgun", 541 | "happiness", 542 | "hardhat", 543 | "hastily", 544 | "hatchling", 545 | "haughty", 546 | "hazelnut", 547 | "headband", 548 | "hedgehog", 549 | "hefty", 550 | "heinously", 551 | "helmet", 552 | "hemoglobin", 553 | "henceforth", 554 | "herbs", 555 | "hesitation", 556 | "hexagon", 557 | "hubcap", 558 | "huddling", 559 | "huff", 560 | "hugeness", 561 | "hullabaloo", 562 | "human", 563 | "hunter", 564 | "hurricane", 565 | "hushing", 566 | "hyacinth", 567 | "hybrid", 568 | "hydrant", 569 | "hygienist", 570 | "hypnotist", 571 | "ibuprofen", 572 | "icepack", 573 | "icing", 574 | "iconic", 575 | "identical", 576 | "idiocy", 577 | "idly", 578 | "igloo", 579 | "ignition", 580 | "iguana", 581 | "illuminate", 582 | "imaging", 583 | "imbecile", 584 | "imitator", 585 | "immigrant", 586 | "imprint", 587 | "iodine", 588 | "ionosphere", 589 | "ipad", 590 | "iphone", 591 | "iridescent", 592 | "irksome", 593 | "iron", 594 | "irrigation", 595 | "island", 596 | "isotope", 597 | "issueless", 598 | "italicize", 599 | "itemizer", 600 | "itinerary", 601 | "itunes", 602 | "ivory", 603 | "jabbering", 604 | "jackrabbit", 605 | "jaguar", 606 | "jailhouse", 607 | "jalapeno", 608 | "jamboree", 609 | "janitor", 610 | "jarring", 611 | "jasmine", 612 | "jaundice", 613 | "jawbreaker", 614 | "jaywalker", 615 | "jazz", 616 | "jealous", 617 | "jeep", 618 | "jelly", 619 | "jeopardize", 620 | "jersey", 621 | "jetski", 622 | "jezebel", 623 | "jiffy", 624 | "jigsaw", 625 | "jingling", 626 | "jobholder", 627 | "jockstrap", 628 | "jogging", 629 | "john", 630 | "joinable", 631 | "jokingly", 632 | "journal", 633 | "jovial", 634 | "joystick", 635 | "jubilant", 636 | "judiciary", 637 | "juggle", 638 | "juice", 639 | "jujitsu", 640 | "jukebox", 641 | "jumpiness", 642 | "junkyard", 643 | "juror", 644 | "justifying", 645 | "juvenile", 646 | "kabob", 647 | "kamikaze", 648 | "kangaroo", 649 | "karate", 650 | "kayak", 651 | "keepsake", 652 | "kennel", 653 | "kerosene", 654 | "ketchup", 655 | "khaki", 656 | "kickstand", 657 | "kilogram", 658 | "kimono", 659 | "kingdom", 660 | "kiosk", 661 | "kissing", 662 | "kite", 663 | "kleenex", 664 | "knapsack", 665 | "kneecap", 666 | "knickers", 667 | "koala", 668 | "krypton", 669 | "laboratory", 670 | "ladder", 671 | "lakefront", 672 | "lantern", 673 | "laptop", 674 | "laryngitis", 675 | "lasagna", 676 | "latch", 677 | "laundry", 678 | "lavender", 679 | "laxative", 680 | "lazybones", 681 | "lecturer", 682 | "leftover", 683 | "leggings", 684 | "leisure", 685 | "lemon", 686 | "length", 687 | "leopard", 688 | "leprechaun", 689 | "lettuce", 690 | "leukemia", 691 | "levers", 692 | "lewdness", 693 | "liability", 694 | "library", 695 | "licorice", 696 | "lifeboat", 697 | "lightbulb", 698 | "likewise", 699 | "lilac", 700 | "limousine", 701 | "lint", 702 | "lioness", 703 | "lipstick", 704 | "liquid", 705 | "listless", 706 | "litter", 707 | "liverwurst", 708 | "lizard", 709 | "llama", 710 | "luau", 711 | "lubricant", 712 | "lucidity", 713 | "ludicrous", 714 | "luggage", 715 | "lukewarm", 716 | "lullaby", 717 | "lumberjack", 718 | "lunchbox", 719 | "luridness", 720 | "luscious", 721 | "luxurious", 722 | "lyrics", 723 | "macaroni", 724 | "maestro", 725 | "magazine", 726 | "mahogany", 727 | "maimed", 728 | "majority", 729 | "makeover", 730 | "malformed", 731 | "mammal", 732 | "mango", 733 | "mapmaker", 734 | "marbles", 735 | "massager", 736 | "matchstick", 737 | "maverick", 738 | "maximum", 739 | "mayonnaise", 740 | "moaning", 741 | "mobilize", 742 | "moccasin", 743 | "modify", 744 | "moisture", 745 | "molecule", 746 | "momentum", 747 | "monastery", 748 | "moonshine", 749 | "mortuary", 750 | "mosquito", 751 | "motorcycle", 752 | "mousetrap", 753 | "movie", 754 | "mower", 755 | "mozzarella", 756 | "muckiness", 757 | "mudflow", 758 | "mugshot", 759 | "mule", 760 | "mummy", 761 | "mundane", 762 | "muppet", 763 | "mural", 764 | "mustard", 765 | "mutation", 766 | "myriad", 767 | "myspace", 768 | "myth", 769 | "nail", 770 | "namesake", 771 | "nanosecond", 772 | "napkin", 773 | "narrator", 774 | "nastiness", 775 | "natives", 776 | "nautically", 777 | "navigate", 778 | "nearest", 779 | "nebula", 780 | "nectar", 781 | "nefarious", 782 | "negotiator", 783 | "neither", 784 | "nemesis", 785 | "neoliberal", 786 | "nephew", 787 | "nervously", 788 | "nest", 789 | "netting", 790 | "neuron", 791 | "nevermore", 792 | "nextdoor", 793 | "nicotine", 794 | "niece", 795 | "nimbleness", 796 | "nintendo", 797 | "nirvana", 798 | "nuclear", 799 | "nugget", 800 | "nuisance", 801 | "nullify", 802 | "numbing", 803 | "nuptials", 804 | "nursery", 805 | "nutcracker", 806 | "nylon", 807 | "oasis", 808 | "oat", 809 | "obediently", 810 | "obituary", 811 | "object", 812 | "obliterate", 813 | "obnoxious", 814 | "observer", 815 | "obtain", 816 | "obvious", 817 | "occupation", 818 | "oceanic", 819 | "octopus", 820 | "ocular", 821 | "office", 822 | "oftentimes", 823 | "oiliness", 824 | "ointment", 825 | "older", 826 | "olympics", 827 | "omissible", 828 | "omnivorous", 829 | "oncoming", 830 | "onion", 831 | "onlooker", 832 | "onstage", 833 | "onward", 834 | "onyx", 835 | "oomph", 836 | "opaquely", 837 | "opera", 838 | "opium", 839 | "opossum", 840 | "opponent", 841 | "optical", 842 | "opulently", 843 | "oscillator", 844 | "osmosis", 845 | "ostrich", 846 | "otherwise", 847 | "ought", 848 | "outhouse", 849 | "ovation", 850 | "oven", 851 | "owlish", 852 | "oxford", 853 | "oxidize", 854 | "oxygen", 855 | "oyster", 856 | "ozone", 857 | "pacemaker", 858 | "padlock", 859 | "pageant", 860 | "pajamas", 861 | "palm", 862 | "pamphlet", 863 | "pantyhose", 864 | "paprika", 865 | "parakeet", 866 | "passport", 867 | "patio", 868 | "pauper", 869 | "pavement", 870 | "payphone", 871 | "pebble", 872 | "peculiarly", 873 | "pedometer", 874 | "pegboard", 875 | "pelican", 876 | "penguin", 877 | "peony", 878 | "pepperoni", 879 | "peroxide", 880 | "pesticide", 881 | "petroleum", 882 | "pewter", 883 | "pharmacy", 884 | "pheasant", 885 | "phonebook", 886 | "phrasing", 887 | "physician", 888 | "plank", 889 | "pledge", 890 | "plotted", 891 | "plug", 892 | "plywood", 893 | "pneumonia", 894 | "podiatrist", 895 | "poetic", 896 | "pogo", 897 | "poison", 898 | "poking", 899 | "policeman", 900 | "poncho", 901 | "popcorn", 902 | "porcupine", 903 | "postcard", 904 | "poultry", 905 | "powerboat", 906 | "prairie", 907 | "pretzel", 908 | "princess", 909 | "propeller", 910 | "prune", 911 | "pry", 912 | "pseudo", 913 | "psychopath", 914 | "publisher", 915 | "pucker", 916 | "pueblo", 917 | "pulley", 918 | "pumpkin", 919 | "punchbowl", 920 | "puppy", 921 | "purse", 922 | "pushup", 923 | "putt", 924 | "puzzle", 925 | "pyramid", 926 | "python", 927 | "quarters", 928 | "quesadilla", 929 | "quilt", 930 | "quote", 931 | "racoon", 932 | "radish", 933 | "ragweed", 934 | "railroad", 935 | "rampantly", 936 | "rancidity", 937 | "rarity", 938 | "raspberry", 939 | "ravishing", 940 | "rearrange", 941 | "rebuilt", 942 | "receipt", 943 | "reentry", 944 | "refinery", 945 | "register", 946 | "rehydrate", 947 | "reimburse", 948 | "rejoicing", 949 | "rekindle", 950 | "relic", 951 | "remote", 952 | "renovator", 953 | "reopen", 954 | "reporter", 955 | "request", 956 | "rerun", 957 | "reservoir", 958 | "retriever", 959 | "reunion", 960 | "revolver", 961 | "rewrite", 962 | "rhapsody", 963 | "rhetoric", 964 | "rhino", 965 | "rhubarb", 966 | "rhyme", 967 | "ribbon", 968 | "riches", 969 | "ridden", 970 | "rigidness", 971 | "rimmed", 972 | "riptide", 973 | "riskily", 974 | "ritzy", 975 | "riverboat", 976 | "roamer", 977 | "robe", 978 | "rocket", 979 | "romancer", 980 | "ropelike", 981 | "rotisserie", 982 | "roundtable", 983 | "royal", 984 | "rubber", 985 | "rudderless", 986 | "rugby", 987 | "ruined", 988 | "rulebook", 989 | "rummage", 990 | "running", 991 | "rupture", 992 | "rustproof", 993 | "sabotage", 994 | "sacrifice", 995 | "saddlebag", 996 | "saffron", 997 | "sainthood", 998 | "saltshaker", 999 | "samurai", 1000 | "sandworm", 1001 | "sapphire", 1002 | "sardine", 1003 | "sassy", 1004 | "satchel", 1005 | "sauna", 1006 | "savage", 1007 | "saxophone", 1008 | "scarf", 1009 | "scenario", 1010 | "schoolbook", 1011 | "scientist", 1012 | "scooter", 1013 | "scrapbook", 1014 | "sculpture", 1015 | "scythe", 1016 | "secretary", 1017 | "sedative", 1018 | "segregator", 1019 | "seismology", 1020 | "selected", 1021 | "semicolon", 1022 | "senator", 1023 | "septum", 1024 | "sequence", 1025 | "serpent", 1026 | "sesame", 1027 | "settler", 1028 | "severely", 1029 | "shack", 1030 | "shelf", 1031 | "shirt", 1032 | "shovel", 1033 | "shrimp", 1034 | "shuttle", 1035 | "shyness", 1036 | "siamese", 1037 | "sibling", 1038 | "siesta", 1039 | "silicon", 1040 | "simmering", 1041 | "singles", 1042 | "sisterhood", 1043 | "sitcom", 1044 | "sixfold", 1045 | "sizable", 1046 | "skateboard", 1047 | "skeleton", 1048 | "skies", 1049 | "skulk", 1050 | "skylight", 1051 | "slapping", 1052 | "sled", 1053 | "slingshot", 1054 | "sloth", 1055 | "slumbering", 1056 | "smartphone", 1057 | "smelliness", 1058 | "smitten", 1059 | "smokestack", 1060 | "smudge", 1061 | "snapshot", 1062 | "sneezing", 1063 | "sniff", 1064 | "snowsuit", 1065 | "snugness", 1066 | "speakers", 1067 | "sphinx", 1068 | "spider", 1069 | "splashing", 1070 | "sponge", 1071 | "sprout", 1072 | "spur", 1073 | "spyglass", 1074 | "squirrel", 1075 | "statue", 1076 | "steamboat", 1077 | "stingray", 1078 | "stopwatch", 1079 | "strawberry", 1080 | "student", 1081 | "stylus", 1082 | "suave", 1083 | "subway", 1084 | "suction", 1085 | "suds", 1086 | "suffocate", 1087 | "sugar", 1088 | "suitcase", 1089 | "sulphur", 1090 | "superstore", 1091 | "surfer", 1092 | "sushi", 1093 | "swan", 1094 | "sweatshirt", 1095 | "swimwear", 1096 | "sword", 1097 | "sycamore", 1098 | "syllable", 1099 | "symphony", 1100 | "synagogue", 1101 | "syringes", 1102 | "systemize", 1103 | "tablespoon", 1104 | "taco", 1105 | "tadpole", 1106 | "taekwondo", 1107 | "tagalong", 1108 | "takeout", 1109 | "tallness", 1110 | "tamale", 1111 | "tanned", 1112 | "tapestry", 1113 | "tarantula", 1114 | "tastebud", 1115 | "tattoo", 1116 | "tavern", 1117 | "thaw", 1118 | "theater", 1119 | "thimble", 1120 | "thorn", 1121 | "throat", 1122 | "thumb", 1123 | "thwarting", 1124 | "tiara", 1125 | "tidbit", 1126 | "tiebreaker", 1127 | "tiger", 1128 | "timid", 1129 | "tinsel", 1130 | "tiptoeing", 1131 | "tirade", 1132 | "tissue", 1133 | "tractor", 1134 | "tree", 1135 | "tripod", 1136 | "trousers", 1137 | "trucks", 1138 | "tryout", 1139 | "tubeless", 1140 | "tuesday", 1141 | "tugboat", 1142 | "tulip", 1143 | "tumbleweed", 1144 | "tupperware", 1145 | "turtle", 1146 | "tusk", 1147 | "tutorial", 1148 | "tuxedo", 1149 | "tweezers", 1150 | "twins", 1151 | "tyrannical", 1152 | "ultrasound", 1153 | "umbrella", 1154 | "umpire", 1155 | "unarmored", 1156 | "unbuttoned", 1157 | "uncle", 1158 | "underwear", 1159 | "unevenness", 1160 | "unflavored", 1161 | "ungloved", 1162 | "unhinge", 1163 | "unicycle", 1164 | "unjustly", 1165 | "unknown", 1166 | "unlocking", 1167 | "unmarked", 1168 | "unnoticed", 1169 | "unopened", 1170 | "unpaved", 1171 | "unquenched", 1172 | "unroll", 1173 | "unscrewing", 1174 | "untied", 1175 | "unusual", 1176 | "unveiled", 1177 | "unwrinkled", 1178 | "unyielding", 1179 | "unzip", 1180 | "upbeat", 1181 | "upcountry", 1182 | "update", 1183 | "upfront", 1184 | "upgrade", 1185 | "upholstery", 1186 | "upkeep", 1187 | "upload", 1188 | "uppercut", 1189 | "upright", 1190 | "upstairs", 1191 | "uptown", 1192 | "upwind", 1193 | "uranium", 1194 | "urban", 1195 | "urchin", 1196 | "urethane", 1197 | "urgent", 1198 | "urologist", 1199 | "username", 1200 | "usher", 1201 | "utensil", 1202 | "utility", 1203 | "utmost", 1204 | "utopia", 1205 | "utterance", 1206 | "vacuum", 1207 | "vagrancy", 1208 | "valuables", 1209 | "vanquished", 1210 | "vaporizer", 1211 | "varied", 1212 | "vaseline", 1213 | "vegetable", 1214 | "vehicle", 1215 | "velcro", 1216 | "vendor", 1217 | "vertebrae", 1218 | "vestibule", 1219 | "veteran", 1220 | "vexingly", 1221 | "vicinity", 1222 | "videogame", 1223 | "viewfinder", 1224 | "vigilante", 1225 | "village", 1226 | "vinegar", 1227 | "violin", 1228 | "viperfish", 1229 | "virus", 1230 | "visor", 1231 | "vitamins", 1232 | "vivacious", 1233 | "vixen", 1234 | "vocalist", 1235 | "vogue", 1236 | "voicemail", 1237 | "volleyball", 1238 | "voucher", 1239 | "voyage", 1240 | "vulnerable", 1241 | "waffle", 1242 | "wagon", 1243 | "wakeup", 1244 | "walrus", 1245 | "wanderer", 1246 | "wasp", 1247 | "water", 1248 | "waving", 1249 | "wheat", 1250 | "whisper", 1251 | "wholesaler", 1252 | "wick", 1253 | "widow", 1254 | "wielder", 1255 | "wifeless", 1256 | "wikipedia", 1257 | "wildcat", 1258 | "windmill", 1259 | "wipeout", 1260 | "wired", 1261 | "wishbone", 1262 | "wizardry", 1263 | "wobbliness", 1264 | "wolverine", 1265 | "womb", 1266 | "woolworker", 1267 | "workbasket", 1268 | "wound", 1269 | "wrangle", 1270 | "wreckage", 1271 | "wristwatch", 1272 | "wrongdoing", 1273 | "xerox", 1274 | "xylophone", 1275 | "yacht", 1276 | "yahoo", 1277 | "yard", 1278 | "yearbook", 1279 | "yesterday", 1280 | "yiddish", 1281 | "yield", 1282 | "yo-yo", 1283 | "yodel", 1284 | "yogurt", 1285 | "yuppie", 1286 | "zealot", 1287 | "zebra", 1288 | "zeppelin", 1289 | "zestfully", 1290 | "zigzagged", 1291 | "zillion", 1292 | "zipping", 1293 | "zirconium", 1294 | "zodiac", 1295 | "zombie", 1296 | "zookeeper", 1297 | "zucchini" 1298 | ] 1299 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | devDependencies: 11 | '@types/node': 12 | specifier: ^22.10.1 13 | version: 22.19.1 14 | typescript: 15 | specifier: ^5.7.2 16 | version: 5.9.3 17 | unbzip2-stream: 18 | specifier: ^1.4.0 19 | version: 1.4.3 20 | vitest: 21 | specifier: ^2.1.6 22 | version: 2.1.9(@types/node@22.19.1) 23 | 24 | packages/english-eff: 25 | devDependencies: 26 | '@types/node': 27 | specifier: ^22.10.2 28 | version: 22.19.1 29 | tsx: 30 | specifier: ^4.19.2 31 | version: 4.21.0 32 | typescript: 33 | specifier: ^5.7.2 34 | version: 5.9.3 35 | 36 | packages/english-wiktionary: 37 | devDependencies: 38 | '@types/node': 39 | specifier: ^22.10.2 40 | version: 22.19.1 41 | tsx: 42 | specifier: ^4.19.2 43 | version: 4.21.0 44 | typescript: 45 | specifier: ^5.7.2 46 | version: 5.9.3 47 | unbzip2-stream: 48 | specifier: ^1.4.3 49 | version: 1.4.3 50 | 51 | packages/random: 52 | devDependencies: 53 | '@types/node': 54 | specifier: ^22.10.2 55 | version: 22.19.1 56 | '@wordlist/english-eff': 57 | specifier: workspace:* 58 | version: link:../english-eff 59 | 60 | packages: 61 | 62 | '@esbuild/aix-ppc64@0.21.5': 63 | resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} 64 | engines: {node: '>=12'} 65 | cpu: [ppc64] 66 | os: [aix] 67 | 68 | '@esbuild/aix-ppc64@0.27.1': 69 | resolution: {integrity: sha512-HHB50pdsBX6k47S4u5g/CaLjqS3qwaOVE5ILsq64jyzgMhLuCuZ8rGzM9yhsAjfjkbgUPMzZEPa7DAp7yz6vuA==} 70 | engines: {node: '>=18'} 71 | cpu: [ppc64] 72 | os: [aix] 73 | 74 | '@esbuild/android-arm64@0.21.5': 75 | resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} 76 | engines: {node: '>=12'} 77 | cpu: [arm64] 78 | os: [android] 79 | 80 | '@esbuild/android-arm64@0.27.1': 81 | resolution: {integrity: sha512-45fuKmAJpxnQWixOGCrS+ro4Uvb4Re9+UTieUY2f8AEc+t7d4AaZ6eUJ3Hva7dtrxAAWHtlEFsXFMAgNnGU9uQ==} 82 | engines: {node: '>=18'} 83 | cpu: [arm64] 84 | os: [android] 85 | 86 | '@esbuild/android-arm@0.21.5': 87 | resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} 88 | engines: {node: '>=12'} 89 | cpu: [arm] 90 | os: [android] 91 | 92 | '@esbuild/android-arm@0.27.1': 93 | resolution: {integrity: sha512-kFqa6/UcaTbGm/NncN9kzVOODjhZW8e+FRdSeypWe6j33gzclHtwlANs26JrupOntlcWmB0u8+8HZo8s7thHvg==} 94 | engines: {node: '>=18'} 95 | cpu: [arm] 96 | os: [android] 97 | 98 | '@esbuild/android-x64@0.21.5': 99 | resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} 100 | engines: {node: '>=12'} 101 | cpu: [x64] 102 | os: [android] 103 | 104 | '@esbuild/android-x64@0.27.1': 105 | resolution: {integrity: sha512-LBEpOz0BsgMEeHgenf5aqmn/lLNTFXVfoWMUox8CtWWYK9X4jmQzWjoGoNb8lmAYml/tQ/Ysvm8q7szu7BoxRQ==} 106 | engines: {node: '>=18'} 107 | cpu: [x64] 108 | os: [android] 109 | 110 | '@esbuild/darwin-arm64@0.21.5': 111 | resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} 112 | engines: {node: '>=12'} 113 | cpu: [arm64] 114 | os: [darwin] 115 | 116 | '@esbuild/darwin-arm64@0.27.1': 117 | resolution: {integrity: sha512-veg7fL8eMSCVKL7IW4pxb54QERtedFDfY/ASrumK/SbFsXnRazxY4YykN/THYqFnFwJ0aVjiUrVG2PwcdAEqQQ==} 118 | engines: {node: '>=18'} 119 | cpu: [arm64] 120 | os: [darwin] 121 | 122 | '@esbuild/darwin-x64@0.21.5': 123 | resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} 124 | engines: {node: '>=12'} 125 | cpu: [x64] 126 | os: [darwin] 127 | 128 | '@esbuild/darwin-x64@0.27.1': 129 | resolution: {integrity: sha512-+3ELd+nTzhfWb07Vol7EZ+5PTbJ/u74nC6iv4/lwIU99Ip5uuY6QoIf0Hn4m2HoV0qcnRivN3KSqc+FyCHjoVQ==} 130 | engines: {node: '>=18'} 131 | cpu: [x64] 132 | os: [darwin] 133 | 134 | '@esbuild/freebsd-arm64@0.21.5': 135 | resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} 136 | engines: {node: '>=12'} 137 | cpu: [arm64] 138 | os: [freebsd] 139 | 140 | '@esbuild/freebsd-arm64@0.27.1': 141 | resolution: {integrity: sha512-/8Rfgns4XD9XOSXlzUDepG8PX+AVWHliYlUkFI3K3GB6tqbdjYqdhcb4BKRd7C0BhZSoaCxhv8kTcBrcZWP+xg==} 142 | engines: {node: '>=18'} 143 | cpu: [arm64] 144 | os: [freebsd] 145 | 146 | '@esbuild/freebsd-x64@0.21.5': 147 | resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} 148 | engines: {node: '>=12'} 149 | cpu: [x64] 150 | os: [freebsd] 151 | 152 | '@esbuild/freebsd-x64@0.27.1': 153 | resolution: {integrity: sha512-GITpD8dK9C+r+5yRT/UKVT36h/DQLOHdwGVwwoHidlnA168oD3uxA878XloXebK4Ul3gDBBIvEdL7go9gCUFzQ==} 154 | engines: {node: '>=18'} 155 | cpu: [x64] 156 | os: [freebsd] 157 | 158 | '@esbuild/linux-arm64@0.21.5': 159 | resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} 160 | engines: {node: '>=12'} 161 | cpu: [arm64] 162 | os: [linux] 163 | 164 | '@esbuild/linux-arm64@0.27.1': 165 | resolution: {integrity: sha512-W9//kCrh/6in9rWIBdKaMtuTTzNj6jSeG/haWBADqLLa9P8O5YSRDzgD5y9QBok4AYlzS6ARHifAb75V6G670Q==} 166 | engines: {node: '>=18'} 167 | cpu: [arm64] 168 | os: [linux] 169 | 170 | '@esbuild/linux-arm@0.21.5': 171 | resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} 172 | engines: {node: '>=12'} 173 | cpu: [arm] 174 | os: [linux] 175 | 176 | '@esbuild/linux-arm@0.27.1': 177 | resolution: {integrity: sha512-ieMID0JRZY/ZeCrsFQ3Y3NlHNCqIhTprJfDgSB3/lv5jJZ8FX3hqPyXWhe+gvS5ARMBJ242PM+VNz/ctNj//eA==} 178 | engines: {node: '>=18'} 179 | cpu: [arm] 180 | os: [linux] 181 | 182 | '@esbuild/linux-ia32@0.21.5': 183 | resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} 184 | engines: {node: '>=12'} 185 | cpu: [ia32] 186 | os: [linux] 187 | 188 | '@esbuild/linux-ia32@0.27.1': 189 | resolution: {integrity: sha512-VIUV4z8GD8rtSVMfAj1aXFahsi/+tcoXXNYmXgzISL+KB381vbSTNdeZHHHIYqFyXcoEhu9n5cT+05tRv13rlw==} 190 | engines: {node: '>=18'} 191 | cpu: [ia32] 192 | os: [linux] 193 | 194 | '@esbuild/linux-loong64@0.21.5': 195 | resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} 196 | engines: {node: '>=12'} 197 | cpu: [loong64] 198 | os: [linux] 199 | 200 | '@esbuild/linux-loong64@0.27.1': 201 | resolution: {integrity: sha512-l4rfiiJRN7sTNI//ff65zJ9z8U+k6zcCg0LALU5iEWzY+a1mVZ8iWC1k5EsNKThZ7XCQ6YWtsZ8EWYm7r1UEsg==} 202 | engines: {node: '>=18'} 203 | cpu: [loong64] 204 | os: [linux] 205 | 206 | '@esbuild/linux-mips64el@0.21.5': 207 | resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} 208 | engines: {node: '>=12'} 209 | cpu: [mips64el] 210 | os: [linux] 211 | 212 | '@esbuild/linux-mips64el@0.27.1': 213 | resolution: {integrity: sha512-U0bEuAOLvO/DWFdygTHWY8C067FXz+UbzKgxYhXC0fDieFa0kDIra1FAhsAARRJbvEyso8aAqvPdNxzWuStBnA==} 214 | engines: {node: '>=18'} 215 | cpu: [mips64el] 216 | os: [linux] 217 | 218 | '@esbuild/linux-ppc64@0.21.5': 219 | resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} 220 | engines: {node: '>=12'} 221 | cpu: [ppc64] 222 | os: [linux] 223 | 224 | '@esbuild/linux-ppc64@0.27.1': 225 | resolution: {integrity: sha512-NzdQ/Xwu6vPSf/GkdmRNsOfIeSGnh7muundsWItmBsVpMoNPVpM61qNzAVY3pZ1glzzAxLR40UyYM23eaDDbYQ==} 226 | engines: {node: '>=18'} 227 | cpu: [ppc64] 228 | os: [linux] 229 | 230 | '@esbuild/linux-riscv64@0.21.5': 231 | resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} 232 | engines: {node: '>=12'} 233 | cpu: [riscv64] 234 | os: [linux] 235 | 236 | '@esbuild/linux-riscv64@0.27.1': 237 | resolution: {integrity: sha512-7zlw8p3IApcsN7mFw0O1Z1PyEk6PlKMu18roImfl3iQHTnr/yAfYv6s4hXPidbDoI2Q0pW+5xeoM4eTCC0UdrQ==} 238 | engines: {node: '>=18'} 239 | cpu: [riscv64] 240 | os: [linux] 241 | 242 | '@esbuild/linux-s390x@0.21.5': 243 | resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} 244 | engines: {node: '>=12'} 245 | cpu: [s390x] 246 | os: [linux] 247 | 248 | '@esbuild/linux-s390x@0.27.1': 249 | resolution: {integrity: sha512-cGj5wli+G+nkVQdZo3+7FDKC25Uh4ZVwOAK6A06Hsvgr8WqBBuOy/1s+PUEd/6Je+vjfm6stX0kmib5b/O2Ykw==} 250 | engines: {node: '>=18'} 251 | cpu: [s390x] 252 | os: [linux] 253 | 254 | '@esbuild/linux-x64@0.21.5': 255 | resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} 256 | engines: {node: '>=12'} 257 | cpu: [x64] 258 | os: [linux] 259 | 260 | '@esbuild/linux-x64@0.27.1': 261 | resolution: {integrity: sha512-z3H/HYI9MM0HTv3hQZ81f+AKb+yEoCRlUby1F80vbQ5XdzEMyY/9iNlAmhqiBKw4MJXwfgsh7ERGEOhrM1niMA==} 262 | engines: {node: '>=18'} 263 | cpu: [x64] 264 | os: [linux] 265 | 266 | '@esbuild/netbsd-arm64@0.27.1': 267 | resolution: {integrity: sha512-wzC24DxAvk8Em01YmVXyjl96Mr+ecTPyOuADAvjGg+fyBpGmxmcr2E5ttf7Im8D0sXZihpxzO1isus8MdjMCXQ==} 268 | engines: {node: '>=18'} 269 | cpu: [arm64] 270 | os: [netbsd] 271 | 272 | '@esbuild/netbsd-x64@0.21.5': 273 | resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} 274 | engines: {node: '>=12'} 275 | cpu: [x64] 276 | os: [netbsd] 277 | 278 | '@esbuild/netbsd-x64@0.27.1': 279 | resolution: {integrity: sha512-1YQ8ybGi2yIXswu6eNzJsrYIGFpnlzEWRl6iR5gMgmsrR0FcNoV1m9k9sc3PuP5rUBLshOZylc9nqSgymI+TYg==} 280 | engines: {node: '>=18'} 281 | cpu: [x64] 282 | os: [netbsd] 283 | 284 | '@esbuild/openbsd-arm64@0.27.1': 285 | resolution: {integrity: sha512-5Z+DzLCrq5wmU7RDaMDe2DVXMRm2tTDvX2KU14JJVBN2CT/qov7XVix85QoJqHltpvAOZUAc3ndU56HSMWrv8g==} 286 | engines: {node: '>=18'} 287 | cpu: [arm64] 288 | os: [openbsd] 289 | 290 | '@esbuild/openbsd-x64@0.21.5': 291 | resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} 292 | engines: {node: '>=12'} 293 | cpu: [x64] 294 | os: [openbsd] 295 | 296 | '@esbuild/openbsd-x64@0.27.1': 297 | resolution: {integrity: sha512-Q73ENzIdPF5jap4wqLtsfh8YbYSZ8Q0wnxplOlZUOyZy7B4ZKW8DXGWgTCZmF8VWD7Tciwv5F4NsRf6vYlZtqg==} 298 | engines: {node: '>=18'} 299 | cpu: [x64] 300 | os: [openbsd] 301 | 302 | '@esbuild/openharmony-arm64@0.27.1': 303 | resolution: {integrity: sha512-ajbHrGM/XiK+sXM0JzEbJAen+0E+JMQZ2l4RR4VFwvV9JEERx+oxtgkpoKv1SevhjavK2z2ReHk32pjzktWbGg==} 304 | engines: {node: '>=18'} 305 | cpu: [arm64] 306 | os: [openharmony] 307 | 308 | '@esbuild/sunos-x64@0.21.5': 309 | resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} 310 | engines: {node: '>=12'} 311 | cpu: [x64] 312 | os: [sunos] 313 | 314 | '@esbuild/sunos-x64@0.27.1': 315 | resolution: {integrity: sha512-IPUW+y4VIjuDVn+OMzHc5FV4GubIwPnsz6ubkvN8cuhEqH81NovB53IUlrlBkPMEPxvNnf79MGBoz8rZ2iW8HA==} 316 | engines: {node: '>=18'} 317 | cpu: [x64] 318 | os: [sunos] 319 | 320 | '@esbuild/win32-arm64@0.21.5': 321 | resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} 322 | engines: {node: '>=12'} 323 | cpu: [arm64] 324 | os: [win32] 325 | 326 | '@esbuild/win32-arm64@0.27.1': 327 | resolution: {integrity: sha512-RIVRWiljWA6CdVu8zkWcRmGP7iRRIIwvhDKem8UMBjPql2TXM5PkDVvvrzMtj1V+WFPB4K7zkIGM7VzRtFkjdg==} 328 | engines: {node: '>=18'} 329 | cpu: [arm64] 330 | os: [win32] 331 | 332 | '@esbuild/win32-ia32@0.21.5': 333 | resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} 334 | engines: {node: '>=12'} 335 | cpu: [ia32] 336 | os: [win32] 337 | 338 | '@esbuild/win32-ia32@0.27.1': 339 | resolution: {integrity: sha512-2BR5M8CPbptC1AK5JbJT1fWrHLvejwZidKx3UMSF0ecHMa+smhi16drIrCEggkgviBwLYd5nwrFLSl5Kho96RQ==} 340 | engines: {node: '>=18'} 341 | cpu: [ia32] 342 | os: [win32] 343 | 344 | '@esbuild/win32-x64@0.21.5': 345 | resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} 346 | engines: {node: '>=12'} 347 | cpu: [x64] 348 | os: [win32] 349 | 350 | '@esbuild/win32-x64@0.27.1': 351 | resolution: {integrity: sha512-d5X6RMYv6taIymSk8JBP+nxv8DQAMY6A51GPgusqLdK9wBz5wWIXy1KjTck6HnjE9hqJzJRdk+1p/t5soSbCtw==} 352 | engines: {node: '>=18'} 353 | cpu: [x64] 354 | os: [win32] 355 | 356 | '@jridgewell/sourcemap-codec@1.5.5': 357 | resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} 358 | 359 | '@rollup/rollup-android-arm-eabi@4.53.3': 360 | resolution: {integrity: sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==} 361 | cpu: [arm] 362 | os: [android] 363 | 364 | '@rollup/rollup-android-arm64@4.53.3': 365 | resolution: {integrity: sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==} 366 | cpu: [arm64] 367 | os: [android] 368 | 369 | '@rollup/rollup-darwin-arm64@4.53.3': 370 | resolution: {integrity: sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==} 371 | cpu: [arm64] 372 | os: [darwin] 373 | 374 | '@rollup/rollup-darwin-x64@4.53.3': 375 | resolution: {integrity: sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==} 376 | cpu: [x64] 377 | os: [darwin] 378 | 379 | '@rollup/rollup-freebsd-arm64@4.53.3': 380 | resolution: {integrity: sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==} 381 | cpu: [arm64] 382 | os: [freebsd] 383 | 384 | '@rollup/rollup-freebsd-x64@4.53.3': 385 | resolution: {integrity: sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==} 386 | cpu: [x64] 387 | os: [freebsd] 388 | 389 | '@rollup/rollup-linux-arm-gnueabihf@4.53.3': 390 | resolution: {integrity: sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==} 391 | cpu: [arm] 392 | os: [linux] 393 | 394 | '@rollup/rollup-linux-arm-musleabihf@4.53.3': 395 | resolution: {integrity: sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==} 396 | cpu: [arm] 397 | os: [linux] 398 | 399 | '@rollup/rollup-linux-arm64-gnu@4.53.3': 400 | resolution: {integrity: sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==} 401 | cpu: [arm64] 402 | os: [linux] 403 | 404 | '@rollup/rollup-linux-arm64-musl@4.53.3': 405 | resolution: {integrity: sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==} 406 | cpu: [arm64] 407 | os: [linux] 408 | 409 | '@rollup/rollup-linux-loong64-gnu@4.53.3': 410 | resolution: {integrity: sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==} 411 | cpu: [loong64] 412 | os: [linux] 413 | 414 | '@rollup/rollup-linux-ppc64-gnu@4.53.3': 415 | resolution: {integrity: sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==} 416 | cpu: [ppc64] 417 | os: [linux] 418 | 419 | '@rollup/rollup-linux-riscv64-gnu@4.53.3': 420 | resolution: {integrity: sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==} 421 | cpu: [riscv64] 422 | os: [linux] 423 | 424 | '@rollup/rollup-linux-riscv64-musl@4.53.3': 425 | resolution: {integrity: sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==} 426 | cpu: [riscv64] 427 | os: [linux] 428 | 429 | '@rollup/rollup-linux-s390x-gnu@4.53.3': 430 | resolution: {integrity: sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==} 431 | cpu: [s390x] 432 | os: [linux] 433 | 434 | '@rollup/rollup-linux-x64-gnu@4.53.3': 435 | resolution: {integrity: sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==} 436 | cpu: [x64] 437 | os: [linux] 438 | 439 | '@rollup/rollup-linux-x64-musl@4.53.3': 440 | resolution: {integrity: sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==} 441 | cpu: [x64] 442 | os: [linux] 443 | 444 | '@rollup/rollup-openharmony-arm64@4.53.3': 445 | resolution: {integrity: sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==} 446 | cpu: [arm64] 447 | os: [openharmony] 448 | 449 | '@rollup/rollup-win32-arm64-msvc@4.53.3': 450 | resolution: {integrity: sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==} 451 | cpu: [arm64] 452 | os: [win32] 453 | 454 | '@rollup/rollup-win32-ia32-msvc@4.53.3': 455 | resolution: {integrity: sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==} 456 | cpu: [ia32] 457 | os: [win32] 458 | 459 | '@rollup/rollup-win32-x64-gnu@4.53.3': 460 | resolution: {integrity: sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==} 461 | cpu: [x64] 462 | os: [win32] 463 | 464 | '@rollup/rollup-win32-x64-msvc@4.53.3': 465 | resolution: {integrity: sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==} 466 | cpu: [x64] 467 | os: [win32] 468 | 469 | '@types/estree@1.0.8': 470 | resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} 471 | 472 | '@types/node@22.19.1': 473 | resolution: {integrity: sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ==} 474 | 475 | '@vitest/expect@2.1.9': 476 | resolution: {integrity: sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==} 477 | 478 | '@vitest/mocker@2.1.9': 479 | resolution: {integrity: sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==} 480 | peerDependencies: 481 | msw: ^2.4.9 482 | vite: ^5.0.0 483 | peerDependenciesMeta: 484 | msw: 485 | optional: true 486 | vite: 487 | optional: true 488 | 489 | '@vitest/pretty-format@2.1.9': 490 | resolution: {integrity: sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==} 491 | 492 | '@vitest/runner@2.1.9': 493 | resolution: {integrity: sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==} 494 | 495 | '@vitest/snapshot@2.1.9': 496 | resolution: {integrity: sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==} 497 | 498 | '@vitest/spy@2.1.9': 499 | resolution: {integrity: sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ==} 500 | 501 | '@vitest/utils@2.1.9': 502 | resolution: {integrity: sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==} 503 | 504 | assertion-error@2.0.1: 505 | resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} 506 | engines: {node: '>=12'} 507 | 508 | base64-js@1.5.1: 509 | resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} 510 | 511 | buffer@5.7.1: 512 | resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} 513 | 514 | cac@6.7.14: 515 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 516 | engines: {node: '>=8'} 517 | 518 | chai@5.3.3: 519 | resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} 520 | engines: {node: '>=18'} 521 | 522 | check-error@2.1.1: 523 | resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} 524 | engines: {node: '>= 16'} 525 | 526 | debug@4.4.3: 527 | resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} 528 | engines: {node: '>=6.0'} 529 | peerDependencies: 530 | supports-color: '*' 531 | peerDependenciesMeta: 532 | supports-color: 533 | optional: true 534 | 535 | deep-eql@5.0.2: 536 | resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} 537 | engines: {node: '>=6'} 538 | 539 | es-module-lexer@1.7.0: 540 | resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} 541 | 542 | esbuild@0.21.5: 543 | resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} 544 | engines: {node: '>=12'} 545 | hasBin: true 546 | 547 | esbuild@0.27.1: 548 | resolution: {integrity: sha512-yY35KZckJJuVVPXpvjgxiCuVEJT67F6zDeVTv4rizyPrfGBUpZQsvmxnN+C371c2esD/hNMjj4tpBhuueLN7aA==} 549 | engines: {node: '>=18'} 550 | hasBin: true 551 | 552 | estree-walker@3.0.3: 553 | resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} 554 | 555 | expect-type@1.2.2: 556 | resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} 557 | engines: {node: '>=12.0.0'} 558 | 559 | fsevents@2.3.3: 560 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 561 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 562 | os: [darwin] 563 | 564 | get-tsconfig@4.13.0: 565 | resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} 566 | 567 | ieee754@1.2.1: 568 | resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} 569 | 570 | loupe@3.2.1: 571 | resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} 572 | 573 | magic-string@0.30.21: 574 | resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} 575 | 576 | ms@2.1.3: 577 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 578 | 579 | nanoid@3.3.11: 580 | resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} 581 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 582 | hasBin: true 583 | 584 | pathe@1.1.2: 585 | resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} 586 | 587 | pathval@2.0.1: 588 | resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} 589 | engines: {node: '>= 14.16'} 590 | 591 | picocolors@1.1.1: 592 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 593 | 594 | postcss@8.5.6: 595 | resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} 596 | engines: {node: ^10 || ^12 || >=14} 597 | 598 | resolve-pkg-maps@1.0.0: 599 | resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} 600 | 601 | rollup@4.53.3: 602 | resolution: {integrity: sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==} 603 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 604 | hasBin: true 605 | 606 | siginfo@2.0.0: 607 | resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} 608 | 609 | source-map-js@1.2.1: 610 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 611 | engines: {node: '>=0.10.0'} 612 | 613 | stackback@0.0.2: 614 | resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} 615 | 616 | std-env@3.10.0: 617 | resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} 618 | 619 | through@2.3.8: 620 | resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} 621 | 622 | tinybench@2.9.0: 623 | resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} 624 | 625 | tinyexec@0.3.2: 626 | resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} 627 | 628 | tinypool@1.1.1: 629 | resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} 630 | engines: {node: ^18.0.0 || >=20.0.0} 631 | 632 | tinyrainbow@1.2.0: 633 | resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} 634 | engines: {node: '>=14.0.0'} 635 | 636 | tinyspy@3.0.2: 637 | resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} 638 | engines: {node: '>=14.0.0'} 639 | 640 | tsx@4.21.0: 641 | resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} 642 | engines: {node: '>=18.0.0'} 643 | hasBin: true 644 | 645 | typescript@5.9.3: 646 | resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} 647 | engines: {node: '>=14.17'} 648 | hasBin: true 649 | 650 | unbzip2-stream@1.4.3: 651 | resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} 652 | 653 | undici-types@6.21.0: 654 | resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} 655 | 656 | vite-node@2.1.9: 657 | resolution: {integrity: sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==} 658 | engines: {node: ^18.0.0 || >=20.0.0} 659 | hasBin: true 660 | 661 | vite@5.4.21: 662 | resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==} 663 | engines: {node: ^18.0.0 || >=20.0.0} 664 | hasBin: true 665 | peerDependencies: 666 | '@types/node': ^18.0.0 || >=20.0.0 667 | less: '*' 668 | lightningcss: ^1.21.0 669 | sass: '*' 670 | sass-embedded: '*' 671 | stylus: '*' 672 | sugarss: '*' 673 | terser: ^5.4.0 674 | peerDependenciesMeta: 675 | '@types/node': 676 | optional: true 677 | less: 678 | optional: true 679 | lightningcss: 680 | optional: true 681 | sass: 682 | optional: true 683 | sass-embedded: 684 | optional: true 685 | stylus: 686 | optional: true 687 | sugarss: 688 | optional: true 689 | terser: 690 | optional: true 691 | 692 | vitest@2.1.9: 693 | resolution: {integrity: sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==} 694 | engines: {node: ^18.0.0 || >=20.0.0} 695 | hasBin: true 696 | peerDependencies: 697 | '@edge-runtime/vm': '*' 698 | '@types/node': ^18.0.0 || >=20.0.0 699 | '@vitest/browser': 2.1.9 700 | '@vitest/ui': 2.1.9 701 | happy-dom: '*' 702 | jsdom: '*' 703 | peerDependenciesMeta: 704 | '@edge-runtime/vm': 705 | optional: true 706 | '@types/node': 707 | optional: true 708 | '@vitest/browser': 709 | optional: true 710 | '@vitest/ui': 711 | optional: true 712 | happy-dom: 713 | optional: true 714 | jsdom: 715 | optional: true 716 | 717 | why-is-node-running@2.3.0: 718 | resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} 719 | engines: {node: '>=8'} 720 | hasBin: true 721 | 722 | snapshots: 723 | 724 | '@esbuild/aix-ppc64@0.21.5': 725 | optional: true 726 | 727 | '@esbuild/aix-ppc64@0.27.1': 728 | optional: true 729 | 730 | '@esbuild/android-arm64@0.21.5': 731 | optional: true 732 | 733 | '@esbuild/android-arm64@0.27.1': 734 | optional: true 735 | 736 | '@esbuild/android-arm@0.21.5': 737 | optional: true 738 | 739 | '@esbuild/android-arm@0.27.1': 740 | optional: true 741 | 742 | '@esbuild/android-x64@0.21.5': 743 | optional: true 744 | 745 | '@esbuild/android-x64@0.27.1': 746 | optional: true 747 | 748 | '@esbuild/darwin-arm64@0.21.5': 749 | optional: true 750 | 751 | '@esbuild/darwin-arm64@0.27.1': 752 | optional: true 753 | 754 | '@esbuild/darwin-x64@0.21.5': 755 | optional: true 756 | 757 | '@esbuild/darwin-x64@0.27.1': 758 | optional: true 759 | 760 | '@esbuild/freebsd-arm64@0.21.5': 761 | optional: true 762 | 763 | '@esbuild/freebsd-arm64@0.27.1': 764 | optional: true 765 | 766 | '@esbuild/freebsd-x64@0.21.5': 767 | optional: true 768 | 769 | '@esbuild/freebsd-x64@0.27.1': 770 | optional: true 771 | 772 | '@esbuild/linux-arm64@0.21.5': 773 | optional: true 774 | 775 | '@esbuild/linux-arm64@0.27.1': 776 | optional: true 777 | 778 | '@esbuild/linux-arm@0.21.5': 779 | optional: true 780 | 781 | '@esbuild/linux-arm@0.27.1': 782 | optional: true 783 | 784 | '@esbuild/linux-ia32@0.21.5': 785 | optional: true 786 | 787 | '@esbuild/linux-ia32@0.27.1': 788 | optional: true 789 | 790 | '@esbuild/linux-loong64@0.21.5': 791 | optional: true 792 | 793 | '@esbuild/linux-loong64@0.27.1': 794 | optional: true 795 | 796 | '@esbuild/linux-mips64el@0.21.5': 797 | optional: true 798 | 799 | '@esbuild/linux-mips64el@0.27.1': 800 | optional: true 801 | 802 | '@esbuild/linux-ppc64@0.21.5': 803 | optional: true 804 | 805 | '@esbuild/linux-ppc64@0.27.1': 806 | optional: true 807 | 808 | '@esbuild/linux-riscv64@0.21.5': 809 | optional: true 810 | 811 | '@esbuild/linux-riscv64@0.27.1': 812 | optional: true 813 | 814 | '@esbuild/linux-s390x@0.21.5': 815 | optional: true 816 | 817 | '@esbuild/linux-s390x@0.27.1': 818 | optional: true 819 | 820 | '@esbuild/linux-x64@0.21.5': 821 | optional: true 822 | 823 | '@esbuild/linux-x64@0.27.1': 824 | optional: true 825 | 826 | '@esbuild/netbsd-arm64@0.27.1': 827 | optional: true 828 | 829 | '@esbuild/netbsd-x64@0.21.5': 830 | optional: true 831 | 832 | '@esbuild/netbsd-x64@0.27.1': 833 | optional: true 834 | 835 | '@esbuild/openbsd-arm64@0.27.1': 836 | optional: true 837 | 838 | '@esbuild/openbsd-x64@0.21.5': 839 | optional: true 840 | 841 | '@esbuild/openbsd-x64@0.27.1': 842 | optional: true 843 | 844 | '@esbuild/openharmony-arm64@0.27.1': 845 | optional: true 846 | 847 | '@esbuild/sunos-x64@0.21.5': 848 | optional: true 849 | 850 | '@esbuild/sunos-x64@0.27.1': 851 | optional: true 852 | 853 | '@esbuild/win32-arm64@0.21.5': 854 | optional: true 855 | 856 | '@esbuild/win32-arm64@0.27.1': 857 | optional: true 858 | 859 | '@esbuild/win32-ia32@0.21.5': 860 | optional: true 861 | 862 | '@esbuild/win32-ia32@0.27.1': 863 | optional: true 864 | 865 | '@esbuild/win32-x64@0.21.5': 866 | optional: true 867 | 868 | '@esbuild/win32-x64@0.27.1': 869 | optional: true 870 | 871 | '@jridgewell/sourcemap-codec@1.5.5': {} 872 | 873 | '@rollup/rollup-android-arm-eabi@4.53.3': 874 | optional: true 875 | 876 | '@rollup/rollup-android-arm64@4.53.3': 877 | optional: true 878 | 879 | '@rollup/rollup-darwin-arm64@4.53.3': 880 | optional: true 881 | 882 | '@rollup/rollup-darwin-x64@4.53.3': 883 | optional: true 884 | 885 | '@rollup/rollup-freebsd-arm64@4.53.3': 886 | optional: true 887 | 888 | '@rollup/rollup-freebsd-x64@4.53.3': 889 | optional: true 890 | 891 | '@rollup/rollup-linux-arm-gnueabihf@4.53.3': 892 | optional: true 893 | 894 | '@rollup/rollup-linux-arm-musleabihf@4.53.3': 895 | optional: true 896 | 897 | '@rollup/rollup-linux-arm64-gnu@4.53.3': 898 | optional: true 899 | 900 | '@rollup/rollup-linux-arm64-musl@4.53.3': 901 | optional: true 902 | 903 | '@rollup/rollup-linux-loong64-gnu@4.53.3': 904 | optional: true 905 | 906 | '@rollup/rollup-linux-ppc64-gnu@4.53.3': 907 | optional: true 908 | 909 | '@rollup/rollup-linux-riscv64-gnu@4.53.3': 910 | optional: true 911 | 912 | '@rollup/rollup-linux-riscv64-musl@4.53.3': 913 | optional: true 914 | 915 | '@rollup/rollup-linux-s390x-gnu@4.53.3': 916 | optional: true 917 | 918 | '@rollup/rollup-linux-x64-gnu@4.53.3': 919 | optional: true 920 | 921 | '@rollup/rollup-linux-x64-musl@4.53.3': 922 | optional: true 923 | 924 | '@rollup/rollup-openharmony-arm64@4.53.3': 925 | optional: true 926 | 927 | '@rollup/rollup-win32-arm64-msvc@4.53.3': 928 | optional: true 929 | 930 | '@rollup/rollup-win32-ia32-msvc@4.53.3': 931 | optional: true 932 | 933 | '@rollup/rollup-win32-x64-gnu@4.53.3': 934 | optional: true 935 | 936 | '@rollup/rollup-win32-x64-msvc@4.53.3': 937 | optional: true 938 | 939 | '@types/estree@1.0.8': {} 940 | 941 | '@types/node@22.19.1': 942 | dependencies: 943 | undici-types: 6.21.0 944 | 945 | '@vitest/expect@2.1.9': 946 | dependencies: 947 | '@vitest/spy': 2.1.9 948 | '@vitest/utils': 2.1.9 949 | chai: 5.3.3 950 | tinyrainbow: 1.2.0 951 | 952 | '@vitest/mocker@2.1.9(vite@5.4.21(@types/node@22.19.1))': 953 | dependencies: 954 | '@vitest/spy': 2.1.9 955 | estree-walker: 3.0.3 956 | magic-string: 0.30.21 957 | optionalDependencies: 958 | vite: 5.4.21(@types/node@22.19.1) 959 | 960 | '@vitest/pretty-format@2.1.9': 961 | dependencies: 962 | tinyrainbow: 1.2.0 963 | 964 | '@vitest/runner@2.1.9': 965 | dependencies: 966 | '@vitest/utils': 2.1.9 967 | pathe: 1.1.2 968 | 969 | '@vitest/snapshot@2.1.9': 970 | dependencies: 971 | '@vitest/pretty-format': 2.1.9 972 | magic-string: 0.30.21 973 | pathe: 1.1.2 974 | 975 | '@vitest/spy@2.1.9': 976 | dependencies: 977 | tinyspy: 3.0.2 978 | 979 | '@vitest/utils@2.1.9': 980 | dependencies: 981 | '@vitest/pretty-format': 2.1.9 982 | loupe: 3.2.1 983 | tinyrainbow: 1.2.0 984 | 985 | assertion-error@2.0.1: {} 986 | 987 | base64-js@1.5.1: {} 988 | 989 | buffer@5.7.1: 990 | dependencies: 991 | base64-js: 1.5.1 992 | ieee754: 1.2.1 993 | 994 | cac@6.7.14: {} 995 | 996 | chai@5.3.3: 997 | dependencies: 998 | assertion-error: 2.0.1 999 | check-error: 2.1.1 1000 | deep-eql: 5.0.2 1001 | loupe: 3.2.1 1002 | pathval: 2.0.1 1003 | 1004 | check-error@2.1.1: {} 1005 | 1006 | debug@4.4.3: 1007 | dependencies: 1008 | ms: 2.1.3 1009 | 1010 | deep-eql@5.0.2: {} 1011 | 1012 | es-module-lexer@1.7.0: {} 1013 | 1014 | esbuild@0.21.5: 1015 | optionalDependencies: 1016 | '@esbuild/aix-ppc64': 0.21.5 1017 | '@esbuild/android-arm': 0.21.5 1018 | '@esbuild/android-arm64': 0.21.5 1019 | '@esbuild/android-x64': 0.21.5 1020 | '@esbuild/darwin-arm64': 0.21.5 1021 | '@esbuild/darwin-x64': 0.21.5 1022 | '@esbuild/freebsd-arm64': 0.21.5 1023 | '@esbuild/freebsd-x64': 0.21.5 1024 | '@esbuild/linux-arm': 0.21.5 1025 | '@esbuild/linux-arm64': 0.21.5 1026 | '@esbuild/linux-ia32': 0.21.5 1027 | '@esbuild/linux-loong64': 0.21.5 1028 | '@esbuild/linux-mips64el': 0.21.5 1029 | '@esbuild/linux-ppc64': 0.21.5 1030 | '@esbuild/linux-riscv64': 0.21.5 1031 | '@esbuild/linux-s390x': 0.21.5 1032 | '@esbuild/linux-x64': 0.21.5 1033 | '@esbuild/netbsd-x64': 0.21.5 1034 | '@esbuild/openbsd-x64': 0.21.5 1035 | '@esbuild/sunos-x64': 0.21.5 1036 | '@esbuild/win32-arm64': 0.21.5 1037 | '@esbuild/win32-ia32': 0.21.5 1038 | '@esbuild/win32-x64': 0.21.5 1039 | 1040 | esbuild@0.27.1: 1041 | optionalDependencies: 1042 | '@esbuild/aix-ppc64': 0.27.1 1043 | '@esbuild/android-arm': 0.27.1 1044 | '@esbuild/android-arm64': 0.27.1 1045 | '@esbuild/android-x64': 0.27.1 1046 | '@esbuild/darwin-arm64': 0.27.1 1047 | '@esbuild/darwin-x64': 0.27.1 1048 | '@esbuild/freebsd-arm64': 0.27.1 1049 | '@esbuild/freebsd-x64': 0.27.1 1050 | '@esbuild/linux-arm': 0.27.1 1051 | '@esbuild/linux-arm64': 0.27.1 1052 | '@esbuild/linux-ia32': 0.27.1 1053 | '@esbuild/linux-loong64': 0.27.1 1054 | '@esbuild/linux-mips64el': 0.27.1 1055 | '@esbuild/linux-ppc64': 0.27.1 1056 | '@esbuild/linux-riscv64': 0.27.1 1057 | '@esbuild/linux-s390x': 0.27.1 1058 | '@esbuild/linux-x64': 0.27.1 1059 | '@esbuild/netbsd-arm64': 0.27.1 1060 | '@esbuild/netbsd-x64': 0.27.1 1061 | '@esbuild/openbsd-arm64': 0.27.1 1062 | '@esbuild/openbsd-x64': 0.27.1 1063 | '@esbuild/openharmony-arm64': 0.27.1 1064 | '@esbuild/sunos-x64': 0.27.1 1065 | '@esbuild/win32-arm64': 0.27.1 1066 | '@esbuild/win32-ia32': 0.27.1 1067 | '@esbuild/win32-x64': 0.27.1 1068 | 1069 | estree-walker@3.0.3: 1070 | dependencies: 1071 | '@types/estree': 1.0.8 1072 | 1073 | expect-type@1.2.2: {} 1074 | 1075 | fsevents@2.3.3: 1076 | optional: true 1077 | 1078 | get-tsconfig@4.13.0: 1079 | dependencies: 1080 | resolve-pkg-maps: 1.0.0 1081 | 1082 | ieee754@1.2.1: {} 1083 | 1084 | loupe@3.2.1: {} 1085 | 1086 | magic-string@0.30.21: 1087 | dependencies: 1088 | '@jridgewell/sourcemap-codec': 1.5.5 1089 | 1090 | ms@2.1.3: {} 1091 | 1092 | nanoid@3.3.11: {} 1093 | 1094 | pathe@1.1.2: {} 1095 | 1096 | pathval@2.0.1: {} 1097 | 1098 | picocolors@1.1.1: {} 1099 | 1100 | postcss@8.5.6: 1101 | dependencies: 1102 | nanoid: 3.3.11 1103 | picocolors: 1.1.1 1104 | source-map-js: 1.2.1 1105 | 1106 | resolve-pkg-maps@1.0.0: {} 1107 | 1108 | rollup@4.53.3: 1109 | dependencies: 1110 | '@types/estree': 1.0.8 1111 | optionalDependencies: 1112 | '@rollup/rollup-android-arm-eabi': 4.53.3 1113 | '@rollup/rollup-android-arm64': 4.53.3 1114 | '@rollup/rollup-darwin-arm64': 4.53.3 1115 | '@rollup/rollup-darwin-x64': 4.53.3 1116 | '@rollup/rollup-freebsd-arm64': 4.53.3 1117 | '@rollup/rollup-freebsd-x64': 4.53.3 1118 | '@rollup/rollup-linux-arm-gnueabihf': 4.53.3 1119 | '@rollup/rollup-linux-arm-musleabihf': 4.53.3 1120 | '@rollup/rollup-linux-arm64-gnu': 4.53.3 1121 | '@rollup/rollup-linux-arm64-musl': 4.53.3 1122 | '@rollup/rollup-linux-loong64-gnu': 4.53.3 1123 | '@rollup/rollup-linux-ppc64-gnu': 4.53.3 1124 | '@rollup/rollup-linux-riscv64-gnu': 4.53.3 1125 | '@rollup/rollup-linux-riscv64-musl': 4.53.3 1126 | '@rollup/rollup-linux-s390x-gnu': 4.53.3 1127 | '@rollup/rollup-linux-x64-gnu': 4.53.3 1128 | '@rollup/rollup-linux-x64-musl': 4.53.3 1129 | '@rollup/rollup-openharmony-arm64': 4.53.3 1130 | '@rollup/rollup-win32-arm64-msvc': 4.53.3 1131 | '@rollup/rollup-win32-ia32-msvc': 4.53.3 1132 | '@rollup/rollup-win32-x64-gnu': 4.53.3 1133 | '@rollup/rollup-win32-x64-msvc': 4.53.3 1134 | fsevents: 2.3.3 1135 | 1136 | siginfo@2.0.0: {} 1137 | 1138 | source-map-js@1.2.1: {} 1139 | 1140 | stackback@0.0.2: {} 1141 | 1142 | std-env@3.10.0: {} 1143 | 1144 | through@2.3.8: {} 1145 | 1146 | tinybench@2.9.0: {} 1147 | 1148 | tinyexec@0.3.2: {} 1149 | 1150 | tinypool@1.1.1: {} 1151 | 1152 | tinyrainbow@1.2.0: {} 1153 | 1154 | tinyspy@3.0.2: {} 1155 | 1156 | tsx@4.21.0: 1157 | dependencies: 1158 | esbuild: 0.27.1 1159 | get-tsconfig: 4.13.0 1160 | optionalDependencies: 1161 | fsevents: 2.3.3 1162 | 1163 | typescript@5.9.3: {} 1164 | 1165 | unbzip2-stream@1.4.3: 1166 | dependencies: 1167 | buffer: 5.7.1 1168 | through: 2.3.8 1169 | 1170 | undici-types@6.21.0: {} 1171 | 1172 | vite-node@2.1.9(@types/node@22.19.1): 1173 | dependencies: 1174 | cac: 6.7.14 1175 | debug: 4.4.3 1176 | es-module-lexer: 1.7.0 1177 | pathe: 1.1.2 1178 | vite: 5.4.21(@types/node@22.19.1) 1179 | transitivePeerDependencies: 1180 | - '@types/node' 1181 | - less 1182 | - lightningcss 1183 | - sass 1184 | - sass-embedded 1185 | - stylus 1186 | - sugarss 1187 | - supports-color 1188 | - terser 1189 | 1190 | vite@5.4.21(@types/node@22.19.1): 1191 | dependencies: 1192 | esbuild: 0.21.5 1193 | postcss: 8.5.6 1194 | rollup: 4.53.3 1195 | optionalDependencies: 1196 | '@types/node': 22.19.1 1197 | fsevents: 2.3.3 1198 | 1199 | vitest@2.1.9(@types/node@22.19.1): 1200 | dependencies: 1201 | '@vitest/expect': 2.1.9 1202 | '@vitest/mocker': 2.1.9(vite@5.4.21(@types/node@22.19.1)) 1203 | '@vitest/pretty-format': 2.1.9 1204 | '@vitest/runner': 2.1.9 1205 | '@vitest/snapshot': 2.1.9 1206 | '@vitest/spy': 2.1.9 1207 | '@vitest/utils': 2.1.9 1208 | chai: 5.3.3 1209 | debug: 4.4.3 1210 | expect-type: 1.2.2 1211 | magic-string: 0.30.21 1212 | pathe: 1.1.2 1213 | std-env: 3.10.0 1214 | tinybench: 2.9.0 1215 | tinyexec: 0.3.2 1216 | tinypool: 1.1.1 1217 | tinyrainbow: 1.2.0 1218 | vite: 5.4.21(@types/node@22.19.1) 1219 | vite-node: 2.1.9(@types/node@22.19.1) 1220 | why-is-node-running: 2.3.0 1221 | optionalDependencies: 1222 | '@types/node': 22.19.1 1223 | transitivePeerDependencies: 1224 | - less 1225 | - lightningcss 1226 | - msw 1227 | - sass 1228 | - sass-embedded 1229 | - stylus 1230 | - sugarss 1231 | - supports-color 1232 | - terser 1233 | 1234 | why-is-node-running@2.3.0: 1235 | dependencies: 1236 | siginfo: 2.0.0 1237 | stackback: 0.0.2 1238 | --------------------------------------------------------------------------------