From 0f06cb8b83d08b926e2762847d32bb06b4c9b85b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakob=20Korde=C5=BE?= Date: Sun, 23 Jun 2024 15:52:45 +0200 Subject: [PATCH] WIP --- .prettierrc | 2 +- .vscode/settings.json | 1 + README.md | 42 +- package.json | 4 +- postcss.config.js | 10 +- scripts/clublog-parser.ts | 70 +- src/app.css | 4 - src/assets/dxcc-entities.json | 2042 ++++++++++++++++++++++ src/assets/dxcc-tree.txt | 2362 +++++++++++++------------- src/components/callsign-input.svelte | 9 +- src/lib/callsign.test.ts | 108 ++ src/lib/callsign.ts | 74 + src/lib/dxcc-util.test.ts | 16 +- src/lib/dxcc-util.ts | 3 + src/lib/models/trie.ts | 4 + src/lib/string-util.test.ts | 40 + src/lib/string-util.ts | 8 +- src/routes/+layout.svelte | 37 +- src/routes/+page.svelte | 85 +- svelte.config.js | 6 +- tailwind.config.js | 13 +- yarn.lock | 51 +- 22 files changed, 3681 insertions(+), 1310 deletions(-) create mode 100644 src/assets/dxcc-entities.json create mode 100644 src/lib/callsign.test.ts create mode 100644 src/lib/string-util.test.ts diff --git a/.prettierrc b/.prettierrc index 9573023..8bc6e86 100644 --- a/.prettierrc +++ b/.prettierrc @@ -3,6 +3,6 @@ "singleQuote": true, "trailingComma": "none", "printWidth": 100, - "plugins": ["prettier-plugin-svelte"], + "plugins": ["prettier-plugin-svelte", "prettier-plugin-tailwindcss"], "overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }] } diff --git a/.vscode/settings.json b/.vscode/settings.json index f9fec36..319096e 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,4 @@ { + "vite.autoStart": false, "cSpell.words": ["callsign", "dxcc", "adif", "graphviz", "clublog"] } diff --git a/README.md b/README.md index 5ce6766..0a130d7 100644 --- a/README.md +++ b/README.md @@ -1,38 +1,18 @@ -# create-svelte +# Callsign Tester -Everything you need to build a Svelte project, powered by [`create-svelte`](https://github.com/sveltejs/kit/tree/main/packages/create-svelte). +An app for checking the format of a callsign and finding the country it belongs to. -## Creating a project +## Obtaining the Clublog prefix database -If you're seeing this, you've probably already done this step. Congrats! +Read how to obtain the Clublog prefix file [here](https://clublog.freshdesk.com/support/solutions/articles/54902-downloading-the-prefixes-and-exceptions-as-xml) + +## Deploying the app + +The app can be deployed using the following command: ```bash -# create a new project in the current directory -npm create svelte@latest - -# create a new project in my-app -npm create svelte@latest my-app +yarn install +yarn build ``` -## Developing - -Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server: - -```bash -npm run dev - -# or start the server and open the app in a new browser tab -npm run dev -- --open -``` - -## Building - -To create a production version of your app: - -```bash -npm run build -``` - -You can preview the production build with `npm run preview`. - -> To deploy your app, you may need to install an [adapter](https://kit.svelte.dev/docs/adapters) for your target environment. +Deploy the contents of the `build` directory to your server. diff --git a/package.json b/package.json index df411e2..5fb6983 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ }, "devDependencies": { "@sveltejs/adapter-auto": "^3.0.0", + "@sveltejs/adapter-static": "^3.0.2", "@sveltejs/kit": "^2.0.0", "@sveltejs/vite-plugin-svelte": "^3.0.0", "@types/eslint": "^8.56.7", @@ -25,8 +26,9 @@ "eslint-plugin-svelte": "^2.36.0", "globals": "^15.0.0", "postcss": "^8.4.38", - "prettier": "^3.1.1", + "prettier": "^3.3.2", "prettier-plugin-svelte": "^3.1.2", + "prettier-plugin-tailwindcss": "^0.6.5", "svelte": "^4.2.7", "svelte-check": "^3.6.0", "tailwindcss": "^3.4.4", diff --git a/postcss.config.js b/postcss.config.js index 2e7af2b..0f77216 100644 --- a/postcss.config.js +++ b/postcss.config.js @@ -1,6 +1,6 @@ export default { - plugins: { - tailwindcss: {}, - autoprefixer: {}, - }, -} + plugins: { + tailwindcss: {}, + autoprefixer: {} + } +}; diff --git a/scripts/clublog-parser.ts b/scripts/clublog-parser.ts index 641d291..a356a8a 100644 --- a/scripts/clublog-parser.ts +++ b/scripts/clublog-parser.ts @@ -1,14 +1,16 @@ +import path from 'path'; +import { fileURLToPath } from 'url'; + const filePath = process.argv[2]; if (!filePath) { console.error('Please provide a file path as the first argument'); process.exit(1); } -const outPath = process.argv[3]; -if (!outPath) { - console.error('Please provide an output path as the second argument'); - process.exit(1); -} +const OUT_DIR = '../src/assets/'; +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const outDir = path.resolve(__dirname, OUT_DIR); +console.log('Outputting to', outDir); import fs from 'fs'; import { parseStringPromise } from 'xml2js'; @@ -21,16 +23,6 @@ const doc: IClublogFile = await parseStringPromise(file); const now = new Date(); -const entities: Map = new Map(); - -for (const entity of doc.clublog.entities[0].entity) { - const id = parseInt(entity.adif[0]); - const name = capitalize(entity.name[0]); - const end = entity.end?.[0]; - if (end && new Date(end) < now) continue; - entities.set(id, name); -} - const prefixes: { call: string; entity: number }[] = []; for (const prefix of doc.clublog.prefixes[0].prefix) { @@ -41,6 +33,7 @@ for (const prefix of doc.clublog.prefixes[0].prefix) { entity: parseInt(prefix.adif[0]) }); } +console.log('Parsed', prefixes.length, 'prefixes'); // Build the initial trie import { TrieNode } from '../src/lib/models/trie'; @@ -52,13 +45,17 @@ for (const { call, entity } of prefixes) { // Merge as many nodes as possible const nodes = new Map([...root.getAllNodes()].map((node) => [node.id, node])); +console.log('Starting merge with', nodes.size, 'nodes'); // Bad merge algorithm, but it works let anyChanged = true; while (anyChanged) { anyChanged = false; for (const a of nodes.values()) { + if (!nodes.has(a.id)) continue; for (const b of nodes.values()) { + if (a === b) continue; + if (!nodes.has(b.id)) continue; if (a.canMerge(b)) { for (const node of nodes.values()) { for (const [k, v] of node.children) { @@ -69,13 +66,48 @@ while (anyChanged) { } nodes.delete(b.id); anyChanged = true; - break; } } - if (anyChanged) break; + } +} +console.log('Finished merge with', nodes.size, 'nodes'); + +// Validate the trie +for (const { call, entity } of prefixes) { + if (root.findRaw(call)?.entity !== entity) { + console.error('Failed to find', call, entity); } } +// Minimize node IDs +let i = 0; +for (const node of root.getAllNodes()) { + node.id = i++; +} + // Output the trie -const out = [...root.getAllNodes()].map((n) => n.encodeToString()).join('\n'); -fs.writeFileSync(outPath, out); +const out = root.encodeToString(); +fs.writeFileSync(path.join(outDir, 'dxcc-tree.txt'), out); + +// Format entities +import { DxccEntity } from '../src/lib/models/dxcc-entity'; + +const entities: DxccEntity[] = []; + +for (const entity of doc.clublog.entities[0].entity) { + const id = parseInt(entity.adif[0]); + const name = capitalize(entity.name[0]); + const cqz = entity.cqz?.[0]; + const cont = entity.cont?.[0]; + const end = entity.end?.[0]; + if (end && new Date(end) < now) continue; + entities.push({ + entity: id, + name, + cqz: cqz ? parseInt(cqz) : undefined, + cont: cont ? cont : undefined + }); +} + +// Output the entities +fs.writeFileSync(path.join(outDir, 'dxcc-entities.json'), JSON.stringify(entities, null, '\t')); diff --git a/src/app.css b/src/app.css index f8824fc..b5c61c9 100644 --- a/src/app.css +++ b/src/app.css @@ -1,7 +1,3 @@ @tailwind base; @tailwind components; @tailwind utilities; - -.btn { - @apply bg-blue-500 text-white py-2 px-4 rounded hover:bg-blue-600 active:bg-blue-700; -} diff --git a/src/assets/dxcc-entities.json b/src/assets/dxcc-entities.json new file mode 100644 index 0000000..1174355 --- /dev/null +++ b/src/assets/dxcc-entities.json @@ -0,0 +1,2042 @@ +[ + { + "entity": 1, + "name": "Canada", + "cqz": 5, + "cont": "NA" + }, + { + "entity": 3, + "name": "Afghanistan", + "cqz": 21, + "cont": "AS" + }, + { + "entity": 4, + "name": "Agalega & St Brandon Islands", + "cqz": 39, + "cont": "AF" + }, + { + "entity": 5, + "name": "Aland Islands", + "cqz": 15, + "cont": "EU" + }, + { + "entity": 6, + "name": "Alaska", + "cqz": 1, + "cont": "NA" + }, + { + "entity": 7, + "name": "Albania", + "cqz": 15, + "cont": "EU" + }, + { + "entity": 9, + "name": "American Samoa", + "cqz": 32, + "cont": "OC" + }, + { + "entity": 10, + "name": "Amsterdam & St Paul Islands", + "cqz": 39, + "cont": "AF" + }, + { + "entity": 11, + "name": "Andaman & Nicobar Islands", + "cqz": 26, + "cont": "AS" + }, + { + "entity": 12, + "name": "Anguilla", + "cqz": 8, + "cont": "NA" + }, + { + "entity": 13, + "name": "Antarctica", + "cqz": 13, + "cont": "AN" + }, + { + "entity": 14, + "name": "Armenia", + "cqz": 21, + "cont": "AS" + }, + { + "entity": 15, + "name": "Asiatic Russia", + "cqz": 17, + "cont": "AS" + }, + { + "entity": 16, + "name": "New Zealand Subantarctic Islands", + "cqz": 32, + "cont": "OC" + }, + { + "entity": 17, + "name": "Aves Island", + "cqz": 8, + "cont": "NA" + }, + { + "entity": 18, + "name": "Azerbaijan", + "cqz": 21, + "cont": "AS" + }, + { + "entity": 20, + "name": "Baker Howland Islands", + "cqz": 31, + "cont": "OC" + }, + { + "entity": 21, + "name": "Balearic Islands", + "cqz": 14, + "cont": "EU" + }, + { + "entity": 22, + "name": "Palau", + "cqz": 27, + "cont": "OC" + }, + { + "entity": 24, + "name": "Bouvet Island", + "cqz": 38, + "cont": "AF" + }, + { + "entity": 27, + "name": "Belarus", + "cqz": 16, + "cont": "EU" + }, + { + "entity": 29, + "name": "Canary Islands", + "cqz": 33, + "cont": "AF" + }, + { + "entity": 31, + "name": "Central Kiribati", + "cqz": 31, + "cont": "OC" + }, + { + "entity": 32, + "name": "Ceuta & Melilla", + "cqz": 33, + "cont": "AF" + }, + { + "entity": 33, + "name": "Chagos Islands", + "cqz": 39, + "cont": "AF" + }, + { + "entity": 34, + "name": "Chatham Island", + "cqz": 32, + "cont": "OC" + }, + { + "entity": 35, + "name": "Christmas Island", + "cqz": 29, + "cont": "OC" + }, + { + "entity": 36, + "name": "Clipperton Island", + "cqz": 7, + "cont": "NA" + }, + { + "entity": 37, + "name": "Cocos Island", + "cqz": 7, + "cont": "NA" + }, + { + "entity": 38, + "name": "Cocos (Keeling) Island", + "cqz": 29, + "cont": "OC" + }, + { + "entity": 40, + "name": "Crete", + "cqz": 20, + "cont": "EU" + }, + { + "entity": 41, + "name": "Crozet Island", + "cqz": 39, + "cont": "AF" + }, + { + "entity": 43, + "name": "Desecheo Island", + "cqz": 8, + "cont": "NA" + }, + { + "entity": 45, + "name": "Dodecanese", + "cqz": 20, + "cont": "EU" + }, + { + "entity": 46, + "name": "East Malaysia", + "cqz": 28, + "cont": "OC" + }, + { + "entity": 47, + "name": "Easter Island", + "cqz": 12, + "cont": "SA" + }, + { + "entity": 48, + "name": "Eastern Kiribati", + "cqz": 31, + "cont": "OC" + }, + { + "entity": 49, + "name": "Equatorial Guinea", + "cqz": 36, + "cont": "AF" + }, + { + "entity": 50, + "name": "Mexico", + "cqz": 6, + "cont": "NA" + }, + { + "entity": 51, + "name": "Eritrea", + "cqz": 37, + "cont": "AF" + }, + { + "entity": 52, + "name": "Estonia", + "cqz": 15, + "cont": "EU" + }, + { + "entity": 53, + "name": "Ethiopia", + "cqz": 37, + "cont": "AF" + }, + { + "entity": 54, + "name": "European Russia", + "cqz": 16, + "cont": "EU" + }, + { + "entity": 56, + "name": "Fernando De Noronha", + "cqz": 11, + "cont": "SA" + }, + { + "entity": 60, + "name": "Bahamas", + "cqz": 8, + "cont": "NA" + }, + { + "entity": 61, + "name": "Franz Josef Land", + "cqz": 40, + "cont": "EU" + }, + { + "entity": 62, + "name": "Barbados", + "cqz": 8, + "cont": "NA" + }, + { + "entity": 63, + "name": "French Guiana", + "cqz": 9, + "cont": "SA" + }, + { + "entity": 64, + "name": "Bermuda", + "cqz": 5, + "cont": "NA" + }, + { + "entity": 65, + "name": "British Virgin Islands", + "cqz": 8, + "cont": "NA" + }, + { + "entity": 66, + "name": "Belize", + "cqz": 7, + "cont": "NA" + }, + { + "entity": 69, + "name": "Cayman Islands", + "cqz": 8, + "cont": "NA" + }, + { + "entity": 70, + "name": "Cuba", + "cqz": 8, + "cont": "NA" + }, + { + "entity": 71, + "name": "Galapagos Islands", + "cqz": 10, + "cont": "SA" + }, + { + "entity": 72, + "name": "Dominican Republic", + "cqz": 8, + "cont": "NA" + }, + { + "entity": 74, + "name": "El Salvador", + "cqz": 7, + "cont": "NA" + }, + { + "entity": 75, + "name": "Georgia", + "cqz": 21, + "cont": "AS" + }, + { + "entity": 76, + "name": "Guatemala", + "cqz": 7, + "cont": "NA" + }, + { + "entity": 77, + "name": "Grenada", + "cqz": 8, + "cont": "NA" + }, + { + "entity": 78, + "name": "Haiti", + "cqz": 8, + "cont": "NA" + }, + { + "entity": 79, + "name": "Guadeloupe", + "cqz": 8, + "cont": "NA" + }, + { + "entity": 80, + "name": "Honduras", + "cqz": 7, + "cont": "NA" + }, + { + "entity": 82, + "name": "Jamaica", + "cqz": 8, + "cont": "NA" + }, + { + "entity": 84, + "name": "Martinique", + "cqz": 8, + "cont": "NA" + }, + { + "entity": 86, + "name": "Nicaragua", + "cqz": 7, + "cont": "NA" + }, + { + "entity": 88, + "name": "Panama", + "cqz": 7, + "cont": "NA" + }, + { + "entity": 89, + "name": "Turks & Caicos Islands", + "cqz": 8, + "cont": "NA" + }, + { + "entity": 90, + "name": "Trinidad & Tobago", + "cqz": 9, + "cont": "SA" + }, + { + "entity": 91, + "name": "Aruba", + "cqz": 9, + "cont": "SA" + }, + { + "entity": 94, + "name": "Antigua & Barbuda", + "cqz": 8, + "cont": "NA" + }, + { + "entity": 95, + "name": "Dominica", + "cqz": 8, + "cont": "NA" + }, + { + "entity": 96, + "name": "Montserrat", + "cqz": 8, + "cont": "NA" + }, + { + "entity": 97, + "name": "Saint Lucia", + "cqz": 8, + "cont": "NA" + }, + { + "entity": 98, + "name": "Saint Vincent", + "cqz": 8, + "cont": "NA" + }, + { + "entity": 99, + "name": "Glorioso Island", + "cqz": 39, + "cont": "AF" + }, + { + "entity": 100, + "name": "Argentina", + "cqz": 13, + "cont": "SA" + }, + { + "entity": 103, + "name": "Guam", + "cqz": 27, + "cont": "OC" + }, + { + "entity": 104, + "name": "Bolivia", + "cqz": 10, + "cont": "SA" + }, + { + "entity": 105, + "name": "Guantanamo Bay", + "cqz": 8, + "cont": "NA" + }, + { + "entity": 106, + "name": "Guernsey", + "cqz": 14, + "cont": "EU" + }, + { + "entity": 107, + "name": "Guinea", + "cqz": 35, + "cont": "AF" + }, + { + "entity": 108, + "name": "Brazil", + "cqz": 11, + "cont": "SA" + }, + { + "entity": 109, + "name": "Guinea-Bissau", + "cqz": 35, + "cont": "AF" + }, + { + "entity": 110, + "name": "Hawaii", + "cqz": 31, + "cont": "OC" + }, + { + "entity": 111, + "name": "Heard Island", + "cqz": 39, + "cont": "AF" + }, + { + "entity": 112, + "name": "Chile", + "cqz": 12, + "cont": "SA" + }, + { + "entity": 114, + "name": "Isle Of Man", + "cqz": 14, + "cont": "EU" + }, + { + "entity": 116, + "name": "Colombia", + "cqz": 9, + "cont": "SA" + }, + { + "entity": 117, + "name": "Itu Hq", + "cqz": 14, + "cont": "EU" + }, + { + "entity": 118, + "name": "Jan Mayen", + "cqz": 40, + "cont": "EU" + }, + { + "entity": 120, + "name": "Ecuador", + "cqz": 10, + "cont": "SA" + }, + { + "entity": 122, + "name": "Jersey", + "cqz": 14, + "cont": "EU" + }, + { + "entity": 123, + "name": "Johnston Island", + "cqz": 31, + "cont": "OC" + }, + { + "entity": 124, + "name": "Juan De Nova, Europa", + "cqz": 39, + "cont": "AF" + }, + { + "entity": 125, + "name": "Juan Fernandez Islands", + "cqz": 12, + "cont": "SA" + }, + { + "entity": 126, + "name": "Kaliningrad", + "cqz": 15, + "cont": "EU" + }, + { + "entity": 129, + "name": "Guyana", + "cqz": 9, + "cont": "SA" + }, + { + "entity": 130, + "name": "Kazakhstan", + "cqz": 17, + "cont": "AS" + }, + { + "entity": 131, + "name": "Kerguelen Island", + "cqz": 39, + "cont": "AF" + }, + { + "entity": 132, + "name": "Paraguay", + "cqz": 11, + "cont": "SA" + }, + { + "entity": 133, + "name": "Kermadec Island", + "cqz": 32, + "cont": "OC" + }, + { + "entity": 135, + "name": "Kyrgyzstan", + "cqz": 17, + "cont": "AS" + }, + { + "entity": 136, + "name": "Peru", + "cqz": 10, + "cont": "SA" + }, + { + "entity": 137, + "name": "Republic Of Korea", + "cqz": 25, + "cont": "AS" + }, + { + "entity": 138, + "name": "Kure Island", + "cqz": 31, + "cont": "OC" + }, + { + "entity": 140, + "name": "Suriname", + "cqz": 9, + "cont": "SA" + }, + { + "entity": 141, + "name": "Falkland Islands", + "cqz": 13, + "cont": "SA" + }, + { + "entity": 142, + "name": "Lakshadweep Islands", + "cqz": 22, + "cont": "AS" + }, + { + "entity": 143, + "name": "Laos", + "cqz": 26, + "cont": "AS" + }, + { + "entity": 144, + "name": "Uruguay", + "cqz": 13, + "cont": "SA" + }, + { + "entity": 145, + "name": "Latvia", + "cqz": 15, + "cont": "EU" + }, + { + "entity": 146, + "name": "Lithuania", + "cqz": 15, + "cont": "EU" + }, + { + "entity": 147, + "name": "Lord Howe Island", + "cqz": 30, + "cont": "OC" + }, + { + "entity": 148, + "name": "Venezuela", + "cqz": 9, + "cont": "SA" + }, + { + "entity": 149, + "name": "Azores", + "cqz": 14, + "cont": "EU" + }, + { + "entity": 150, + "name": "Australia", + "cqz": 30, + "cont": "OC" + }, + { + "entity": 152, + "name": "Macao", + "cqz": 24, + "cont": "AS" + }, + { + "entity": 153, + "name": "Macquarie Island", + "cqz": 30, + "cont": "OC" + }, + { + "entity": 157, + "name": "Nauru", + "cqz": 31, + "cont": "OC" + }, + { + "entity": 158, + "name": "Vanuatu", + "cqz": 32, + "cont": "OC" + }, + { + "entity": 159, + "name": "Maldives", + "cqz": 22, + "cont": "AS" + }, + { + "entity": 160, + "name": "Tonga", + "cqz": 32, + "cont": "OC" + }, + { + "entity": 161, + "name": "Malpelo Island", + "cqz": 9, + "cont": "SA" + }, + { + "entity": 162, + "name": "New Caledonia", + "cqz": 32, + "cont": "OC" + }, + { + "entity": 163, + "name": "Papua New Guinea", + "cqz": 28, + "cont": "OC" + }, + { + "entity": 165, + "name": "Mauritius Island", + "cqz": 39, + "cont": "AF" + }, + { + "entity": 166, + "name": "Mariana Islands", + "cqz": 27, + "cont": "OC" + }, + { + "entity": 167, + "name": "Market Reef", + "cqz": 15, + "cont": "EU" + }, + { + "entity": 168, + "name": "Marshall Islands", + "cqz": 31, + "cont": "OC" + }, + { + "entity": 169, + "name": "Mayotte", + "cqz": 39, + "cont": "AF" + }, + { + "entity": 170, + "name": "New Zealand", + "cqz": 32, + "cont": "OC" + }, + { + "entity": 171, + "name": "Mellish Reef", + "cqz": 30, + "cont": "OC" + }, + { + "entity": 172, + "name": "Pitcairn Island", + "cqz": 32, + "cont": "OC" + }, + { + "entity": 173, + "name": "Micronesia", + "cqz": 27, + "cont": "OC" + }, + { + "entity": 174, + "name": "Midway Island", + "cqz": 31, + "cont": "OC" + }, + { + "entity": 175, + "name": "French Polynesia", + "cqz": 32, + "cont": "OC" + }, + { + "entity": 176, + "name": "Fiji Islands", + "cqz": 32, + "cont": "OC" + }, + { + "entity": 177, + "name": "Minami Torishima", + "cqz": 27, + "cont": "OC" + }, + { + "entity": 179, + "name": "Moldova", + "cqz": 16, + "cont": "EU" + }, + { + "entity": 180, + "name": "Mount Athos", + "cqz": 20, + "cont": "EU" + }, + { + "entity": 181, + "name": "Mozambique", + "cqz": 37, + "cont": "AF" + }, + { + "entity": 182, + "name": "Navassa Island", + "cqz": 8, + "cont": "NA" + }, + { + "entity": 185, + "name": "Solomon Islands", + "cqz": 28, + "cont": "OC" + }, + { + "entity": 187, + "name": "Niger", + "cqz": 35, + "cont": "AF" + }, + { + "entity": 188, + "name": "Niue", + "cqz": 32, + "cont": "OC" + }, + { + "entity": 189, + "name": "Norfolk Island", + "cqz": 32, + "cont": "OC" + }, + { + "entity": 190, + "name": "Samoa", + "cqz": 32, + "cont": "OC" + }, + { + "entity": 191, + "name": "North Cook Islands", + "cqz": 32, + "cont": "OC" + }, + { + "entity": 192, + "name": "Ogasawara", + "cqz": 27, + "cont": "AS" + }, + { + "entity": 195, + "name": "Annobon", + "cqz": 36, + "cont": "AF" + }, + { + "entity": 197, + "name": "Palmyra & Jarvis Islands", + "cqz": 31, + "cont": "OC" + }, + { + "entity": 199, + "name": "Peter 1 Island", + "cqz": 12, + "cont": "AN" + }, + { + "entity": 201, + "name": "Prince Edward & Marion Islands", + "cqz": 38, + "cont": "AF" + }, + { + "entity": 202, + "name": "Puerto Rico", + "cqz": 8, + "cont": "NA" + }, + { + "entity": 203, + "name": "Andorra", + "cqz": 14, + "cont": "EU" + }, + { + "entity": 204, + "name": "Revillagigedo", + "cqz": 6, + "cont": "NA" + }, + { + "entity": 205, + "name": "Ascension Island", + "cqz": 36, + "cont": "AF" + }, + { + "entity": 206, + "name": "Austria", + "cqz": 15, + "cont": "EU" + }, + { + "entity": 207, + "name": "Rodriguez Island", + "cqz": 39, + "cont": "AF" + }, + { + "entity": 209, + "name": "Belgium", + "cqz": 14, + "cont": "EU" + }, + { + "entity": 211, + "name": "Sable Island", + "cqz": 5, + "cont": "NA" + }, + { + "entity": 212, + "name": "Bulgaria", + "cqz": 20, + "cont": "EU" + }, + { + "entity": 213, + "name": "Saint Martin", + "cqz": 8, + "cont": "NA" + }, + { + "entity": 214, + "name": "Corsica", + "cqz": 15, + "cont": "EU" + }, + { + "entity": 215, + "name": "Cyprus", + "cqz": 20, + "cont": "AS" + }, + { + "entity": 216, + "name": "San Andres Island", + "cqz": 7, + "cont": "NA" + }, + { + "entity": 217, + "name": "San Felix Islands", + "cqz": 12, + "cont": "SA" + }, + { + "entity": 219, + "name": "Sao Tome & Principe", + "cqz": 36, + "cont": "AF" + }, + { + "entity": 221, + "name": "Denmark", + "cqz": 14, + "cont": "EU" + }, + { + "entity": 222, + "name": "Faroe Islands", + "cqz": 14, + "cont": "EU" + }, + { + "entity": 223, + "name": "England", + "cqz": 14, + "cont": "EU" + }, + { + "entity": 224, + "name": "Finland", + "cqz": 15, + "cont": "EU" + }, + { + "entity": 225, + "name": "Sardinia", + "cqz": 15, + "cont": "EU" + }, + { + "entity": 227, + "name": "France", + "cqz": 14, + "cont": "EU" + }, + { + "entity": 230, + "name": "Federal Republic Of Germany", + "cqz": 14, + "cont": "EU" + }, + { + "entity": 232, + "name": "Somalia", + "cqz": 37, + "cont": "AF" + }, + { + "entity": 233, + "name": "Gibraltar", + "cqz": 14, + "cont": "EU" + }, + { + "entity": 234, + "name": "South Cook Islands", + "cqz": 32, + "cont": "OC" + }, + { + "entity": 235, + "name": "South Georgia Island", + "cqz": 13, + "cont": "SA" + }, + { + "entity": 236, + "name": "Greece", + "cqz": 20, + "cont": "EU" + }, + { + "entity": 237, + "name": "Greenland", + "cqz": 40, + "cont": "NA" + }, + { + "entity": 238, + "name": "South Orkney Islands", + "cqz": 13, + "cont": "SA" + }, + { + "entity": 239, + "name": "Hungary", + "cqz": 15, + "cont": "EU" + }, + { + "entity": 240, + "name": "South Sandwich Islands", + "cqz": 13, + "cont": "SA" + }, + { + "entity": 241, + "name": "South Shetland Islands", + "cqz": 13, + "cont": "SA" + }, + { + "entity": 242, + "name": "Iceland", + "cqz": 40, + "cont": "EU" + }, + { + "entity": 245, + "name": "Ireland", + "cqz": 14, + "cont": "EU" + }, + { + "entity": 246, + "name": "Sov Military Order Of Malta", + "cqz": 15, + "cont": "EU" + }, + { + "entity": 247, + "name": "Spratly Islands", + "cqz": 26, + "cont": "AS" + }, + { + "entity": 248, + "name": "Italy", + "cqz": 15, + "cont": "EU" + }, + { + "entity": 249, + "name": "Saint Kitts & Nevis", + "cqz": 8, + "cont": "NA" + }, + { + "entity": 250, + "name": "Saint Helena", + "cqz": 36, + "cont": "AF" + }, + { + "entity": 251, + "name": "Liechtenstein", + "cqz": 14, + "cont": "EU" + }, + { + "entity": 252, + "name": "Saint Paul Island", + "cqz": 5, + "cont": "NA" + }, + { + "entity": 253, + "name": "Saint Peter And Paul Rocks", + "cqz": 11, + "cont": "SA" + }, + { + "entity": 254, + "name": "Luxembourg", + "cqz": 14, + "cont": "EU" + }, + { + "entity": 256, + "name": "Madeira Islands", + "cqz": 33, + "cont": "AF" + }, + { + "entity": 257, + "name": "Malta", + "cqz": 15, + "cont": "EU" + }, + { + "entity": 259, + "name": "Svalbard", + "cqz": 40, + "cont": "EU" + }, + { + "entity": 260, + "name": "Monaco", + "cqz": 14, + "cont": "EU" + }, + { + "entity": 262, + "name": "Tajikistan", + "cqz": 17, + "cont": "AS" + }, + { + "entity": 263, + "name": "Netherlands", + "cqz": 14, + "cont": "EU" + }, + { + "entity": 265, + "name": "Northern Ireland", + "cqz": 14, + "cont": "EU" + }, + { + "entity": 266, + "name": "Norway", + "cqz": 14, + "cont": "EU" + }, + { + "entity": 269, + "name": "Poland", + "cqz": 15, + "cont": "EU" + }, + { + "entity": 270, + "name": "Tokelau Islands", + "cqz": 31, + "cont": "OC" + }, + { + "entity": 272, + "name": "Portugal", + "cqz": 14, + "cont": "EU" + }, + { + "entity": 273, + "name": "Trindade & Martim Vaz Islands", + "cqz": 11, + "cont": "SA" + }, + { + "entity": 274, + "name": "Tristan Da Cunha & Gough Islands", + "cqz": 38, + "cont": "AF" + }, + { + "entity": 275, + "name": "Romania", + "cqz": 20, + "cont": "EU" + }, + { + "entity": 276, + "name": "Tromelin Island", + "cqz": 39, + "cont": "AF" + }, + { + "entity": 277, + "name": "Saint Pierre & Miquelon", + "cqz": 5, + "cont": "NA" + }, + { + "entity": 278, + "name": "San Marino", + "cqz": 15, + "cont": "EU" + }, + { + "entity": 279, + "name": "Scotland", + "cqz": 14, + "cont": "EU" + }, + { + "entity": 280, + "name": "Turkmenistan", + "cqz": 17, + "cont": "AS" + }, + { + "entity": 281, + "name": "Spain", + "cqz": 14, + "cont": "EU" + }, + { + "entity": 282, + "name": "Tuvalu", + "cqz": 31, + "cont": "OC" + }, + { + "entity": 283, + "name": "Uk Bases On Cyprus", + "cqz": 20, + "cont": "AS" + }, + { + "entity": 284, + "name": "Sweden", + "cqz": 14, + "cont": "EU" + }, + { + "entity": 285, + "name": "Us Virgin Islands", + "cqz": 8, + "cont": "NA" + }, + { + "entity": 286, + "name": "Uganda", + "cqz": 37, + "cont": "AF" + }, + { + "entity": 287, + "name": "Switzerland", + "cqz": 14, + "cont": "EU" + }, + { + "entity": 288, + "name": "Ukraine", + "cqz": 16, + "cont": "EU" + }, + { + "entity": 289, + "name": "United Nations Hq", + "cqz": 5, + "cont": "NA" + }, + { + "entity": 291, + "name": "United States Of America", + "cqz": 5, + "cont": "NA" + }, + { + "entity": 292, + "name": "Uzbekistan", + "cqz": 17, + "cont": "AS" + }, + { + "entity": 293, + "name": "Viet Nam", + "cqz": 26, + "cont": "AS" + }, + { + "entity": 294, + "name": "Wales", + "cqz": 14, + "cont": "EU" + }, + { + "entity": 295, + "name": "Vatican City", + "cqz": 15, + "cont": "EU" + }, + { + "entity": 296, + "name": "Serbia", + "cqz": 15, + "cont": "EU" + }, + { + "entity": 297, + "name": "Wake Island", + "cqz": 31, + "cont": "OC" + }, + { + "entity": 298, + "name": "Wallis & Futuna Islands", + "cqz": 32, + "cont": "OC" + }, + { + "entity": 299, + "name": "West Malaysia", + "cqz": 28, + "cont": "AS" + }, + { + "entity": 301, + "name": "Western Kiribati", + "cqz": 31, + "cont": "OC" + }, + { + "entity": 302, + "name": "Western Sahara", + "cqz": 33, + "cont": "AF" + }, + { + "entity": 303, + "name": "Willis Island", + "cqz": 30, + "cont": "OC" + }, + { + "entity": 304, + "name": "Bahrain", + "cqz": 21, + "cont": "AS" + }, + { + "entity": 305, + "name": "Bangladesh", + "cqz": 22, + "cont": "AS" + }, + { + "entity": 306, + "name": "Bhutan", + "cqz": 22, + "cont": "AS" + }, + { + "entity": 308, + "name": "Costa Rica", + "cqz": 7, + "cont": "NA" + }, + { + "entity": 309, + "name": "Myanmar", + "cqz": 26, + "cont": "AS" + }, + { + "entity": 312, + "name": "Cambodia", + "cqz": 26, + "cont": "AS" + }, + { + "entity": 315, + "name": "Sri Lanka", + "cqz": 22, + "cont": "AS" + }, + { + "entity": 318, + "name": "China", + "cqz": 24, + "cont": "AS" + }, + { + "entity": 321, + "name": "Hong Kong", + "cqz": 24, + "cont": "AS" + }, + { + "entity": 324, + "name": "India", + "cqz": 22, + "cont": "AS" + }, + { + "entity": 327, + "name": "Indonesia", + "cqz": 28, + "cont": "OC" + }, + { + "entity": 330, + "name": "Iran", + "cqz": 21, + "cont": "AS" + }, + { + "entity": 333, + "name": "Iraq", + "cqz": 21, + "cont": "AS" + }, + { + "entity": 336, + "name": "Israel", + "cqz": 20, + "cont": "AS" + }, + { + "entity": 339, + "name": "Japan", + "cqz": 25, + "cont": "AS" + }, + { + "entity": 342, + "name": "Jordan", + "cqz": 20, + "cont": "AS" + }, + { + "entity": 344, + "name": "Dprk (North Korea)", + "cqz": 25, + "cont": "AS" + }, + { + "entity": 345, + "name": "Brunei", + "cqz": 28, + "cont": "OC" + }, + { + "entity": 348, + "name": "Kuwait", + "cqz": 21, + "cont": "AS" + }, + { + "entity": 354, + "name": "Lebanon", + "cqz": 20, + "cont": "AS" + }, + { + "entity": 363, + "name": "Mongolia", + "cqz": 23, + "cont": "AS" + }, + { + "entity": 369, + "name": "Nepal", + "cqz": 22, + "cont": "AS" + }, + { + "entity": 370, + "name": "Oman", + "cqz": 21, + "cont": "AS" + }, + { + "entity": 372, + "name": "Pakistan", + "cqz": 21, + "cont": "AS" + }, + { + "entity": 375, + "name": "Philippines", + "cqz": 27, + "cont": "OC" + }, + { + "entity": 376, + "name": "Qatar", + "cqz": 21, + "cont": "AS" + }, + { + "entity": 378, + "name": "Saudi Arabia", + "cqz": 21, + "cont": "AS" + }, + { + "entity": 379, + "name": "Seychelles Islands", + "cqz": 39, + "cont": "AF" + }, + { + "entity": 381, + "name": "Singapore", + "cqz": 28, + "cont": "AS" + }, + { + "entity": 382, + "name": "Djibouti", + "cqz": 37, + "cont": "AF" + }, + { + "entity": 384, + "name": "Syria", + "cqz": 20, + "cont": "AS" + }, + { + "entity": 386, + "name": "Taiwan", + "cqz": 24, + "cont": "AS" + }, + { + "entity": 387, + "name": "Thailand", + "cqz": 26, + "cont": "AS" + }, + { + "entity": 390, + "name": "Turkey", + "cqz": 20, + "cont": "AS" + }, + { + "entity": 391, + "name": "United Arab Emirates", + "cqz": 21, + "cont": "AS" + }, + { + "entity": 400, + "name": "Algeria", + "cqz": 33, + "cont": "AF" + }, + { + "entity": 401, + "name": "Angola", + "cqz": 36, + "cont": "AF" + }, + { + "entity": 402, + "name": "Botswana", + "cqz": 38, + "cont": "AF" + }, + { + "entity": 404, + "name": "Burundi", + "cqz": 36, + "cont": "AF" + }, + { + "entity": 406, + "name": "Cameroon", + "cqz": 36, + "cont": "AF" + }, + { + "entity": 408, + "name": "Central African Republic", + "cqz": 36, + "cont": "AF" + }, + { + "entity": 409, + "name": "Cape Verde", + "cqz": 35, + "cont": "AF" + }, + { + "entity": 410, + "name": "Chad", + "cqz": 36, + "cont": "AF" + }, + { + "entity": 411, + "name": "Comoros", + "cqz": 39, + "cont": "AF" + }, + { + "entity": 412, + "name": "Republic Of The Congo", + "cqz": 36, + "cont": "AF" + }, + { + "entity": 414, + "name": "Dem. Rep. Of The Congo", + "cqz": 36, + "cont": "AF" + }, + { + "entity": 416, + "name": "Benin", + "cqz": 35, + "cont": "AF" + }, + { + "entity": 420, + "name": "Gabon", + "cqz": 36, + "cont": "AF" + }, + { + "entity": 422, + "name": "The Gambia", + "cqz": 35, + "cont": "AF" + }, + { + "entity": 424, + "name": "Ghana", + "cqz": 35, + "cont": "AF" + }, + { + "entity": 428, + "name": "Cote D'Ivoire", + "cqz": 35, + "cont": "AF" + }, + { + "entity": 430, + "name": "Kenya", + "cqz": 37, + "cont": "AF" + }, + { + "entity": 432, + "name": "Lesotho", + "cqz": 38, + "cont": "AF" + }, + { + "entity": 434, + "name": "Liberia", + "cqz": 35, + "cont": "AF" + }, + { + "entity": 436, + "name": "Libya", + "cqz": 34, + "cont": "AF" + }, + { + "entity": 438, + "name": "Madagascar", + "cqz": 39, + "cont": "AF" + }, + { + "entity": 440, + "name": "Malawi", + "cqz": 37, + "cont": "AF" + }, + { + "entity": 442, + "name": "Mali", + "cqz": 35, + "cont": "AF" + }, + { + "entity": 444, + "name": "Mauritania", + "cqz": 35, + "cont": "AF" + }, + { + "entity": 446, + "name": "Morocco", + "cqz": 33, + "cont": "AF" + }, + { + "entity": 450, + "name": "Nigeria", + "cqz": 35, + "cont": "AF" + }, + { + "entity": 452, + "name": "Zimbabwe", + "cqz": 38, + "cont": "AF" + }, + { + "entity": 453, + "name": "Reunion Island", + "cqz": 39, + "cont": "AF" + }, + { + "entity": 454, + "name": "Rwanda", + "cqz": 36, + "cont": "AF" + }, + { + "entity": 456, + "name": "Senegal", + "cqz": 35, + "cont": "AF" + }, + { + "entity": 458, + "name": "Sierra Leone", + "cqz": 35, + "cont": "AF" + }, + { + "entity": 460, + "name": "Rotuma", + "cqz": 32, + "cont": "OC" + }, + { + "entity": 462, + "name": "Republic Of South Africa", + "cqz": 38, + "cont": "AF" + }, + { + "entity": 464, + "name": "Namibia", + "cqz": 38, + "cont": "AF" + }, + { + "entity": 466, + "name": "Sudan", + "cqz": 34, + "cont": "AF" + }, + { + "entity": 468, + "name": "Kingdom Of Eswatini", + "cqz": 38, + "cont": "AF" + }, + { + "entity": 470, + "name": "Tanzania", + "cqz": 37, + "cont": "AF" + }, + { + "entity": 474, + "name": "Tunisia", + "cqz": 33, + "cont": "AF" + }, + { + "entity": 478, + "name": "Egypt", + "cqz": 34, + "cont": "AF" + }, + { + "entity": 480, + "name": "Burkina Faso", + "cqz": 35, + "cont": "AF" + }, + { + "entity": 482, + "name": "Zambia", + "cqz": 36, + "cont": "AF" + }, + { + "entity": 483, + "name": "Togo", + "cqz": 35, + "cont": "AF" + }, + { + "entity": 489, + "name": "Conway Reef", + "cqz": 32, + "cont": "OC" + }, + { + "entity": 490, + "name": "Banaba Island", + "cqz": 31, + "cont": "OC" + }, + { + "entity": 492, + "name": "Yemen", + "cqz": 21, + "cont": "AS" + }, + { + "entity": 497, + "name": "Croatia", + "cqz": 15, + "cont": "EU" + }, + { + "entity": 499, + "name": "Slovenia", + "cqz": 15, + "cont": "EU" + }, + { + "entity": 501, + "name": "Bosnia-Herzegovina", + "cqz": 15, + "cont": "EU" + }, + { + "entity": 502, + "name": "North Macedonia", + "cqz": 15, + "cont": "EU" + }, + { + "entity": 503, + "name": "Czech Republic", + "cqz": 15, + "cont": "EU" + }, + { + "entity": 504, + "name": "Slovak Republic", + "cqz": 15, + "cont": "EU" + }, + { + "entity": 505, + "name": "Pratas Island", + "cqz": 24, + "cont": "AS" + }, + { + "entity": 506, + "name": "Scarborough Reef", + "cqz": 27, + "cont": "AS" + }, + { + "entity": 507, + "name": "Temotu Province", + "cqz": 32, + "cont": "OC" + }, + { + "entity": 508, + "name": "Austral Islands", + "cqz": 32, + "cont": "OC" + }, + { + "entity": 509, + "name": "Marquesas Islands", + "cqz": 31, + "cont": "OC" + }, + { + "entity": 510, + "name": "Palestine", + "cqz": 20, + "cont": "AS" + }, + { + "entity": 511, + "name": "Timor-Leste", + "cqz": 28, + "cont": "OC" + }, + { + "entity": 512, + "name": "Chesterfield Islands", + "cqz": 30, + "cont": "OC" + }, + { + "entity": 513, + "name": "Ducie Island", + "cqz": 32, + "cont": "OC" + }, + { + "entity": 514, + "name": "Montenegro", + "cqz": 15, + "cont": "EU" + }, + { + "entity": 515, + "name": "Swains Island", + "cqz": 32, + "cont": "OC" + }, + { + "entity": 516, + "name": "Saint Barthelemy", + "cqz": 8, + "cont": "NA" + }, + { + "entity": 517, + "name": "Curacao", + "cqz": 9, + "cont": "SA" + }, + { + "entity": 518, + "name": "Sint Maarten", + "cqz": 8, + "cont": "NA" + }, + { + "entity": 519, + "name": "Saba & St Eustatius", + "cqz": 8, + "cont": "NA" + }, + { + "entity": 520, + "name": "Bonaire", + "cqz": 9, + "cont": "SA" + }, + { + "entity": 521, + "name": "Republic Of South Sudan", + "cqz": 34, + "cont": "AF" + }, + { + "entity": 522, + "name": "Republic Of Kosovo", + "cqz": 15, + "cont": "EU" + } +] diff --git a/src/assets/dxcc-tree.txt b/src/assets/dxcc-tree.txt index cbdf37b..605dc32 100644 --- a/src/assets/dxcc-tree.txt +++ b/src/assets/dxcc-tree.txt @@ -1,1182 +1,1182 @@ -1-B-2 -1-3-6 -1-H-12 -1-6-14 -1-5-16 -1-9-18 -1-S-21 -1-A-25 -1-X-68 -1-C-70 -1-L-99 -1-T-106 -1-D-126 -1-4-145 -1-E-157 -1-F-218 -1-7-283 -1-8-285 -1-I-287 -1-J-298 -1-K-320 -1-N-330 -1-W-331 -1-O-385 -1-P-417 -1-Z-436 -1-Y-599 -1-U-612 -1-V-614 -1-1-852 -1-G-1142 -1-2-1173 -1-R-1424 -1-M-3033 -2-V-3 -2-MNOPQUWX-29 -2-AGHIJLRTY-37 -2-01245678-888 -2-3-54 -2-D-61 -2-Z-67 -2-S-809 -2-9-894 -3=386 -3-9-4 -4-S-5 -4-P-1884 -5=247 -1884=505 -29=386 -29-9-1889 -1889-P-1884 -37=318 -37-3-887 -37-9-894 -37-0-888 -887-GHIJKL-888 -888=318 -894=318 -894-ABCDEF-888 -54=318 -54-GHIJKL-888 -61=318 -61-0-888 -61-3-915 -61-9-894 -915-GHIKL-888 -67=318 -67-0-888 -67-3-887 -67-9-998 -998=318 -998-ABCDE-888 -809=318 -809-0-888 -809-3-887 -809-9-894 -809-7-1544 -1544=506 -6-D-7 -6-HIJKLMNOPQRSTU-888 -6-G-72 -6-EF-271 -6-Z-578 -6-A-811 -6-B-868 -6-X-1188 -6-C-1398 -6-V-1543 -6-Y-3132 -6-W-3136 -7-2-8 -7-A-1177 -8=176 -8-/-9 -9-C-10 -9-R-11 -10=489 -11=460 -1177=468 -72=112 -72-0-81 -72-9-796 -81=47 -81-Z-89 -81-X-1898 -89=125 -1898=217 -796=13 -271=88 -578=269 -811=260 -868-67-869 -868-8-1230 -868-9-1231 -869=4 -1230=165 -1231=207 -1188=107 -1398=49 -1398-0-1399 -1399=195 -1543=474 -3132-/-3133 -3133-P-3134 -3133-B-3135 -3134=199 -3135=24 -3136=293 -12-2-13 -12-WXY-219 -12-4-243 -12-AG-245 -12-BE-247 -12-CD-249 -12-H-253 -12-I-255 -12-JK-256 -12-389OP-271 -12-QR-277 -12-S-279 -12-V-281 -12-Z-282 -12-F-578 -12-N-747 -12-67T-751 -12-U-759 -12-5-785 -12-L-3029 -13=215 -219=227 -243=185 +0-B-1 +0-3-19 +0-H-47 +0-6-71 +0-5-83 +0-9-96 +0-S-114 +0-A-127 +0-X-168 +0-C-184 +0-L-215 +0-T-222 +0-D-248 +0-4-254 +0-E-269 +0-F-285 +0-7-315 +0-8-322 +0-I-326 +0-J-333 +0-K-347 +0-N-358 +0-W-362 +0-O-363 +0-P-374 +0-Z-393 +0-Y-426 +0-U-431 +0-V-444 +0-1-486 +0-G-488 +0-2-495 +0-R-497 +0-M-512 +1-V-2 +1-MNOPQUWX-6 +1-AGHIJLRTY-8 +1-01245678-9 +1-3-12 +1-D-13 +1-Z-15 +1-S-17 +1-9-11 +2=386 +2-9-3 +3-S-4 +3-P-5 +4=247 +5=505 +6=386 +6-9-7 +7-P-5 +8=318 +8-0-9 +8-3-10 +8-9-11 +9=318 +10-GHIJKL-9 +11=318 +11-ABCDEF-9 +12=318 +12-GHIJKL-9 +13=318 +13-0-9 +13-3-14 +13-9-11 +14-GHIKL-9 +15=318 +15-0-9 +15-3-10 +15-9-16 +16=318 +16-ABCDE-9 +17=318 +17-0-9 +17-3-10 +17-9-11 +17-7-18 +18=506 +19-D-20 +19-HIJKLMNOPQRSTU-9 +19-G-26 +19-EF-31 +19-Z-32 +19-A-33 +19-B-34 +19-X-38 +19-C-39 +19-V-41 +19-Y-42 +19-W-46 +20-2-21 +20-A-25 +21=176 +21-/-22 +22-C-23 +22-R-24 +23=489 +24=460 +25=468 +26=112 +26-0-27 +26-9-30 +27=47 +27-Z-28 +27-X-29 +28=125 +29=217 +30=13 +31=88 +32=269 +33=260 +34-67-35 +34-8-36 +34-9-37 +35=4 +36=165 +37=207 +38=107 +39=49 +39-0-40 +40=195 +41=474 +42-/-43 +43-P-44 +43-B-45 +44=199 +45=24 +46=293 +47-2-48 +47-WXY-49 +47-4-50 +47-AG-52 +47-BE-53 +47-CD-55 +47-H-57 +47-I-58 +47-JK-59 +47-389OP-31 +47-QR-62 +47-S-63 +47-V-64 +47-Z-65 +47-F-32 +47-N-66 +47-67T-67 +47-U-68 +47-5-69 +47-L-70 +48=215 +49=227 +50=185 +50-0-51 +51=507 +52=239 +53=287 +53-0-54 +54=251 +55=120 +55-8-56 +56=71 +57=78 +58=72 +59=116 +59-0-60 +60=216 +60-M-61 +61=161 +62=80 +63=387 +64=295 +65=378 +66=333 +67=86 +68=74 +69=462 +70=137 +71-X-72 +71-Z-73 +71-KLMN-70 +71-TU-74 +71-AB-75 +71-DEFGHIJ-76 +71-C-78 +71-O-79 +71-PQRS-80 +71-VW-81 +71-Y-82 +72=438 +73=434 +74=466 +75=478 +76=50 +76-4-77 +77=204 +78=384 +79=232 +80=372 +81=456 +82=82 +83-W-84 +83-CDEFG-85 +83-LM-73 +83-JK-86 +83-PQ-88 +83-B-48 +83-YZ-89 +83-HI-90 +83-RS-72 +83-V-91 +83-X-92 +83-T-93 +83-U-94 +83-NO-95 +84=190 +85=446 +86=116 +86-0-87 +87=216 +88=221 +89=430 +90=470 +91=483 +92=286 +93=444 +94=187 +95=450 +96-L-97 +96-N-98 +96-YZ-99 +96-BCD-100 +96-EF-101 +96-H-102 +96-V-103 +96-IJ-104 +96-OPQRST-105 +96-X-106 +96-U-107 +96-M-108 +96-W-110 +96-G-111 +96-A-112 +96-K-113 +97=458 +98=369 +99=90 +100=330 +101=53 +102=257 +103=381 +104=482 +105=414 +106=454 +107=404 +108=299 +108-0-4 +108-68-109 +109=46 +110=299 +110-68-109 +111=424 +112=497 +113=348 +114-6-103 +114-5-115 +114-ABCDEFGHIJKLM-116 +114-NOPQR-32 +114-T-74 +114-SU-75 +114-V-117 +114-48-69 +114-9-122 +114-7-123 +114-0-124 +114-23-125 +114-WXYZ-126 +115=499 +116=284 +117=236 +117-/-118 +117-9-120 +117-5-121 +118-A-119 +119=180 +120=40 +121=45 +122=219 +123=379 +124=302 +125=305 +126=236 +126-5-121 +126-9-120 +127-3-128 +127-5-129 +127-7-130 +127-X-131 +127-MNO-142 +127-8-73 +127-ABDEFGIJK-146 +127-H-147 +127-L-160 +127-YZ-161 +127-TUVW-162 +127-6-163 +127-2-164 +127-PQRS-80 +127-C-165 +127-9-166 +127-4-167 +128=160 +129=306 +130=376 +131=150 +131-0-132 +131-9-134 +131-68-141 +132=13 +132-M-133 +133=153 +134-CY-135 +134-M-136 +134-WZ-137 +134-X-138 +134-N-139 +134-L-140 +135=38 +136=171 +137=303 +138=35 +139=189 +140=147 +141=150 +142=281 +142-6-143 +142-8-144 +142-9-145 +143=21 +144=29 +145=32 +146=291 +147-0-148 +147-8-149 +147-7-151 +147-3-153 +147-6-154 +147-1-155 +147-2-156 +147-4-157 +147-9-158 +147-5-159 +148=166 +149=9 +149-S-150 +150=515 +151=110 +151-K-152 +152=138 +153=123 +154=110 +155=20 +156=103 +157=174 +158=297 +159=197 +160=6 +161=100 +162=324 +163=391 +164=402 +165=291 +165-5-146 +166=304 +167=370 +168-S-9 +168-QR-26 +168-P-169 +168-ABCDEFGHI-76 +168-W-170 +168-X-171 +168-YZ-174 +168-J-175 +168-M-177 +168-N-178 +168-O-179 +168-T-180 +168-U-181 +168-K-182 +168-L-183 +168-V-46 +169=237 +170=143 +171=272 +171-9-172 +171-3-173 +172=152 +173=256 +174=309 +175=1 +175-13456789-176 +176=1 +177=1 +177-23456789-176 +178=1 +178-04689-176 +179=1 +179-9-176 +180=480 +181=312 +182-0123456789-176 +183-123456789-176 +184-E-185 +184-ABCD-188 +184-LMO-189 +184-P-190 +184-T-191 +184-Q-193 +184-S-194 +184-X-195 +184-VW-196 +184-F-197 +184-G-198 +184-HJ-199 +184-K-200 +184-I-201 +184-Y-202 +184-Z-176 +184-R-205 +184-U-192 +184-89-209 +184-5-210 +184-N-211 +184-6-212 +184-2-213 +184-3-214 +184-4-48 +185=112 +185-0-186 +185-9-30 +186=47 +186-Y-187 +186-IZ-28 +186-X-29 +187=47 +188=112 +188-0-27 +189=70 +190=104 +191=272 +191-39-173 +191-8-192 +192=149 +193=272 +193-239-173 +193-18-192 +194=272 +194-39-173 +194-48-192 +195=144 +195-0-30 +196=144 +197=1 +197-123456789-176 +198=1 +198-129-176 +199=1 +199-2-176 +200=1 +200-02468-176 +201=1 +201-12-176 +202=1 +202-0-203 +202-9-204 +203=211 +204=252 +205=272 +205-8-206 +205-39-173 +205-12-192 +206=149 +206-/-207 +207-D-208 +208=42 +209=181 +210=422 +211=446 +211-289-85 +212=60 +213=157 +214=203 +215-U-216 +215-ABCDEFGHIJKLMN-218 +215-123456789OPQRSTVW-161 +215-X-219 +215-Z-220 +215-Y-221 +216=100 +216-123456789-217 +217-Z-30 +218=266 +219=254 +220=212 +221=146 +222-4-189 +222-9-223 +222-HMPQVW-49 +222-2-224 +222-5-79 +222-ABC-225 +222-F-227 +222-DG-228 +222-EI-229 +222-6-231 +222-8-232 +222-K-233 +222-7-234 +222-J-235 +222-U-236 +222-S-41 +222-Y-237 +222-L-238 +222-T-239 +222-N-240 +222-R-241 +222-Z-242 +222-3-243 +223=501 +224=282 +225=390 +225-1-226 +226=390 +227=242 +228=76 +229=308 +229-9-230 +230=37 +231=3 +232=22 +233=214 +234=278 +235=406 +236=428 +237=416 +238=408 +239=410 +240=412 +241=420 +242=442 243-0-244 -244=507 -245=239 -247=287 -247-0-1096 -1096=251 -249=120 -249-8-251 -251=71 -253=78 -255=72 -256=116 -256-0-263 -263=216 -263-M-832 -832=161 -277=80 -279=387 -281=295 -282=378 -747=333 -751=86 -759=74 -785=462 -3029=137 -14-X-15 -14-Z-208 -14-KLMN-3029 -14-TU-585 -14-AB-588 -14-DEFGHIJ-676 -14-C-865 -14-O-1187 -14-PQRS-1264 -14-VW-1400 -14-Y-1408 -15=438 -208=434 -585=466 -588=478 -676=50 -676-4-694 -694=204 -865=384 -1187=232 -1264=372 -1400=456 -1408=82 -16-W-17 -16-CDEFG-108 -16-LM-208 -16-JK-257 -16-PQ-413 -16-B-13 -16-YZ-1179 -16-HI-1180 -16-RS-15 -16-V-1184 -16-X-1186 -16-T-1218 -16-U-1224 -16-NO-1533 -17=190 -108=446 -257=116 -257-0-260 -260=216 -413=221 -1179=430 -1180=470 -1184=483 -1186=286 -1218=444 -1224=187 -1533=450 -18-L-19 -18-N-20 -18-YZ-23 -18-BCD-211 -18-EF-216 -18-H-1098 -18-V-1106 -18-IJ-1199 -18-OPQRST-1201 -18-X-1207 -18-U-1215 -18-M-1383 -18-W-1390 -18-G-1402 -18-A-1985 -18-K-3055 -19=458 -20=369 -23=90 -211=330 -216=53 -1098=257 -1106=381 -1199=482 -1201=414 -1207=454 -1215=404 -1383=299 -1383-0-5 -1383-68-3125 -3125=46 -1390=299 -1390-68-3125 -1402=424 -1985=497 -3055=348 -21-6-1106 -21-5-561 -21-ABCDEFGHIJKLM-562 -21-NOPQR-578 -21-T-585 -21-SU-588 -21-V-591 -21-48-785 -21-9-1220 -21-7-1221 -21-0-1247 -21-23-1269 -21-WXYZ-1412 -561=499 -562=284 -591=236 -591-/-592 -591-9-1531 -591-5-3138 -592-A-593 -593=180 -1531=40 -3138=45 -1220=219 -1221=379 -1247=302 -1269=305 -1412=236 -1412-5-3138 -1412-9-1531 -25-3-26 -25-5-27 -25-7-28 -25-X-97 -25-MNO-161 -25-8-208 -25-ABDEFGIJK-321 -25-H-334 -25-L-347 -25-YZ-365 -25-TUVW-664 -25-6-1110 -25-2-1198 -25-PQRS-1264 -25-C-2266 -25-9-3000 -25-4-3001 -26=160 -27=306 -28=376 -97=150 -97-0-98 -97-9-633 -97-68-829 -98=13 -98-M-630 -630=153 -633-CY-634 -633-M-642 -633-WZ-645 -633-X-648 -633-N-1099 -633-L-3164 -634=38 -642=171 -645=303 -648=35 -1099=189 -3164=147 -829=150 -161=281 -161-6-171 -161-8-182 -161-9-193 -171=21 -182=29 -193=32 -321=291 -334-0-335 -334-8-825 -334-7-839 -334-3-1300 -334-6-1394 -334-1-1395 -334-2-1396 -334-4-1397 -334-9-1403 -334-5-1861 -335=166 -825=9 -825-S-826 -826=515 -839=110 -839-K-840 -840=138 -1300=123 -1394=110 -1395=20 -1396=103 -1397=174 -1403=297 -1861=197 -347=6 -365=100 -664=324 -1110=391 -1198=402 -2266=291 -2266-5-321 -3000=304 -3001=370 -68-S-888 -68-QR-72 -68-P-409 -68-ABCDEFGHI-676 -68-W-710 -68-X-711 -68-YZ-713 -68-J-802 -68-M-803 -68-N-804 -68-O-805 -68-T-1248 -68-U-1258 -68-K-1352 -68-L-1365 -68-V-3136 -409=237 -710=143 -711=272 -711-9-712 -711-3-862 -712=152 -862=256 -713=309 -802=1 -802-13456789-1344 -1344=1 -803=1 -803-23456789-1344 -804=1 -804-04689-1344 -805=1 -805-9-1344 -1248=480 -1258=312 -1352-0123456789-1344 -1365-123456789-1344 -70-E-71 -70-ABCD-73 -70-LMO-103 -70-P-113 -70-T-114 -70-Q-115 -70-S-116 -70-X-123 -70-VW-124 -70-F-617 -70-G-618 -70-HJ-619 -70-K-620 -70-I-799 -70-Y-800 -70-Z-1344 -70-R-859 -70-U-1242 -70-89-1208 -70-5-1246 -70-N-1254 -70-6-1381 -70-2-1382 -70-3-1982 -70-4-13 -71=112 -71-0-79 -71-9-796 -79=47 -79-Y-80 -79-IZ-89 -79-X-1898 -80=47 -73=112 -73-0-81 -103=70 -113=104 -114=272 -114-39-862 -114-8-1242 -1242=149 -115=272 -115-239-862 -115-18-1242 -116=272 -116-39-862 -116-48-1242 -123=144 -123-0-796 -124=144 -617=1 -617-123456789-1344 -618=1 -618-129-1344 -619=1 -619-2-1344 -620=1 -620-02468-1344 -799=1 -799-12-1344 -800=1 -800-0-1981 -800-9-2648 -1981=211 -2648=252 -859=272 -859-8-860 -859-39-862 -859-12-1242 -860=149 -860-/-1535 -1535-D-1536 -1536=42 -1208=181 -1246=422 -1254=446 -1254-289-108 -1381=60 -1382=157 -1982=203 -99-U-100 -99-ABCDEFGHIJKLMN-354 -99-123456789OPQRSTVW-365 -99-X-383 -99-Z-384 -99-Y-1245 -100=100 -100-123456789-101 -101-Z-796 -354=266 -383=254 -384=212 -1245=146 -106-4-103 -106-9-159 -106-HMPQVW-219 -106-2-594 -106-5-1187 -106-ABC-596 -106-F-605 -106-DG-606 -106-EI-608 -106-6-716 -106-8-886 -106-K-1158 -106-7-1167 -106-J-1216 -106-U-1217 -106-S-1543 -106-Y-1223 -106-L-1225 -106-T-1226 -106-N-1227 -106-R-1228 -106-Z-1229 -106-3-3139 -159=501 -594=282 -596=390 -596-1-601 -601=390 -605=242 -606=76 -608=308 -608-9-610 -610=37 -716=3 -886=22 -1158=214 -1167=278 -1216=406 -1217=428 -1223=416 -1225=408 -1226=410 -1227=412 -1228=420 -1229=442 -3139-0-3140 -3139-1-3141 -3139-2-3142 -3139-3-3143 -3140=301 -3141=31 -3142=48 -3143=490 -126-ABCDFGHIJKLMNOPQR-127 -126-UVWXYZ-144 -126-789ST-3029 -126-23-1210 -126-4-1211 -126-6-1214 -126-5-208 -127=230 -144=375 -1210=401 -1211=409 -1214=411 -145-DEFGHI-144 -145-V-253 -145-T-387 -145-ABC-676 -145-M-764 -145-W-827 -145-O-842 -145-JK-858 -145-L-1388 -145-U-1866 -145-XZ-1872 -145-PQRS-3121 -387=136 -764=148 -764-0-769 -769=17 -827=511 -842=514 -842-6-843 -843=514 -858=18 -1388=75 -1866-/-1867 -1867-U-1868 -1867-I-1869 -1868=289 -1869=117 -1872=336 -3121=315 -157-7-159 -157-ABCDEFGH-161 -157-IJ-203 -157-L-208 -157-PQ-211 -157-T-216 -157-2-279 -157-4-828 -157-Y-856 -157-X-1157 -157-3-1168 -157-S-1243 -157-Z-1387 -157-R-1393 -157-6-1547 -157-K-1560 -157-MNO-1561 -157-UVW-1564 -157-5-2635 -203=245 -828=510 -856=262 -1157=135 -1168=51 -1243=52 -1387=280 -1393=179 -1547=188 -1560=14 -1561=288 -1564=27 -2635=234 -2635-/-3161 -3161-N-3162 -3162=191 -218=227 -218-G-228 -218-J-229 -218-K-230 -218-M-233 -218-O-234 -218-P-239 -218-R-240 -218-W-241 -218-Y-242 -218-T-1163 -218-S-1169 -218-H-1213 -228=79 -229=516 -230=162 -230-/-231 -231-C-232 -232=512 -233=84 -234=175 -234-/-235 -235-A-236 -235-C-237 -235-M-238 -236=508 -237=36 -238=509 -239=277 -240=453 -240-/-1853 -1853-T-1854 -1853-G-1855 -1853-EJ-1856 -1854=276 -1855=99 -1856=124 -241=298 -242=63 -1163-0123678-1164 -1163-5-1250 -1163-4-1252 -1164-Z-1165 -1164-Y-796 -1165=10 -1250-Z-1165 -1250-Y-796 -1250-G-1855 -1250-/-1876 -1876-W-1877 -1876-X-1878 -1877=41 -1878=131 -1252-Z-1165 -1252-Y-796 -1252-T-1854 -1252-J-1856 -1169=213 -1213=169 -283-Z-282 -283-JKLMN-288 -283-S-562 -283-ABCDEFGHI-718 -283-O-1171 -283-P-1189 -283-Q-1190 -283-RTUVWXY-1191 -288=339 -718=327 -1171=492 -1189=432 -1190=440 -1191=400 -285-Z-282 -285-JKLMN-288 -285-S-562 -285-TUVWXY-664 -285-ABCDEFGHI-718 -285-R-1105 -285-P-1107 -285-O-1198 -285-Q-1532 -1105=129 -1107=62 -1532=159 -287=248 -287-W-844 -287-GH-3051 -287-MS-3154 -844-0-845 -845-UVWXYZ-846 -846=225 -3051-9-3052 -3052=248 -3154-0-846 -298-AEFGHIJKLMNOPQRS-288 -298-D-314 -298-TUV-316 -298-Y-319 -298-3-1146 -298-4-1412 -298-6-1154 -298-7-1155 -298-8-1156 -298-2-1219 -298-X-2638 -298-W-2639 -298-5-3127 -314-1-315 -315=192 -315-M-872 -872=177 -316=363 -319=342 -1146=77 -1154=97 -1155=95 -1156=98 -1219=382 -2638=118 -2639=259 -3127=109 -320=291 -320-H-332 -320-L-347 -320-P-350 -320-G-1275 -332-0-335 -332-2-1396 -332-8-342 -332-7-839 -332-6-1394 -332-4-1397 -332-9-1403 -332-1-1395 -332-3-1300 -332-5-1861 -342=9 -342-/-344 -342-S-826 -344-S-826 -350-2-351 -350-1-1409 -350-5-1426 -350-34-2267 -351=285 -1409=182 -1426=43 -2267=202 -1275-4-1276 -1276=105 -330=291 -330-L-348 -330-H-835 -330-P-350 -348=6 -348-D-3055 -835-7-839 -835-3-1300 -835-1-1395 -835-9-1403 -835-0-335 -835-2-1396 -835-4-1397 -835-6-1394 -835-8-1529 -835-5-1861 -1529=9 -331=291 -331-H-334 -331-L-347 -331-P-350 -385-ABC-387 -385-D-390 -385-E-391 -385-FGHI-392 -385-J-396 -385-NOPQRST-401 -385-X-409 -385-WY-410 -385-UVZ-413 -385-M-1293 -385-KL-1294 -390=354 -391=206 -392=224 -392-0-3131 -3131=5 -396=224 -396-0-400 -400=167 -401=209 -410=222 -1293=504 -1294=503 -417-ABCDEFGHI-418 -417-Y-427 -417-PQRSTUVWX-428 -417-Z-560 -417-KLMNO-718 -417-2-867 -417-J-882 -417-3-13 -417-56789-1148 -417-4-1260 -418=263 -427=108 -427-0-497 -497=56 -497-R-498 -497-Z-499 -497-T-548 -497-S-1130 -498=56 -499-FR-498 -499-T-548 -499-S-1130 -548=273 -1130=253 -428=108 -428-0-442 -442-FR-498 -442-Z-499 -442-T-548 -442-S-1130 -560=140 -867=163 -882-2-883 -882-4-884 -882-078-885 -882-56-2641 -883=517 -884=520 -885=518 -2641=519 -1148=344 -1260=91 -436-VWXZ-428 -436-Y-440 -436-2-772 -436-3-773 -436-A-774 -436-BG-775 -436-D-777 -436-K-781 -436-P-783 -436-S-784 -436-RTU-789 -436-8-1097 -436-L-1159 -436-C-1278 -436-M-1385 -436-F-1407 -436-6-1989 -436-O-2643 -440=108 -440-0-520 -520-FR-498 -520-T-548 -520-Z-556 -520-S-1130 -556=56 -556-T-548 -556-S-1130 -772=452 -773=502 -774=7 -775=233 -777-7-778 -777-8-779 -777-9-780 -778=250 -779=205 -780=274 -781=170 -781-2-1547 -781-3-1162 -1162=270 -783=132 -784=462 -784-8-1170 -784-7-796 -1170=201 -789=462 -789-8-1170 -1097=521 -1159=170 -1159-8-1160 -1159-7-1161 -1159-5-1305 -1159-9-1870 -1160=133 -1161=34 -1305=13 -1305-0-1306 -1306=170 -1870=16 -1278-4-1279 -1279=283 -1385=170 -1385-7-1161 -1385-8-1160 -1385-5-796 -1407=69 -1989=522 -2643-N-2644 -2644-E-2645 -2645-2-1344 -599-M-596 -599-A-716 -599-BCDEFGH-718 -599-I-747 -599-J-748 -599-K-865 -599-N-751 -599-OPQR-754 -599-S-759 -599-TUZ-760 -599-VWXY-764 -599-23456789-127 -599-L-1244 -748=158 -754=275 -760=296 -1244=145 -612=54 -612-5RSTUVWYZ-1561 -612-NOPQ-841 -612-JKLM-863 -612-X-874 -612-2-1510 -612-89-1513 -612-ABCDEFGHI-1514 -612-0-1586 -612-1-3106 -841=130 -863=292 -874=288 -874-5-1561 -1510-FK-1511 -1511=126 -1513=15 -1513-FGX-1953 -1513-HIOPSTUVWYZ-1955 -1953=54 -1955=15 -1514-89-1513 -1514-0-1576 -1514-2-1511 -1514-1-3106 -1576=15 -1576-ABHORSTUVWY-1955 -3106-I-1953 -1586=15 -1586-ABHIORSTUVWY-1955 -614-2-615 -614-8-616 -614-ABE-617 -614-C-803 -614-DFGO-619 -614-X-625 -614-K-626 -614-I-627 -614-Z-639 -614-P-650 -614-U-657 -614-TVW-664 -614-9-785 -614-Y-808 -614-3-1145 -614-6-1175 -614-7-1176 -614-5-1178 -614-Q-1233 -614-R-1389 -614-4-3130 -614-JL-3144 -615=94 -616=345 -625=1 -625-29-1344 -626=150 -626-0-628 -626-68-829 -626-9-876 -628=13 -628-M-630 -628-H-1874 -1874=111 -876=189 -876-CY-634 -876-M-642 -876-N-1099 -876-X-648 -876-F-1100 -876-WZ-645 -876-L-3164 -1100-C-634 -1100-N-1099 -1100-W-645 -1100-X-648 -627=150 -627-0-98 -627-9-636 -627-68-829 -636=189 -636-CY-634 -636-M-642 -636-W-645 -636-X-648 -636-L-3164 -639-9-640 -640-Y-634 -640-M-642 -640-W-645 -640-X-648 -640-L-3164 -650-2-651 -650-5-655 -650-8-656 -650-9-1879 -650-6-1988 -650-0-3158 -651-E-652 -651-M-653 -651-V-654 -652=12 -653=96 -654=65 -655=89 -656=141 -656-/-1537 -1537-H-1538 -1537-O-1539 -1537-G-1545 -1537-S-1875 -1538=241 -1539=238 -1545=235 -1875=240 -1879=64 -1988=172 -1988-D-1990 -1990=513 -3158-G-1545 -3158-S-1875 -657=324 -657-4-671 -657-7-1249 -671=11 -1249=142 -808=1 -808-02689-1344 -1145=66 -1175=173 -1176=168 -1178=464 -1233-9-1234 -1233-5-655 -1234=33 -1389=321 -3130=249 -3144=150 -3144-68-829 -852-A-853 -852-M-26 -853=246 -1142=223 -1142-HJ-1143 -1142-PU-1144 -1142-CW-1905 -1142-MS-1907 -1142-IN-1908 -1142-DT-1910 -1143=122 -1144=106 -1905=294 -1907=279 -1908=265 -1910=114 -1173-EOQRV-1174 -1173-AM-1907 -1173-D-1910 -1173-I-1908 -1173-J-1143 -1173-U-1144 -1173-W-1905 -1174=223 -1424=54 -1424-8-1425 -1424-CDEFGJLMNOQTVYZ-1433 -1424-K-1457 -1424-U-1483 -1424-W-1494 -1424-X-1498 -1424-A-1514 -1424-I-1567 -1424-0-1576 -1424-2-1510 -1424-9-1513 -1424-1-3106 -1425=15 -1425-HIOPSTUWYZ-1955 -1425-FGX-1953 -1433-2-1510 -1433-0-1576 -1433-89-1513 -1433-1-3106 -1457-2-1510 -1457-8-1461 -1457-0-1576 -1457-9-1513 -1457-1-3106 -1461=15 -1461-FGX-1953 -1461-HIOPSTUVWY-1955 -1483-2-1510 -1483-0-1586 -1483-89-1513 -1483-1-3106 -1494-2-1510 -1494-0-1610 -1494-89-1513 -1494-1-3106 -1610=15 -1610-ABHORSTUVY-1955 -1498-2-1510 -1498-0-1576 -1498-8-1513 -1498-9-1461 -1498-1-3106 -1567-1-1568 -1567-0-2739 -1567-89-2743 -1568-A-1569 -1568-F-2999 -1569-N-796 -2999=61 -2739=15 -2739-ABH-1955 -2743=15 -2743-X-1953 -3033=223 -3033-CW-1905 -3033-PU-1144 -3033-DT-1910 -3033-AMS-1907 -3033-IN-1908 -3033-HJ-1143 \ No newline at end of file +243-1-245 +243-2-246 +243-3-247 +244=301 +245=31 +246=48 +247=490 +248-ABCDFGHIJKLMNOPQR-249 +248-UVWXYZ-250 +248-789ST-70 +248-23-251 +248-4-252 +248-6-253 +248-5-73 +249=230 +250=375 +251=401 +252=409 +253=411 +254-DEFGHI-250 +254-V-57 +254-T-255 +254-ABC-76 +254-M-256 +254-W-258 +254-O-259 +254-JK-261 +254-L-262 +254-U-263 +254-XZ-267 +254-PQRS-268 +255=136 +256=148 +256-0-257 +257=17 +258=511 +259=514 +259-6-260 +260=514 +261=18 +262=75 +263-/-264 +264-U-265 +264-I-266 +265=289 +266=117 +267=336 +268=315 +269-7-223 +269-ABCDEFGH-142 +269-IJ-270 +269-L-73 +269-PQ-100 +269-T-101 +269-2-63 +269-4-271 +269-Y-272 +269-X-273 +269-3-274 +269-S-275 +269-Z-276 +269-R-277 +269-6-278 +269-K-279 +269-MNO-280 +269-UVW-281 +269-5-282 +270=245 +271=510 +272=262 +273=135 +274=51 +275=52 +276=280 +277=179 +278=188 +279=14 +280=288 +281=27 +282=234 +282-/-283 +283-N-284 +284=191 +285=227 +285-G-286 +285-J-287 +285-K-288 +285-M-291 +285-O-292 +285-P-297 +285-R-298 +285-W-303 +285-Y-304 +285-T-305 +285-S-313 +285-H-314 +286=79 +287=516 +288=162 +288-/-289 +289-C-290 +290=512 +291=84 +292=175 +292-/-293 +293-A-294 +293-C-295 +293-M-296 +294=508 +295=36 +296=509 +297=277 +298=453 +298-/-299 +299-T-300 +299-G-301 +299-EJ-302 +300=276 +301=99 +302=124 +303=298 +304=63 +305-0123678-306 +305-5-308 +305-4-312 +306-Y-30 +306-Z-307 +307=10 +308-Z-307 +308-Y-30 +308-G-301 +308-/-309 +309-W-310 +309-X-311 +310=41 +311=131 +312-Z-307 +312-Y-30 +312-T-300 +312-J-302 +313=213 +314=169 +315-Z-65 +315-JKLMN-316 +315-S-116 +315-ABCDEFGHI-317 +315-O-318 +315-P-319 +315-Q-320 +315-RTUVWXY-321 +316=339 +317=327 +318=492 +319=432 +320=440 +321=400 +322-Z-65 +322-JKLMN-316 +322-S-116 +322-TUVWXY-162 +322-ABCDEFGHI-317 +322-R-323 +322-P-324 +322-O-164 +322-Q-325 +323=129 +324=62 +325=159 +326=248 +326-W-327 +326-GH-330 +326-MS-332 +327-0-328 +328-UVWXYZ-329 +329=225 +330-9-331 +331=248 +332-0-329 +333-AEFGHIJKLMNOPQRS-316 +333-D-334 +333-TUV-337 +333-Y-338 +333-3-339 +333-4-126 +333-6-340 +333-7-341 +333-8-342 +333-2-343 +333-X-344 +333-W-345 +333-5-346 +334-1-335 +335=192 +335-M-336 +336=177 +337=363 +338=342 +339=77 +340=97 +341=95 +342=98 +343=382 +344=118 +345=259 +346=109 +347=291 +347-H-348 +347-L-160 +347-P-351 +347-G-356 +348-0-148 +348-2-156 +348-8-349 +348-7-151 +348-6-154 +348-4-157 +348-9-158 +348-1-155 +348-3-153 +348-5-159 +349=9 +349-/-350 +349-S-150 +350-S-150 +351-5-352 +351-1-353 +351-2-354 +351-34-355 +352=43 +353=182 +354=285 +355=202 +356-4-357 +357=105 +358=291 +358-L-359 +358-H-360 +358-P-351 +359=6 +359-D-113 +360-7-151 +360-3-153 +360-1-155 +360-9-158 +360-0-148 +360-2-156 +360-4-157 +360-6-154 +360-8-361 +360-5-159 +361=9 +362=291 +362-H-147 +362-L-160 +362-P-351 +363-ABC-255 +363-D-364 +363-E-365 +363-FGHI-366 +363-J-368 +363-NOPQRST-370 +363-X-169 +363-WY-371 +363-UVZ-88 +363-M-372 +363-KL-373 +364=354 +365=206 +366=224 +366-0-367 +367=5 +368=224 +368-0-369 +369=167 +370=209 +371=222 +372=504 +373=503 +374-ABCDEFGHI-375 +374-Y-376 +374-PQRSTUVWX-382 +374-Z-384 +374-KLMNO-317 +374-2-385 +374-J-386 +374-3-48 +374-56789-391 +374-4-392 +375=263 +376=108 +376-0-377 +377=56 +377-R-378 +377-Z-379 +377-T-380 +377-S-381 +378=56 +379-FR-378 +379-T-380 +379-S-381 +380=273 +381=253 +382=108 +382-0-383 +383-FR-378 +383-Z-379 +383-T-380 +383-S-381 +384=140 +385=163 +386-2-387 +386-4-388 +386-078-389 +386-56-390 +387=517 +388=520 +389=518 +390=519 +391=344 +392=91 +393-VWXZ-382 +393-Y-394 +393-2-397 +393-3-398 +393-A-399 +393-BG-400 +393-D-401 +393-K-405 +393-P-407 +393-S-408 +393-RTU-410 +393-8-411 +393-L-412 +393-C-418 +393-M-420 +393-F-421 +393-6-422 +393-O-423 +394=108 +394-0-395 +395-FR-378 +395-T-380 +395-Z-396 +395-S-381 +396=56 +396-T-380 +396-S-381 +397=452 +398=502 +399=7 +400=233 +401-7-402 +401-8-403 +401-9-404 +402=250 +403=205 +404=274 +405=170 +405-2-278 +405-3-406 +406=270 +407=132 +408=462 +408-8-409 +408-7-30 +409=201 +410=462 +410-8-409 +411=521 +412=170 +412-8-413 +412-7-414 +412-5-415 +412-9-417 +413=133 +414=34 +415=13 +415-0-416 +416=170 +417=16 +418-4-419 +419=283 +420=170 +420-7-414 +420-8-413 +420-5-30 +421=69 +422=522 +423-N-424 +424-E-425 +425-2-176 +426-M-225 +426-A-231 +426-BCDEFGH-317 +426-I-66 +426-J-427 +426-K-78 +426-N-67 +426-OPQR-428 +426-S-68 +426-TUZ-429 +426-VWXY-256 +426-23456789-249 +426-L-430 +427=158 +428=275 +429=296 +430=145 +431=54 +431-5RSTUVWYZ-280 +431-NOPQ-432 +431-JKLM-433 +431-X-434 +431-2-435 +431-89-437 +431-ABCDEFGHI-440 +431-0-443 +431-1-442 +432=130 +433=292 +434=288 +434-5-280 +435-FK-436 +436=126 +437=15 +437-FGX-438 +437-HIOPSTUVWYZ-439 +438=54 +439=15 +440-89-437 +440-0-441 +440-2-436 +440-1-442 +441=15 +441-ABHORSTUVWY-439 +442-I-438 +443=15 +443-ABHIORSTUVWY-439 +444-2-445 +444-8-446 +444-ABE-197 +444-C-177 +444-DFGO-199 +444-X-447 +444-K-448 +444-I-453 +444-Z-455 +444-P-457 +444-U-473 +444-TVW-162 +444-9-69 +444-Y-476 +444-3-477 +444-6-478 +444-7-479 +444-5-480 +444-Q-481 +444-R-483 +444-4-484 +444-JL-485 +445=94 +446=345 +447=1 +447-29-176 +448=150 +448-0-449 +448-68-141 +448-9-451 +449=13 +449-M-133 +449-H-450 +450=111 +451=189 +451-CY-135 +451-M-136 +451-N-139 +451-X-138 +451-F-452 +451-WZ-137 +451-L-140 +452-C-135 +452-N-139 +452-W-137 +452-X-138 +453=150 +453-0-132 +453-9-454 +453-68-141 +454=189 +454-CY-135 +454-M-136 +454-W-137 +454-X-138 +454-L-140 +455-9-456 +456-Y-135 +456-M-136 +456-W-137 +456-X-138 +456-L-140 +457-2-458 +457-5-462 +457-8-463 +457-9-469 +457-6-470 +457-0-472 +458-E-459 +458-M-460 +458-V-461 +459=12 +460=96 +461=65 +462=89 +463=141 +463-/-464 +464-H-465 +464-O-466 +464-G-467 +464-S-468 +465=241 +466=238 +467=235 +468=240 +469=64 +470=172 +470-D-471 +471=513 +472-G-467 +472-S-468 +473=324 +473-4-474 +473-7-475 +474=11 +475=142 +476=1 +476-02689-176 +477=66 +478=173 +479=168 +480=464 +481-9-482 +481-5-462 +482=33 +483=321 +484=249 +485=150 +485-68-141 +486-A-487 +486-M-128 +487=246 +488=223 +488-HJ-489 +488-PU-490 +488-CW-491 +488-MS-492 +488-IN-493 +488-DT-494 +489=122 +490=106 +491=294 +492=279 +493=265 +494=114 +495-EOQRV-496 +495-AM-492 +495-D-494 +495-I-493 +495-J-489 +495-U-490 +495-W-491 +496=223 +497=54 +497-8-498 +497-CDEFGJLMNOQTVYZ-499 +497-K-500 +497-U-502 +497-W-503 +497-X-505 +497-A-440 +497-I-506 +497-0-441 +497-2-435 +497-9-437 +497-1-442 +498=15 +498-HIOPSTUWYZ-439 +498-FGX-438 +499-2-435 +499-0-441 +499-89-437 +499-1-442 +500-2-435 +500-8-501 +500-0-441 +500-9-437 +500-1-442 +501=15 +501-FGX-438 +501-HIOPSTUVWY-439 +502-2-435 +502-0-443 +502-89-437 +502-1-442 +503-2-435 +503-0-504 +503-89-437 +503-1-442 +504=15 +504-ABHORSTUVY-439 +505-2-435 +505-0-441 +505-8-437 +505-9-501 +505-1-442 +506-1-507 +506-0-510 +506-89-511 +507-A-508 +507-F-509 +508-N-30 +509=61 +510=15 +510-ABH-439 +511=15 +511-X-438 +512=223 +512-CW-491 +512-PU-490 +512-DT-494 +512-AMS-492 +512-IN-493 +512-HJ-489 \ No newline at end of file diff --git a/src/components/callsign-input.svelte b/src/components/callsign-input.svelte index 53d6569..c003e6a 100644 --- a/src/components/callsign-input.svelte +++ b/src/components/callsign-input.svelte @@ -5,7 +5,7 @@ let selectionStart: number | null = inputText.length; let selectionEnd: number | null = inputText.length; - export const generateStyledText: (text: string) => string = (text: string) => text; + export let generateStyledText: (text: string) => string = (text: string) => text; $: styledText = generateStyledText(inputText) || '​'; @@ -36,7 +36,7 @@ t.setSelectionRange(selectionStart, selectionEnd); } }} - placeholder="Enter a callsign" + placeholder="..." />
@@ -49,17 +49,17 @@ font-size: 32px; padding: 8px 12px; text-align: center; + border-radius: 12px; } .input { border: 1px solid #ccc; - border-radius: 10px; position: absolute; top: 0; left: 0; background: transparent; color: transparent; - caret-color: black; + caret-color: white; } .input::placeholder { @@ -68,6 +68,7 @@ } .styled-text { + background: #424242; border: 1px solid transparent; white-space: pre; word-wrap: break-word; diff --git a/src/lib/callsign.test.ts b/src/lib/callsign.test.ts new file mode 100644 index 0000000..9713d9b --- /dev/null +++ b/src/lib/callsign.test.ts @@ -0,0 +1,108 @@ +import { describe, expect, test } from 'vitest'; +import { parseCallsign } from './callsign'; + +describe('parseCallsign', () => { + test('S52KJ', () => { + const data = parseCallsign('S52KJ'); + expect(data).not.toBe(null); + expect(data?.secondaryPrefix).toBe(null); + expect(data?.basePrefix).toBe('S5'); + expect(data?.baseSuffix).toBe('2KJ'); + expect(data?.base).toBe('S52KJ'); + expect(data?.secondarySuffix).toBe(null); + expect(data?.suffixPartOf).toBe(null); + expect(data?.baseDxcc).toBe(499); + expect(data?.prefixDxcc).toBe(null); + }); + + test('s52kj', () => { + const data = parseCallsign('s52kj'); + expect(data).not.toBe(null); + expect(data?.secondaryPrefix).toBe(null); + expect(data?.basePrefix).toBe('S5'); + expect(data?.baseSuffix).toBe('2KJ'); + expect(data?.base).toBe('S52KJ'); + expect(data?.secondarySuffix).toBe(null); + expect(data?.suffixPartOf).toBe(null); + expect(data?.baseDxcc).toBe(499); + expect(data?.prefixDxcc).toBe(null); + }); + + test('S52KJ/P', () => { + const data = parseCallsign('S52KJ/P'); + expect(data).not.toBe(null); + expect(data?.secondaryPrefix).toBe(null); + expect(data?.basePrefix).toBe('S5'); + expect(data?.baseSuffix).toBe('2KJ'); + expect(data?.base).toBe('S52KJ'); + expect(data?.secondarySuffix).toBe('P'); + expect(data?.suffixPartOf).toBe(null); + expect(data?.baseDxcc).toBe(499); + expect(data?.prefixDxcc).toBe(null); + }); + + test('9A/S52KJ', () => { + const data = parseCallsign('9A/S52KJ'); + expect(data).not.toBe(null); + expect(data?.secondaryPrefix).toBe('9A'); + expect(data?.basePrefix).toBe('S5'); + expect(data?.baseSuffix).toBe('2KJ'); + expect(data?.base).toBe('S52KJ'); + expect(data?.secondarySuffix).toBe(null); + expect(data?.suffixPartOf).toBe(null); + expect(data?.baseDxcc).toBe(499); + expect(data?.prefixDxcc).toBe(497); + }); + + test('9A/S52KJ/P', () => { + const data = parseCallsign('9A/S52KJ/P'); + expect(data).not.toBe(null); + expect(data?.secondaryPrefix).toBe('9A'); + expect(data?.basePrefix).toBe('S5'); + expect(data?.baseSuffix).toBe('2KJ'); + expect(data?.base).toBe('S52KJ'); + expect(data?.secondarySuffix).toBe('P'); + expect(data?.suffixPartOf).toBe(null); + expect(data?.baseDxcc).toBe(499); + expect(data?.prefixDxcc).toBe(497); + }); + + test('S52KJ/A', () => { + const data = parseCallsign('S52KJ/A'); + expect(data).not.toBe(null); + expect(data?.secondaryPrefix).toBe(null); + expect(data?.basePrefix).toBe('S5'); + expect(data?.baseSuffix).toBe('2KJ'); + expect(data?.base).toBe('S52KJ'); + expect(data?.secondarySuffix).toBe('A'); + expect(data?.suffixPartOf).toBe(null); + expect(data?.baseDxcc).toBe(499); + expect(data?.prefixDxcc).toBe(null); + }); + + test('SV1KJ/A', () => { + const data = parseCallsign('SV1KJ/A'); + expect(data).not.toBe(null); + expect(data?.secondaryPrefix).toBe(null); + expect(data?.basePrefix).toBe('SV'); + expect(data?.baseSuffix).toBe('1KJ'); + expect(data?.base).toBe('SV1KJ'); + expect(data?.secondarySuffix).toBe('A'); + expect(data?.suffixPartOf).toBe('base'); + expect(data?.baseDxcc).toBe(180); + expect(data?.prefixDxcc).toBe(null); + }); + + test('SV/S52KJ/A', () => { + const data = parseCallsign('SV/S52KJ/A'); + expect(data).not.toBe(null); + expect(data?.secondaryPrefix).toBe('SV'); + expect(data?.basePrefix).toBe('S5'); + expect(data?.baseSuffix).toBe('2KJ'); + expect(data?.base).toBe('S52KJ'); + expect(data?.secondarySuffix).toBe('A'); + expect(data?.suffixPartOf).toBe('prefix'); + expect(data?.baseDxcc).toBe(499); + expect(data?.prefixDxcc).toBe(180); + }); +}); diff --git a/src/lib/callsign.ts b/src/lib/callsign.ts index 23a5281..3bbac85 100644 --- a/src/lib/callsign.ts +++ b/src/lib/callsign.ts @@ -1 +1,75 @@ +import { findDxcc } from './dxcc-util'; + export const callsignPattern = /^([A-Z\d]+\/)?([A-Z\d]+\d+[A-Z]+)(\/[A-Z\d]+)?$/i; + +type CallsignData = { + secondaryPrefix: string | null; + basePrefix: string | null; + baseSuffix: string | null; + base: string; + secondarySuffix: string | null; + suffixPartOf: 'base' | 'prefix' | null; + suffixDescription?: string; + baseDxcc: number | null; + prefixDxcc: number | null; +}; + +export function parseCallsign(callsign: string): CallsignData | null { + callsign = callsign.toUpperCase(); + const match = callsign.match(callsignPattern); + if (!match) { + return null; + } + + const secondaryPrefix = match[1]?.slice(0, -1) ?? null; + const base = match[2]; + const secondarySuffix = match[3]?.slice(1) ?? null; + const baseDxcc = findDxcc(base + '/' + secondarySuffix); + const prefixDxcc = secondaryPrefix ? findDxcc(callsign) : null; + + const basePrefix = baseDxcc ? base.slice(0, baseDxcc.prefixLength) : null; + const baseSuffix = baseDxcc ? base.slice(baseDxcc.prefixLength) : null; + + const suffixPartOf = prefixDxcc?.withSuffix + ? 'prefix' + : !prefixDxcc && baseDxcc?.withSuffix + ? 'base' + : null; + + return { + secondaryPrefix, + basePrefix, + baseSuffix, + base, + secondarySuffix, + suffixPartOf, + baseDxcc: baseDxcc?.entity || null, + prefixDxcc: prefixDxcc?.entity || null + }; +} + +export function getSecondarySuffixDescription(callsign: CallsignData): string | null { + if (!callsign.secondarySuffix) { + return null; + } + + if (callsign.suffixPartOf === 'base') { + return 'Part of prefix'; + } + + if (callsign.suffixPartOf === 'prefix') { + return 'Part of secondary prefix'; + } + + switch (callsign.secondarySuffix) { + case 'P': + return 'Portable'; + case 'M': + return 'Mobile'; + case 'AM': + return 'Aeronautical mobile'; + case 'MM': + return 'Maritime mobile'; + } + return null; +} diff --git a/src/lib/dxcc-util.test.ts b/src/lib/dxcc-util.test.ts index 2d8e8ab..1044570 100644 --- a/src/lib/dxcc-util.test.ts +++ b/src/lib/dxcc-util.test.ts @@ -1,5 +1,5 @@ import { describe, expect, test } from 'vitest'; -import { dxccTree, findDxcc } from './dxcc-util'; +import { dxccEntities, dxccTree, findDxcc } from './dxcc-util'; describe('dxccTree', () => { test('dxccTree is not null', () => { @@ -100,3 +100,17 @@ describe('findDxcc', () => { expect(result).toBe(null); }); }); + +describe('dxccEntities', () => { + test('dxccEntities is not null', () => { + expect(dxccEntities).not.toBe(null); + }); + + test('499', () => { + const entity = dxccEntities.get(499); + expect(entity).not.toBe(undefined); + expect(entity?.name).toBe('Slovenia'); + expect(entity?.cont).toBe('EU'); + expect(entity?.cqz).toBe(15); + }); +}); diff --git a/src/lib/dxcc-util.ts b/src/lib/dxcc-util.ts index b09e4b6..6b937d2 100644 --- a/src/lib/dxcc-util.ts +++ b/src/lib/dxcc-util.ts @@ -1,4 +1,5 @@ import dxccTreeFile from '../assets/dxcc-tree.txt?raw'; +import dxccEntitiesFile from '../assets/dxcc-entities.json'; import { TrieNode } from './models/trie'; export const dxccTree = TrieNode.decodeFromString(dxccTreeFile); @@ -38,3 +39,5 @@ export function findDxcc(prefix: string, startingNode: TrieNode = dxccTree): Dxc if (!entity) return null; return { entity, withSuffix: false, prefixLength }; } + +export const dxccEntities = new Map([...dxccEntitiesFile].map((e) => [e.entity, e])); diff --git a/src/lib/models/trie.ts b/src/lib/models/trie.ts index ca82df8..494e09e 100644 --- a/src/lib/models/trie.ts +++ b/src/lib/models/trie.ts @@ -55,6 +55,10 @@ export class TrieNode { } encodeToString(): string { + return [...this.getAllNodes()].map((n) => n._encodeToString()).join('\n'); + } + + _encodeToString(): string { const s = []; if (this.entity) { s.push(`${this.id}=${this.entity}`); diff --git a/src/lib/string-util.test.ts b/src/lib/string-util.test.ts new file mode 100644 index 0000000..718474d --- /dev/null +++ b/src/lib/string-util.test.ts @@ -0,0 +1,40 @@ +import { describe, expect, test } from 'vitest'; +import { capitalize } from './string-util'; + +describe('capitalize', () => { + test('Single word', () => { + expect(capitalize('hello')).toBe('Hello'); + }); + + test('Multiple words', () => { + expect(capitalize('hello world')).toBe('Hello World'); + }); + + test('Empty string', () => { + expect(capitalize('')).toBe(''); + }); + + test('Single letter', () => { + expect(capitalize('a')).toBe('A'); + }); + + test('Repeating letters', () => { + expect(capitalize('aaa')).toBe('Aaa'); + }); + + test('Repeating words', () => { + expect(capitalize('hello hello')).toBe('Hello Hello'); + }); + + test('Mixed case', () => { + expect(capitalize('hELLO')).toBe('Hello'); + }); + + test('Mixed case words', () => { + expect(capitalize('hELLO wORLD')).toBe('Hello World'); + }); + + test('Repeating substrings', () => { + expect(capitalize('hihihi hi')).toBe('Hihihi Hi'); + }); +}); diff --git a/src/lib/string-util.ts b/src/lib/string-util.ts index 52adefb..8b1c4e1 100644 --- a/src/lib/string-util.ts +++ b/src/lib/string-util.ts @@ -1,12 +1,6 @@ export const capitalize = (s: string) => { s = s.toLowerCase(); - const re = /\b\w+/g; - while (true) { - const result = re.exec(s); - if (!result) break; - s = s.replace(result[0], result[0][0].toUpperCase() + result[0].slice(1)); - } - return s; + return s.replace(/\b\w+/g, (word) => word[0].toUpperCase() + word.slice(1)); }; export const rangeToString = (start: string, end: string): string => { diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 2e511e0..0a525aa 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -2,4 +2,39 @@ import '../app.css'; - + + Callsign Tester + + + + + +
+
+ +
+ + +
+ + diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 3bd6ca8..957f6d0 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -1,30 +1,79 @@ -
-

Callsign Tester

+
+

Callsign Tester

- +
+
Enter a callsign
+ +
+ + {#if callsignData} +
+ {#if callsignData.prefixDxcc} +
+

Secondary prefix

+
{callsignData.secondaryPrefix}
+
{dxccEntities.get(callsignData.prefixDxcc)?.name}
+
+ {/if} + {#if callsignData.baseDxcc} +
+

Prefix

+
{callsignData.basePrefix}
+
{dxccEntities.get(callsignData.baseDxcc)?.name}
+
+ {/if} + {#if callsignData.secondarySuffix} +
+

Secondary suffix

+
{callsignData.secondarySuffix}
+
{getSecondarySuffixDescription(callsignData) ?? ''}
+
+ {/if} +
+ {/if}
+ + diff --git a/svelte.config.js b/svelte.config.js index 4a82086..8667683 100644 --- a/svelte.config.js +++ b/svelte.config.js @@ -1,4 +1,4 @@ -import adapter from '@sveltejs/adapter-auto'; +import adapter from '@sveltejs/adapter-static'; import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; /** @type {import('@sveltejs/kit').Config} */ @@ -11,7 +11,9 @@ const config = { // adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list. // If your environment is not supported, or you settled on a specific environment, switch out the adapter. // See https://kit.svelte.dev/docs/adapters for more information about adapters. - adapter: adapter() + adapter: adapter({ + fallback: 'index.html' + }) } }; diff --git a/tailwind.config.js b/tailwind.config.js index 13207cc..bfe0bc2 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -1,9 +1,8 @@ /** @type {import('tailwindcss').Config} */ export default { - content: ['./src/**/*.{html,js,svelte,ts}'], - theme: { - extend: {}, - }, - plugins: [], -} - + content: ['./src/**/*.{html,js,svelte,ts}'], + theme: { + extend: {} + }, + plugins: [] +}; diff --git a/yarn.lock b/yarn.lock index b51eb74..7d0bdf5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -360,6 +360,11 @@ dependencies: import-meta-resolve "^4.1.0" +"@sveltejs/adapter-static@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@sveltejs/adapter-static/-/adapter-static-3.0.2.tgz#b505c429616c3319d40d293b741f6915da143f49" + integrity sha512-/EBFydZDwfwFfFEuF1vzUseBoRziwKP7AoHAwv+Ot3M084sE/HTVBHf9mCmXfdM9ijprY5YEugZjleflncX5fQ== + "@sveltejs/kit@^2.0.0": version "2.5.17" resolved "https://registry.yarnpkg.com/@sveltejs/kit/-/kit-2.5.17.tgz#e59e00be7a86021c897ce65a540740473535898e" @@ -422,9 +427,9 @@ integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== "@types/node@*", "@types/node@^20.14.6": - version "20.14.6" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.6.tgz#f3c19ffc98c2220e18de259bb172dd4d892a6075" - integrity sha512-JbA0XIJPL1IiNnU7PFxDXyfAwcwVVrOoqyzzyQTyMeVhBzkJVMSkC1LlVsRQ2lpqiY4n6Bb9oCS6lzDKVQxbZw== + version "20.14.8" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.8.tgz#45c26a2a5de26c3534a9504530ddb3b27ce031ac" + integrity sha512-DO+2/jZinXfROG7j7WKFn/3C6nFwxy2lLpgLjEXJz+0XKphZlTLJ14mo8Vfg8X5BWN6XjyESXq+LcYdT7tR3bA== dependencies: undici-types "~5.26.4" @@ -920,9 +925,9 @@ eastasianwidth@^0.2.0: integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== electron-to-chromium@^1.4.796: - version "1.4.807" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.807.tgz#4d6c5ea1516f0164ac5bfd487ccd4ee9507c8f01" - integrity sha512-kSmJl2ZwhNf/bcIuCH/imtNOKlpkLDn2jqT5FJ+/0CXjhnFaOa9cOe9gHKKy71eM49izwuQjZhKk+lWQ1JxB7A== + version "1.4.810" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.810.tgz#7dee01b090b9e048e6db752f7b30921790230654" + integrity sha512-Kaxhu4T7SJGpRQx99tq216gCq2nMxJo+uuT6uzz9l8TVN2stL7M06MIIXAtr9jsrLs2Glflgf2vMQRepxawOdQ== emoji-regex@^8.0.0: version "8.0.0" @@ -1930,7 +1935,12 @@ prettier-plugin-svelte@^3.1.2: resolved "https://registry.yarnpkg.com/prettier-plugin-svelte/-/prettier-plugin-svelte-3.2.5.tgz#ec004ed6626f59655cfd3fe88154c7cf41c90a2e" integrity sha512-vP/M/Goc8z4iVIvrwXwbrYVjJgA0Hf8PO1G4LBh/ocSt6vUP6sLvyu9F3ABEGr+dbKyxZjEKLkeFsWy/yYl0HQ== -prettier@^3.1.1: +prettier-plugin-tailwindcss@^0.6.5: + version "0.6.5" + resolved "https://registry.yarnpkg.com/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.6.5.tgz#e05202784a3f41889711ae38c75c5b8cad72f368" + integrity sha512-axfeOArc/RiGHjOIy9HytehlC0ZLeMaqY09mm8YCkMzznKiDkwFzOpBvtuhuv3xG5qB73+Mj7OCe2j/L1ryfuQ== + +prettier@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.2.tgz#03ff86dc7c835f2d2559ee76876a3914cec4a90a" integrity sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA== @@ -2124,16 +2134,8 @@ std-env@^3.5.0: resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.7.0.tgz#c9f7386ced6ecf13360b6c6c55b8aaa4ef7481d2" integrity sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg== -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^4.1.0: +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0: + name string-width-cjs version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -2151,14 +2153,7 @@ string-width@^5.0.1, string-width@^5.1.2: emoji-regex "^9.2.2" strip-ansi "^7.0.1" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -2401,9 +2396,9 @@ typescript-eslint@^8.0.0-alpha.20: "@typescript-eslint/utils" "8.0.0-alpha.30" typescript@^5.0.0, typescript@^5.0.3: - version "5.4.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" - integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== + version "5.5.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.2.tgz#c26f023cb0054e657ce04f72583ea2d85f8d0507" + integrity sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew== ufo@^1.5.3: version "1.5.3"