@rljson/edge 0.0.0-stage → 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.de.md +181 -0
- package/README.md +174 -2
- package/dist/README.de.md +181 -0
- package/dist/README.md +175 -0
- package/dist/car-world/bom-builder.d.ts +57 -0
- package/dist/car-world/brands.d.ts +17 -0
- package/dist/car-world/car-world.d.ts +135 -0
- package/dist/car-world/catalog-generator.d.ts +99 -0
- package/dist/car-world/generate-car-world.d.ts +16 -0
- package/dist/car-world/plan.d.ts +130 -0
- package/dist/car-world/prices.d.ts +32 -0
- package/dist/car-world/scene-builder.d.ts +40 -0
- package/dist/car-world/table-cfgs.d.ts +22 -0
- package/dist/car-world/workshops.d.ts +39 -0
- package/dist/config/config.d.ts +177 -0
- package/dist/config/presets.d.ts +13 -0
- package/dist/core/emitter.d.ts +71 -0
- package/dist/core/estimate.d.ts +33 -0
- package/dist/core/pick.d.ts +69 -0
- package/dist/core/sink.d.ts +49 -0
- package/dist/dictionaries/cad.d.ts +13 -0
- package/dist/dictionaries/manufacturers.d.ts +21 -0
- package/dist/dictionaries/parts.d.ts +29 -0
- package/dist/dictionaries/people.d.ts +4 -0
- package/dist/dictionaries/places.d.ts +27 -0
- package/dist/dictionaries/vehicles.d.ts +22 -0
- package/dist/edge.d.ts +62 -0
- package/dist/edge.js +11334 -0
- package/dist/edge.js.map +1 -0
- package/dist/edge_version.d.ts +2 -0
- package/dist/example.d.ts +7 -0
- package/dist/index.d.ts +23 -0
- package/dist/src/example.ts +69 -0
- package/package.json +57 -3
package/dist/edge.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edge.js","names":[],"sources":["../src/core/pick.ts","../src/dictionaries/manufacturers.ts","../src/dictionaries/places.ts","../src/dictionaries/vehicles.ts","../src/car-world/car-world.ts","../src/car-world/brands.ts","../src/dictionaries/parts.ts","../src/car-world/bom-builder.ts","../src/dictionaries/cad.ts","../src/car-world/scene-builder.ts","../src/car-world/plan.ts","../src/car-world/prices.ts","../src/dictionaries/people.ts","../src/car-world/workshops.ts","../src/car-world/catalog-generator.ts","../src/car-world/table-cfgs.ts","../src/car-world/generate-car-world.ts","../src/config/config.ts","../src/config/presets.ts","../src/core/emitter.ts","../src/core/estimate.ts","../src/core/sink.ts","../src/edge.ts","../src/index.ts"],"sourcesContent":["// @license\n// Copyright (c) 2025 Rljson\n//\n// Use of this source code is governed by terms that can be\n// found in the LICENSE file in the root of this package.\n\n// Deterministic selection helpers. Edge uses no random numbers: every value\n// derives from an index, so two runs with the same configuration yield the\n// same data.\n\n// .............................................................................\n/**\n * Returns the entry at an index, wrapping around the end of the list.\n * @param list - The list to pick from\n * @param index - Any non-negative index\n */\nexport const pick = <T>(list: readonly T[], index: number): T => {\n if (list.length === 0) {\n throw new Error('pick: the list is empty');\n }\n return list[index % list.length];\n};\n\n// .............................................................................\n/**\n * Returns count entries starting at an offset, wrapping around the end.\n *\n * The entries are distinct as long as count does not exceed the length.\n * @param list - The list to pick from\n * @param offset - The index of the first entry\n * @param count - The number of entries\n */\nexport const pickMany = <T>(\n list: readonly T[],\n offset: number,\n count: number,\n): T[] => Array.from({ length: count }, (_, i) => pick(list, offset + i));\n\n// .............................................................................\n/**\n * Tells whether an index falls into a share of a sequence.\n *\n * Of n consecutive indices, exactly round(n * share) are in the share, spread\n * evenly: with a share of 0.25 every fourth index is in.\n * @param index - The index within the sequence\n * @param share - The share between 0 and 1\n */\nexport const inShare = (index: number, share: number): boolean =>\n Math.floor((index + 1) * share) > Math.floor(index * share);\n\n// #############################################################################\n/** Where an index sits and how many buckets share the sequence */\nexport interface EZipfOptions {\n /** The index within the sequence */\n index: number;\n\n /** The length of the sequence */\n count: number;\n\n /** The number of buckets */\n buckets: number;\n}\n\n// .............................................................................\n/**\n * Returns the harmonic number of n: 1 + 1/2 + … + 1/n.\n * @param n - The number of terms\n */\nexport const harmonic = (n: number): number => {\n let sum = 0;\n for (let k = 1; k <= n; k++) {\n sum += 1 / k;\n }\n return sum;\n};\n\n// .............................................................................\n/**\n * Maps an index of a sequence to a bucket, following a Zipf distribution.\n *\n * Bucket 0 receives the most indices, bucket 1 half as many, bucket 2 a\n * third, and so on. Consecutive indices land in the same bucket.\n * @param options - The index, the length of the sequence and the buckets\n */\nexport const zipfBucket = (options: EZipfOptions): number => {\n const { index, count, buckets } = options;\n const total = harmonic(buckets);\n const position = (index + 0.5) / count;\n let cumulative = 0;\n for (let bucket = 0; bucket < buckets - 1; bucket++) {\n cumulative += 1 / (bucket + 1) / total;\n if (position < cumulative) {\n return bucket;\n }\n }\n return buckets - 1;\n};\n\n// .............................................................................\n/**\n * Pads a number with leading zeros.\n * @param value - The number\n * @param width - The minimum number of digits\n */\nexport const padded = (value: number, width: number): string =>\n String(value).padStart(width, '0');\n\n// .............................................................................\n/**\n * Turns a name into a kebab case slug: lower case, ASCII letters and digits.\n * @param name - The name, e.g. \"Lynk & Co\"\n */\nexport const slug = (name: string): string =>\n name\n .toLowerCase()\n .normalize('NFD')\n .replace(/\\p{M}/gu, '')\n .replace(/&/g, 'and')\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '');\n\n// .............................................................................\n/**\n * Rounds a value to the nearest multiple of a step.\n * @param value - The value\n * @param step - The step, e.g. 100\n */\nexport const roundTo = (value: number, step: number): number =>\n Math.round(value / step) * step;\n\n// .............................................................................\n/**\n * Rounds a value to a number of decimals.\n * @param value - The value\n * @param decimals - The decimals to keep\n */\nexport const roundDecimals = (value: number, decimals: number): number => {\n const factor = 10 ** decimals;\n return Math.round(value * factor) / factor;\n};\n","// @license\n// Copyright (c) 2025 Rljson\n//\n// Use of this source code is governed by terms that can be\n// found in the LICENSE file in the root of this package.\n\n// #############################################################################\n/** A car manufacturer or brand with a few facts about it */\nexport interface EManufacturerEntry {\n /** The id of the manufacturer: the brand in kebab case */\n id: string;\n\n /** The name of the company */\n name: string;\n\n /** The brand name the cars carry */\n brand: string;\n\n /** The ISO 3166 country code of the headquarters */\n country: string;\n\n /** The city of the headquarters, listed in the places dictionary */\n city: string;\n\n /** The year the brand was founded, approximately */\n founded: number;\n}\n\n// .............................................................................\n/**\n * Car manufacturers and brands from around the world.\n *\n * The facts are approximate and meant for test data only.\n */\nexport const manufacturers: readonly EManufacturerEntry[] = [\n {\n id: 'volkswagen',\n name: 'Volkswagen AG',\n brand: 'Volkswagen',\n country: 'DE',\n city: 'Wolfsburg',\n founded: 1937,\n },\n {\n id: 'audi',\n name: 'Audi AG',\n brand: 'Audi',\n country: 'DE',\n city: 'Ingolstadt',\n founded: 1909,\n },\n {\n id: 'bmw',\n name: 'BMW AG',\n brand: 'BMW',\n country: 'DE',\n city: 'Munich',\n founded: 1916,\n },\n {\n id: 'mercedes-benz',\n name: 'Mercedes-Benz Group AG',\n brand: 'Mercedes-Benz',\n country: 'DE',\n city: 'Stuttgart',\n founded: 1926,\n },\n {\n id: 'porsche',\n name: 'Dr. Ing. h.c. F. Porsche AG',\n brand: 'Porsche',\n country: 'DE',\n city: 'Stuttgart',\n founded: 1931,\n },\n {\n id: 'opel',\n name: 'Opel Automobile GmbH',\n brand: 'Opel',\n country: 'DE',\n city: 'Rüsselsheim',\n founded: 1862,\n },\n {\n id: 'ford',\n name: 'Ford Motor Company',\n brand: 'Ford',\n country: 'US',\n city: 'Dearborn',\n founded: 1903,\n },\n {\n id: 'toyota',\n name: 'Toyota Motor Corporation',\n brand: 'Toyota',\n country: 'JP',\n city: 'Toyota City',\n founded: 1937,\n },\n {\n id: 'honda',\n name: 'Honda Motor Co., Ltd.',\n brand: 'Honda',\n country: 'JP',\n city: 'Tokyo',\n founded: 1948,\n },\n {\n id: 'nissan',\n name: 'Nissan Motor Co., Ltd.',\n brand: 'Nissan',\n country: 'JP',\n city: 'Yokohama',\n founded: 1933,\n },\n {\n id: 'mazda',\n name: 'Mazda Motor Corporation',\n brand: 'Mazda',\n country: 'JP',\n city: 'Hiroshima',\n founded: 1920,\n },\n {\n id: 'subaru',\n name: 'Subaru Corporation',\n brand: 'Subaru',\n country: 'JP',\n city: 'Tokyo',\n founded: 1953,\n },\n {\n id: 'mitsubishi',\n name: 'Mitsubishi Motors Corporation',\n brand: 'Mitsubishi',\n country: 'JP',\n city: 'Tokyo',\n founded: 1970,\n },\n {\n id: 'suzuki',\n name: 'Suzuki Motor Corporation',\n brand: 'Suzuki',\n country: 'JP',\n city: 'Hamamatsu',\n founded: 1909,\n },\n {\n id: 'daihatsu',\n name: 'Daihatsu Motor Co., Ltd.',\n brand: 'Daihatsu',\n country: 'JP',\n city: 'Ikeda',\n founded: 1907,\n },\n {\n id: 'lexus',\n name: 'Lexus',\n brand: 'Lexus',\n country: 'JP',\n city: 'Toyota City',\n founded: 1989,\n },\n {\n id: 'infiniti',\n name: 'Infiniti Motor Company',\n brand: 'Infiniti',\n country: 'JP',\n city: 'Yokohama',\n founded: 1989,\n },\n {\n id: 'acura',\n name: 'Acura',\n brand: 'Acura',\n country: 'JP',\n city: 'Tokyo',\n founded: 1986,\n },\n {\n id: 'isuzu',\n name: 'Isuzu Motors Ltd.',\n brand: 'Isuzu',\n country: 'JP',\n city: 'Yokohama',\n founded: 1916,\n },\n {\n id: 'hino',\n name: 'Hino Motors, Ltd.',\n brand: 'Hino',\n country: 'JP',\n city: 'Tokyo',\n founded: 1942,\n },\n {\n id: 'datsun',\n name: 'Datsun',\n brand: 'Datsun',\n country: 'JP',\n city: 'Yokohama',\n founded: 1931,\n },\n {\n id: 'hyundai',\n name: 'Hyundai Motor Company',\n brand: 'Hyundai',\n country: 'KR',\n city: 'Seoul',\n founded: 1967,\n },\n {\n id: 'kia',\n name: 'Kia Corporation',\n brand: 'Kia',\n country: 'KR',\n city: 'Seoul',\n founded: 1944,\n },\n {\n id: 'genesis',\n name: 'Genesis Motor',\n brand: 'Genesis',\n country: 'KR',\n city: 'Seoul',\n founded: 2015,\n },\n {\n id: 'kg-mobility',\n name: 'KG Mobility Corporation',\n brand: 'KG Mobility',\n country: 'KR',\n city: 'Seoul',\n founded: 1954,\n },\n {\n id: 'daewoo',\n name: 'Daewoo Motors',\n brand: 'Daewoo',\n country: 'KR',\n city: 'Seoul',\n founded: 1983,\n },\n {\n id: 'renault',\n name: 'Renault Group',\n brand: 'Renault',\n country: 'FR',\n city: 'Boulogne-Billancourt',\n founded: 1899,\n },\n {\n id: 'peugeot',\n name: 'Automobiles Peugeot',\n brand: 'Peugeot',\n country: 'FR',\n city: 'Poissy',\n founded: 1896,\n },\n {\n id: 'citroen',\n name: 'Automobiles Citroën',\n brand: 'Citroën',\n country: 'FR',\n city: 'Poissy',\n founded: 1919,\n },\n {\n id: 'ds',\n name: 'DS Automobiles',\n brand: 'DS',\n country: 'FR',\n city: 'Poissy',\n founded: 2014,\n },\n {\n id: 'alpine',\n name: 'Alpine',\n brand: 'Alpine',\n country: 'FR',\n city: 'Dieppe',\n founded: 1955,\n },\n {\n id: 'bugatti',\n name: 'Bugatti Automobiles S.A.S.',\n brand: 'Bugatti',\n country: 'FR',\n city: 'Molsheim',\n founded: 1909,\n },\n {\n id: 'simca',\n name: 'Simca',\n brand: 'Simca',\n country: 'FR',\n city: 'Poissy',\n founded: 1934,\n },\n {\n id: 'matra',\n name: 'Matra Automobiles',\n brand: 'Matra',\n country: 'FR',\n city: 'Paris',\n founded: 1964,\n },\n {\n id: 'renault-trucks',\n name: 'Renault Trucks',\n brand: 'Renault Trucks',\n country: 'FR',\n city: 'Lyon',\n founded: 1978,\n },\n {\n id: 'dacia',\n name: 'Automobile Dacia S.A.',\n brand: 'Dacia',\n country: 'RO',\n city: 'Mioveni',\n founded: 1966,\n },\n {\n id: 'fiat',\n name: 'Fiat Automobiles S.p.A.',\n brand: 'Fiat',\n country: 'IT',\n city: 'Turin',\n founded: 1899,\n },\n {\n id: 'alfa-romeo',\n name: 'Alfa Romeo Automobiles S.p.A.',\n brand: 'Alfa Romeo',\n country: 'IT',\n city: 'Turin',\n founded: 1910,\n },\n {\n id: 'lancia',\n name: 'Lancia Automobiles S.p.A.',\n brand: 'Lancia',\n country: 'IT',\n city: 'Turin',\n founded: 1906,\n },\n {\n id: 'abarth',\n name: 'Abarth & C. S.p.A.',\n brand: 'Abarth',\n country: 'IT',\n city: 'Turin',\n founded: 1949,\n },\n {\n id: 'ferrari',\n name: 'Ferrari S.p.A.',\n brand: 'Ferrari',\n country: 'IT',\n city: 'Maranello',\n founded: 1947,\n },\n {\n id: 'lamborghini',\n name: 'Automobili Lamborghini S.p.A.',\n brand: 'Lamborghini',\n country: 'IT',\n city: \"Sant'Agata Bolognese\",\n founded: 1963,\n },\n {\n id: 'maserati',\n name: 'Maserati S.p.A.',\n brand: 'Maserati',\n country: 'IT',\n city: 'Modena',\n founded: 1914,\n },\n {\n id: 'pagani',\n name: 'Pagani Automobili S.p.A.',\n brand: 'Pagani',\n country: 'IT',\n city: 'San Cesario sul Panaro',\n founded: 1992,\n },\n {\n id: 'autobianchi',\n name: 'Autobianchi',\n brand: 'Autobianchi',\n country: 'IT',\n city: 'Milan',\n founded: 1955,\n },\n {\n id: 'de-tomaso',\n name: 'De Tomaso Automobili',\n brand: 'De Tomaso',\n country: 'IT',\n city: 'Modena',\n founded: 1959,\n },\n {\n id: 'pininfarina',\n name: 'Automobili Pininfarina',\n brand: 'Pininfarina',\n country: 'IT',\n city: 'Turin',\n founded: 2018,\n },\n {\n id: 'iveco',\n name: 'Iveco Group',\n brand: 'Iveco',\n country: 'IT',\n city: 'Turin',\n founded: 1975,\n },\n {\n id: 'volvo',\n name: 'Volvo Car Corporation',\n brand: 'Volvo',\n country: 'SE',\n city: 'Gothenburg',\n founded: 1927,\n },\n {\n id: 'polestar',\n name: 'Polestar Automotive',\n brand: 'Polestar',\n country: 'SE',\n city: 'Gothenburg',\n founded: 2017,\n },\n {\n id: 'koenigsegg',\n name: 'Koenigsegg Automotive AB',\n brand: 'Koenigsegg',\n country: 'SE',\n city: 'Ängelholm',\n founded: 1994,\n },\n {\n id: 'saab',\n name: 'Saab Automobile AB',\n brand: 'Saab',\n country: 'SE',\n city: 'Trollhättan',\n founded: 1945,\n },\n {\n id: 'scania',\n name: 'Scania AB',\n brand: 'Scania',\n country: 'SE',\n city: 'Södertälje',\n founded: 1891,\n },\n {\n id: 'volvo-trucks',\n name: 'Volvo Trucks',\n brand: 'Volvo Trucks',\n country: 'SE',\n city: 'Gothenburg',\n founded: 1928,\n },\n {\n id: 'skoda',\n name: 'Škoda Auto a.s.',\n brand: 'Škoda',\n country: 'CZ',\n city: 'Mladá Boleslav',\n founded: 1895,\n },\n {\n id: 'praga',\n name: 'Praga',\n brand: 'Praga',\n country: 'CZ',\n city: 'Prague',\n founded: 1907,\n },\n {\n id: 'seat',\n name: 'SEAT S.A.',\n brand: 'SEAT',\n country: 'ES',\n city: 'Martorell',\n founded: 1950,\n },\n {\n id: 'cupra',\n name: 'Cupra',\n brand: 'Cupra',\n country: 'ES',\n city: 'Martorell',\n founded: 2018,\n },\n {\n id: 'daf',\n name: 'DAF Trucks N.V.',\n brand: 'DAF',\n country: 'NL',\n city: 'Eindhoven',\n founded: 1928,\n },\n {\n id: 'spyker',\n name: 'Spyker N.V.',\n brand: 'Spyker',\n country: 'NL',\n city: 'Amsterdam',\n founded: 1999,\n },\n {\n id: 'zenvo',\n name: 'Zenvo Automotive',\n brand: 'Zenvo',\n country: 'DK',\n city: 'Copenhagen',\n founded: 2004,\n },\n {\n id: 'rimac',\n name: 'Rimac Automobili',\n brand: 'Rimac',\n country: 'HR',\n city: 'Sveta Nedelja',\n founded: 2009,\n },\n {\n id: 'togg',\n name: 'Togg',\n brand: 'Togg',\n country: 'TR',\n city: 'Gebze',\n founded: 2018,\n },\n {\n id: 'man',\n name: 'MAN Truck & Bus SE',\n brand: 'MAN',\n country: 'DE',\n city: 'Munich',\n founded: 1915,\n },\n {\n id: 'smart',\n name: 'smart Europe GmbH',\n brand: 'Smart',\n country: 'DE',\n city: 'Böblingen',\n founded: 1994,\n },\n {\n id: 'maybach',\n name: 'Maybach',\n brand: 'Maybach',\n country: 'DE',\n city: 'Stuttgart',\n founded: 1909,\n },\n {\n id: 'borgward',\n name: 'Borgward',\n brand: 'Borgward',\n country: 'DE',\n city: 'Bremen',\n founded: 1919,\n },\n {\n id: 'trabant',\n name: 'VEB Sachsenring',\n brand: 'Trabant',\n country: 'DE',\n city: 'Zwickau',\n founded: 1957,\n },\n {\n id: 'horch',\n name: 'Horch',\n brand: 'Horch',\n country: 'DE',\n city: 'Zwickau',\n founded: 1899,\n },\n {\n id: 'daimler-truck',\n name: 'Daimler Truck AG',\n brand: 'Daimler Truck',\n country: 'DE',\n city: 'Stuttgart',\n founded: 2019,\n },\n {\n id: 'tesla',\n name: 'Tesla, Inc.',\n brand: 'Tesla',\n country: 'US',\n city: 'Austin',\n founded: 2003,\n },\n {\n id: 'rivian',\n name: 'Rivian Automotive, Inc.',\n brand: 'Rivian',\n country: 'US',\n city: 'Irvine',\n founded: 2009,\n },\n {\n id: 'lucid',\n name: 'Lucid Group, Inc.',\n brand: 'Lucid',\n country: 'US',\n city: 'Newark',\n founded: 2007,\n },\n {\n id: 'chevrolet',\n name: 'Chevrolet',\n brand: 'Chevrolet',\n country: 'US',\n city: 'Detroit',\n founded: 1911,\n },\n {\n id: 'cadillac',\n name: 'Cadillac',\n brand: 'Cadillac',\n country: 'US',\n city: 'Detroit',\n founded: 1902,\n },\n {\n id: 'gmc',\n name: 'GMC',\n brand: 'GMC',\n country: 'US',\n city: 'Detroit',\n founded: 1911,\n },\n {\n id: 'buick',\n name: 'Buick',\n brand: 'Buick',\n country: 'US',\n city: 'Detroit',\n founded: 1903,\n },\n {\n id: 'lincoln',\n name: 'Lincoln Motor Company',\n brand: 'Lincoln',\n country: 'US',\n city: 'Dearborn',\n founded: 1917,\n },\n {\n id: 'chrysler',\n name: 'Chrysler',\n brand: 'Chrysler',\n country: 'US',\n city: 'Auburn Hills',\n founded: 1925,\n },\n {\n id: 'dodge',\n name: 'Dodge',\n brand: 'Dodge',\n country: 'US',\n city: 'Auburn Hills',\n founded: 1900,\n },\n {\n id: 'jeep',\n name: 'Jeep',\n brand: 'Jeep',\n country: 'US',\n city: 'Auburn Hills',\n founded: 1941,\n },\n {\n id: 'ram',\n name: 'Ram Trucks',\n brand: 'Ram',\n country: 'US',\n city: 'Auburn Hills',\n founded: 2010,\n },\n {\n id: 'fisker',\n name: 'Fisker Inc.',\n brand: 'Fisker',\n country: 'US',\n city: 'Los Angeles',\n founded: 2016,\n },\n {\n id: 'canoo',\n name: 'Canoo Inc.',\n brand: 'Canoo',\n country: 'US',\n city: 'Torrance',\n founded: 2017,\n },\n {\n id: 'karma',\n name: 'Karma Automotive',\n brand: 'Karma',\n country: 'US',\n city: 'Irvine',\n founded: 2014,\n },\n {\n id: 'faraday-future',\n name: 'Faraday Future',\n brand: 'Faraday Future',\n country: 'US',\n city: 'Los Angeles',\n founded: 2014,\n },\n {\n id: 'pontiac',\n name: 'Pontiac',\n brand: 'Pontiac',\n country: 'US',\n city: 'Detroit',\n founded: 1926,\n },\n {\n id: 'oldsmobile',\n name: 'Oldsmobile',\n brand: 'Oldsmobile',\n country: 'US',\n city: 'Detroit',\n founded: 1897,\n },\n {\n id: 'plymouth',\n name: 'Plymouth',\n brand: 'Plymouth',\n country: 'US',\n city: 'Auburn Hills',\n founded: 1928,\n },\n {\n id: 'hummer',\n name: 'Hummer',\n brand: 'Hummer',\n country: 'US',\n city: 'Detroit',\n founded: 1992,\n },\n {\n id: 'saturn',\n name: 'Saturn Corporation',\n brand: 'Saturn',\n country: 'US',\n city: 'Detroit',\n founded: 1985,\n },\n {\n id: 'mercury',\n name: 'Mercury',\n brand: 'Mercury',\n country: 'US',\n city: 'Dearborn',\n founded: 1938,\n },\n {\n id: 'kenworth',\n name: 'Kenworth Truck Company',\n brand: 'Kenworth',\n country: 'US',\n city: 'Bellevue',\n founded: 1923,\n },\n {\n id: 'peterbilt',\n name: 'Peterbilt Motors Company',\n brand: 'Peterbilt',\n country: 'US',\n city: 'Denton',\n founded: 1939,\n },\n {\n id: 'freightliner',\n name: 'Freightliner Trucks',\n brand: 'Freightliner',\n country: 'US',\n city: 'Portland',\n founded: 1942,\n },\n {\n id: 'western-star',\n name: 'Western Star Trucks',\n brand: 'Western Star',\n country: 'US',\n city: 'Portland',\n founded: 1967,\n },\n {\n id: 'mack',\n name: 'Mack Trucks',\n brand: 'Mack',\n country: 'US',\n city: 'Greensboro',\n founded: 1900,\n },\n {\n id: 'international',\n name: 'International Motors',\n brand: 'International',\n country: 'US',\n city: 'Chicago',\n founded: 1902,\n },\n {\n id: 'jaguar',\n name: 'Jaguar Cars',\n brand: 'Jaguar',\n country: 'GB',\n city: 'Coventry',\n founded: 1935,\n },\n {\n id: 'land-rover',\n name: 'Land Rover',\n brand: 'Land Rover',\n country: 'GB',\n city: 'Gaydon',\n founded: 1948,\n },\n {\n id: 'bentley',\n name: 'Bentley Motors Limited',\n brand: 'Bentley',\n country: 'GB',\n city: 'Crewe',\n founded: 1919,\n },\n {\n id: 'rolls-royce',\n name: 'Rolls-Royce Motor Cars',\n brand: 'Rolls-Royce',\n country: 'GB',\n city: 'Goodwood',\n founded: 1906,\n },\n {\n id: 'aston-martin',\n name: 'Aston Martin Lagonda',\n brand: 'Aston Martin',\n country: 'GB',\n city: 'Gaydon',\n founded: 1913,\n },\n {\n id: 'mclaren',\n name: 'McLaren Automotive',\n brand: 'McLaren',\n country: 'GB',\n city: 'Woking',\n founded: 1985,\n },\n {\n id: 'lotus',\n name: 'Lotus Cars',\n brand: 'Lotus',\n country: 'GB',\n city: 'Hethel',\n founded: 1948,\n },\n {\n id: 'mini',\n name: 'MINI',\n brand: 'MINI',\n country: 'GB',\n city: 'Oxford',\n founded: 1959,\n },\n {\n id: 'morgan',\n name: 'Morgan Motor Company',\n brand: 'Morgan',\n country: 'GB',\n city: 'Malvern',\n founded: 1910,\n },\n {\n id: 'vauxhall',\n name: 'Vauxhall Motors',\n brand: 'Vauxhall',\n country: 'GB',\n city: 'Luton',\n founded: 1903,\n },\n {\n id: 'caterham',\n name: 'Caterham Cars',\n brand: 'Caterham',\n country: 'GB',\n city: 'Dartford',\n founded: 1973,\n },\n {\n id: 'ineos',\n name: 'INEOS Automotive',\n brand: 'Ineos',\n country: 'GB',\n city: 'London',\n founded: 2017,\n },\n {\n id: 'rover',\n name: 'Rover',\n brand: 'Rover',\n country: 'GB',\n city: 'Coventry',\n founded: 1904,\n },\n {\n id: 'mg',\n name: 'MG Motor',\n brand: 'MG',\n country: 'GB',\n city: 'London',\n founded: 1924,\n },\n {\n id: 'triumph',\n name: 'Triumph Motor Company',\n brand: 'Triumph',\n country: 'GB',\n city: 'Coventry',\n founded: 1923,\n },\n {\n id: 'byd',\n name: 'BYD Auto',\n brand: 'BYD',\n country: 'CN',\n city: 'Shenzhen',\n founded: 2003,\n },\n {\n id: 'denza',\n name: 'Denza',\n brand: 'Denza',\n country: 'CN',\n city: 'Shenzhen',\n founded: 2010,\n },\n {\n id: 'yangwang',\n name: 'Yangwang',\n brand: 'Yangwang',\n country: 'CN',\n city: 'Shenzhen',\n founded: 2023,\n },\n {\n id: 'geely',\n name: 'Geely Auto',\n brand: 'Geely',\n country: 'CN',\n city: 'Hangzhou',\n founded: 1997,\n },\n {\n id: 'lynk-and-co',\n name: 'Lynk & Co',\n brand: 'Lynk & Co',\n country: 'CN',\n city: 'Hangzhou',\n founded: 2016,\n },\n {\n id: 'zeekr',\n name: 'Zeekr',\n brand: 'Zeekr',\n country: 'CN',\n city: 'Hangzhou',\n founded: 2021,\n },\n {\n id: 'leapmotor',\n name: 'Leapmotor',\n brand: 'Leapmotor',\n country: 'CN',\n city: 'Hangzhou',\n founded: 2015,\n },\n {\n id: 'nio',\n name: 'NIO Inc.',\n brand: 'NIO',\n country: 'CN',\n city: 'Shanghai',\n founded: 2014,\n },\n {\n id: 'aiways',\n name: 'Aiways',\n brand: 'Aiways',\n country: 'CN',\n city: 'Shanghai',\n founded: 2017,\n },\n {\n id: 'im-motors',\n name: 'IM Motors',\n brand: 'IM Motors',\n country: 'CN',\n city: 'Shanghai',\n founded: 2020,\n },\n {\n id: 'roewe',\n name: 'Roewe',\n brand: 'Roewe',\n country: 'CN',\n city: 'Shanghai',\n founded: 2006,\n },\n {\n id: 'maxus',\n name: 'Maxus',\n brand: 'Maxus',\n country: 'CN',\n city: 'Shanghai',\n founded: 2011,\n },\n {\n id: 'xpeng',\n name: 'XPeng Inc.',\n brand: 'XPeng',\n country: 'CN',\n city: 'Guangzhou',\n founded: 2014,\n },\n {\n id: 'trumpchi',\n name: 'GAC Trumpchi',\n brand: 'Trumpchi',\n country: 'CN',\n city: 'Guangzhou',\n founded: 2010,\n },\n {\n id: 'aion',\n name: 'GAC Aion',\n brand: 'Aion',\n country: 'CN',\n city: 'Guangzhou',\n founded: 2017,\n },\n {\n id: 'li-auto',\n name: 'Li Auto Inc.',\n brand: 'Li Auto',\n country: 'CN',\n city: 'Beijing',\n founded: 2015,\n },\n {\n id: 'baic',\n name: 'BAIC Motor',\n brand: 'BAIC',\n country: 'CN',\n city: 'Beijing',\n founded: 1958,\n },\n {\n id: 'arcfox',\n name: 'Arcfox',\n brand: 'Arcfox',\n country: 'CN',\n city: 'Beijing',\n founded: 2016,\n },\n {\n id: 'xiaomi',\n name: 'Xiaomi Auto',\n brand: 'Xiaomi',\n country: 'CN',\n city: 'Beijing',\n founded: 2021,\n },\n {\n id: 'great-wall',\n name: 'Great Wall Motor',\n brand: 'Great Wall',\n country: 'CN',\n city: 'Baoding',\n founded: 1984,\n },\n {\n id: 'haval',\n name: 'Haval',\n brand: 'Haval',\n country: 'CN',\n city: 'Baoding',\n founded: 2013,\n },\n {\n id: 'ora',\n name: 'Ora',\n brand: 'Ora',\n country: 'CN',\n city: 'Baoding',\n founded: 2018,\n },\n {\n id: 'wey',\n name: 'Wey',\n brand: 'Wey',\n country: 'CN',\n city: 'Baoding',\n founded: 2016,\n },\n {\n id: 'tank',\n name: 'Tank',\n brand: 'Tank',\n country: 'CN',\n city: 'Baoding',\n founded: 2021,\n },\n {\n id: 'chery',\n name: 'Chery Automobile',\n brand: 'Chery',\n country: 'CN',\n city: 'Wuhu',\n founded: 1997,\n },\n {\n id: 'exeed',\n name: 'Exeed',\n brand: 'Exeed',\n country: 'CN',\n city: 'Wuhu',\n founded: 2017,\n },\n {\n id: 'jetour',\n name: 'Jetour',\n brand: 'Jetour',\n country: 'CN',\n city: 'Wuhu',\n founded: 2018,\n },\n {\n id: 'omoda',\n name: 'Omoda',\n brand: 'Omoda',\n country: 'CN',\n city: 'Wuhu',\n founded: 2022,\n },\n {\n id: 'changan',\n name: 'Changan Automobile',\n brand: 'Changan',\n country: 'CN',\n city: 'Chongqing',\n founded: 1959,\n },\n {\n id: 'deepal',\n name: 'Deepal',\n brand: 'Deepal',\n country: 'CN',\n city: 'Chongqing',\n founded: 2022,\n },\n {\n id: 'avatr',\n name: 'Avatr Technology',\n brand: 'Avatr',\n country: 'CN',\n city: 'Chongqing',\n founded: 2018,\n },\n {\n id: 'seres',\n name: 'Seres Group',\n brand: 'Seres',\n country: 'CN',\n city: 'Chongqing',\n founded: 2016,\n },\n {\n id: 'lifan',\n name: 'Lifan Technology',\n brand: 'Lifan',\n country: 'CN',\n city: 'Chongqing',\n founded: 1992,\n },\n {\n id: 'dongfeng',\n name: 'Dongfeng Motor Corporation',\n brand: 'Dongfeng',\n country: 'CN',\n city: 'Wuhan',\n founded: 1969,\n },\n {\n id: 'voyah',\n name: 'Voyah',\n brand: 'Voyah',\n country: 'CN',\n city: 'Wuhan',\n founded: 2020,\n },\n {\n id: 'hongqi',\n name: 'Hongqi',\n brand: 'Hongqi',\n country: 'CN',\n city: 'Changchun',\n founded: 1958,\n },\n {\n id: 'jac',\n name: 'JAC Motors',\n brand: 'JAC',\n country: 'CN',\n city: 'Hefei',\n founded: 1964,\n },\n {\n id: 'wuling',\n name: 'Wuling Motors',\n brand: 'Wuling',\n country: 'CN',\n city: 'Liuzhou',\n founded: 1982,\n },\n {\n id: 'baojun',\n name: 'Baojun',\n brand: 'Baojun',\n country: 'CN',\n city: 'Liuzhou',\n founded: 2010,\n },\n {\n id: 'tata',\n name: 'Tata Motors',\n brand: 'Tata',\n country: 'IN',\n city: 'Mumbai',\n founded: 1945,\n },\n {\n id: 'mahindra',\n name: 'Mahindra & Mahindra',\n brand: 'Mahindra',\n country: 'IN',\n city: 'Mumbai',\n founded: 1945,\n },\n {\n id: 'maruti-suzuki',\n name: 'Maruti Suzuki India',\n brand: 'Maruti Suzuki',\n country: 'IN',\n city: 'New Delhi',\n founded: 1981,\n },\n {\n id: 'eicher',\n name: 'Eicher Motors',\n brand: 'Eicher',\n country: 'IN',\n city: 'New Delhi',\n founded: 1948,\n },\n {\n id: 'force-motors',\n name: 'Force Motors',\n brand: 'Force Motors',\n country: 'IN',\n city: 'Pune',\n founded: 1958,\n },\n {\n id: 'bajaj',\n name: 'Bajaj Auto',\n brand: 'Bajaj',\n country: 'IN',\n city: 'Pune',\n founded: 1945,\n },\n {\n id: 'ashok-leyland',\n name: 'Ashok Leyland',\n brand: 'Ashok Leyland',\n country: 'IN',\n city: 'Chennai',\n founded: 1948,\n },\n {\n id: 'proton',\n name: 'Proton Holdings',\n brand: 'Proton',\n country: 'MY',\n city: 'Shah Alam',\n founded: 1983,\n },\n {\n id: 'perodua',\n name: 'Perodua',\n brand: 'Perodua',\n country: 'MY',\n city: 'Kuala Lumpur',\n founded: 1993,\n },\n {\n id: 'vinfast',\n name: 'VinFast',\n brand: 'VinFast',\n country: 'VN',\n city: 'Haiphong',\n founded: 2017,\n },\n {\n id: 'lada',\n name: 'AvtoVAZ',\n brand: 'Lada',\n country: 'RU',\n city: 'Tolyatti',\n founded: 1966,\n },\n {\n id: 'gaz',\n name: 'GAZ Group',\n brand: 'GAZ',\n country: 'RU',\n city: 'Nizhny Novgorod',\n founded: 1932,\n },\n {\n id: 'uaz',\n name: 'UAZ',\n brand: 'UAZ',\n country: 'RU',\n city: 'Ulyanovsk',\n founded: 1941,\n },\n {\n id: 'holden',\n name: 'Holden',\n brand: 'Holden',\n country: 'AU',\n city: 'Melbourne',\n founded: 1908,\n },\n];\n","// @license\n// Copyright (c) 2025 Rljson\n//\n// Use of this source code is governed by terms that can be\n// found in the LICENSE file in the root of this package.\n\n// #############################################################################\n/** A city with its country, a postal code and coordinates */\nexport interface ECity {\n /** The name of the city */\n name: string;\n\n /** The ISO 3166 country code, e.g. DE */\n country: string;\n\n /** A postal code of the city */\n zip: string;\n\n /** The latitude in degrees */\n lat: number;\n\n /** The longitude in degrees */\n lng: number;\n}\n\n// .............................................................................\n/** Cities around the world, including the headquarters of every manufacturer */\nexport const cities: readonly ECity[] = [\n { name: 'Wolfsburg', country: 'DE', zip: '38440', lat: 52.42, lng: 10.79 },\n { name: 'Ingolstadt', country: 'DE', zip: '85049', lat: 48.77, lng: 11.42 },\n { name: 'Munich', country: 'DE', zip: '80331', lat: 48.14, lng: 11.58 },\n { name: 'Stuttgart', country: 'DE', zip: '70173', lat: 48.78, lng: 9.18 },\n { name: 'Rüsselsheim', country: 'DE', zip: '65428', lat: 49.99, lng: 8.41 },\n { name: 'Cologne', country: 'DE', zip: '50667', lat: 50.94, lng: 6.96 },\n { name: 'Hamburg', country: 'DE', zip: '20095', lat: 53.55, lng: 10.0 },\n { name: 'Berlin', country: 'DE', zip: '10115', lat: 52.52, lng: 13.41 },\n { name: 'Frankfurt', country: 'DE', zip: '60311', lat: 50.11, lng: 8.68 },\n { name: 'Leipzig', country: 'DE', zip: '04109', lat: 51.34, lng: 12.37 },\n { name: 'Dresden', country: 'DE', zip: '01067', lat: 51.05, lng: 13.74 },\n { name: 'Hanover', country: 'DE', zip: '30159', lat: 52.37, lng: 9.73 },\n { name: 'Bremen', country: 'DE', zip: '28195', lat: 53.08, lng: 8.8 },\n { name: 'Nuremberg', country: 'DE', zip: '90402', lat: 49.45, lng: 11.08 },\n { name: 'Zwickau', country: 'DE', zip: '08056', lat: 50.72, lng: 12.5 },\n { name: 'Böblingen', country: 'DE', zip: '71032', lat: 48.68, lng: 9.01 },\n { name: 'Paris', country: 'FR', zip: '75001', lat: 48.86, lng: 2.35 },\n {\n name: 'Boulogne-Billancourt',\n country: 'FR',\n zip: '92100',\n lat: 48.84,\n lng: 2.24,\n },\n { name: 'Poissy', country: 'FR', zip: '78300', lat: 48.93, lng: 2.04 },\n { name: 'Sochaux', country: 'FR', zip: '25600', lat: 47.51, lng: 6.83 },\n { name: 'Dieppe', country: 'FR', zip: '76200', lat: 49.92, lng: 1.08 },\n { name: 'Lyon', country: 'FR', zip: '69001', lat: 45.76, lng: 4.84 },\n { name: 'Toulouse', country: 'FR', zip: '31000', lat: 43.6, lng: 1.44 },\n { name: 'Molsheim', country: 'FR', zip: '67120', lat: 48.54, lng: 7.49 },\n { name: 'Turin', country: 'IT', zip: '10121', lat: 45.07, lng: 7.69 },\n { name: 'Maranello', country: 'IT', zip: '41053', lat: 44.53, lng: 10.86 },\n {\n name: \"Sant'Agata Bolognese\",\n country: 'IT',\n zip: '40019',\n lat: 44.66,\n lng: 11.13,\n },\n { name: 'Modena', country: 'IT', zip: '41121', lat: 44.65, lng: 10.93 },\n { name: 'Milan', country: 'IT', zip: '20121', lat: 45.46, lng: 9.19 },\n { name: 'Rome', country: 'IT', zip: '00184', lat: 41.9, lng: 12.5 },\n { name: 'Bologna', country: 'IT', zip: '40121', lat: 44.49, lng: 11.34 },\n {\n name: 'San Cesario sul Panaro',\n country: 'IT',\n zip: '41018',\n lat: 44.56,\n lng: 11.03,\n },\n { name: 'Gothenburg', country: 'SE', zip: '41103', lat: 57.71, lng: 11.97 },\n { name: 'Trollhättan', country: 'SE', zip: '46130', lat: 58.28, lng: 12.29 },\n { name: 'Stockholm', country: 'SE', zip: '11120', lat: 59.33, lng: 18.07 },\n { name: 'Ängelholm', country: 'SE', zip: '26231', lat: 56.24, lng: 12.86 },\n { name: 'Södertälje', country: 'SE', zip: '15187', lat: 59.2, lng: 17.63 },\n {\n name: 'Mladá Boleslav',\n country: 'CZ',\n zip: '29301',\n lat: 50.41,\n lng: 14.9,\n },\n { name: 'Prague', country: 'CZ', zip: '11000', lat: 50.08, lng: 14.44 },\n { name: 'Martorell', country: 'ES', zip: '08760', lat: 41.47, lng: 1.93 },\n { name: 'Barcelona', country: 'ES', zip: '08001', lat: 41.39, lng: 2.17 },\n { name: 'Madrid', country: 'ES', zip: '28001', lat: 40.42, lng: -3.7 },\n { name: 'Valencia', country: 'ES', zip: '46001', lat: 39.47, lng: -0.38 },\n { name: 'Mioveni', country: 'RO', zip: '115400', lat: 44.96, lng: 24.95 },\n { name: 'Bucharest', country: 'RO', zip: '010011', lat: 44.43, lng: 26.1 },\n { name: 'Eindhoven', country: 'NL', zip: '5611 AA', lat: 51.44, lng: 5.48 },\n { name: 'Amsterdam', country: 'NL', zip: '1012 AB', lat: 52.37, lng: 4.9 },\n {\n name: 'Sveta Nedelja',\n country: 'HR',\n zip: '10431',\n lat: 45.79,\n lng: 15.78,\n },\n { name: 'Zagreb', country: 'HR', zip: '10000', lat: 45.81, lng: 15.98 },\n { name: 'Gebze', country: 'TR', zip: '41400', lat: 40.8, lng: 29.43 },\n { name: 'Istanbul', country: 'TR', zip: '34000', lat: 41.01, lng: 28.98 },\n { name: 'Coventry', country: 'GB', zip: 'CV1 1AA', lat: 52.41, lng: -1.51 },\n { name: 'Gaydon', country: 'GB', zip: 'CV35 0DB', lat: 52.19, lng: -1.48 },\n { name: 'Crewe', country: 'GB', zip: 'CW1 3PL', lat: 53.1, lng: -2.44 },\n { name: 'Goodwood', country: 'GB', zip: 'PO18 0SH', lat: 50.86, lng: -0.75 },\n { name: 'Woking', country: 'GB', zip: 'GU21 4YH', lat: 51.32, lng: -0.56 },\n { name: 'Hethel', country: 'GB', zip: 'NR14 8EZ', lat: 52.56, lng: 1.18 },\n { name: 'Oxford', country: 'GB', zip: 'OX4 6NL', lat: 51.75, lng: -1.26 },\n { name: 'Malvern', country: 'GB', zip: 'WR14 2LL', lat: 52.11, lng: -2.33 },\n { name: 'Dartford', country: 'GB', zip: 'DA1 1AA', lat: 51.45, lng: 0.22 },\n { name: 'London', country: 'GB', zip: 'SW1A 1AA', lat: 51.5, lng: -0.13 },\n { name: 'Luton', country: 'GB', zip: 'LU1 3LU', lat: 51.88, lng: -0.42 },\n { name: 'Tokyo', country: 'JP', zip: '100-0001', lat: 35.68, lng: 139.69 },\n {\n name: 'Toyota City',\n country: 'JP',\n zip: '471-8571',\n lat: 35.08,\n lng: 137.16,\n },\n {\n name: 'Hiroshima',\n country: 'JP',\n zip: '730-0011',\n lat: 34.39,\n lng: 132.46,\n },\n { name: 'Yokohama', country: 'JP', zip: '220-0012', lat: 35.44, lng: 139.64 },\n {\n name: 'Hamamatsu',\n country: 'JP',\n zip: '430-0926',\n lat: 34.71,\n lng: 137.73,\n },\n { name: 'Osaka', country: 'JP', zip: '530-0001', lat: 34.69, lng: 135.5 },\n { name: 'Ikeda', country: 'JP', zip: '563-0044', lat: 34.82, lng: 135.43 },\n { name: 'Seoul', country: 'KR', zip: '04524', lat: 37.57, lng: 126.98 },\n { name: 'Ulsan', country: 'KR', zip: '44000', lat: 35.54, lng: 129.31 },\n { name: 'Shenzhen', country: 'CN', zip: '518000', lat: 22.54, lng: 114.06 },\n { name: 'Hangzhou', country: 'CN', zip: '310000', lat: 30.27, lng: 120.15 },\n { name: 'Shanghai', country: 'CN', zip: '200000', lat: 31.23, lng: 121.47 },\n { name: 'Beijing', country: 'CN', zip: '100000', lat: 39.91, lng: 116.4 },\n { name: 'Guangzhou', country: 'CN', zip: '510000', lat: 23.13, lng: 113.26 },\n { name: 'Baoding', country: 'CN', zip: '071000', lat: 38.87, lng: 115.46 },\n { name: 'Wuhu', country: 'CN', zip: '241000', lat: 31.35, lng: 118.43 },\n { name: 'Chongqing', country: 'CN', zip: '400000', lat: 29.56, lng: 106.55 },\n { name: 'Changchun', country: 'CN', zip: '130000', lat: 43.88, lng: 125.32 },\n { name: 'Hefei', country: 'CN', zip: '230000', lat: 31.82, lng: 117.23 },\n { name: 'Wuhan', country: 'CN', zip: '430000', lat: 30.59, lng: 114.3 },\n { name: 'Liuzhou', country: 'CN', zip: '545000', lat: 24.33, lng: 109.43 },\n { name: 'Wenzhou', country: 'CN', zip: '325000', lat: 28.0, lng: 120.7 },\n { name: 'Mumbai', country: 'IN', zip: '400001', lat: 19.08, lng: 72.88 },\n { name: 'Pune', country: 'IN', zip: '411001', lat: 18.52, lng: 73.86 },\n { name: 'Chennai', country: 'IN', zip: '600001', lat: 13.08, lng: 80.27 },\n { name: 'New Delhi', country: 'IN', zip: '110001', lat: 28.61, lng: 77.21 },\n { name: 'Austin', country: 'US', zip: '73301', lat: 30.27, lng: -97.74 },\n { name: 'Detroit', country: 'US', zip: '48201', lat: 42.33, lng: -83.05 },\n { name: 'Dearborn', country: 'US', zip: '48120', lat: 42.32, lng: -83.18 },\n {\n name: 'Auburn Hills',\n country: 'US',\n zip: '48326',\n lat: 42.69,\n lng: -83.23,\n },\n { name: 'Irvine', country: 'US', zip: '92602', lat: 33.68, lng: -117.83 },\n { name: 'Newark', country: 'US', zip: '94560', lat: 37.53, lng: -122.04 },\n {\n name: 'Los Angeles',\n country: 'US',\n zip: '90001',\n lat: 34.05,\n lng: -118.24,\n },\n { name: 'Torrance', country: 'US', zip: '90501', lat: 33.84, lng: -118.34 },\n { name: 'Bellevue', country: 'US', zip: '98004', lat: 47.61, lng: -122.2 },\n { name: 'Denton', country: 'US', zip: '76205', lat: 33.21, lng: -97.13 },\n { name: 'Portland', country: 'US', zip: '97201', lat: 45.52, lng: -122.68 },\n { name: 'Greensboro', country: 'US', zip: '27401', lat: 36.07, lng: -79.79 },\n { name: 'Chicago', country: 'US', zip: '60601', lat: 41.88, lng: -87.63 },\n { name: 'Shah Alam', country: 'MY', zip: '40000', lat: 3.07, lng: 101.52 },\n { name: 'Kuala Lumpur', country: 'MY', zip: '50000', lat: 3.14, lng: 101.69 },\n { name: 'Haiphong', country: 'VN', zip: '180000', lat: 20.86, lng: 106.68 },\n { name: 'Tolyatti', country: 'RU', zip: '445000', lat: 53.51, lng: 49.42 },\n {\n name: 'Nizhny Novgorod',\n country: 'RU',\n zip: '603000',\n lat: 56.3,\n lng: 44.0,\n },\n { name: 'Ulyanovsk', country: 'RU', zip: '432000', lat: 54.31, lng: 48.4 },\n { name: 'Melbourne', country: 'AU', zip: '3000', lat: -37.81, lng: 144.96 },\n { name: 'Sydney', country: 'AU', zip: '2000', lat: -33.87, lng: 151.21 },\n { name: 'Zurich', country: 'CH', zip: '8001', lat: 47.37, lng: 8.54 },\n { name: 'Vienna', country: 'AT', zip: '1010', lat: 48.21, lng: 16.37 },\n { name: 'Graz', country: 'AT', zip: '8010', lat: 47.07, lng: 15.44 },\n { name: 'Warsaw', country: 'PL', zip: '00-001', lat: 52.23, lng: 21.01 },\n { name: 'Brussels', country: 'BE', zip: '1000', lat: 50.85, lng: 4.35 },\n { name: 'Lisbon', country: 'PT', zip: '1100-001', lat: 38.72, lng: -9.14 },\n { name: 'Copenhagen', country: 'DK', zip: '1050', lat: 55.68, lng: 12.57 },\n { name: 'Oslo', country: 'NO', zip: '0150', lat: 59.91, lng: 10.75 },\n { name: 'Helsinki', country: 'FI', zip: '00100', lat: 60.17, lng: 24.94 },\n { name: 'Dublin', country: 'IE', zip: 'D01', lat: 53.35, lng: -6.26 },\n { name: 'Toronto', country: 'CA', zip: 'M5H 2N2', lat: 43.65, lng: -79.38 },\n {\n name: 'São Paulo',\n country: 'BR',\n zip: '01000-000',\n lat: -23.55,\n lng: -46.63,\n },\n { name: 'Mexico City', country: 'MX', zip: '06000', lat: 19.43, lng: -99.13 },\n { name: 'Johannesburg', country: 'ZA', zip: '2000', lat: -26.2, lng: 28.04 },\n { name: 'Bangkok', country: 'TH', zip: '10200', lat: 13.76, lng: 100.5 },\n { name: 'Singapore', country: 'SG', zip: '018956', lat: 1.35, lng: 103.82 },\n { name: 'Dubai', country: 'AE', zip: '00000', lat: 25.2, lng: 55.27 },\n];\n\n// .............................................................................\n/** Street names from many countries */\nexport const streets: readonly string[] = [\n 'Hauptstraße',\n 'Bahnhofstraße',\n 'Industriestraße',\n 'Gartenstraße',\n 'Schulstraße',\n 'Werkstraße',\n 'Ringstraße',\n 'Lindenallee',\n 'Kirchweg',\n 'Am Hafen',\n 'Hafenstraße',\n 'Marktplatz',\n 'Poststraße',\n 'Bergstraße',\n 'Waldweg',\n 'Mühlenweg',\n 'Rathausplatz',\n 'Feldstraße',\n 'Wiesenweg',\n 'Am Bahnhof',\n 'Main Street',\n 'High Street',\n 'Station Road',\n 'Church Lane',\n 'Park Avenue',\n 'Mill Road',\n 'King Street',\n 'Queen Street',\n 'Victoria Road',\n 'Bridge Street',\n 'Market Street',\n 'Castle Street',\n 'Oak Avenue',\n 'Elm Street',\n 'Maple Drive',\n 'Cedar Lane',\n 'Harbour Road',\n 'Factory Lane',\n 'Union Street',\n 'Commerce Way',\n 'Rue de la Gare',\n \"Rue de l'Église\",\n 'Avenue de la République',\n 'Boulevard Victor Hugo',\n 'Rue des Écoles',\n 'Place du Marché',\n 'Rue du Moulin',\n 'Chemin des Vignes',\n 'Rue Pasteur',\n 'Avenue Jean Jaurès',\n 'Via Roma',\n 'Via Garibaldi',\n 'Corso Italia',\n 'Via Dante',\n 'Piazza Garibaldi',\n 'Via Marconi',\n 'Via Verdi',\n 'Viale Europa',\n 'Via Mazzini',\n 'Via Nazionale',\n 'Calle Mayor',\n 'Avenida de la Constitución',\n 'Calle Real',\n 'Paseo de la Castellana',\n 'Gran Vía',\n 'Calle del Sol',\n 'Plaza Mayor',\n 'Avenida del Puerto',\n 'Storgatan',\n 'Kungsgatan',\n 'Industrivägen',\n 'Järnvägsgatan',\n 'Hamngatan',\n 'Nádražní',\n 'Hlavní',\n 'Průmyslová',\n 'Dworcowa',\n 'Fabryczna',\n 'Sakura-dori',\n 'Chuo-dori',\n 'Ekimae-dori',\n 'Minato-dori',\n 'Renmin Road',\n 'Zhongshan Road',\n 'Jiefang Avenue',\n 'Nanjing Road',\n 'Gangnam-daero',\n 'Teheran-ro',\n 'MG Road',\n 'Nehru Street',\n 'Lake Shore Drive',\n 'Industrial Parkway',\n 'Technology Drive',\n 'Innovation Way',\n 'Commerce Street',\n 'Ocean Boulevard',\n 'Sunset Boulevard',\n 'Harbor Boulevard',\n 'Airport Road',\n 'Riverside Drive',\n];\n\n// .............................................................................\n/**\n * Returns the cities of a country, or all cities when the country has none.\n * @param country - The ISO 3166 country code\n */\nexport const citiesIn = (country: string): readonly ECity[] => {\n const result = cities.filter((city) => city.country === country);\n return result.length > 0 ? result : cities;\n};\n\n// .............................................................................\n/**\n * Returns the city with a name, or throws when the dictionary has none.\n * @param name - The name of the city\n */\nexport const cityNamed = (name: string): ECity => {\n const city = cities.find((entry) => entry.name === name);\n if (!city) {\n throw new Error(`places: unknown city \"${name}\"`);\n }\n return city;\n};\n","// @license\n// Copyright (c) 2025 Rljson\n//\n// Use of this source code is governed by terms that can be\n// found in the LICENSE file in the root of this package.\n\n// #############################################################################\n/** The body types of the vehicles */\nexport type EBodyType =\n | 'sedan'\n | 'hatchback'\n | 'wagon'\n | 'suv'\n | 'coupe'\n | 'convertible'\n | 'van'\n | 'pickup'\n | 'truck'\n | 'sportscar'\n | 'minivan'\n | 'microcar';\n\n// #############################################################################\n/** The fuels of the vehicles */\nexport type EFuel = 'petrol' | 'diesel' | 'hybrid' | 'electric' | 'hydrogen';\n\n// #############################################################################\n/** A vehicle model of a brand */\nexport interface EVehicleModel {\n /** The brand, as in the manufacturers dictionary */\n brand: string;\n\n /** The name of the model */\n model: string;\n\n /** The body type of the model */\n bodyType: EBodyType;\n\n /** The fuel of the model */\n fuel: EFuel;\n}\n\n// .............................................................................\n/**\n * Shortens the model entries of one brand.\n * @param brand - The brand of the models\n * @param list - Model name, body type and fuel per model\n */\nconst models = (\n brand: string,\n list: readonly (readonly [string, EBodyType, EFuel])[],\n): EVehicleModel[] =>\n list.map(([model, bodyType, fuel]) => ({ brand, model, bodyType, fuel }));\n\n// .............................................................................\n/** Vehicle models of every brand in the manufacturers dictionary */\nexport const vehicles: readonly EVehicleModel[] = [\n ...models('Volkswagen', [\n ['Polo', 'hatchback', 'petrol'],\n ['Golf', 'hatchback', 'petrol'],\n ['Passat', 'wagon', 'diesel'],\n ['Tiguan', 'suv', 'petrol'],\n ['Touareg', 'suv', 'diesel'],\n ['ID.3', 'hatchback', 'electric'],\n ['ID.4', 'suv', 'electric'],\n ['ID. Buzz', 'van', 'electric'],\n ['Arteon', 'sedan', 'hybrid'],\n ['T-Roc', 'suv', 'petrol'],\n ['Multivan', 'van', 'diesel'],\n ['Amarok', 'pickup', 'diesel'],\n ]),\n ...models('Audi', [\n ['A1', 'hatchback', 'petrol'],\n ['A3', 'hatchback', 'petrol'],\n ['A4', 'sedan', 'diesel'],\n ['A5', 'coupe', 'petrol'],\n ['A6', 'wagon', 'diesel'],\n ['A8', 'sedan', 'hybrid'],\n ['Q2', 'suv', 'petrol'],\n ['Q3', 'suv', 'petrol'],\n ['Q5', 'suv', 'hybrid'],\n ['Q7', 'suv', 'diesel'],\n ['Q8 e-tron', 'suv', 'electric'],\n ['e-tron GT', 'sedan', 'electric'],\n ['TT', 'coupe', 'petrol'],\n ['R8', 'sportscar', 'petrol'],\n ]),\n ...models('BMW', [\n ['1 Series', 'hatchback', 'petrol'],\n ['3 Series', 'sedan', 'diesel'],\n ['5 Series', 'sedan', 'hybrid'],\n ['7 Series', 'sedan', 'hybrid'],\n ['X1', 'suv', 'petrol'],\n ['X3', 'suv', 'diesel'],\n ['X5', 'suv', 'hybrid'],\n ['i4', 'sedan', 'electric'],\n ['iX', 'suv', 'electric'],\n ['iX3', 'suv', 'electric'],\n ['Z4', 'convertible', 'petrol'],\n ['M3', 'sedan', 'petrol'],\n ]),\n ...models('Mercedes-Benz', [\n ['A-Class', 'hatchback', 'petrol'],\n ['C-Class', 'sedan', 'diesel'],\n ['E-Class', 'wagon', 'hybrid'],\n ['S-Class', 'sedan', 'hybrid'],\n ['GLA', 'suv', 'petrol'],\n ['GLC', 'suv', 'diesel'],\n ['GLE', 'suv', 'hybrid'],\n ['EQA', 'suv', 'electric'],\n ['EQE', 'sedan', 'electric'],\n ['EQS', 'sedan', 'electric'],\n ['V-Class', 'van', 'diesel'],\n ['Sprinter', 'van', 'diesel'],\n ['AMG GT', 'sportscar', 'petrol'],\n ]),\n ...models('Porsche', [\n ['911', 'sportscar', 'petrol'],\n ['718 Cayman', 'coupe', 'petrol'],\n ['718 Boxster', 'convertible', 'petrol'],\n ['Taycan', 'sedan', 'electric'],\n ['Macan', 'suv', 'petrol'],\n ['Cayenne', 'suv', 'hybrid'],\n ['Panamera', 'sedan', 'hybrid'],\n ]),\n ...models('Opel', [\n ['Corsa', 'hatchback', 'petrol'],\n ['Astra', 'hatchback', 'diesel'],\n ['Insignia', 'wagon', 'diesel'],\n ['Mokka', 'suv', 'electric'],\n ['Grandland', 'suv', 'hybrid'],\n ['Crossland', 'suv', 'petrol'],\n ['Zafira', 'minivan', 'diesel'],\n ['Combo', 'van', 'diesel'],\n ]),\n ...models('Ford', [\n ['Fiesta', 'hatchback', 'petrol'],\n ['Focus', 'hatchback', 'petrol'],\n ['Mondeo', 'wagon', 'diesel'],\n ['Puma', 'suv', 'hybrid'],\n ['Kuga', 'suv', 'hybrid'],\n ['Explorer', 'suv', 'hybrid'],\n ['Mustang', 'coupe', 'petrol'],\n ['Mustang Mach-E', 'suv', 'electric'],\n ['F-150', 'pickup', 'petrol'],\n ['Ranger', 'pickup', 'diesel'],\n ['Transit', 'van', 'diesel'],\n ['Bronco', 'suv', 'petrol'],\n ]),\n ...models('Toyota', [\n ['Yaris', 'hatchback', 'hybrid'],\n ['Corolla', 'hatchback', 'hybrid'],\n ['Camry', 'sedan', 'hybrid'],\n ['Prius', 'hatchback', 'hybrid'],\n ['RAV4', 'suv', 'hybrid'],\n ['Highlander', 'suv', 'hybrid'],\n ['Land Cruiser', 'suv', 'diesel'],\n ['Hilux', 'pickup', 'diesel'],\n ['C-HR', 'suv', 'hybrid'],\n ['bZ4X', 'suv', 'electric'],\n ['Mirai', 'sedan', 'hydrogen'],\n ['Supra', 'sportscar', 'petrol'],\n ['Proace', 'van', 'diesel'],\n ]),\n ...models('Honda', [\n ['Jazz', 'hatchback', 'hybrid'],\n ['Civic', 'hatchback', 'hybrid'],\n ['Accord', 'sedan', 'hybrid'],\n ['HR-V', 'suv', 'hybrid'],\n ['CR-V', 'suv', 'hybrid'],\n ['e', 'hatchback', 'electric'],\n ['NSX', 'sportscar', 'hybrid'],\n ['Odyssey', 'minivan', 'petrol'],\n ['Pilot', 'suv', 'petrol'],\n ]),\n ...models('Nissan', [\n ['Micra', 'hatchback', 'petrol'],\n ['Juke', 'suv', 'hybrid'],\n ['Qashqai', 'suv', 'hybrid'],\n ['X-Trail', 'suv', 'hybrid'],\n ['Leaf', 'hatchback', 'electric'],\n ['Ariya', 'suv', 'electric'],\n ['GT-R', 'sportscar', 'petrol'],\n ['Navara', 'pickup', 'diesel'],\n ['Patrol', 'suv', 'petrol'],\n ]),\n ...models('Mazda', [\n ['Mazda2', 'hatchback', 'petrol'],\n ['Mazda3', 'hatchback', 'petrol'],\n ['Mazda6', 'sedan', 'petrol'],\n ['CX-3', 'suv', 'petrol'],\n ['CX-30', 'suv', 'petrol'],\n ['CX-5', 'suv', 'diesel'],\n ['CX-60', 'suv', 'hybrid'],\n ['MX-5', 'convertible', 'petrol'],\n ['MX-30', 'suv', 'electric'],\n ]),\n ...models('Subaru', [\n ['Impreza', 'hatchback', 'petrol'],\n ['Legacy', 'sedan', 'petrol'],\n ['Outback', 'wagon', 'petrol'],\n ['Forester', 'suv', 'hybrid'],\n ['Crosstrek', 'suv', 'petrol'],\n ['BRZ', 'coupe', 'petrol'],\n ['Solterra', 'suv', 'electric'],\n ['WRX', 'sedan', 'petrol'],\n ]),\n ...models('Mitsubishi', [\n ['Space Star', 'hatchback', 'petrol'],\n ['ASX', 'suv', 'petrol'],\n ['Eclipse Cross', 'suv', 'hybrid'],\n ['Outlander', 'suv', 'hybrid'],\n ['Pajero', 'suv', 'diesel'],\n ['L200', 'pickup', 'diesel'],\n ]),\n ...models('Suzuki', [\n ['Swift', 'hatchback', 'hybrid'],\n ['Ignis', 'hatchback', 'hybrid'],\n ['Vitara', 'suv', 'hybrid'],\n ['S-Cross', 'suv', 'hybrid'],\n ['Jimny', 'suv', 'petrol'],\n ['Across', 'suv', 'hybrid'],\n ['Baleno', 'hatchback', 'petrol'],\n ]),\n ...models('Daihatsu', [\n ['Mira', 'microcar', 'petrol'],\n ['Move', 'microcar', 'petrol'],\n ['Tanto', 'microcar', 'petrol'],\n ['Rocky', 'suv', 'hybrid'],\n ['Copen', 'convertible', 'petrol'],\n ['Hijet', 'van', 'petrol'],\n ]),\n ...models('Lexus', [\n ['IS', 'sedan', 'hybrid'],\n ['ES', 'sedan', 'hybrid'],\n ['LS', 'sedan', 'hybrid'],\n ['UX', 'suv', 'hybrid'],\n ['NX', 'suv', 'hybrid'],\n ['RX', 'suv', 'hybrid'],\n ['LC', 'coupe', 'hybrid'],\n ['RZ', 'suv', 'electric'],\n ]),\n ...models('Infiniti', [\n ['Q50', 'sedan', 'petrol'],\n ['Q60', 'coupe', 'petrol'],\n ['QX50', 'suv', 'petrol'],\n ['QX60', 'suv', 'petrol'],\n ['QX80', 'suv', 'petrol'],\n ]),\n ...models('Acura', [\n ['Integra', 'hatchback', 'petrol'],\n ['TLX', 'sedan', 'petrol'],\n ['RDX', 'suv', 'petrol'],\n ['MDX', 'suv', 'petrol'],\n ['ZDX', 'suv', 'electric'],\n ]),\n ...models('Isuzu', [\n ['D-Max', 'pickup', 'diesel'],\n ['MU-X', 'suv', 'diesel'],\n ['N-Series', 'truck', 'diesel'],\n ['F-Series', 'truck', 'diesel'],\n ]),\n ...models('Hino', [\n ['300 Series', 'truck', 'diesel'],\n ['500 Series', 'truck', 'diesel'],\n ['700 Series', 'truck', 'diesel'],\n ['Dutro', 'truck', 'hybrid'],\n ]),\n ...models('Datsun', [\n ['Go', 'hatchback', 'petrol'],\n ['Go+', 'minivan', 'petrol'],\n ['redi-GO', 'hatchback', 'petrol'],\n ['240Z', 'sportscar', 'petrol'],\n ]),\n ...models('Hyundai', [\n ['i10', 'hatchback', 'petrol'],\n ['i20', 'hatchback', 'petrol'],\n ['i30', 'hatchback', 'petrol'],\n ['Elantra', 'sedan', 'hybrid'],\n ['Tucson', 'suv', 'hybrid'],\n ['Santa Fe', 'suv', 'hybrid'],\n ['Kona', 'suv', 'electric'],\n ['Ioniq 5', 'suv', 'electric'],\n ['Ioniq 6', 'sedan', 'electric'],\n ['Nexo', 'suv', 'hydrogen'],\n ['Staria', 'van', 'diesel'],\n ]),\n ...models('Kia', [\n ['Picanto', 'hatchback', 'petrol'],\n ['Rio', 'hatchback', 'petrol'],\n ['Ceed', 'hatchback', 'petrol'],\n ['Niro', 'suv', 'hybrid'],\n ['Sportage', 'suv', 'hybrid'],\n ['Sorento', 'suv', 'hybrid'],\n ['EV6', 'suv', 'electric'],\n ['EV9', 'suv', 'electric'],\n ['Stinger', 'sedan', 'petrol'],\n ['Carnival', 'minivan', 'petrol'],\n ]),\n ...models('Genesis', [\n ['G70', 'sedan', 'petrol'],\n ['G80', 'sedan', 'petrol'],\n ['G90', 'sedan', 'petrol'],\n ['GV60', 'suv', 'electric'],\n ['GV70', 'suv', 'petrol'],\n ['GV80', 'suv', 'diesel'],\n ]),\n ...models('KG Mobility', [\n ['Torres', 'suv', 'petrol'],\n ['Korando', 'suv', 'petrol'],\n ['Rexton', 'suv', 'diesel'],\n ['Tivoli', 'suv', 'petrol'],\n ['Musso', 'pickup', 'diesel'],\n ]),\n ...models('Daewoo', [\n ['Matiz', 'hatchback', 'petrol'],\n ['Lanos', 'hatchback', 'petrol'],\n ['Nubira', 'sedan', 'petrol'],\n ['Leganza', 'sedan', 'petrol'],\n ['Kalos', 'hatchback', 'petrol'],\n ]),\n ...models('Renault', [\n ['Clio', 'hatchback', 'hybrid'],\n ['Captur', 'suv', 'hybrid'],\n ['Megane', 'hatchback', 'electric'],\n ['Austral', 'suv', 'hybrid'],\n ['Arkana', 'suv', 'hybrid'],\n ['Espace', 'suv', 'hybrid'],\n ['Zoe', 'hatchback', 'electric'],\n ['Kangoo', 'van', 'diesel'],\n ['Trafic', 'van', 'diesel'],\n ['Master', 'van', 'diesel'],\n ['Scenic', 'suv', 'electric'],\n ['Twingo', 'hatchback', 'petrol'],\n ]),\n ...models('Peugeot', [\n ['208', 'hatchback', 'petrol'],\n ['2008', 'suv', 'electric'],\n ['308', 'hatchback', 'hybrid'],\n ['3008', 'suv', 'hybrid'],\n ['408', 'sedan', 'hybrid'],\n ['508', 'wagon', 'hybrid'],\n ['5008', 'suv', 'diesel'],\n ['Rifter', 'van', 'diesel'],\n ['Expert', 'van', 'diesel'],\n ['Partner', 'van', 'diesel'],\n ]),\n ...models('Citroën', [\n ['C3', 'hatchback', 'petrol'],\n ['C3 Aircross', 'suv', 'petrol'],\n ['C4', 'hatchback', 'electric'],\n ['C5 Aircross', 'suv', 'hybrid'],\n ['C5 X', 'wagon', 'hybrid'],\n ['Berlingo', 'van', 'diesel'],\n ['Ami', 'microcar', 'electric'],\n ['SpaceTourer', 'van', 'diesel'],\n ]),\n ...models('DS', [\n ['DS 3', 'suv', 'electric'],\n ['DS 4', 'hatchback', 'hybrid'],\n ['DS 7', 'suv', 'hybrid'],\n ['DS 9', 'sedan', 'hybrid'],\n ]),\n ...models('Alpine', [\n ['A110', 'sportscar', 'petrol'],\n ['A290', 'hatchback', 'electric'],\n ['A110 R', 'sportscar', 'petrol'],\n ]),\n ...models('Bugatti', [\n ['Chiron', 'sportscar', 'petrol'],\n ['Veyron', 'sportscar', 'petrol'],\n ['Divo', 'sportscar', 'petrol'],\n ['Mistral', 'convertible', 'petrol'],\n ['Tourbillon', 'sportscar', 'hybrid'],\n ]),\n ...models('Simca', [\n ['1000', 'sedan', 'petrol'],\n ['1100', 'hatchback', 'petrol'],\n ['1301', 'sedan', 'petrol'],\n ['Aronde', 'sedan', 'petrol'],\n ]),\n ...models('Matra', [\n ['Rancho', 'suv', 'petrol'],\n ['Murena', 'coupe', 'petrol'],\n ['Bagheera', 'coupe', 'petrol'],\n ['Djet', 'coupe', 'petrol'],\n ]),\n ...models('Renault Trucks', [\n ['T', 'truck', 'diesel'],\n ['C', 'truck', 'diesel'],\n ['K', 'truck', 'diesel'],\n ['D', 'truck', 'diesel'],\n ['E-Tech T', 'truck', 'electric'],\n ['Master', 'van', 'diesel'],\n ]),\n ...models('Dacia', [\n ['Sandero', 'hatchback', 'petrol'],\n ['Logan', 'sedan', 'petrol'],\n ['Duster', 'suv', 'diesel'],\n ['Jogger', 'wagon', 'hybrid'],\n ['Spring', 'hatchback', 'electric'],\n ['Bigster', 'suv', 'hybrid'],\n ]),\n ...models('Fiat', [\n ['500', 'hatchback', 'hybrid'],\n ['500e', 'hatchback', 'electric'],\n ['Panda', 'hatchback', 'hybrid'],\n ['Tipo', 'hatchback', 'petrol'],\n ['600', 'suv', 'hybrid'],\n ['Doblò', 'van', 'diesel'],\n ['Ducato', 'van', 'diesel'],\n ['Punto', 'hatchback', 'petrol'],\n ]),\n ...models('Alfa Romeo', [\n ['Giulia', 'sedan', 'petrol'],\n ['Stelvio', 'suv', 'diesel'],\n ['Tonale', 'suv', 'hybrid'],\n ['Junior', 'suv', 'electric'],\n ['Giulietta', 'hatchback', 'petrol'],\n ['4C', 'sportscar', 'petrol'],\n ]),\n ...models('Lancia', [\n ['Ypsilon', 'hatchback', 'hybrid'],\n ['Delta', 'hatchback', 'petrol'],\n ['Thema', 'sedan', 'petrol'],\n ['Gamma', 'suv', 'electric'],\n ]),\n ...models('Abarth', [\n ['500', 'hatchback', 'petrol'],\n ['500e', 'hatchback', 'electric'],\n ['595', 'hatchback', 'petrol'],\n ['695', 'hatchback', 'petrol'],\n ['124 Spider', 'convertible', 'petrol'],\n ]),\n ...models('Ferrari', [\n ['Roma', 'coupe', 'petrol'],\n ['296 GTB', 'coupe', 'hybrid'],\n ['SF90 Stradale', 'sportscar', 'hybrid'],\n ['F8 Tributo', 'sportscar', 'petrol'],\n ['812 Superfast', 'coupe', 'petrol'],\n ['Purosangue', 'suv', 'petrol'],\n ['Portofino', 'convertible', 'petrol'],\n ]),\n ...models('Lamborghini', [\n ['Huracán', 'sportscar', 'petrol'],\n ['Aventador', 'sportscar', 'petrol'],\n ['Revuelto', 'sportscar', 'hybrid'],\n ['Urus', 'suv', 'petrol'],\n ['Temerario', 'sportscar', 'hybrid'],\n ]),\n ...models('Maserati', [\n ['Ghibli', 'sedan', 'petrol'],\n ['Quattroporte', 'sedan', 'petrol'],\n ['Levante', 'suv', 'petrol'],\n ['Grecale', 'suv', 'hybrid'],\n ['MC20', 'sportscar', 'petrol'],\n ['GranTurismo', 'coupe', 'petrol'],\n ['GranCabrio', 'convertible', 'petrol'],\n ]),\n ...models('Pagani', [\n ['Zonda', 'sportscar', 'petrol'],\n ['Huayra', 'sportscar', 'petrol'],\n ['Utopia', 'sportscar', 'petrol'],\n ]),\n ...models('Autobianchi', [\n ['A112', 'hatchback', 'petrol'],\n ['Y10', 'hatchback', 'petrol'],\n ['Bianchina', 'microcar', 'petrol'],\n ]),\n ...models('De Tomaso', [\n ['Pantera', 'sportscar', 'petrol'],\n ['Mangusta', 'sportscar', 'petrol'],\n ['P72', 'sportscar', 'petrol'],\n ['Deauville', 'sedan', 'petrol'],\n ]),\n ...models('Pininfarina', [\n ['Battista', 'sportscar', 'electric'],\n ['B95', 'sportscar', 'electric'],\n ['Pura Vision', 'suv', 'electric'],\n ]),\n ...models('Iveco', [\n ['Daily', 'van', 'diesel'],\n ['Eurocargo', 'truck', 'diesel'],\n ['S-Way', 'truck', 'diesel'],\n ['T-Way', 'truck', 'diesel'],\n ['eDaily', 'van', 'electric'],\n ]),\n ...models('Volvo', [\n ['XC40', 'suv', 'hybrid'],\n ['XC60', 'suv', 'hybrid'],\n ['XC90', 'suv', 'hybrid'],\n ['EX30', 'suv', 'electric'],\n ['EX90', 'suv', 'electric'],\n ['S60', 'sedan', 'hybrid'],\n ['S90', 'sedan', 'hybrid'],\n ['V60', 'wagon', 'hybrid'],\n ['V90', 'wagon', 'hybrid'],\n ['C40', 'suv', 'electric'],\n ]),\n ...models('Polestar', [\n ['Polestar 2', 'sedan', 'electric'],\n ['Polestar 3', 'suv', 'electric'],\n ['Polestar 4', 'suv', 'electric'],\n ['Polestar 1', 'coupe', 'hybrid'],\n ]),\n ...models('Koenigsegg', [\n ['Jesko', 'sportscar', 'petrol'],\n ['Gemera', 'sportscar', 'hybrid'],\n ['Regera', 'sportscar', 'hybrid'],\n ['Agera', 'sportscar', 'petrol'],\n ['CC850', 'sportscar', 'petrol'],\n ]),\n ...models('Saab', [\n ['9-3', 'sedan', 'petrol'],\n ['9-5', 'wagon', 'diesel'],\n ['900', 'hatchback', 'petrol'],\n ['9000', 'sedan', 'petrol'],\n ]),\n ...models('Scania', [\n ['R-Series', 'truck', 'diesel'],\n ['S-Series', 'truck', 'diesel'],\n ['P-Series', 'truck', 'diesel'],\n ['G-Series', 'truck', 'diesel'],\n ['L-Series', 'truck', 'diesel'],\n ]),\n ...models('Volvo Trucks', [\n ['FH', 'truck', 'diesel'],\n ['FM', 'truck', 'diesel'],\n ['FMX', 'truck', 'diesel'],\n ['FL', 'truck', 'diesel'],\n ['FH Electric', 'truck', 'electric'],\n ['VNL', 'truck', 'diesel'],\n ]),\n ...models('Škoda', [\n ['Fabia', 'hatchback', 'petrol'],\n ['Scala', 'hatchback', 'petrol'],\n ['Octavia', 'wagon', 'diesel'],\n ['Superb', 'wagon', 'hybrid'],\n ['Kamiq', 'suv', 'petrol'],\n ['Karoq', 'suv', 'diesel'],\n ['Kodiaq', 'suv', 'diesel'],\n ['Enyaq', 'suv', 'electric'],\n ['Elroq', 'suv', 'electric'],\n ]),\n ...models('Praga', [\n ['Bohema', 'sportscar', 'petrol'],\n ['R1', 'sportscar', 'petrol'],\n ['Alfa', 'sedan', 'petrol'],\n ]),\n ...models('SEAT', [\n ['Ibiza', 'hatchback', 'petrol'],\n ['Leon', 'hatchback', 'hybrid'],\n ['Arona', 'suv', 'petrol'],\n ['Ateca', 'suv', 'diesel'],\n ['Tarraco', 'suv', 'hybrid'],\n ['Alhambra', 'minivan', 'diesel'],\n ]),\n ...models('Cupra', [\n ['Formentor', 'suv', 'hybrid'],\n ['Leon', 'hatchback', 'hybrid'],\n ['Ateca', 'suv', 'petrol'],\n ['Born', 'hatchback', 'electric'],\n ['Tavascan', 'suv', 'electric'],\n ['Terramar', 'suv', 'hybrid'],\n ]),\n ...models('DAF', [\n ['XF', 'truck', 'diesel'],\n ['XG', 'truck', 'diesel'],\n ['XG+', 'truck', 'diesel'],\n ['CF', 'truck', 'diesel'],\n ['LF', 'truck', 'diesel'],\n ['XD', 'truck', 'electric'],\n ]),\n ...models('Spyker', [\n ['C8 Aileron', 'sportscar', 'petrol'],\n ['C8 Preliator', 'sportscar', 'petrol'],\n ['C8 Laviolette', 'sportscar', 'petrol'],\n ]),\n ...models('Zenvo', [\n ['TSR-S', 'sportscar', 'petrol'],\n ['Aurora', 'sportscar', 'hybrid'],\n ['ST1', 'sportscar', 'petrol'],\n ]),\n ...models('Rimac', [\n ['Nevera', 'sportscar', 'electric'],\n ['Concept One', 'sportscar', 'electric'],\n ['Nevera R', 'sportscar', 'electric'],\n ]),\n ...models('Togg', [\n ['T10X', 'suv', 'electric'],\n ['T10F', 'sedan', 'electric'],\n ['T8X', 'suv', 'electric'],\n ]),\n ...models('MAN', [\n ['TGX', 'truck', 'diesel'],\n ['TGS', 'truck', 'diesel'],\n ['TGM', 'truck', 'diesel'],\n ['TGL', 'truck', 'diesel'],\n ['TGE', 'van', 'diesel'],\n ['eTGX', 'truck', 'electric'],\n ]),\n ...models('Smart', [\n ['fortwo', 'microcar', 'electric'],\n ['forfour', 'hatchback', 'electric'],\n ['#1', 'suv', 'electric'],\n ['#3', 'suv', 'electric'],\n ['#5', 'suv', 'electric'],\n ]),\n ...models('Maybach', [\n ['57', 'sedan', 'petrol'],\n ['62', 'sedan', 'petrol'],\n ['S 680', 'sedan', 'petrol'],\n ['GLS 600', 'suv', 'petrol'],\n ['Zeppelin', 'sedan', 'petrol'],\n ]),\n ...models('Borgward', [\n ['Isabella', 'sedan', 'petrol'],\n ['BX7', 'suv', 'petrol'],\n ['BX5', 'suv', 'petrol'],\n ['Hansa', 'sedan', 'petrol'],\n ]),\n ...models('Trabant', [\n ['601', 'sedan', 'petrol'],\n ['601 Kombi', 'wagon', 'petrol'],\n ['1.1', 'hatchback', 'petrol'],\n ['P50', 'sedan', 'petrol'],\n ]),\n ...models('Horch', [\n ['853', 'convertible', 'petrol'],\n ['930 V', 'sedan', 'petrol'],\n ['851', 'sedan', 'petrol'],\n ]),\n ...models('Daimler Truck', [\n ['Actros', 'truck', 'diesel'],\n ['Arocs', 'truck', 'diesel'],\n ['Atego', 'truck', 'diesel'],\n ['eActros', 'truck', 'electric'],\n ['Unimog', 'truck', 'diesel'],\n ]),\n ...models('Tesla', [\n ['Model 3', 'sedan', 'electric'],\n ['Model Y', 'suv', 'electric'],\n ['Model S', 'sedan', 'electric'],\n ['Model X', 'suv', 'electric'],\n ['Cybertruck', 'pickup', 'electric'],\n ['Semi', 'truck', 'electric'],\n ]),\n ...models('Rivian', [\n ['R1T', 'pickup', 'electric'],\n ['R1S', 'suv', 'electric'],\n ['R2', 'suv', 'electric'],\n ['R3', 'hatchback', 'electric'],\n ]),\n ...models('Lucid', [\n ['Air', 'sedan', 'electric'],\n ['Gravity', 'suv', 'electric'],\n ['Air Sapphire', 'sedan', 'electric'],\n ]),\n ...models('Chevrolet', [\n ['Spark', 'hatchback', 'petrol'],\n ['Malibu', 'sedan', 'petrol'],\n ['Camaro', 'coupe', 'petrol'],\n ['Corvette', 'sportscar', 'petrol'],\n ['Equinox', 'suv', 'petrol'],\n ['Traverse', 'suv', 'petrol'],\n ['Tahoe', 'suv', 'petrol'],\n ['Suburban', 'suv', 'petrol'],\n ['Silverado', 'pickup', 'petrol'],\n ['Colorado', 'pickup', 'diesel'],\n ['Bolt EV', 'hatchback', 'electric'],\n ['Blazer EV', 'suv', 'electric'],\n ]),\n ...models('Cadillac', [\n ['CT4', 'sedan', 'petrol'],\n ['CT5', 'sedan', 'petrol'],\n ['XT4', 'suv', 'petrol'],\n ['XT5', 'suv', 'petrol'],\n ['Escalade', 'suv', 'petrol'],\n ['Lyriq', 'suv', 'electric'],\n ['Celestiq', 'sedan', 'electric'],\n ]),\n ...models('GMC', [\n ['Sierra', 'pickup', 'petrol'],\n ['Canyon', 'pickup', 'petrol'],\n ['Yukon', 'suv', 'petrol'],\n ['Acadia', 'suv', 'petrol'],\n ['Terrain', 'suv', 'petrol'],\n ['Hummer EV', 'pickup', 'electric'],\n ]),\n ...models('Buick', [\n ['Encore', 'suv', 'petrol'],\n ['Envision', 'suv', 'petrol'],\n ['Enclave', 'suv', 'petrol'],\n ['Envista', 'suv', 'petrol'],\n ['Regal', 'sedan', 'petrol'],\n ]),\n ...models('Lincoln', [\n ['Corsair', 'suv', 'hybrid'],\n ['Nautilus', 'suv', 'hybrid'],\n ['Aviator', 'suv', 'hybrid'],\n ['Navigator', 'suv', 'petrol'],\n ['Continental', 'sedan', 'petrol'],\n ]),\n ...models('Chrysler', [\n ['Pacifica', 'minivan', 'hybrid'],\n ['Voyager', 'minivan', 'petrol'],\n ['300', 'sedan', 'petrol'],\n ['Airflow', 'suv', 'electric'],\n ]),\n ...models('Dodge', [\n ['Charger', 'sedan', 'petrol'],\n ['Challenger', 'coupe', 'petrol'],\n ['Durango', 'suv', 'petrol'],\n ['Hornet', 'suv', 'hybrid'],\n ['Viper', 'sportscar', 'petrol'],\n ]),\n ...models('Jeep', [\n ['Renegade', 'suv', 'petrol'],\n ['Compass', 'suv', 'hybrid'],\n ['Cherokee', 'suv', 'petrol'],\n ['Grand Cherokee', 'suv', 'hybrid'],\n ['Wrangler', 'suv', 'hybrid'],\n ['Gladiator', 'pickup', 'petrol'],\n ['Avenger', 'suv', 'electric'],\n ['Wagoneer', 'suv', 'petrol'],\n ]),\n ...models('Ram', [\n ['1500', 'pickup', 'petrol'],\n ['2500', 'pickup', 'diesel'],\n ['3500', 'pickup', 'diesel'],\n ['ProMaster', 'van', 'petrol'],\n ['1500 REV', 'pickup', 'electric'],\n ]),\n ...models('Fisker', [\n ['Ocean', 'suv', 'electric'],\n ['Pear', 'suv', 'electric'],\n ['Alaska', 'pickup', 'electric'],\n ['Karma', 'sedan', 'hybrid'],\n ]),\n ...models('Canoo', [\n ['Lifestyle Vehicle', 'van', 'electric'],\n ['Pickup', 'pickup', 'electric'],\n ['MPDV', 'van', 'electric'],\n ]),\n ...models('Karma', [\n ['Revero', 'sedan', 'hybrid'],\n ['GS-6', 'sedan', 'hybrid'],\n ['Gyesera', 'sedan', 'electric'],\n ['Kaveya', 'coupe', 'electric'],\n ]),\n ...models('Faraday Future', [\n ['FF 91', 'suv', 'electric'],\n ['FF 81', 'suv', 'electric'],\n ['FF 71', 'sedan', 'electric'],\n ]),\n ...models('Pontiac', [\n ['Firebird', 'coupe', 'petrol'],\n ['GTO', 'coupe', 'petrol'],\n ['Grand Prix', 'sedan', 'petrol'],\n ['Solstice', 'convertible', 'petrol'],\n ['Trans Am', 'coupe', 'petrol'],\n ]),\n ...models('Oldsmobile', [\n ['Cutlass', 'sedan', 'petrol'],\n ['442', 'coupe', 'petrol'],\n ['Toronado', 'coupe', 'petrol'],\n ['Alero', 'sedan', 'petrol'],\n ]),\n ...models('Plymouth', [\n ['Barracuda', 'coupe', 'petrol'],\n ['Road Runner', 'coupe', 'petrol'],\n ['Voyager', 'minivan', 'petrol'],\n ['Prowler', 'convertible', 'petrol'],\n ]),\n ...models('Hummer', [\n ['H1', 'suv', 'diesel'],\n ['H2', 'suv', 'petrol'],\n ['H3', 'suv', 'petrol'],\n ]),\n ...models('Saturn', [\n ['S-Series', 'sedan', 'petrol'],\n ['Ion', 'sedan', 'petrol'],\n ['Vue', 'suv', 'petrol'],\n ['Sky', 'convertible', 'petrol'],\n ]),\n ...models('Mercury', [\n ['Cougar', 'coupe', 'petrol'],\n ['Grand Marquis', 'sedan', 'petrol'],\n ['Mountaineer', 'suv', 'petrol'],\n ['Milan', 'sedan', 'hybrid'],\n ]),\n ...models('Kenworth', [\n ['T680', 'truck', 'diesel'],\n ['T880', 'truck', 'diesel'],\n ['W900', 'truck', 'diesel'],\n ['T270', 'truck', 'diesel'],\n ['T680E', 'truck', 'electric'],\n ]),\n ...models('Peterbilt', [\n ['579', 'truck', 'diesel'],\n ['389', 'truck', 'diesel'],\n ['567', 'truck', 'diesel'],\n ['520', 'truck', 'diesel'],\n ['579EV', 'truck', 'electric'],\n ]),\n ...models('Freightliner', [\n ['Cascadia', 'truck', 'diesel'],\n ['M2 106', 'truck', 'diesel'],\n ['114SD', 'truck', 'diesel'],\n ['eCascadia', 'truck', 'electric'],\n ['Sprinter', 'van', 'diesel'],\n ]),\n ...models('Western Star', [\n ['49X', 'truck', 'diesel'],\n ['47X', 'truck', 'diesel'],\n ['57X', 'truck', 'diesel'],\n ['4700', 'truck', 'diesel'],\n ]),\n ...models('Mack', [\n ['Anthem', 'truck', 'diesel'],\n ['Granite', 'truck', 'diesel'],\n ['Pinnacle', 'truck', 'diesel'],\n ['LR Electric', 'truck', 'electric'],\n ['MD Series', 'truck', 'diesel'],\n ]),\n ...models('International', [\n ['LT Series', 'truck', 'diesel'],\n ['RH Series', 'truck', 'diesel'],\n ['HX Series', 'truck', 'diesel'],\n ['MV Series', 'truck', 'diesel'],\n ['eMV', 'truck', 'electric'],\n ]),\n ...models('Jaguar', [\n ['XE', 'sedan', 'petrol'],\n ['XF', 'sedan', 'diesel'],\n ['F-Pace', 'suv', 'diesel'],\n ['E-Pace', 'suv', 'petrol'],\n ['I-Pace', 'suv', 'electric'],\n ['F-Type', 'sportscar', 'petrol'],\n ['XJ', 'sedan', 'petrol'],\n ]),\n ...models('Land Rover', [\n ['Defender', 'suv', 'diesel'],\n ['Discovery', 'suv', 'diesel'],\n ['Discovery Sport', 'suv', 'hybrid'],\n ['Range Rover', 'suv', 'hybrid'],\n ['Range Rover Sport', 'suv', 'hybrid'],\n ['Range Rover Velar', 'suv', 'hybrid'],\n ['Range Rover Evoque', 'suv', 'hybrid'],\n ]),\n ...models('Bentley', [\n ['Continental GT', 'coupe', 'petrol'],\n ['Continental GTC', 'convertible', 'petrol'],\n ['Flying Spur', 'sedan', 'hybrid'],\n ['Bentayga', 'suv', 'hybrid'],\n ['Mulsanne', 'sedan', 'petrol'],\n ]),\n ...models('Rolls-Royce', [\n ['Phantom', 'sedan', 'petrol'],\n ['Ghost', 'sedan', 'petrol'],\n ['Cullinan', 'suv', 'petrol'],\n ['Spectre', 'coupe', 'electric'],\n ['Dawn', 'convertible', 'petrol'],\n ['Wraith', 'coupe', 'petrol'],\n ]),\n ...models('Aston Martin', [\n ['Vantage', 'sportscar', 'petrol'],\n ['DB12', 'coupe', 'petrol'],\n ['DBS', 'coupe', 'petrol'],\n ['DBX', 'suv', 'petrol'],\n ['Valhalla', 'sportscar', 'hybrid'],\n ['Valkyrie', 'sportscar', 'hybrid'],\n ]),\n ...models('McLaren', [\n ['720S', 'sportscar', 'petrol'],\n ['750S', 'sportscar', 'petrol'],\n ['Artura', 'sportscar', 'hybrid'],\n ['GT', 'coupe', 'petrol'],\n ['765LT', 'sportscar', 'petrol'],\n ['Senna', 'sportscar', 'petrol'],\n ]),\n ...models('Lotus', [\n ['Emira', 'sportscar', 'petrol'],\n ['Evija', 'sportscar', 'electric'],\n ['Eletre', 'suv', 'electric'],\n ['Emeya', 'sedan', 'electric'],\n ['Elise', 'sportscar', 'petrol'],\n ['Exige', 'sportscar', 'petrol'],\n ['Evora', 'coupe', 'petrol'],\n ]),\n ...models('MINI', [\n ['Cooper', 'hatchback', 'petrol'],\n ['Cooper SE', 'hatchback', 'electric'],\n ['Countryman', 'suv', 'hybrid'],\n ['Clubman', 'wagon', 'petrol'],\n ['Convertible', 'convertible', 'petrol'],\n ['Aceman', 'suv', 'electric'],\n ]),\n ...models('Morgan', [\n ['Plus Four', 'convertible', 'petrol'],\n ['Plus Six', 'convertible', 'petrol'],\n ['Super 3', 'sportscar', 'petrol'],\n ['Midsummer', 'convertible', 'petrol'],\n ]),\n ...models('Vauxhall', [\n ['Corsa', 'hatchback', 'petrol'],\n ['Astra', 'hatchback', 'hybrid'],\n ['Mokka', 'suv', 'electric'],\n ['Grandland', 'suv', 'hybrid'],\n ['Vivaro', 'van', 'diesel'],\n ['Movano', 'van', 'diesel'],\n ]),\n ...models('Caterham', [\n ['Seven 170', 'sportscar', 'petrol'],\n ['Seven 360', 'sportscar', 'petrol'],\n ['Seven 420', 'sportscar', 'petrol'],\n ['Seven 620', 'sportscar', 'petrol'],\n ['Project V', 'coupe', 'electric'],\n ]),\n ...models('Ineos', [\n ['Grenadier', 'suv', 'diesel'],\n ['Quartermaster', 'pickup', 'diesel'],\n ['Fusilier', 'suv', 'electric'],\n ]),\n ...models('Rover', [\n ['75', 'sedan', 'petrol'],\n ['200', 'hatchback', 'petrol'],\n ['400', 'sedan', 'diesel'],\n ['600', 'sedan', 'petrol'],\n ['800', 'sedan', 'petrol'],\n ]),\n ...models('MG', [\n ['MG3', 'hatchback', 'hybrid'],\n ['MG4', 'hatchback', 'electric'],\n ['MG5', 'wagon', 'electric'],\n ['ZS', 'suv', 'electric'],\n ['HS', 'suv', 'hybrid'],\n ['Cyberster', 'convertible', 'electric'],\n ['Marvel R', 'suv', 'electric'],\n ]),\n ...models('Triumph', [\n ['Spitfire', 'convertible', 'petrol'],\n ['TR6', 'convertible', 'petrol'],\n ['Stag', 'convertible', 'petrol'],\n ['Dolomite', 'sedan', 'petrol'],\n ]),\n ...models('BYD', [\n ['Dolphin', 'hatchback', 'electric'],\n ['Seal', 'sedan', 'electric'],\n ['Atto 3', 'suv', 'electric'],\n ['Tang', 'suv', 'electric'],\n ['Han', 'sedan', 'electric'],\n ['Song Plus', 'suv', 'hybrid'],\n ['Seal U', 'suv', 'hybrid'],\n ['Yuan Plus', 'suv', 'electric'],\n ['Qin Plus', 'sedan', 'hybrid'],\n ]),\n ...models('Denza', [\n ['D9', 'minivan', 'hybrid'],\n ['N7', 'suv', 'electric'],\n ['N8', 'suv', 'hybrid'],\n ['Z9 GT', 'wagon', 'electric'],\n ]),\n ...models('Yangwang', [\n ['U8', 'suv', 'hybrid'],\n ['U9', 'sportscar', 'electric'],\n ['U7', 'sedan', 'electric'],\n ]),\n ...models('Geely', [\n ['Coolray', 'suv', 'petrol'],\n ['Emgrand', 'sedan', 'petrol'],\n ['Xingyue L', 'suv', 'hybrid'],\n ['Galaxy E8', 'sedan', 'electric'],\n ['Geometry C', 'suv', 'electric'],\n ['Boyue', 'suv', 'petrol'],\n ]),\n ...models('Lynk & Co', [\n ['01', 'suv', 'hybrid'],\n ['02', 'suv', 'electric'],\n ['03', 'sedan', 'petrol'],\n ['05', 'suv', 'petrol'],\n ['08', 'suv', 'hybrid'],\n ['09', 'suv', 'hybrid'],\n ]),\n ...models('Zeekr', [\n ['001', 'wagon', 'electric'],\n ['007', 'sedan', 'electric'],\n ['009', 'minivan', 'electric'],\n ['X', 'suv', 'electric'],\n ['7X', 'suv', 'electric'],\n ]),\n ...models('Leapmotor', [\n ['T03', 'hatchback', 'electric'],\n ['C10', 'suv', 'electric'],\n ['C11', 'suv', 'electric'],\n ['C16', 'suv', 'hybrid'],\n ['B10', 'suv', 'electric'],\n ]),\n ...models('NIO', [\n ['ET5', 'sedan', 'electric'],\n ['ET7', 'sedan', 'electric'],\n ['ES6', 'suv', 'electric'],\n ['ES8', 'suv', 'electric'],\n ['EC6', 'suv', 'electric'],\n ['EL7', 'suv', 'electric'],\n ]),\n ...models('Aiways', [\n ['U5', 'suv', 'electric'],\n ['U6', 'suv', 'electric'],\n ['U7 ion', 'suv', 'electric'],\n ]),\n ...models('IM Motors', [\n ['L7', 'sedan', 'electric'],\n ['LS7', 'suv', 'electric'],\n ['LS6', 'suv', 'electric'],\n ['L6', 'sedan', 'electric'],\n ]),\n ...models('Roewe', [\n ['RX5', 'suv', 'petrol'],\n ['i5', 'sedan', 'petrol'],\n ['RX9', 'suv', 'petrol'],\n ['D7', 'sedan', 'electric'],\n ['iMAX8', 'minivan', 'hybrid'],\n ]),\n ...models('Maxus', [\n ['eDeliver 3', 'van', 'electric'],\n ['eDeliver 9', 'van', 'electric'],\n ['T90', 'pickup', 'diesel'],\n ['D90', 'suv', 'diesel'],\n ['Mifa 9', 'minivan', 'electric'],\n ]),\n ...models('XPeng', [\n ['P7', 'sedan', 'electric'],\n ['G6', 'suv', 'electric'],\n ['G9', 'suv', 'electric'],\n ['X9', 'minivan', 'electric'],\n ['MONA M03', 'sedan', 'electric'],\n ]),\n ...models('Trumpchi', [\n ['GS4', 'suv', 'petrol'],\n ['GS8', 'suv', 'hybrid'],\n ['M8', 'minivan', 'petrol'],\n ['Empow', 'sedan', 'petrol'],\n ['ES9', 'suv', 'hybrid'],\n ]),\n ...models('Aion', [\n ['S', 'sedan', 'electric'],\n ['Y', 'suv', 'electric'],\n ['V', 'suv', 'electric'],\n ['LX', 'suv', 'electric'],\n ['Hyper GT', 'sedan', 'electric'],\n ]),\n ...models('Li Auto', [\n ['L6', 'suv', 'hybrid'],\n ['L7', 'suv', 'hybrid'],\n ['L8', 'suv', 'hybrid'],\n ['L9', 'suv', 'hybrid'],\n ['MEGA', 'minivan', 'electric'],\n ]),\n ...models('BAIC', [\n ['BJ40', 'suv', 'diesel'],\n ['BJ80', 'suv', 'petrol'],\n ['Beijing X7', 'suv', 'petrol'],\n ['Beijing EU5', 'sedan', 'electric'],\n ]),\n ...models('Arcfox', [\n ['Alpha S', 'sedan', 'electric'],\n ['Alpha T', 'suv', 'electric'],\n ['Kaola', 'suv', 'electric'],\n ['Alpha T5', 'suv', 'electric'],\n ]),\n ...models('Xiaomi', [\n ['SU7', 'sedan', 'electric'],\n ['SU7 Ultra', 'sedan', 'electric'],\n ['YU7', 'suv', 'electric'],\n ]),\n ...models('Great Wall', [\n ['Poer', 'pickup', 'diesel'],\n ['Cannon', 'pickup', 'diesel'],\n ['Wingle', 'pickup', 'diesel'],\n ['Shanhai Cannon', 'pickup', 'hybrid'],\n ]),\n ...models('Haval', [\n ['H6', 'suv', 'hybrid'],\n ['Jolion', 'suv', 'petrol'],\n ['Dargo', 'suv', 'petrol'],\n ['H9', 'suv', 'diesel'],\n ['Big Dog', 'suv', 'petrol'],\n ]),\n ...models('Ora', [\n ['Funky Cat', 'hatchback', 'electric'],\n ['Good Cat', 'hatchback', 'electric'],\n ['Lightning Cat', 'sedan', 'electric'],\n ['Ballet Cat', 'hatchback', 'electric'],\n ]),\n ...models('Wey', [\n ['Coffee 01', 'suv', 'hybrid'],\n ['Coffee 02', 'suv', 'hybrid'],\n ['Mocha', 'suv', 'hybrid'],\n ['Latte', 'suv', 'hybrid'],\n ['Blue Mountain', 'suv', 'hybrid'],\n ]),\n ...models('Tank', [\n ['300', 'suv', 'petrol'],\n ['400', 'suv', 'hybrid'],\n ['500', 'suv', 'hybrid'],\n ['700', 'suv', 'hybrid'],\n ]),\n ...models('Chery', [\n ['Tiggo 7', 'suv', 'petrol'],\n ['Tiggo 8', 'suv', 'hybrid'],\n ['Arrizo 8', 'sedan', 'petrol'],\n ['Tiggo 4', 'suv', 'petrol'],\n ['Arrizo 5', 'sedan', 'petrol'],\n ]),\n ...models('Exeed', [\n ['TXL', 'suv', 'petrol'],\n ['VX', 'suv', 'petrol'],\n ['LX', 'suv', 'petrol'],\n ['Sterra ES', 'sedan', 'electric'],\n ['Sterra ET', 'suv', 'hybrid'],\n ]),\n ...models('Jetour', [\n ['X70', 'suv', 'petrol'],\n ['X90', 'suv', 'petrol'],\n ['Dashing', 'suv', 'petrol'],\n ['T2', 'suv', 'hybrid'],\n ['Traveller', 'suv', 'petrol'],\n ]),\n ...models('Omoda', [\n ['5', 'suv', 'petrol'],\n ['E5', 'suv', 'electric'],\n ['7', 'suv', 'hybrid'],\n ['9', 'suv', 'hybrid'],\n ]),\n ...models('Changan', [\n ['CS75 Plus', 'suv', 'petrol'],\n ['UNI-T', 'suv', 'petrol'],\n ['UNI-K', 'suv', 'hybrid'],\n ['Eado', 'sedan', 'petrol'],\n ['Hunter', 'pickup', 'diesel'],\n ]),\n ...models('Deepal', [\n ['S07', 'suv', 'electric'],\n ['L07', 'sedan', 'electric'],\n ['G318', 'suv', 'hybrid'],\n ['S05', 'suv', 'electric'],\n ]),\n ...models('Avatr', [\n ['11', 'suv', 'electric'],\n ['12', 'sedan', 'electric'],\n ['07', 'suv', 'hybrid'],\n ]),\n ...models('Seres', [\n ['Aito M5', 'suv', 'hybrid'],\n ['Aito M7', 'suv', 'hybrid'],\n ['Aito M9', 'suv', 'hybrid'],\n ['Seres 3', 'suv', 'electric'],\n ]),\n ...models('Lifan', [\n ['320', 'hatchback', 'petrol'],\n ['X60', 'suv', 'petrol'],\n ['820', 'sedan', 'petrol'],\n ['Myway', 'suv', 'petrol'],\n ]),\n ...models('Dongfeng', [\n ['Aeolus AX7', 'suv', 'petrol'],\n ['Fengon 580', 'suv', 'petrol'],\n ['Rich 6', 'pickup', 'diesel'],\n ['Box', 'hatchback', 'electric'],\n ]),\n ...models('Voyah', [\n ['Free', 'suv', 'hybrid'],\n ['Dream', 'minivan', 'hybrid'],\n ['Passion', 'sedan', 'electric'],\n ['Courage', 'suv', 'electric'],\n ]),\n ...models('Hongqi', [\n ['H5', 'sedan', 'petrol'],\n ['H9', 'sedan', 'petrol'],\n ['HS5', 'suv', 'petrol'],\n ['E-HS9', 'suv', 'electric'],\n ['EH7', 'sedan', 'electric'],\n ]),\n ...models('JAC', [\n ['JS4', 'suv', 'petrol'],\n ['JS6', 'suv', 'petrol'],\n ['T8', 'pickup', 'diesel'],\n ['iEV7S', 'suv', 'electric'],\n ['Refine RF8', 'minivan', 'hybrid'],\n ]),\n ...models('Wuling', [\n ['Hongguang Mini EV', 'microcar', 'electric'],\n ['Bingo', 'hatchback', 'electric'],\n ['Hongguang', 'minivan', 'petrol'],\n ['Victory', 'minivan', 'petrol'],\n ['Air EV', 'microcar', 'electric'],\n ]),\n ...models('Baojun', [\n ['510', 'suv', 'petrol'],\n ['530', 'suv', 'petrol'],\n ['730', 'minivan', 'petrol'],\n ['KiWi EV', 'microcar', 'electric'],\n ['Yep', 'suv', 'electric'],\n ]),\n ...models('Tata', [\n ['Nexon', 'suv', 'petrol'],\n ['Punch', 'suv', 'petrol'],\n ['Harrier', 'suv', 'diesel'],\n ['Safari', 'suv', 'diesel'],\n ['Tiago', 'hatchback', 'petrol'],\n ['Altroz', 'hatchback', 'petrol'],\n ['Nexon EV', 'suv', 'electric'],\n ['Curvv', 'suv', 'electric'],\n ]),\n ...models('Mahindra', [\n ['Thar', 'suv', 'diesel'],\n ['Scorpio', 'suv', 'diesel'],\n ['XUV700', 'suv', 'diesel'],\n ['XUV400', 'suv', 'electric'],\n ['Bolero', 'suv', 'diesel'],\n ['XUV 3XO', 'suv', 'petrol'],\n ]),\n ...models('Maruti Suzuki', [\n ['Alto', 'hatchback', 'petrol'],\n ['Swift', 'hatchback', 'petrol'],\n ['Dzire', 'sedan', 'petrol'],\n ['Baleno', 'hatchback', 'petrol'],\n ['Brezza', 'suv', 'petrol'],\n ['Grand Vitara', 'suv', 'hybrid'],\n ['Ertiga', 'minivan', 'petrol'],\n ['Jimny', 'suv', 'petrol'],\n ]),\n ...models('Eicher', [\n ['Pro 2049', 'truck', 'diesel'],\n ['Pro 3015', 'truck', 'diesel'],\n ['Pro 6028', 'truck', 'diesel'],\n ['Pro 2110', 'truck', 'electric'],\n ]),\n ...models('Force Motors', [\n ['Gurkha', 'suv', 'diesel'],\n ['Trax', 'suv', 'diesel'],\n ['Traveller', 'van', 'diesel'],\n ['Urbania', 'van', 'diesel'],\n ]),\n ...models('Bajaj', [\n ['Qute', 'microcar', 'petrol'],\n ['RE', 'microcar', 'petrol'],\n ['Maxima', 'microcar', 'diesel'],\n ['GoGo', 'microcar', 'electric'],\n ]),\n ...models('Ashok Leyland', [\n ['Dost', 'van', 'diesel'],\n ['Partner', 'truck', 'diesel'],\n ['Boss', 'truck', 'diesel'],\n ['Captain', 'truck', 'diesel'],\n ['Bada Dost', 'van', 'diesel'],\n ]),\n ...models('Proton', [\n ['Saga', 'sedan', 'petrol'],\n ['Persona', 'sedan', 'petrol'],\n ['X50', 'suv', 'petrol'],\n ['X70', 'suv', 'petrol'],\n ['X90', 'suv', 'hybrid'],\n ['S70', 'sedan', 'petrol'],\n ]),\n ...models('Perodua', [\n ['Myvi', 'hatchback', 'petrol'],\n ['Axia', 'hatchback', 'petrol'],\n ['Bezza', 'sedan', 'petrol'],\n ['Ativa', 'suv', 'petrol'],\n ['Alza', 'minivan', 'petrol'],\n ]),\n ...models('VinFast', [\n ['VF 8', 'suv', 'electric'],\n ['VF 9', 'suv', 'electric'],\n ['VF 6', 'suv', 'electric'],\n ['VF 7', 'suv', 'electric'],\n ['VF 3', 'microcar', 'electric'],\n ]),\n ...models('Lada', [\n ['Granta', 'sedan', 'petrol'],\n ['Vesta', 'sedan', 'petrol'],\n ['Niva Legend', 'suv', 'petrol'],\n ['Niva Travel', 'suv', 'petrol'],\n ['Largus', 'wagon', 'petrol'],\n ]),\n ...models('GAZ', [\n ['Gazelle Next', 'van', 'diesel'],\n ['Sobol', 'van', 'diesel'],\n ['Volga', 'sedan', 'petrol'],\n ['Gazon Next', 'truck', 'diesel'],\n ]),\n ...models('UAZ', [\n ['Patriot', 'suv', 'petrol'],\n ['Hunter', 'suv', 'petrol'],\n ['Pickup', 'pickup', 'petrol'],\n ['Bukhanka', 'van', 'petrol'],\n ]),\n ...models('Holden', [\n ['Commodore', 'sedan', 'petrol'],\n ['Ute', 'pickup', 'petrol'],\n ['Colorado', 'pickup', 'diesel'],\n ['Captiva', 'suv', 'petrol'],\n ['Astra', 'hatchback', 'petrol'],\n ]),\n];\n\n// .............................................................................\n/**\n * Returns the models of a brand, in the order of the dictionary.\n * @param brand - The brand, as in the manufacturers dictionary\n */\nexport const modelsOf = (brand: string): readonly EVehicleModel[] =>\n vehicles.filter((vehicle) => vehicle.brand === brand);\n","// @license\n// Copyright (c) 2025 Rljson\n//\n// Use of this source code is governed by terms that can be\n// found in the LICENSE file in the root of this package.\n\nimport type { Json } from '@rljson/json';\nimport type {\n CakesTable,\n ComponentsTable,\n LayersTable,\n Ref,\n RevisionsTable,\n Rljson,\n Row,\n SliceIdsTable,\n TablesCfgTable,\n TreesTable,\n} from '@rljson/rljson';\n\nimport type { EBodyType, EFuel } from '../dictionaries/vehicles.ts';\n\n// #############################################################################\n/** A manufacturer: the entry point of the world */\nexport interface EManufacturer extends Row {\n /** The brand in kebab case, e.g. \"mercedes-benz\" */\n id: string;\n\n /** The name of the company */\n name: string;\n\n /** The brand the cars carry */\n brand: string;\n\n /** The ISO 3166 country code of the headquarters */\n country: string;\n\n /** The year the brand was founded */\n founded: number;\n\n /** The website, a made up address */\n website: string;\n\n /** The address of the headquarters */\n headquartersRef: Ref;\n\n /** The catalogs of the manufacturer, every model year, oldest first */\n catalogsRef: Ref[];\n}\n\n// #############################################################################\n/** A postal address with coordinates */\nexport interface EAddress extends Row {\n street: string;\n houseNumber: string;\n zip: string;\n city: string;\n country: string;\n lat: number;\n lng: number;\n}\n\n// #############################################################################\n/** A person, e.g. the owner of a workshop */\nexport interface EPerson extends Row {\n firstName: string;\n lastName: string;\n email: string;\n phone: string;\n birthYear: number;\n}\n\n// #############################################################################\n/** A workshop that services cars */\nexport interface EWorkshop extends Row {\n name: string;\n\n /** The address of the workshop */\n addressRef: Ref;\n\n /** The person who owns the workshop */\n ownerRef: Ref;\n\n phone: string;\n email: string;\n\n /** The services the workshop offers */\n services: string[];\n\n /** The rating from 3 to 5 */\n rating: number;\n}\n\n// #############################################################################\n/** The price of a car */\nexport interface EPrice extends Row {\n amount: number;\n currency: string;\n\n /** The first day of the model year, as ISO date */\n validFrom: string;\n\n /** The discount in percent, 0 for none */\n discountPercent: number;\n\n taxIncluded: boolean;\n}\n\n// #############################################################################\n/** The brand and model of a car */\nexport interface EBrand extends Row {\n brand: string;\n model: string;\n bodyType: EBodyType;\n fuel: EFuel;\n powerKw: number;\n}\n\n// #############################################################################\n/** A part of a bill of materials. Level 0 is the bill itself. */\nexport interface EPart extends Row {\n name: string;\n\n /** A part number, unique per manufacturer */\n partNumber: string;\n\n /** The category, e.g. \"engine\", or \"bom\" for the bill of materials */\n category: string;\n\n /** 0 for the bill of materials, up to 4 for a standard part */\n level: number;\n\n /** How many of the part the parent contains */\n quantity: number;\n\n /** The weight of one part in kilograms */\n weightKg: number;\n\n /** The material, or null for an assembly */\n material: string | null;\n\n /** The sub parts, empty for a leaf */\n subPartRefs: Ref[];\n}\n\n// #############################################################################\n/** The meta data of a node of a CAD scene */\nexport interface ECadMeta extends Json {\n /** A group has children, a mesh has geometry */\n type: 'group' | 'mesh';\n\n /** What the scene shows, e.g. the model or the car it belongs to */\n variant: string;\n\n /** The position, rotation and scale relative to the parent */\n transform: { position: number[]; rotation: number[]; scale: number[] };\n\n /** The material of a mesh, null for a group */\n material: string | null;\n\n /** The number of vertices of a mesh, null for a group */\n vertices: number | null;\n\n /** Width, height and depth in meters */\n boundsM: number[];\n\n /** The part the mesh shows, or null */\n partRef: Ref | null;\n}\n\n// #############################################################################\n/** The generated world: an Rljson object with typed tables */\nexport interface ECarWorld extends Rljson {\n manufacturers: ComponentsTable<EManufacturer>;\n addresses: ComponentsTable<EAddress>;\n persons: ComponentsTable<EPerson>;\n workshops: ComponentsTable<EWorkshop>;\n prices: ComponentsTable<EPrice>;\n brands: ComponentsTable<EBrand>;\n parts: ComponentsTable<EPart>;\n cadScenes: TreesTable;\n carIds: SliceIdsTable;\n carPrices: LayersTable;\n carBrands: LayersTable;\n carWorkshops: LayersTable;\n carParts: LayersTable;\n carCad: LayersTable;\n catalogs: CakesTable;\n revisions: RevisionsTable;\n tableCfgs: TablesCfgTable;\n}\n\n// .............................................................................\n/** The keys of the tables of a car world, in the order they are announced */\nexport const carWorldTableKeys = [\n 'tableCfgs',\n 'addresses',\n 'persons',\n 'workshops',\n 'prices',\n 'brands',\n 'parts',\n 'cadScenes',\n 'carIds',\n 'carPrices',\n 'carBrands',\n 'carWorkshops',\n 'carParts',\n 'carCad',\n 'catalogs',\n 'revisions',\n 'manufacturers',\n] as const;\n\n// #############################################################################\n/** The key of a table of a car world */\nexport type ECarWorldTableKey = (typeof carWorldTableKeys)[number];\n","// @license\n// Copyright (c) 2025 Rljson\n//\n// Use of this source code is governed by terms that can be\n// found in the LICENSE file in the root of this package.\n\nimport type { EBodyType, EVehicleModel } from '../dictionaries/vehicles.ts';\n\nimport type { EBrand } from './car-world.ts';\n\n// .............................................................................\n/** The body types from the cheapest to the most expensive */\nexport const bodyTypeRanks: readonly EBodyType[] = [\n 'microcar',\n 'hatchback',\n 'minivan',\n 'van',\n 'sedan',\n 'wagon',\n 'pickup',\n 'suv',\n 'coupe',\n 'convertible',\n 'truck',\n 'sportscar',\n];\n\n/** The typical power of a body type in kW */\nconst basePowerKw: Readonly<Record<EBodyType, number>> = {\n microcar: 45,\n hatchback: 85,\n minivan: 130,\n van: 110,\n sedan: 120,\n wagon: 130,\n pickup: 170,\n suv: 150,\n coupe: 200,\n convertible: 180,\n truck: 350,\n sportscar: 400,\n};\n\n/** The power a model gains for every model the manufacturer lists before it */\nconst powerKwPerModel = 15;\n\n// .............................................................................\n/**\n * Returns the power of a model in kW: the typical power of its body type,\n * plus a bit for every model the manufacturer lists before it.\n * @param model - The model\n * @param modelIndex - The index of the model within the manufacturer\n */\nexport const powerKwOf = (model: EVehicleModel, modelIndex: number): number =>\n basePowerKw[model.bodyType] + modelIndex * powerKwPerModel;\n\n// .............................................................................\n/**\n * Returns the brand row of a model.\n * @param model - The model\n * @param modelIndex - The index of the model within the manufacturer\n */\nexport const brandRow = (model: EVehicleModel, modelIndex: number): EBrand => ({\n brand: model.brand,\n model: model.model,\n bodyType: model.bodyType,\n fuel: model.fuel,\n powerKw: powerKwOf(model, modelIndex),\n});\n","// @license\n// Copyright (c) 2025 Rljson\n//\n// Use of this source code is governed by terms that can be\n// found in the LICENSE file in the root of this package.\n\n// #############################################################################\n/** A sub assembly of an assembly, with the names of its parts (level 2 and 3) */\nexport interface ESubAssembly {\n /** The name of the sub assembly */\n name: string;\n\n /** The names of the parts the sub assembly consists of */\n parts: readonly string[];\n}\n\n// #############################################################################\n/** An assembly of a car: level 1 of a bill of materials */\nexport interface EAssembly {\n /** The name of the assembly */\n name: string;\n\n /** The category of the assembly and of everything below it */\n category: string;\n\n /** The sub assemblies the assembly consists of */\n subAssemblies: readonly ESubAssembly[];\n}\n\n// #############################################################################\n/** A standard part shared by many bills of materials: level 4 */\nexport interface EStandardPart {\n /** The name of the standard part */\n name: string;\n\n /** The material of the standard part */\n material: string;\n}\n\n// .............................................................................\n/** The assemblies of a car, each with six sub assemblies of six parts */\nexport const assemblies: readonly EAssembly[] = [\n {\n name: 'Engine',\n category: 'engine',\n subAssemblies: [\n {\n name: 'Cylinder head',\n parts: [\n 'Intake valve',\n 'Exhaust valve',\n 'Valve spring',\n 'Camshaft',\n 'Rocker arm',\n 'Head gasket',\n ],\n },\n {\n name: 'Engine block',\n parts: [\n 'Cylinder liner',\n 'Piston',\n 'Piston ring',\n 'Connecting rod',\n 'Crankshaft',\n 'Main bearing',\n ],\n },\n {\n name: 'Lubrication',\n parts: [\n 'Oil pump',\n 'Oil filter',\n 'Oil pan',\n 'Oil cooler',\n 'Pressure relief valve',\n 'Dipstick',\n ],\n },\n {\n name: 'Air intake',\n parts: [\n 'Air filter',\n 'Intake manifold',\n 'Throttle body',\n 'Mass air flow sensor',\n 'Intake hose',\n 'Resonator',\n ],\n },\n {\n name: 'Turbocharging',\n parts: [\n 'Turbocharger',\n 'Wastegate',\n 'Intercooler',\n 'Boost pipe',\n 'Blow-off valve',\n 'Boost sensor',\n ],\n },\n {\n name: 'Timing drive',\n parts: [\n 'Timing chain',\n 'Chain tensioner',\n 'Chain guide',\n 'Camshaft sprocket',\n 'Crankshaft sprocket',\n 'Timing cover',\n ],\n },\n ],\n },\n {\n name: 'Transmission',\n category: 'transmission',\n subAssemblies: [\n {\n name: 'Gearbox housing',\n parts: [\n 'Housing front',\n 'Housing rear',\n 'Bell housing',\n 'Breather',\n 'Drain plug',\n 'Dowel pin',\n ],\n },\n {\n name: 'Gear set',\n parts: [\n 'Input shaft',\n 'Output shaft',\n 'Synchronizer ring',\n 'First gear',\n 'Second gear',\n 'Reverse idler',\n ],\n },\n {\n name: 'Clutch',\n parts: [\n 'Clutch disc',\n 'Pressure plate',\n 'Release bearing',\n 'Flywheel',\n 'Slave cylinder',\n 'Master cylinder',\n ],\n },\n {\n name: 'Shift mechanism',\n parts: [\n 'Shift fork',\n 'Shift rail',\n 'Detent spring',\n 'Selector lever',\n 'Shift cable',\n 'Gear knob',\n ],\n },\n {\n name: 'Differential',\n parts: [\n 'Ring gear',\n 'Pinion gear',\n 'Side gear',\n 'Spider gear',\n 'Differential case',\n 'Pinion bearing',\n ],\n },\n {\n name: 'Torque converter',\n parts: [\n 'Impeller',\n 'Turbine',\n 'Stator',\n 'Lock-up clutch',\n 'Converter housing',\n 'Hub seal',\n ],\n },\n ],\n },\n {\n name: 'Chassis',\n category: 'chassis',\n subAssemblies: [\n {\n name: 'Front suspension',\n parts: [\n 'Control arm',\n 'Ball joint',\n 'Coil spring',\n 'Shock absorber',\n 'Stabilizer bar',\n 'Stabilizer link',\n ],\n },\n {\n name: 'Rear suspension',\n parts: [\n 'Trailing arm',\n 'Lateral link',\n 'Rear spring',\n 'Rear damper',\n 'Subframe bushing',\n 'Toe link',\n ],\n },\n {\n name: 'Steering',\n parts: [\n 'Steering rack',\n 'Tie rod',\n 'Tie rod end',\n 'Steering column',\n 'Power steering pump',\n 'Steering wheel',\n ],\n },\n {\n name: 'Front brakes',\n parts: [\n 'Front brake disc',\n 'Front brake caliper',\n 'Front brake pad',\n 'Caliper carrier',\n 'Brake hose',\n 'Wheel speed sensor',\n ],\n },\n {\n name: 'Rear brakes',\n parts: [\n 'Rear brake disc',\n 'Rear brake caliper',\n 'Rear brake pad',\n 'Parking brake cable',\n 'Brake drum',\n 'Wheel cylinder',\n ],\n },\n {\n name: 'Wheels',\n parts: [\n 'Alloy rim',\n 'Tire',\n 'Wheel hub',\n 'Wheel bearing',\n 'Wheel bolt',\n 'Valve stem',\n ],\n },\n ],\n },\n {\n name: 'Body',\n category: 'body',\n subAssemblies: [\n {\n name: 'Body shell',\n parts: [\n 'Floor pan',\n 'A-pillar',\n 'B-pillar',\n 'Roof panel',\n 'Rear quarter panel',\n 'Sill',\n ],\n },\n {\n name: 'Doors',\n parts: [\n 'Front door shell',\n 'Rear door shell',\n 'Door hinge',\n 'Door lock',\n 'Window regulator',\n 'Door seal',\n ],\n },\n {\n name: 'Hood and trunk',\n parts: [\n 'Hood panel',\n 'Hood hinge',\n 'Hood latch',\n 'Trunk lid',\n 'Trunk hinge',\n 'Gas strut',\n ],\n },\n {\n name: 'Bumpers',\n parts: [\n 'Front bumper cover',\n 'Rear bumper cover',\n 'Bumper beam',\n 'Crash absorber',\n 'Tow hook cover',\n 'Parking sensor bracket',\n ],\n },\n {\n name: 'Glazing',\n parts: [\n 'Windshield',\n 'Rear window',\n 'Front side window',\n 'Rear side window',\n 'Quarter glass',\n 'Sunroof glass',\n ],\n },\n {\n name: 'Exterior trim',\n parts: [\n 'Grille',\n 'Side mirror',\n 'Roof rail',\n 'Wheel arch trim',\n 'Rear spoiler',\n 'Emblem',\n ],\n },\n ],\n },\n {\n name: 'Interior',\n category: 'interior',\n subAssemblies: [\n {\n name: 'Seats',\n parts: [\n 'Seat frame',\n 'Seat cushion',\n 'Backrest',\n 'Headrest',\n 'Seat rail',\n 'Seat belt buckle',\n ],\n },\n {\n name: 'Dashboard',\n parts: [\n 'Dashboard carrier',\n 'Instrument cluster',\n 'Glove box',\n 'Air vent',\n 'Center display',\n 'Steering column cover',\n ],\n },\n {\n name: 'Center console',\n parts: [\n 'Console housing',\n 'Armrest',\n 'Cup holder',\n 'Gear selector trim',\n 'Storage bin',\n 'USB module',\n ],\n },\n {\n name: 'Door panels',\n parts: [\n 'Front door panel',\n 'Rear door panel',\n 'Armrest pad',\n 'Window switch',\n 'Door speaker grille',\n 'Inner door handle',\n ],\n },\n {\n name: 'Headliner',\n parts: [\n 'Headliner board',\n 'Sun visor',\n 'Grab handle',\n 'Dome light',\n 'Microphone',\n 'Rear view mirror',\n ],\n },\n {\n name: 'Floor',\n parts: [\n 'Front carpet',\n 'Rear carpet',\n 'Floor mat',\n 'Pedal box',\n 'Dead pedal',\n 'Sound insulation',\n ],\n },\n ],\n },\n {\n name: 'Electrical system',\n category: 'electrical',\n subAssemblies: [\n {\n name: 'Power supply',\n parts: [\n '12 V battery',\n 'Alternator',\n 'Battery tray',\n 'Battery cable',\n 'Fuse box',\n 'Main relay',\n ],\n },\n {\n name: 'Lighting',\n parts: [\n 'Headlamp',\n 'Tail lamp',\n 'Turn signal',\n 'Fog lamp',\n 'License plate lamp',\n 'Interior lamp',\n ],\n },\n {\n name: 'Control units',\n parts: [\n 'Engine control unit',\n 'Body control module',\n 'Gateway module',\n 'Transmission control unit',\n 'Airbag control unit',\n 'Parking assist module',\n ],\n },\n {\n name: 'Sensors',\n parts: [\n 'Oxygen sensor',\n 'Crankshaft sensor',\n 'Camshaft sensor',\n 'Coolant temperature sensor',\n 'Rain sensor',\n 'Ultrasonic sensor',\n ],\n },\n {\n name: 'Wiring',\n parts: [\n 'Main harness',\n 'Engine harness',\n 'Door harness',\n 'Ground strap',\n 'Connector housing',\n 'Cable duct',\n ],\n },\n {\n name: 'Infotainment',\n parts: [\n 'Head unit',\n 'Antenna',\n 'Amplifier',\n 'Speaker',\n 'Microphone module',\n 'Display panel',\n ],\n },\n ],\n },\n {\n name: 'Cooling and climate',\n category: 'hvac',\n subAssemblies: [\n {\n name: 'Engine cooling',\n parts: [\n 'Radiator',\n 'Water pump',\n 'Thermostat',\n 'Coolant hose',\n 'Expansion tank',\n 'Radiator fan',\n ],\n },\n {\n name: 'Air conditioning',\n parts: [\n 'Compressor',\n 'Condenser',\n 'Evaporator',\n 'Expansion valve',\n 'Receiver dryer',\n 'Refrigerant line',\n ],\n },\n {\n name: 'Heating',\n parts: [\n 'Heater core',\n 'Blower motor',\n 'Blend door actuator',\n 'Cabin filter',\n 'Heater valve',\n 'Heater duct',\n ],\n },\n {\n name: 'Climate control',\n parts: [\n 'Climate control panel',\n 'Cabin temperature sensor',\n 'Sun load sensor',\n 'Humidity sensor',\n 'Climate control module',\n 'Climate harness',\n ],\n },\n {\n name: 'Ventilation',\n parts: [\n 'Fresh air inlet',\n 'Recirculation flap',\n 'Rear vent',\n 'Defroster nozzle',\n 'Side vent',\n 'Foot well duct',\n ],\n },\n {\n name: 'Charge air',\n parts: [\n 'Charge air cooler',\n 'Charge air hose',\n 'Charge air pipe',\n 'Hose clamp set',\n 'Charge pressure sensor',\n 'Cooler bracket',\n ],\n },\n ],\n },\n {\n name: 'Fuel and exhaust',\n category: 'fuel',\n subAssemblies: [\n {\n name: 'Fuel tank',\n parts: [\n 'Tank shell',\n 'Filler neck',\n 'Fuel cap',\n 'Tank strap',\n 'Fuel level sender',\n 'Rollover valve',\n ],\n },\n {\n name: 'Fuel delivery',\n parts: [\n 'Fuel pump',\n 'Fuel filter',\n 'Fuel line',\n 'Fuel rail',\n 'Fuel injector',\n 'Pressure regulator',\n ],\n },\n {\n name: 'Exhaust manifold',\n parts: [\n 'Manifold casting',\n 'Manifold gasket',\n 'Heat shield',\n 'Downpipe',\n 'Flex pipe',\n 'Lambda sensor boss',\n ],\n },\n {\n name: 'Catalytic converter',\n parts: [\n 'Catalyst substrate',\n 'Converter shell',\n 'Particulate filter',\n 'Exhaust temperature sensor',\n 'Differential pressure sensor',\n 'Pipe clamp',\n ],\n },\n {\n name: 'Muffler',\n parts: [\n 'Center muffler',\n 'Rear muffler',\n 'Tailpipe',\n 'Exhaust hanger',\n 'Resonator chamber',\n 'End trim',\n ],\n },\n {\n name: 'Emission control',\n parts: [\n 'EGR valve',\n 'EGR cooler',\n 'Charcoal canister',\n 'Purge valve',\n 'Crankcase vent valve',\n 'Secondary air pump',\n ],\n },\n ],\n },\n {\n name: 'High voltage system',\n category: 'ev',\n subAssemblies: [\n {\n name: 'Traction battery',\n parts: [\n 'Battery module',\n 'Battery cell',\n 'Cooling plate',\n 'Battery housing',\n 'Busbar',\n 'Battery management unit',\n ],\n },\n {\n name: 'Electric motor',\n parts: [\n 'Motor stator',\n 'Motor rotor',\n 'Resolver',\n 'Inverter',\n 'Motor housing',\n 'Reduction gear',\n ],\n },\n {\n name: 'Charging',\n parts: [\n 'Onboard charger',\n 'Charge port',\n 'DC converter',\n 'Charging cable',\n 'Charge inlet lid',\n 'Contactor',\n ],\n },\n {\n name: 'High voltage wiring',\n parts: [\n 'HV harness',\n 'HV connector',\n 'Service disconnect',\n 'HV fuse',\n 'Cable shielding',\n 'Cable gland',\n ],\n },\n {\n name: 'Thermal management',\n parts: [\n 'Chiller',\n 'HV coolant pump',\n 'Heat pump',\n 'PTC heater',\n 'Three-way valve',\n 'Thermal sensor',\n ],\n },\n {\n name: 'Power electronics',\n parts: [\n 'Power module',\n 'DC link capacitor',\n 'Gate driver',\n 'Heat sink',\n 'Current sensor',\n 'Control board',\n ],\n },\n ],\n },\n];\n\n// .............................................................................\n/** Standard parts: screws, seals, bearings, shared by every bill of materials */\nexport const standardParts: readonly EStandardPart[] = [\n { name: 'Hex bolt M6x20', material: 'steel' },\n { name: 'Hex bolt M8x25', material: 'steel' },\n { name: 'Hex bolt M10x30', material: 'steel' },\n { name: 'Flange bolt M8x30', material: 'steel' },\n { name: 'Hex nut M6', material: 'steel' },\n { name: 'Hex nut M8', material: 'steel' },\n { name: 'Flange nut M10', material: 'steel' },\n { name: 'Lock nut M12', material: 'steel' },\n { name: 'Washer 6 mm', material: 'stainless steel' },\n { name: 'Washer 8 mm', material: 'stainless steel' },\n { name: 'Spring washer 8 mm', material: 'spring steel' },\n { name: 'O-ring 12x2', material: 'nitrile' },\n { name: 'O-ring 20x2.5', material: 'nitrile' },\n { name: 'Shaft seal 30x47x7', material: 'rubber' },\n { name: 'Paper gasket 0.5 mm', material: 'gasket paper' },\n { name: 'Circlip 25 mm', material: 'spring steel' },\n { name: 'Cotter pin 3x30', material: 'steel' },\n { name: 'Rivet 4x8', material: 'aluminium' },\n { name: 'Plastic clip 8 mm', material: 'nylon' },\n { name: 'Cable tie 200 mm', material: 'nylon' },\n { name: 'Hose clamp 40 mm', material: 'stainless steel' },\n { name: 'Hose clamp 60 mm', material: 'stainless steel' },\n { name: 'Ball bearing 6203', material: 'bearing steel' },\n { name: 'Ball bearing 6205', material: 'bearing steel' },\n { name: 'Needle bearing 15x21x12', material: 'bearing steel' },\n { name: 'Compression spring 20x60', material: 'spring steel' },\n { name: 'Torsion spring 12 mm', material: 'spring steel' },\n { name: 'Grease nipple M6', material: 'brass' },\n { name: 'Bushing 20x24x30', material: 'bronze' },\n { name: 'Grommet 10 mm', material: 'rubber' },\n { name: 'Spacer 8x16x5', material: 'aluminium' },\n { name: 'Threaded insert M6', material: 'brass' },\n { name: 'Stud M8x40', material: 'steel' },\n { name: 'Set screw M5x10', material: 'steel' },\n { name: 'Rivet nut M6', material: 'steel' },\n { name: 'Spring pin 6x24', material: 'spring steel' },\n { name: 'Woodruff key 5x7.5', material: 'steel' },\n { name: 'Shim 0.2 mm', material: 'steel' },\n { name: 'Cap plug 12 mm', material: 'plastic' },\n { name: 'Dowel pin 8x20', material: 'steel' },\n];\n\n// .............................................................................\n/** The materials of the parts of a category, picked by index */\nexport const materialsOf: Readonly<Record<string, readonly string[]>> = {\n engine: ['aluminium', 'cast iron', 'steel', 'forged steel'],\n transmission: ['steel', 'aluminium', 'hardened steel', 'sintered metal'],\n chassis: ['steel', 'aluminium', 'cast iron', 'rubber'],\n body: ['steel', 'aluminium', 'glass', 'plastic'],\n interior: ['plastic', 'leather', 'fabric', 'foam'],\n electrical: ['copper', 'plastic', 'silicon', 'glass fibre'],\n hvac: ['aluminium', 'plastic', 'rubber', 'copper'],\n fuel: ['stainless steel', 'plastic', 'steel', 'ceramic'],\n ev: ['aluminium', 'copper', 'lithium', 'plastic'],\n};\n","// @license\n// Copyright (c) 2025 Rljson\n//\n// Use of this source code is governed by terms that can be\n// found in the LICENSE file in the root of this package.\n\nimport type { EPartsConfig } from '../config/config.ts';\nimport type { EEmitter } from '../core/emitter.ts';\nimport { padded, pick, pickMany, roundDecimals } from '../core/pick.ts';\nimport {\n assemblies,\n materialsOf,\n standardParts,\n} from '../dictionaries/parts.ts';\nimport type { EAssembly, ESubAssembly } from '../dictionaries/parts.ts';\n\nimport type { EPart } from './car-world.ts';\nimport type { EVariant } from './plan.ts';\n\n// #############################################################################\n/** A generated bill of materials */\nexport interface EBom {\n /** The hash of the bill of materials: the part of level 0 */\n rootRef: string;\n\n /**\n * The hashes of the parts in the order they were emitted, the root first.\n * A standard part appears once for every part that contains it.\n */\n partRefs: string[];\n}\n\n// #############################################################################\n/** What a bill of materials builder needs */\nexport interface EBomBuilderOptions {\n /** Receives the rows */\n emitter: EEmitter;\n\n /** The parts layer configuration */\n config: Required<EPartsConfig>;\n\n /** The part number prefix of the manufacturer, e.g. \"AUD\" */\n prefix: string;\n\n /** Who the bill of materials belongs to */\n variant: EVariant;\n}\n\n// #############################################################################\n/** Where a part sits in the dictionary */\ninterface EBomPosition {\n assembly: EAssembly;\n assemblyIndex: number;\n sub: ESubAssembly;\n subIndex: number;\n}\n\n// .............................................................................\n/** The level of the standard parts, a pool every bill of materials shares */\nexport const standardPartsLevel = 4;\n\n/** The parts of a sub assembly and of an assembly in the dictionary */\nconst partsPerSubAssembly = 6;\nconst partsPerAssembly = 6 * partsPerSubAssembly;\n\n/** Standard parts of neighbouring parts start this far apart in the pool */\nconst standardPartStride = 3;\n\n/** The quantities of parts at level 3, by index */\nconst quantities = [1, 2, 4, 8, 16];\n\n/** The digits of the sequence number in a part number */\nconst partNumberDigits = 4;\n\n/** The weights in kilograms: a base per level and steps by position */\nconst weights = {\n assembly: { base: 50, step: 20 },\n subAssembly: { base: 5, step: 3 },\n part: { base: 0.2, step: 0.3, subStep: 0.05 },\n standard: { base: 0.01, variants: 10, step: 0.005 },\n} as const;\n\n/** Standard parts come in up to this many pieces */\nconst standardQuantities = 4;\n\n// .............................................................................\n/**\n * Returns the weight of an assembly in kilograms.\n * @param assemblyIndex - The index of the assembly in the dictionary\n */\nconst assemblyWeight = (assemblyIndex: number): number =>\n weights.assembly.base + assemblyIndex * weights.assembly.step;\n\n// .............................................................................\n/**\n * Returns the row of a standard part.\n * @param index - The index of the standard part in the pool\n */\nconst standardPartRow = (index: number): EPart => {\n const { name, material } = standardParts[index];\n const { base, variants, step } = weights.standard;\n return {\n name,\n partNumber: `STD-${padded(index + 1, partNumberDigits)}`,\n category: 'standard',\n level: standardPartsLevel,\n quantity: 1 + (index % standardQuantities),\n weightKg: roundDecimals(base + (index % variants) * step, 3),\n material,\n subPartRefs: [],\n };\n};\n\n// #############################################################################\n/**\n * Emits a bill of materials from the leaves up.\n *\n * Part numbers are handed out from the top down, so a part's number is\n * lower than the numbers of its sub parts. Levels 1 to 3 carry the variant\n * in their part numbers, so two variants never share them. Level 4, the\n * standard parts, comes from a pool every bill shares. Build once per\n * instance.\n */\nexport class EBomBuilder {\n /**\n * Constructor\n * @param options - The emitter, the parts layer and the variant\n */\n constructor(private readonly options: EBomBuilderOptions) {}\n\n // ...........................................................................\n /** Emits the bill of materials and returns its hashes */\n async build(): Promise<EBom> {\n const { config, variant } = this.options;\n const assemblyRefs: string[] = [];\n let weightKg = 0;\n for (const assembly of pickMany(\n assemblies,\n variant.offset,\n config.fanOut,\n )) {\n const assemblyIndex = assemblies.indexOf(assembly);\n weightKg += assemblyWeight(assemblyIndex);\n assemblyRefs.push(await this.assembly(assembly, assemblyIndex));\n }\n const rootRef = await this.root(assemblyRefs, weightKg);\n return { rootRef, partRefs: [rootRef, ...this.partRefs.slice(0, -1)] };\n }\n\n // ######################\n // Private\n // ######################\n\n private sequence = 0;\n private readonly partRefs: string[] = [];\n\n private get code(): string {\n return `${this.options.prefix}-${this.options.variant.code.toUpperCase()}`;\n }\n\n private nextPartNumber(level: number): string {\n this.sequence++;\n return `${this.code}-${level}-${padded(this.sequence, partNumberDigits)}`;\n }\n\n private async emit(part: EPart): Promise<string> {\n const { _hash } = await this.options.emitter.emit('parts', part);\n this.partRefs.push(_hash);\n return _hash;\n }\n\n private root(subPartRefs: string[], weightKg: number): Promise<string> {\n return this.emit({\n name: `Bill of materials ${this.options.variant.name}`,\n partNumber: `${this.code}-BOM`,\n category: 'bom',\n level: 0,\n quantity: 1,\n weightKg,\n material: null,\n subPartRefs,\n });\n }\n\n private async assembly(\n assembly: EAssembly,\n assemblyIndex: number,\n ): Promise<string> {\n const partNumber = this.nextPartNumber(1);\n const subPartRefs =\n this.options.config.depth >= 2\n ? await this.subAssemblies(assembly, assemblyIndex)\n : [];\n return this.emit({\n name: assembly.name,\n partNumber,\n category: assembly.category,\n level: 1,\n quantity: 1,\n weightKg: assemblyWeight(assemblyIndex),\n material: null,\n subPartRefs,\n });\n }\n\n private async subAssemblies(\n assembly: EAssembly,\n assemblyIndex: number,\n ): Promise<string[]> {\n const fanOut = this.options.config.fanOut;\n const result: string[] = [];\n for (const [subIndex, sub] of pickMany(\n assembly.subAssemblies,\n 0,\n fanOut,\n ).entries()) {\n const position = { assembly, assemblyIndex, sub, subIndex };\n result.push(await this.subAssembly(position));\n }\n return result;\n }\n\n private async subAssembly(position: EBomPosition): Promise<string> {\n const { assembly, assemblyIndex, sub, subIndex } = position;\n const { base, step } = weights.subAssembly;\n const partNumber = this.nextPartNumber(2);\n const subPartRefs =\n this.options.config.depth >= 3 ? await this.parts(position) : [];\n return this.emit({\n name: sub.name,\n partNumber,\n category: assembly.category,\n level: 2,\n quantity: 1 + (subIndex % 2),\n weightKg: roundDecimals(base + subIndex * step + assemblyIndex, 3),\n material: pick(materialsOf[assembly.category], subIndex),\n subPartRefs,\n });\n }\n\n private async parts(position: EBomPosition): Promise<string[]> {\n const names = pickMany(position.sub.parts, 0, this.options.config.fanOut);\n const result: string[] = [];\n for (const [i, name] of names.entries()) {\n result.push(await this.part(position, { name, i }));\n }\n return result;\n }\n\n private async part(\n { assembly, assemblyIndex, subIndex }: EBomPosition,\n { name, i }: { name: string; i: number },\n ): Promise<string> {\n const { base, step, subStep } = weights.part;\n const partNumber = this.nextPartNumber(3);\n const partIndex =\n assemblyIndex * partsPerAssembly + subIndex * partsPerSubAssembly + i;\n const subPartRefs =\n this.options.config.depth >= standardPartsLevel\n ? await this.standardParts(partIndex)\n : [];\n return this.emit({\n name,\n partNumber,\n category: assembly.category,\n level: 3,\n quantity: pick(quantities, i),\n weightKg: roundDecimals(base + i * step + subIndex * subStep, 3),\n material: pick(materialsOf[assembly.category], i + subIndex),\n subPartRefs,\n });\n }\n\n private async standardParts(partIndex: number): Promise<string[]> {\n const { fanOut, standardPartsPool } = this.options.config;\n const first = partIndex * standardPartStride;\n const result: string[] = [];\n for (let i = 0; i < fanOut; i++) {\n const index = (first + i) % standardPartsPool;\n result.push(await this.emit(standardPartRow(index)));\n }\n return result;\n }\n}\n","// @license\n// Copyright (c) 2025 Rljson\n//\n// Use of this source code is governed by terms that can be\n// found in the LICENSE file in the root of this package.\n\n// #############################################################################\n/** A system group of a CAD scene (level 1) with its component groups (level 2) */\nexport interface ECadSystem {\n /** The id of the group, unique among the children of the scene */\n id: string;\n\n /** The ids of the component groups below the system */\n children: readonly string[];\n}\n\n// .............................................................................\n/** The system groups of a car scene, each with six components */\nexport const cadSystems: readonly ECadSystem[] = [\n {\n id: 'body',\n children: ['hood', 'roof', 'doors', 'trunk', 'bumpers', 'fenders'],\n },\n {\n id: 'chassis',\n children: [\n 'frame',\n 'subframe-front',\n 'subframe-rear',\n 'crossmembers',\n 'mounts',\n 'underbody',\n ],\n },\n {\n id: 'drivetrain',\n children: [\n 'engine',\n 'transmission',\n 'driveshaft',\n 'axles',\n 'exhaust',\n 'cooling',\n ],\n },\n {\n id: 'interior',\n children: ['seats', 'dashboard', 'console', 'headliner', 'carpet', 'trim'],\n },\n {\n id: 'electrics',\n children: [\n 'harness',\n 'battery',\n 'ecu',\n 'lighting',\n 'sensors',\n 'infotainment',\n ],\n },\n {\n id: 'wheels',\n children: ['wheel-fl', 'wheel-fr', 'wheel-rl', 'wheel-rr', 'spare', 'hubs'],\n },\n {\n id: 'exterior',\n children: ['grille', 'mirrors', 'spoiler', 'sills', 'mouldings', 'badges'],\n },\n {\n id: 'safety',\n children: ['airbags', 'belts', 'abs', 'camera', 'radar', 'crash-bars'],\n },\n];\n\n// .............................................................................\n/** Names for the nodes below the component groups (level 3 and deeper) */\nexport const cadDetails: readonly string[] = [\n 'shell',\n 'frame',\n 'bracket',\n 'cover',\n 'mount',\n 'seal',\n 'hinge',\n 'panel',\n 'bolt-set',\n 'clip-set',\n];\n\n// .............................................................................\n/** The materials of meshes, picked by index */\nexport const cadMaterials: readonly string[] = [\n 'steel',\n 'aluminium',\n 'glass',\n 'plastic',\n 'rubber',\n 'leather',\n 'carbon fibre',\n 'chrome',\n];\n","// @license\n// Copyright (c) 2025 Rljson\n//\n// Use of this source code is governed by terms that can be\n// found in the LICENSE file in the root of this package.\n\nimport type { Tree } from '@rljson/rljson';\n\nimport type { ECadConfig } from '../config/config.ts';\nimport type { EEmitter } from '../core/emitter.ts';\nimport { pick, pickMany, roundDecimals } from '../core/pick.ts';\nimport { cadDetails, cadMaterials, cadSystems } from '../dictionaries/cad.ts';\nimport type { ECadSystem } from '../dictionaries/cad.ts';\n\nimport type { ECadMeta } from './car-world.ts';\nimport type { EVariant } from './plan.ts';\n\n// #############################################################################\n/** What a scene builder needs */\nexport interface ESceneBuilderOptions {\n /** Receives the rows */\n emitter: EEmitter;\n\n /** The CAD layer configuration */\n config: Required<ECadConfig>;\n\n /** Who the scene belongs to */\n variant: EVariant;\n\n /** The parts of the variant's bill of materials, for linking meshes */\n partRefs: readonly string[];\n}\n\n// .............................................................................\n/** How the nodes of a scene are laid out, in meters */\nconst layout = { xStep: 0.5, yStep: 0.3 } as const;\n\n/** How many vertices a mesh has: a minimum plus a spread by index */\nconst vertexSpread = { min: 500, range: 20000, stride: 137 } as const;\n\n/** Base, variants and step of the width, height and depth of a node */\nconst boundsSpread = [\n { base: 0.5, variants: 4, step: 0.25 },\n { base: 0.3, variants: 3, step: 0.2 },\n { base: 0.4, variants: 5, step: 0.1 },\n] as const;\n\n/** The level whose detail names start after the names of the level above */\nconst shiftedDetailLevel = 4;\n\n// .............................................................................\n/**\n * Returns the width, height and depth of the node with an index.\n * @param index - The index of the node within the scene\n */\nconst boundsOf = (index: number): number[] =>\n boundsSpread.map(({ base, variants, step }) =>\n roundDecimals(base + (index % variants) * step, 2),\n );\n\n// #############################################################################\n/**\n * Emits the scene of a variant as a tree, from the meshes up.\n *\n * Every node carries the variant in its meta data, so two variants never\n * share a node. Nodes are numbered in the order they are emitted, children\n * before their group. Build once per instance.\n */\nexport class ESceneBuilder {\n /**\n * Constructor\n * @param options - The emitter, the CAD layer, the variant and its parts\n */\n constructor(private readonly options: ESceneBuilderOptions) {}\n\n // ...........................................................................\n /** Emits the scene and returns the hash of its root */\n async build(): Promise<string> {\n const { config, variant } = this.options;\n const systems: string[] = [];\n for (const system of pickMany(cadSystems, variant.offset, config.fanOut)) {\n systems.push(await this.system(system));\n }\n return this.group('scene', 0, systems);\n }\n\n // ######################\n // Private\n // ######################\n\n private index = 0;\n\n private async system(system: ECadSystem): Promise<string> {\n if (this.options.config.depth < 2) {\n return this.mesh(system.id, 1);\n }\n return this.group(system.id, 1, await this.components(system));\n }\n\n private async components(system: ECadSystem): Promise<string[]> {\n const { depth, fanOut } = this.options.config;\n const result: string[] = [];\n for (const id of pickMany(system.children, 0, fanOut)) {\n result.push(\n depth > 2\n ? await this.group(id, 2, await this.details(id, 3))\n : await this.mesh(id, 2),\n );\n }\n return result;\n }\n\n private async details(parentId: string, level: number): Promise<string[]> {\n const { depth, fanOut } = this.options.config;\n const offset = level === shiftedDetailLevel ? fanOut : 0;\n const result: string[] = [];\n for (const name of pickMany(cadDetails, offset, fanOut)) {\n const id = `${parentId}-${name}`;\n result.push(\n level < depth\n ? await this.group(id, level, await this.details(id, level + 1))\n : await this.mesh(id, level),\n );\n }\n return result;\n }\n\n private group(id: string, level: number, children: string[]) {\n return this.node({\n id,\n isParent: true,\n meta: this.meta('group', level),\n children,\n });\n }\n\n private mesh(id: string, level: number): Promise<string> {\n return this.node({\n id,\n isParent: false,\n meta: this.meta('mesh', level),\n children: null,\n });\n }\n\n private async node(row: Tree): Promise<string> {\n return (await this.options.emitter.emit('cadScenes', row))._hash;\n }\n\n private meta(type: 'group' | 'mesh', level: number): ECadMeta {\n const i = this.index++;\n const isMesh = type === 'mesh';\n return {\n type,\n variant: this.options.variant.name,\n transform: {\n position: [\n roundDecimals(i * layout.xStep, 2),\n roundDecimals(level * layout.yStep, 2),\n 0,\n ],\n rotation: [0, 0, 0],\n scale: [1, 1, 1],\n },\n material: isMesh ? pick(cadMaterials, i) : null,\n vertices: isMesh\n ? vertexSpread.min + ((i * vertexSpread.stride) % vertexSpread.range)\n : null,\n boundsM: boundsOf(i),\n partRef: isMesh ? this.partRefOf(i) : null,\n };\n }\n\n private partRefOf(index: number): string | null {\n const { config, partRefs } = this.options;\n return config.linkToParts && partRefs.length > 0\n ? pick(partRefs, index)\n : null;\n }\n}\n","// @license\n// Copyright (c) 2025 Rljson\n//\n// Use of this source code is governed by terms that can be\n// found in the LICENSE file in the root of this package.\n\nimport type {\n EResolvedConfig,\n ERevisionsConfig,\n ESharing,\n} from '../config/config.ts';\nimport { inShare, padded, pick, slug, zipfBucket } from '../core/pick.ts';\nimport type { EVehicleModel } from '../dictionaries/vehicles.ts';\n\n// .............................................................................\n/** The segments a manufacturer's catalogs are named after */\nexport const segments = [\n 'cars',\n 'vans',\n 'suvs',\n 'fleet',\n 'classics',\n 'sports',\n 'trucks',\n 'compact',\n 'premium',\n 'electric',\n] as const;\n\n/** The digits of the car number in a slice id */\nexport const carNoDigits = 6;\n\n/** The models a manufacturer uses when the brands layer is off */\nexport const modelsWithoutBrands = 5;\n\n// .............................................................................\n/**\n * Returns the segment of a catalog, unique within a manufacturer.\n * @param catalogIndex - The index of the catalog within the manufacturer\n */\nexport const segmentOf = (catalogIndex: number): string => {\n const segment = pick(segments, catalogIndex);\n const round = Math.floor(catalogIndex / segments.length);\n return round === 0 ? segment : `${segment}-${round + 1}`;\n};\n\n// .............................................................................\n/**\n * Returns the id of a catalog without its year, e.g. \"audi-cars\".\n * @param manufacturerId - The id of the manufacturer\n * @param catalogIndex - The index of the catalog within the manufacturer\n */\nexport const catalogBaseId = (\n manufacturerId: string,\n catalogIndex: number,\n): string => `${manufacturerId}-${segmentOf(catalogIndex)}`;\n\n// .............................................................................\n/**\n * Returns the slice id of a car, e.g. \"audi-cars-000017\".\n * @param baseId - The id of the catalog without its year\n * @param carNo - The number of the car, starting at 1\n */\nexport const carSliceId = (baseId: string, carNo: number): string =>\n `${baseId}-${padded(carNo, carNoDigits)}`;\n\n// .............................................................................\n/**\n * Returns the number of a car from its slice id.\n * @param sliceId - The slice id of the car\n */\nexport const carNoOf = (sliceId: string): number =>\n Number(sliceId.slice(sliceId.lastIndexOf('-') + 1));\n\n// #############################################################################\n/** One model year of a catalog */\nexport interface EVersionPlan {\n /** The model year */\n year: number;\n\n /** The slice ids of all cars of the year */\n carIds: string[];\n\n /** The cars the year adds; all cars in the first year */\n added: string[];\n\n /** The cars the year removes */\n removed: string[];\n\n /** The cars whose price the year changes */\n changed: string[];\n}\n\n// #############################################################################\n/** What the model years of a catalog depend on */\nexport interface EPlanOptions {\n /** The id of the catalog without its year */\n baseId: string;\n\n /** The number of cars in the first year */\n cars: number;\n\n /** The first model year */\n startYear: number;\n\n /** How many years follow, and their shares */\n revisions: Required<ERevisionsConfig>;\n}\n\n// .............................................................................\n/**\n * Returns a function that hands out the next slice ids of a catalog.\n * @param baseId - The id of the catalog without its year\n */\nconst carIdSequence = (baseId: string): ((count: number) => string[]) => {\n let next = 1;\n return (count) =>\n Array.from({ length: count }, () => carSliceId(baseId, next++));\n};\n\n// .............................................................................\n/**\n * Plans the model year after another one: which cars it removes, keeps, adds\n * and gives a new price.\n * @param previous - The model year before\n * @param nextIds - Hands out the slice ids of new cars\n * @param revisions - The shares of the change\n */\nconst nextVersion = (\n previous: EVersionPlan,\n nextIds: (count: number) => string[],\n revisions: Required<ERevisionsConfig>,\n): EVersionPlan => {\n const cars = previous.carIds;\n const removed = cars.filter((_, i) => inShare(i, revisions.removeShare));\n const kept = cars.filter((_, i) => !inShare(i, revisions.removeShare));\n const added = nextIds(Math.round(cars.length * revisions.addShare));\n const changed = kept.filter((_, i) => inShare(i, revisions.changeShare));\n const carIds = [...kept, ...added];\n return { year: previous.year + 1, carIds, added, removed, changed };\n};\n\n// .............................................................................\n/**\n * Plans the model years of a catalog: which cars each year adds, removes and\n * changes. Everything derives from the shares, nothing is random.\n * @param options - The catalog, its first year and its revisions\n */\nexport const planVersions = (options: EPlanOptions): EVersionPlan[] => {\n const { baseId, cars, startYear, revisions } = options;\n const nextIds = carIdSequence(baseId);\n const initial = nextIds(cars);\n const first = { year: startYear, carIds: initial, added: initial };\n const result: EVersionPlan[] = [{ ...first, removed: [], changed: [] }];\n for (let v = 1; v <= revisions.count; v++) {\n result.push(nextVersion(result[v - 1], nextIds, revisions));\n }\n return result;\n};\n\n// #############################################################################\n/** The counts of a catalog across its model years, for the estimate */\nexport interface EVersionCounts {\n /** How many different cars the catalog lists over all years */\n distinctCars: number;\n\n /** How many price rows the years need at most, all years together */\n priceRows: number;\n\n /** How many price rows each year needs at most: new cars and changed prices */\n priceRowsPerVersion: number[];\n\n /** How many assignments the layers of all years hold together */\n assignments: number;\n}\n\n// .............................................................................\n/**\n * Counts what planVersions would plan, without building a single id.\n * @param cars - The number of cars in the first year\n * @param revisions - How many years follow, and their shares\n */\nexport const countVersions = (\n cars: number,\n revisions: Required<ERevisionsConfig>,\n): EVersionCounts => {\n const counts: EVersionCounts = {\n distinctCars: cars,\n priceRows: cars,\n priceRowsPerVersion: [cars],\n assignments: cars,\n };\n let length = cars;\n for (let v = 1; v <= revisions.count; v++) {\n const removed = Math.floor(length * revisions.removeShare);\n const kept = length - removed;\n const added = Math.round(length * revisions.addShare);\n const changed = Math.floor(kept * revisions.changeShare);\n counts.distinctCars += added;\n counts.priceRows += added + changed;\n counts.priceRowsPerVersion.push(added + changed);\n counts.assignments += added + changed + removed;\n length = kept + added;\n }\n return counts;\n};\n\n// .............................................................................\n/**\n * Returns how many models the cars of a manufacturer use: the configured\n * number, capped by the models the dictionary knows.\n * @param config - The resolved configuration\n * @param models - The models of the manufacturer\n */\nexport const modelCountOf = (\n config: EResolvedConfig,\n models: readonly EVehicleModel[],\n): number =>\n Math.min(\n config.layers.brands\n ? config.layers.brands.modelsPerManufacturer\n : modelsWithoutBrands,\n models.length,\n );\n\n// #############################################################################\n/** What the model of a car depends on */\nexport interface EModelOptions {\n /** The number of the car, starting at 1 */\n carNo: number;\n\n /** The number of cars in the first year */\n initialCars: number;\n\n /** The number of models the manufacturer offers */\n models: number;\n\n /** uniform spreads the cars evenly, zipf favours the first models */\n popularity: 'uniform' | 'zipf';\n}\n\n// .............................................................................\n/**\n * Returns the index of the model of a car. A car keeps its model over the\n * years, so the index derives from the car number alone.\n * @param options - The car, the catalog size and the models\n */\nexport const modelIndexOf = (options: EModelOptions): number => {\n const { carNo, initialCars, models, popularity } = options;\n return popularity === 'zipf'\n ? zipfBucket({ index: carNo - 1, count: initialCars, buckets: models })\n : (carNo - 1) % models;\n};\n\n// #############################################################################\n/** Who shares a bill of materials or a scene: a code for ids and a name */\nexport interface EVariant {\n /** A short code for part numbers and cache keys, e.g. \"a4\" */\n code: string;\n\n /** A readable name, e.g. \"Audi A4\" */\n name: string;\n\n /** A number that varies the assemblies and systems the variant uses */\n offset: number;\n}\n\n// #############################################################################\n/** What the variant of a car depends on */\nexport interface EVariantOptions {\n /** perCar, perModel or perCatalog */\n sharing: ESharing;\n\n /** The slice id of the car */\n sliceId: string;\n\n /** The model of the car */\n model: EVehicleModel;\n\n /** The index of the model within the manufacturer */\n modelIndex: number;\n\n /** The segment of the catalog */\n segment: string;\n\n /** The index of the catalog within the manufacturer */\n catalogIndex: number;\n}\n\n// .............................................................................\n/**\n * Returns the variant a car's bill of materials or scene belongs to.\n * @param options - The sharing, the car, its model and its catalog\n */\nexport const variantOf = (options: EVariantOptions): EVariant => {\n const { sharing, sliceId, model, modelIndex, segment } = options;\n if (sharing === 'perCar') {\n const carNo = carNoOf(sliceId);\n const code = `${slug(segment)}-${padded(carNo, carNoDigits)}`;\n return { code, name: sliceId, offset: carNo };\n }\n if (sharing === 'perModel') {\n const name = `${model.brand} ${model.model}`;\n return { code: slug(model.model), name, offset: modelIndex };\n }\n const name = `${model.brand} ${segment}`;\n return { code: slug(segment), name, offset: options.catalogIndex };\n};\n","// @license\n// Copyright (c) 2025 Rljson\n//\n// Use of this source code is governed by terms that can be\n// found in the LICENSE file in the root of this package.\n\nimport type { EPricesConfig } from '../config/config.ts';\nimport { inShare, roundTo } from '../core/pick.ts';\nimport type { EVehicleModel } from '../dictionaries/vehicles.ts';\n\nimport { bodyTypeRanks } from './brands.ts';\nimport type { EPrice } from './car-world.ts';\n\n// .............................................................................\n/** A model has at most this many different prices per model year */\nexport const pricesPerModel = 100;\n\n/** The discounts are this many steps of discountStepPercent: 5, 10 and 15 */\nexport const discountSteps = 3;\n\n/** The percent one discount step takes off */\nconst discountStepPercent = 5;\n\n/** How much of the price range the body type, the model and the car decide */\nconst priceShares = { bodyType: 0.6, model: 0.25, car: 0.15 } as const;\n\n/** The models of a manufacturer spread over this many price steps */\nconst modelPriceSteps = 5;\n\n/** The share every raise adds to a price */\nconst raiseShare = 0.03;\n\n// #############################################################################\n/** What a price depends on */\nexport interface EPriceInput {\n /** The model of the car: its body type decides the price class */\n model: EVehicleModel;\n\n /** The index of the model within the manufacturer */\n modelIndex: number;\n\n /** The number of the car, starting at 1 */\n carNo: number;\n\n /** The model year the price is valid from */\n year: number;\n\n /** The currency of the catalog */\n currency: string;\n\n /** How many model years raised the price: 0 for the first price of a car */\n raises: number;\n}\n\n// .............................................................................\n/**\n * Returns where a price lies in the range, between 0 and 1.\n * @param input - What the price depends on\n */\nconst positionInRange = (input: EPriceInput): number => {\n const { model, modelIndex, carNo } = input;\n const rank = bodyTypeRanks.indexOf(model.bodyType);\n return (\n ((rank + 1) / (bodyTypeRanks.length + 1)) * priceShares.bodyType +\n ((modelIndex % modelPriceSteps) / modelPriceSteps) * priceShares.model +\n ((carNo % pricesPerModel) / pricesPerModel) * priceShares.car\n );\n};\n\n// .............................................................................\n/**\n * Returns the discount of a car in percent, 0 for none.\n * @param config - The prices layer configuration\n * @param carNo - The number of the car, starting at 1\n */\nconst discountOf = (config: Required<EPricesConfig>, carNo: number) =>\n inShare(carNo - 1, config.discountShare)\n ? discountStepPercent * (1 + (carNo % discountSteps))\n : 0;\n\n// .............................................................................\n/**\n * Returns the price row of a car.\n *\n * Expensive body types land high in the range, cheap ones low. The model and\n * the car number spread the prices a little: a model has at most a hundred\n * different prices per year. Every raise adds three percent.\n * @param config - The prices layer configuration\n * @param input - What the price depends on\n */\nexport const priceRow = (\n config: Required<EPricesConfig>,\n input: EPriceInput,\n): EPrice => {\n const { min, max } = config.range;\n const base = min + (max - min) * positionInRange(input);\n const raised = base * (1 + raiseShare * input.raises);\n return {\n amount: Math.min(max, roundTo(raised, config.roundTo)),\n currency: input.currency,\n validFrom: `${input.year}-01-01`,\n discountPercent: discountOf(config, input.carNo),\n taxIncluded: true,\n };\n};\n","// @license\n// Copyright (c) 2025 Rljson\n//\n// Use of this source code is governed by terms that can be\n// found in the LICENSE file in the root of this package.\n\n// .............................................................................\n/** First names from many countries */\nexport const firstNames: readonly string[] = [\n 'Mira',\n 'Jonas',\n 'Lea',\n 'Noah',\n 'Emma',\n 'Liam',\n 'Sofia',\n 'Elias',\n 'Hannah',\n 'Finn',\n 'Clara',\n 'Paul',\n 'Lina',\n 'Leon',\n 'Ida',\n 'Luca',\n 'Mia',\n 'Felix',\n 'Marie',\n 'Ben',\n 'Anna',\n 'Lukas',\n 'Nora',\n 'Maximilian',\n 'Greta',\n 'Oskar',\n 'Frieda',\n 'Anton',\n 'Johanna',\n 'Theo',\n 'Amelie',\n 'Henry',\n 'Charlotte',\n 'Matteo',\n 'Elena',\n 'Julian',\n 'Lara',\n 'David',\n 'Sarah',\n 'Tom',\n 'Laura',\n 'Niklas',\n 'Lisa',\n 'Moritz',\n 'Julia',\n 'Jan',\n 'Katharina',\n 'Tim',\n 'Sophie',\n 'Fabian',\n 'Olivia',\n 'Oliver',\n 'Ava',\n 'George',\n 'Isla',\n 'Harry',\n 'Amelia',\n 'Jack',\n 'Grace',\n 'Oscar',\n 'Freya',\n 'Arthur',\n 'Lily',\n 'Alfie',\n 'Poppy',\n 'James',\n 'Emily',\n 'William',\n 'Rosie',\n 'Louis',\n 'Chloé',\n 'Gabriel',\n 'Inès',\n 'Raphaël',\n 'Jade',\n 'Arthur',\n 'Louise',\n 'Jules',\n 'Alice',\n 'Hugo',\n 'Léa',\n 'Adam',\n 'Manon',\n 'Lucas',\n 'Camille',\n 'Giulia',\n 'Francesco',\n 'Alessandro',\n 'Aurora',\n 'Lorenzo',\n 'Ginevra',\n 'Leonardo',\n 'Beatrice',\n 'Mattia',\n 'Vittoria',\n 'Riccardo',\n 'Martina',\n 'Hugo',\n 'Lucía',\n 'Martín',\n 'María',\n 'Pablo',\n 'Paula',\n 'Alejandro',\n 'Daniela',\n 'Daniel',\n 'Carla',\n 'Elsa',\n 'Oliver',\n 'Alma',\n 'Hugo',\n 'Wilma',\n 'Adam',\n 'Ebba',\n 'Lucas',\n 'Maja',\n 'Liam',\n 'Astrid',\n 'Jakub',\n 'Eliška',\n 'Tomáš',\n 'Tereza',\n 'Matěj',\n 'Anna',\n 'Zofia',\n 'Antoni',\n 'Julia',\n 'Aleksander',\n 'Hana',\n 'Yuki',\n 'Haruto',\n 'Sakura',\n 'Sota',\n 'Himari',\n 'Riku',\n 'Aoi',\n 'Minato',\n 'Mei',\n 'Seo-yeon',\n 'Min-jun',\n 'Ji-woo',\n 'Do-yun',\n 'Ha-eun',\n 'Wei',\n 'Fang',\n 'Jing',\n 'Hao',\n 'Yan',\n 'Lei',\n 'Xin',\n 'Aarav',\n 'Vivaan',\n 'Diya',\n 'Aditya',\n 'Ananya',\n 'Arjun',\n 'Saanvi',\n 'Reyansh',\n 'Ishaan',\n 'Kiara',\n 'Olivia',\n 'Liam',\n 'Emma',\n 'Noah',\n 'Ava',\n 'Mason',\n 'Isabella',\n 'Ethan',\n 'Mia',\n 'Logan',\n 'Harper',\n 'Lucas',\n 'Evelyn',\n 'Aiden',\n 'Abigail',\n 'Carter',\n 'Ella',\n 'Amara',\n 'Thabo',\n 'Zanele',\n 'Sipho',\n 'Lerato',\n 'Kwame',\n 'Ama',\n 'Yara',\n 'Omar',\n 'Layla',\n 'Zayd',\n 'Fatima',\n 'Mateus',\n 'Valentina',\n 'Enzo',\n 'Helena',\n 'Santiago',\n 'Camila',\n 'Nikolai',\n 'Anastasia',\n 'Dmitri',\n 'Polina',\n 'Ivan',\n 'Alina',\n];\n\n// .............................................................................\n/** Last names from many countries */\nexport const lastNames: readonly string[] = [\n 'Lindqvist',\n 'Müller',\n 'Schmidt',\n 'Schneider',\n 'Fischer',\n 'Weber',\n 'Meyer',\n 'Wagner',\n 'Becker',\n 'Schulz',\n 'Hoffmann',\n 'Koch',\n 'Richter',\n 'Klein',\n 'Wolf',\n 'Schröder',\n 'Neumann',\n 'Braun',\n 'Zimmermann',\n 'Krüger',\n 'Hartmann',\n 'Lange',\n 'Werner',\n 'Krause',\n 'Lehmann',\n 'Köhler',\n 'Maier',\n 'Huber',\n 'Smith',\n 'Jones',\n 'Taylor',\n 'Brown',\n 'Williams',\n 'Wilson',\n 'Johnson',\n 'Davies',\n 'Robinson',\n 'Wright',\n 'Thompson',\n 'Evans',\n 'Walker',\n 'White',\n 'Roberts',\n 'Green',\n 'Hall',\n 'Wood',\n 'Jackson',\n 'Clarke',\n 'Martin',\n 'Bernard',\n 'Dubois',\n 'Thomas',\n 'Robert',\n 'Richard',\n 'Petit',\n 'Durand',\n 'Leroy',\n 'Moreau',\n 'Simon',\n 'Laurent',\n 'Lefebvre',\n 'Michel',\n 'Garcia',\n 'David',\n 'Rossi',\n 'Russo',\n 'Ferrari',\n 'Esposito',\n 'Bianchi',\n 'Romano',\n 'Colombo',\n 'Ricci',\n 'Marino',\n 'Greco',\n 'Bruno',\n 'Gallo',\n 'Conti',\n 'De Luca',\n 'Costa',\n 'García',\n 'Rodríguez',\n 'González',\n 'Fernández',\n 'López',\n 'Martínez',\n 'Sánchez',\n 'Pérez',\n 'Gómez',\n 'Martín',\n 'Jiménez',\n 'Ruiz',\n 'Hernández',\n 'Díaz',\n 'Andersson',\n 'Johansson',\n 'Karlsson',\n 'Nilsson',\n 'Eriksson',\n 'Larsson',\n 'Olsson',\n 'Persson',\n 'Svensson',\n 'Gustafsson',\n 'Novák',\n 'Svoboda',\n 'Novotný',\n 'Dvořák',\n 'Černý',\n 'Procházka',\n 'Kowalski',\n 'Nowak',\n 'Wiśniewski',\n 'Wójcik',\n 'Kamiński',\n 'Sato',\n 'Suzuki',\n 'Takahashi',\n 'Tanaka',\n 'Watanabe',\n 'Ito',\n 'Yamamoto',\n 'Nakamura',\n 'Kobayashi',\n 'Kato',\n 'Kim',\n 'Lee',\n 'Park',\n 'Choi',\n 'Jung',\n 'Kang',\n 'Cho',\n 'Yoon',\n 'Wang',\n 'Li',\n 'Zhang',\n 'Liu',\n 'Chen',\n 'Yang',\n 'Huang',\n 'Zhao',\n 'Wu',\n 'Zhou',\n 'Sharma',\n 'Patel',\n 'Singh',\n 'Kumar',\n 'Gupta',\n 'Reddy',\n 'Nair',\n 'Mehta',\n 'Iyer',\n 'Das',\n 'Miller',\n 'Anderson',\n 'Moore',\n 'Harris',\n 'Clark',\n 'Lewis',\n 'Young',\n 'Allen',\n 'King',\n 'Scott',\n 'Nguyen',\n 'Tran',\n 'Pham',\n 'Silva',\n 'Santos',\n 'Oliveira',\n 'Souza',\n 'Pereira',\n 'Ivanov',\n 'Petrov',\n 'Sokolov',\n 'Volkov',\n 'Haddad',\n 'Khalil',\n 'Mensah',\n 'Okafor',\n 'Dlamini',\n 'Nkosi',\n];\n","// @license\n// Copyright (c) 2025 Rljson\n//\n// Use of this source code is governed by terms that can be\n// found in the LICENSE file in the root of this package.\n\nimport type { EWorkshopsConfig } from '../config/config.ts';\nimport type { EEmitter } from '../core/emitter.ts';\nimport { padded, pick, pickMany, roundDecimals, slug } from '../core/pick.ts';\nimport { firstNames, lastNames } from '../dictionaries/people.ts';\nimport { citiesIn, streets } from '../dictionaries/places.ts';\nimport type { ECity } from '../dictionaries/places.ts';\n\nimport type { EAddress, EPerson, EWorkshop } from './car-world.ts';\n\n// .............................................................................\n/** The services a workshop can offer */\nexport const services: readonly string[] = [\n 'inspection',\n 'tires',\n 'brakes',\n 'bodywork',\n 'paint',\n 'glass',\n 'electrics',\n 'ev-service',\n 'air-conditioning',\n 'towing',\n];\n\n/** How workshops are named; owner stands for the owner's last name, city for the city */\nconst nameTemplates: readonly string[] = [\n '{owner} Motors',\n 'Autohaus {owner}',\n '{city} Car Service',\n 'Garage {owner}',\n '{owner} & Sons',\n '{city} Motor Works',\n 'Werkstatt {owner}',\n '{owner} Automotive',\n];\n\n/** The telephone country codes of the countries in the places dictionary */\nconst dialCodes: Readonly<Record<string, string>> = {\n DE: '49',\n FR: '33',\n IT: '39',\n SE: '46',\n CZ: '420',\n ES: '34',\n RO: '40',\n NL: '31',\n HR: '385',\n TR: '90',\n GB: '44',\n JP: '81',\n KR: '82',\n CN: '86',\n IN: '91',\n US: '1',\n MY: '60',\n VN: '84',\n RU: '7',\n AU: '61',\n CH: '41',\n AT: '43',\n PL: '48',\n BE: '32',\n PT: '351',\n DK: '45',\n NO: '47',\n FI: '358',\n IE: '353',\n CA: '1',\n BR: '55',\n MX: '52',\n ZA: '27',\n TH: '66',\n SG: '65',\n AE: '971',\n};\n\n/** How generated addresses spread around the center of their city */\nconst addressSpread = { latSteps: 7, lngSteps: 5, degrees: 0.01 } as const;\n\n/** How generated persons vary with their index */\nconst personSpread = {\n firstNameStride: 7,\n lastNameStride: 11,\n mobilePrefix: '170',\n phoneBase: 1_000_000,\n oldestBirthYear: 1950,\n birthYears: 50,\n birthYearStride: 13,\n} as const;\n\n/** How generated workshops vary with their index */\nconst workshopSpread = {\n cityStride: 3,\n phoneBase: 2_000_000,\n minServices: 2,\n serviceVariants: 3,\n minRating: 3,\n ratingSteps: 21,\n ratingStride: 7,\n} as const;\n\n/** The digits of the subscriber part of a phone number */\nconst phoneDigits = 7;\n\n// .............................................................................\n/**\n * Returns the dial code of a country, 0 when the country is unknown.\n * @param country - The ISO 3166 country code\n */\nconst dialCodeOf = (country: string): string => dialCodes[country] ?? '0';\n\n// .............................................................................\n/**\n * Returns the address with an index in a city. Street and house number\n * derive from the index, so no two indices share an address.\n * @param city - The city\n * @param index - Any non-negative index\n */\nexport const addressRow = (city: ECity, index: number): EAddress => {\n const { latSteps, lngSteps, degrees } = addressSpread;\n return {\n street: pick(streets, index),\n houseNumber: String(1 + Math.floor(index / streets.length)),\n zip: city.zip,\n city: city.name,\n country: city.country,\n lat: roundDecimals(city.lat + (index % latSteps) * degrees, 4),\n lng: roundDecimals(city.lng + (index % lngSteps) * degrees, 4),\n };\n};\n\n// .............................................................................\n/**\n * Returns the person with an index. The phone number makes every index a\n * different person, even when the names repeat.\n * @param index - Any non-negative index\n * @param country - The country the phone number belongs to\n */\nexport const personRow = (index: number, country: string): EPerson => {\n const spread = personSpread;\n const firstName = pick(firstNames, index * spread.firstNameStride);\n const lastName = pick(lastNames, index * spread.lastNameStride);\n const subscriber = padded(spread.phoneBase + index, phoneDigits);\n const birthYearOffset = (index * spread.birthYearStride) % spread.birthYears;\n return {\n firstName,\n lastName,\n email: `${slug(firstName)}.${slug(lastName)}@example.com`,\n phone: `+${dialCodeOf(country)} ${spread.mobilePrefix} ${subscriber}`,\n birthYear: spread.oldestBirthYear + birthYearOffset,\n };\n};\n\n// #############################################################################\n/** What a workshop row depends on */\ninterface EWorkshopInput {\n /** The index of the workshop within the world */\n index: number;\n\n /** The city of the workshop */\n city: ECity;\n\n /** The owner of the workshop */\n owner: EPerson;\n\n /** The hash of the address row */\n addressRef: string;\n\n /** The hash of the owner row */\n ownerRef: string;\n\n /** The country of the manufacturer */\n country: string;\n}\n\n// .............................................................................\n/**\n * Returns the row of a workshop.\n * @param input - The index, the city, the owner and the referenced rows\n */\nconst workshopRow = (input: EWorkshopInput): EWorkshop => {\n const { index, city, owner, country } = input;\n const spread = workshopSpread;\n const name = pick(nameTemplates, index)\n .replace('{owner}', owner.lastName)\n .replace('{city}', city.name);\n const serviceCount = spread.minServices + (index % spread.serviceVariants);\n const ratingTenths = (index * spread.ratingStride) % spread.ratingSteps;\n return {\n name,\n addressRef: input.addressRef,\n ownerRef: input.ownerRef,\n phone: `+${dialCodeOf(country)} ${padded(spread.phoneBase + index, phoneDigits)}`,\n email: `info@${slug(name)}.example`,\n services: pickMany(services, index, serviceCount),\n rating: roundDecimals(spread.minRating + ratingTenths / 10, 1),\n };\n};\n\n// #############################################################################\n/** What the workshops of a catalog depend on */\nexport interface EWorkshopsOptions {\n /** Receives the rows */\n emitter: EEmitter;\n\n /** The workshops layer configuration */\n config: Required<EWorkshopsConfig>;\n\n /** The index of the manufacturer, for the owner pool */\n manufacturerIndex: number;\n\n /** The index of the catalog within the world */\n catalogIndex: number;\n\n /** The country of the manufacturer */\n country: string;\n}\n\n// #############################################################################\n/** The cities of a country and the number of a workshop within its catalog */\ninterface EWorkshopSlot {\n cities: readonly ECity[];\n j: number;\n}\n\n// .............................................................................\n/**\n * Emits one workshop with its address and owner and returns its hash.\n * @param options - What the workshops of the catalog depend on\n * @param position - The cities of the country and the number of the workshop\n */\nconst generateWorkshop = async (\n options: EWorkshopsOptions,\n position: EWorkshopSlot,\n): Promise<string> => {\n const { emitter, config, manufacturerIndex, catalogIndex, country } = options;\n const { cities, j } = position;\n const index = catalogIndex * config.perCatalog + j;\n const city = pick(cities, index * workshopSpread.cityStride);\n const owners = config.ownersPerManufacturer;\n const ownerIndex = manufacturerIndex * owners + (j % owners);\n\n emitter.phaseIs('addresses');\n const address = await emitter.emit('addresses', addressRow(city, index));\n emitter.phaseIs('persons');\n const owner = personRow(ownerIndex, country);\n const person = await emitter.emit('persons', owner);\n emitter.phaseIs('workshops');\n const row = workshopRow({\n index,\n city,\n owner,\n addressRef: address._hash,\n ownerRef: person._hash,\n country,\n });\n return (await emitter.emit('workshops', row))._hash;\n};\n\n// .............................................................................\n/**\n * Emits the workshops of a catalog with their addresses and owners, and\n * returns the hashes of the workshops.\n * @param options - The emitter, the layer and the catalog\n */\nexport const generateWorkshops = async (\n options: EWorkshopsOptions,\n): Promise<string[]> => {\n const cities = citiesIn(options.country);\n const result: string[] = [];\n for (let j = 0; j < options.config.perCatalog; j++) {\n result.push(await generateWorkshop(options, { cities, j }));\n }\n return result;\n};\n","// @license\n// Copyright (c) 2025 Rljson\n//\n// Use of this source code is governed by terms that can be\n// found in the LICENSE file in the root of this package.\n\nimport type { Cake, Layer, Revision, SliceIds } from '@rljson/rljson';\n\nimport type {\n ECadConfig,\n EPartsConfig,\n EResolvedConfig,\n EResolvedLayers,\n ESharing,\n} from '../config/config.ts';\nimport type { EEmitter } from '../core/emitter.ts';\nimport { pick } from '../core/pick.ts';\nimport type { EVehicleModel } from '../dictionaries/vehicles.ts';\n\nimport { brandRow } from './brands.ts';\nimport { EBomBuilder } from './bom-builder.ts';\nimport type { EBom } from './bom-builder.ts';\nimport { ESceneBuilder } from './scene-builder.ts';\nimport {\n carNoOf,\n catalogBaseId,\n modelCountOf,\n modelIndexOf,\n planVersions,\n segmentOf,\n variantOf,\n} from './plan.ts';\nimport type { EVariant, EVersionPlan } from './plan.ts';\nimport { priceRow } from './prices.ts';\nimport type { EPriceInput } from './prices.ts';\nimport { generateWorkshops } from './workshops.ts';\n\n// #############################################################################\n/** What a catalog needs to know about its manufacturer */\nexport interface ECatalogManufacturer {\n /** The index of the manufacturer within the world */\n index: number;\n\n /** The id of the manufacturer, e.g. \"audi\" */\n id: string;\n\n /** The part number prefix, e.g. \"AUD\" */\n prefix: string;\n\n /** The ISO 3166 country code */\n country: string;\n\n /** The models the manufacturer offers */\n models: readonly EVehicleModel[];\n}\n\n// #############################################################################\n/** Bills of materials and scenes shared by the catalogs of a manufacturer */\nexport interface ECatalogCaches {\n boms: Map<string, EBom>;\n scenes: Map<string, string>;\n}\n\n// #############################################################################\n/** What generating a catalog yields */\nexport interface ECatalogResult {\n /** The hashes of the cakes, one per model year, oldest first */\n cakeRefs: string[];\n\n /** How many different cars the catalog lists over all years */\n cars: number;\n}\n\n// #############################################################################\n/** What a catalog generator needs */\nexport interface ECatalogGeneratorOptions {\n /** Receives the rows */\n emitter: EEmitter;\n\n /** The resolved configuration */\n config: EResolvedConfig;\n\n /** The manufacturer of the catalog */\n manufacturer: ECatalogManufacturer;\n\n /** The index of the catalog within the manufacturer */\n catalogIndex: number;\n\n /** Bills of materials and scenes shared within the manufacturer */\n caches: ECatalogCaches;\n}\n\n// #############################################################################\n/** The aspects a layer can describe */\ntype EAspect = 'prices' | 'brands' | 'workshops' | 'parts' | 'cad';\n\n// #############################################################################\n/** A cache, who shares its entries, and how to build an entry */\ninterface ESharedEntry<T> {\n cache: Map<string, T>;\n sharing: ESharing;\n car: string;\n build: (variant: EVariant) => Promise<T>;\n}\n\n// .............................................................................\n/** The layers table and the components table of every aspect */\nconst aspectTables: Readonly<\n Record<EAspect, { layer: string; components: string }>\n> = {\n prices: { layer: 'carPrices', components: 'prices' },\n brands: { layer: 'carBrands', components: 'brands' },\n workshops: { layer: 'carWorkshops', components: 'workshops' },\n parts: { layer: 'carParts', components: 'parts' },\n cad: { layer: 'carCad', components: 'cadScenes' },\n};\n\n// #############################################################################\n/**\n * Emits one catalog with all its model years: components, slice ids, layers,\n * cakes and revisions.\n *\n * Every model year is a cake of its own. Its slice ids and layers build on\n * the year before, and a revision links the two cakes. Generate once per\n * instance.\n */\nexport class ECatalogGenerator {\n /**\n * Constructor\n * @param options - The emitter, the configuration and the catalog\n */\n constructor(private readonly options: ECatalogGeneratorOptions) {\n const { config, manufacturer, catalogIndex } = options;\n const { layers, catalogs } = config;\n this.catalogGlobal =\n manufacturer.index * config.manufacturers.catalogsPerManufacturer +\n catalogIndex;\n this.baseId = catalogBaseId(manufacturer.id, catalogIndex);\n this.segment = segmentOf(catalogIndex);\n this.plan = planVersions({\n baseId: this.baseId,\n cars: catalogs.carsPerCatalog,\n startYear: catalogs.startYear,\n revisions: catalogs.revisions,\n });\n this.modelCount = modelCountOf(config, manufacturer.models);\n this.currency = layers.prices\n ? pick(layers.prices.currencies, this.catalogGlobal)\n : '';\n this.aspects = (Object.keys(aspectTables) as EAspect[]).filter(\n (aspect) => layers[aspect] !== false,\n );\n }\n\n // ...........................................................................\n /** Emits the catalog and returns the hashes of its cakes */\n async generate(): Promise<ECatalogResult> {\n this.workshopRefs = await this.generateWorkshops();\n for (const version of this.plan) {\n await this.generateVersion(version);\n }\n const cars = this.plan.reduce((sum, v) => sum + v.added.length, 0);\n return { cakeRefs: this.cakeRefs, cars };\n }\n\n // ######################\n // Private\n // ######################\n\n private readonly catalogGlobal: number;\n private readonly baseId: string;\n private readonly segment: string;\n private readonly plan: EVersionPlan[];\n private readonly modelCount: number;\n private readonly currency: string;\n private readonly aspects: EAspect[];\n\n private workshopRefs: string[] = [];\n private previousSliceRef = '';\n private readonly cakeRefs: string[] = [];\n private readonly previousLayer: Partial<Record<EAspect, string>> = {};\n private readonly raises = new Map<string, number>();\n private readonly versionBoms = new Map<string, EBom>();\n private readonly current: Record<EAspect, Map<string, string>> = {\n prices: new Map(),\n brands: new Map(),\n workshops: new Map(),\n parts: new Map(),\n cad: new Map(),\n };\n\n private get emitter(): EEmitter {\n return this.options.emitter;\n }\n\n private get layers(): EResolvedLayers {\n return this.options.config.layers;\n }\n\n private isFirst(version: EVersionPlan): boolean {\n return version === this.plan[0];\n }\n\n private newCarsOf(version: EVersionPlan): string[] {\n return this.isFirst(version) ? version.carIds : version.added;\n }\n\n private async generateWorkshops(): Promise<string[]> {\n const { emitter, manufacturer } = this.options;\n if (!this.layers.workshops) {\n return [];\n }\n return generateWorkshops({\n emitter,\n config: this.layers.workshops,\n manufacturerIndex: manufacturer.index,\n catalogIndex: this.catalogGlobal,\n country: manufacturer.country,\n });\n }\n\n private async generateVersion(version: EVersionPlan): Promise<void> {\n const cars = this.newCarsOf(version);\n const sliceRef = await this.emitSliceIds(version);\n await this.assignBrands(cars);\n await this.assignPrices(version);\n this.assignWorkshops(cars);\n this.versionBoms.clear();\n await this.assignParts(cars);\n await this.assignScenes(cars);\n const cakeLayers = await this.emitLayers(version, sliceRef);\n this.forget(version.removed);\n await this.emitCake(version, { sliceRef, cakeLayers });\n }\n\n // ...........................................................................\n // Components\n\n private modelIndexOf(car: string): number {\n const popularity = this.layers.brands\n ? this.layers.brands.popularity\n : 'uniform';\n return modelIndexOf({\n carNo: carNoOf(car),\n initialCars: this.options.config.catalogs.carsPerCatalog,\n models: this.modelCount,\n popularity,\n });\n }\n\n private async assignBrands(cars: string[]): Promise<void> {\n if (!this.layers.brands) {\n return;\n }\n this.emitter.phaseIs('brands');\n for (const car of cars) {\n const modelIndex = this.modelIndexOf(car);\n const model = this.options.manufacturer.models[modelIndex];\n const brand = await this.emitter.emit(\n 'brands',\n brandRow(model, modelIndex),\n );\n this.current.brands.set(car, brand._hash);\n }\n }\n\n private async assignPrices(version: EVersionPlan): Promise<void> {\n const prices = this.layers.prices;\n if (!prices) {\n return;\n }\n this.emitter.phaseIs('prices');\n for (const car of version.changed) {\n this.raises.set(car, (this.raises.get(car) ?? 0) + 1);\n }\n for (const car of [...this.newCarsOf(version), ...version.changed]) {\n const row = priceRow(prices, this.priceInputOf(car, version.year));\n const price = await this.emitter.emit('prices', row);\n this.current.prices.set(car, price._hash);\n }\n }\n\n private priceInputOf(car: string, year: number): EPriceInput {\n const modelIndex = this.modelIndexOf(car);\n return {\n model: this.options.manufacturer.models[modelIndex],\n modelIndex,\n carNo: carNoOf(car),\n year,\n currency: this.currency,\n raises: this.raises.get(car) ?? 0,\n };\n }\n\n private assignWorkshops(cars: string[]): void {\n if (!this.layers.workshops) {\n return;\n }\n for (const car of cars) {\n const workshop = pick(this.workshopRefs, carNoOf(car) - 1);\n this.current.workshops.set(car, workshop);\n }\n }\n\n private async assignParts(cars: string[]): Promise<void> {\n const parts = this.layers.parts;\n if (!parts) {\n return;\n }\n this.emitter.phaseIs('parts');\n for (const car of cars) {\n this.current.parts.set(car, (await this.bomOf(car, parts)).rootRef);\n }\n }\n\n private async assignScenes(cars: string[]): Promise<void> {\n const cad = this.layers.cad;\n if (!cad) {\n return;\n }\n this.emitter.phaseIs('cadScenes');\n for (const car of cars) {\n this.current.cad.set(car, await this.sceneOf(car, cad));\n }\n }\n\n // ...........................................................................\n // Bills of materials and scenes\n\n private variantOf(sharing: ESharing, car: string): EVariant {\n const modelIndex = this.modelIndexOf(car);\n return variantOf({\n sharing,\n sliceId: car,\n model: this.options.manufacturer.models[modelIndex],\n modelIndex,\n segment: this.segment,\n catalogIndex: this.options.catalogIndex,\n });\n }\n\n private async shared<T>(entry: ESharedEntry<T>): Promise<T> {\n const { cache, sharing, car, build } = entry;\n const variant = this.variantOf(sharing, car);\n const cached = cache.get(variant.code);\n if (cached) {\n return cached;\n }\n const result = await build(variant);\n cache.set(variant.code, result);\n return result;\n }\n\n private bomOf(car: string, config: Required<EPartsConfig>): Promise<EBom> {\n const { emitter, manufacturer, caches } = this.options;\n const cache = config.sharing === 'perCar' ? this.versionBoms : caches.boms;\n return this.shared({\n cache,\n sharing: config.sharing,\n car,\n build: (variant) =>\n new EBomBuilder({\n emitter,\n config,\n prefix: manufacturer.prefix,\n variant,\n }).build(),\n });\n }\n\n private sceneOf(car: string, config: Required<ECadConfig>): Promise<string> {\n const cache =\n config.sharing === 'perCar' ? new Map() : this.options.caches.scenes;\n return this.shared({\n cache,\n sharing: config.sharing,\n car,\n build: async (variant) =>\n new ESceneBuilder({\n emitter: this.emitter,\n config,\n variant,\n partRefs: await this.partRefsOf(car, config),\n }).build(),\n });\n }\n\n private async partRefsOf(\n car: string,\n cad: Required<ECadConfig>,\n ): Promise<string[]> {\n const parts = this.layers.parts;\n if (!parts || !cad.linkToParts) {\n return [];\n }\n return (await this.bomOf(car, parts)).partRefs;\n }\n\n // ...........................................................................\n // Slice ids, layers, cakes and revisions\n\n private async emitSliceIds(version: EVersionPlan): Promise<string> {\n this.emitter.phaseIs('carIds');\n const sliceIds: SliceIds = this.isFirst(version)\n ? { add: version.carIds }\n : {\n base: this.previousSliceRef,\n add: version.added,\n remove: version.removed,\n };\n this.previousSliceRef = (await this.emitter.emit('carIds', sliceIds))._hash;\n return this.previousSliceRef;\n }\n\n private async emitLayers(\n version: EVersionPlan,\n sliceRef: string,\n ): Promise<Record<string, string>> {\n this.emitter.phaseIs('layers');\n const cakeLayers: Record<string, string> = {};\n for (const aspect of this.aspects) {\n const table = aspectTables[aspect].layer;\n const layer = this.layerOf(aspect, { version, sliceRef });\n const ref = (await this.emitter.emit(table, layer))._hash;\n cakeLayers[table] = ref;\n this.previousLayer[aspect] = ref;\n }\n return cakeLayers;\n }\n\n private layerOf(\n aspect: EAspect,\n { version, sliceRef }: { version: EVersionPlan; sliceRef: string },\n ): Layer {\n const assignment = (car: string): [string, string] => [\n car,\n this.current[aspect].get(car) as string,\n ];\n const layer: Layer = {\n sliceIdsTable: 'carIds',\n sliceIdsTableRow: sliceRef,\n componentsTable: aspectTables[aspect].components,\n add: Object.fromEntries(this.addedCars(aspect, version).map(assignment)),\n };\n if (this.isFirst(version)) {\n return layer;\n }\n layer.base = this.previousLayer[aspect];\n if (version.removed.length > 0) {\n layer.remove = Object.fromEntries(version.removed.map(assignment));\n }\n return layer;\n }\n\n private addedCars(aspect: EAspect, version: EVersionPlan): string[] {\n if (this.isFirst(version)) {\n return version.carIds;\n }\n return aspect === 'prices'\n ? [...version.added, ...version.changed]\n : version.added;\n }\n\n private forget(removed: string[]): void {\n for (const car of removed) {\n for (const aspect of this.aspects) {\n this.current[aspect].delete(car);\n }\n }\n }\n\n private async emitCake(\n version: EVersionPlan,\n {\n sliceRef,\n cakeLayers,\n }: { sliceRef: string; cakeLayers: Record<string, string> },\n ): Promise<void> {\n this.emitter.phaseIs('catalogs');\n const cake: Cake = {\n id: `${this.baseId}-${version.year}`,\n sliceIdsTable: 'carIds',\n sliceIdsRow: sliceRef,\n layers: cakeLayers,\n };\n const cakeRef = (await this.emitter.emit('catalogs', cake))._hash;\n if (!this.isFirst(version)) {\n await this.emitRevision(version, cakeRef);\n }\n this.cakeRefs.push(cakeRef);\n }\n\n private async emitRevision(\n version: EVersionPlan,\n successor: string,\n ): Promise<void> {\n this.emitter.phaseIs('revisions');\n const revision: Revision = {\n table: 'catalogs',\n predecessor: this.cakeRefs[this.cakeRefs.length - 1],\n successor,\n timestamp: Date.UTC(version.year, 0, 1),\n id: this.baseId,\n };\n await this.emitter.emit('revisions', revision);\n }\n}\n","// @license\n// Copyright (c) 2025 Rljson\n//\n// Use of this source code is governed by terms that can be\n// found in the LICENSE file in the root of this package.\n\nimport type { JsonValueType } from '@rljson/json';\nimport {\n createCakeTableCfg,\n createLayerTableCfg,\n createSliceIdsTableCfg,\n createTreesTableCfg,\n} from '@rljson/rljson';\nimport type { ColumnCfg, ContentType, TableCfg } from '@rljson/rljson';\n\nimport type { ECarWorldTableKey } from './car-world.ts';\n\n// #############################################################################\n/** A column: key, json type, title and, for a reference, the referenced table */\ntype EColumnSpec = readonly [\n key: string,\n type: JsonValueType,\n title: string,\n ref?: ColumnCfg['ref'],\n];\n\n// .............................................................................\n/**\n * Turns a column spec into a column configuration.\n * @param spec - Key, type, title and an optional reference\n */\nconst columnOf = (spec: EColumnSpec): ColumnCfg => {\n const [key, type, title, ref] = spec;\n return {\n key,\n type,\n titleLong: title,\n titleShort: title,\n ...(ref ? { ref } : {}),\n };\n};\n\n/** The first column of every table */\nconst hashColumn: EColumnSpec = ['_hash', 'string', 'Hash'];\n\n// .............................................................................\n/**\n * Returns a reference to a table.\n * @param tableKey - The key of the referenced table\n * @param type - The content type of the referenced table\n */\nconst refTo = (\n tableKey: string,\n type: ContentType = 'components',\n): ColumnCfg['ref'] => ({ tableKey, type });\n\n// .............................................................................\n/**\n * Returns the configuration of a table whose rows several parents use.\n * @param key - The key of the table\n * @param columns - The columns after the hash column\n */\nconst shared = (key: string, columns: EColumnSpec[]): TableCfg => ({\n key,\n type: 'components',\n columns: [hashColumn, ...columns].map(columnOf),\n isHead: false,\n isRoot: false,\n isShared: true,\n});\n\n// .............................................................................\n/** Returns the configuration of the manufacturers table: the root of the world */\nexport const manufacturersTableCfg = (): TableCfg => ({\n key: 'manufacturers',\n type: 'components',\n columns: (\n [\n hashColumn,\n ['id', 'string', 'Id'],\n ['name', 'string', 'Name'],\n ['brand', 'string', 'Brand'],\n ['country', 'string', 'Country'],\n ['founded', 'number', 'Founded'],\n ['website', 'string', 'Website'],\n ['headquartersRef', 'string', 'Headquarters', refTo('addresses')],\n ['catalogsRef', 'jsonArray', 'Catalogs', refTo('catalogs', 'cakes')],\n ] as EColumnSpec[]\n ).map(columnOf),\n isHead: true,\n isRoot: true,\n isShared: false,\n});\n\n// .............................................................................\n/** Returns the configuration of the addresses table */\nexport const addressesTableCfg = (): TableCfg =>\n shared('addresses', [\n ['street', 'string', 'Street'],\n ['houseNumber', 'string', 'House number'],\n ['zip', 'string', 'Postal code'],\n ['city', 'string', 'City'],\n ['country', 'string', 'Country'],\n ['lat', 'number', 'Latitude'],\n ['lng', 'number', 'Longitude'],\n ]);\n\n// .............................................................................\n/** Returns the configuration of the persons table */\nexport const personsTableCfg = (): TableCfg =>\n shared('persons', [\n ['firstName', 'string', 'First name'],\n ['lastName', 'string', 'Last name'],\n ['email', 'string', 'Email'],\n ['phone', 'string', 'Phone'],\n ['birthYear', 'number', 'Year of birth'],\n ]);\n\n// .............................................................................\n/** Returns the configuration of the workshops table */\nexport const workshopsTableCfg = (): TableCfg =>\n shared('workshops', [\n ['name', 'string', 'Name'],\n ['addressRef', 'string', 'Address', refTo('addresses')],\n ['ownerRef', 'string', 'Owner', refTo('persons')],\n ['phone', 'string', 'Phone'],\n ['email', 'string', 'Email'],\n ['services', 'jsonArray', 'Services'],\n ['rating', 'number', 'Rating'],\n ]);\n\n// .............................................................................\n/** Returns the configuration of the prices table */\nexport const pricesTableCfg = (): TableCfg =>\n shared('prices', [\n ['amount', 'number', 'Amount'],\n ['currency', 'string', 'Currency'],\n ['validFrom', 'string', 'Valid from'],\n ['discountPercent', 'number', 'Discount in percent'],\n ['taxIncluded', 'boolean', 'Tax included'],\n ]);\n\n// .............................................................................\n/** Returns the configuration of the brands table */\nexport const brandsTableCfg = (): TableCfg =>\n shared('brands', [\n ['brand', 'string', 'Brand'],\n ['model', 'string', 'Model'],\n ['bodyType', 'string', 'Body type'],\n ['fuel', 'string', 'Fuel'],\n ['powerKw', 'number', 'Power in kW'],\n ]);\n\n// .............................................................................\n/** Returns the configuration of the parts table */\nexport const partsTableCfg = (): TableCfg =>\n shared('parts', [\n ['name', 'string', 'Name'],\n ['partNumber', 'string', 'Part number'],\n ['category', 'string', 'Category'],\n ['level', 'number', 'Level'],\n ['quantity', 'number', 'Quantity'],\n ['weightKg', 'number', 'Weight in kg'],\n ['material', 'string', 'Material'],\n ['subPartRefs', 'jsonArray', 'Sub parts', refTo('parts')],\n ]);\n\n// .............................................................................\n/** Returns the configuration of the revisions table */\nexport const revisionsTableCfg = (): TableCfg => ({\n key: 'revisions',\n type: 'revisions',\n columns: (\n [\n hashColumn,\n ['table', 'string', 'Table'],\n ['predecessor', 'string', 'Predecessor', refTo('catalogs', 'cakes')],\n ['successor', 'string', 'Successor', refTo('catalogs', 'cakes')],\n ['timestamp', 'number', 'Timestamp'],\n ['id', 'string', 'Id'],\n ] as EColumnSpec[]\n ).map(columnOf),\n isHead: false,\n isRoot: false,\n isShared: true,\n});\n\n// .............................................................................\n/** Returns the configuration of the tableCfgs table itself */\nexport const tableCfgsTableCfg = (): TableCfg => ({\n key: 'tableCfgs',\n type: 'tableCfgs',\n columns: (\n [\n hashColumn,\n ['key', 'string', 'Table key'],\n ['type', 'string', 'Content type'],\n ['columns', 'jsonArray', 'Columns'],\n ['isHead', 'boolean', 'Is head'],\n ['isRoot', 'boolean', 'Is root'],\n ['isShared', 'boolean', 'Is shared'],\n ['previous', 'string', 'Previous'],\n ] as EColumnSpec[]\n ).map(columnOf),\n isHead: false,\n isRoot: false,\n isShared: true,\n});\n\n// .............................................................................\n/** Returns the configurations of all tables of a car world, by table key */\nexport const carWorldTableCfgs = (): Record<ECarWorldTableKey, TableCfg> => ({\n tableCfgs: tableCfgsTableCfg(),\n addresses: addressesTableCfg(),\n persons: personsTableCfg(),\n workshops: workshopsTableCfg(),\n prices: pricesTableCfg(),\n brands: brandsTableCfg(),\n parts: partsTableCfg(),\n cadScenes: createTreesTableCfg('cadScenes'),\n carIds: createSliceIdsTableCfg('carIds'),\n carPrices: createLayerTableCfg('carPrices'),\n carBrands: createLayerTableCfg('carBrands'),\n carWorkshops: createLayerTableCfg('carWorkshops'),\n carParts: createLayerTableCfg('carParts'),\n carCad: createLayerTableCfg('carCad'),\n catalogs: createCakeTableCfg('catalogs'),\n revisions: revisionsTableCfg(),\n manufacturers: manufacturersTableCfg(),\n});\n","// @license\n// Copyright (c) 2025 Rljson\n//\n// Use of this source code is governed by terms that can be\n// found in the LICENSE file in the root of this package.\n\nimport type { EResolvedConfig } from '../config/config.ts';\nimport type { EEmitter } from '../core/emitter.ts';\nimport { pick, slug } from '../core/pick.ts';\nimport { manufacturers } from '../dictionaries/manufacturers.ts';\nimport type { EManufacturerEntry } from '../dictionaries/manufacturers.ts';\nimport { cityNamed } from '../dictionaries/places.ts';\nimport { modelsOf } from '../dictionaries/vehicles.ts';\n\nimport { carWorldTableKeys } from './car-world.ts';\nimport type { EManufacturer } from './car-world.ts';\nimport { ECatalogGenerator } from './catalog-generator.ts';\nimport type {\n ECatalogCaches,\n ECatalogManufacturer,\n} from './catalog-generator.ts';\nimport { carWorldTableCfgs } from './table-cfgs.ts';\nimport { addressRow } from './workshops.ts';\n\n// #############################################################################\n/** What generating a manufacturer needs */\ninterface EManufacturerInput {\n config: EResolvedConfig;\n emitter: EEmitter;\n\n /** The index of the manufacturer within the world */\n index: number;\n}\n\n// .............................................................................\n/** Headquarters addresses start at this index, so they never collide with workshops */\nconst headquartersOffset = 100000;\n\n/** The part number prefix takes this many letters of the brand */\nconst prefixLength = 3;\n\n// .............................................................................\n/**\n * Returns the part number prefix of a brand: its first three letters.\n * @param brand - The brand, e.g. \"Mercedes-Benz\"\n */\nexport const prefixOf = (brand: string): string =>\n slug(brand).replace(/-/g, '').slice(0, prefixLength).toUpperCase();\n\n// .............................................................................\n/**\n * Returns the id and the name of a manufacturer. When the world has more\n * manufacturers than the dictionary, the dictionary starts over and the\n * repetitions get a number.\n * @param entry - The manufacturer in the dictionary\n * @param index - The index of the manufacturer within the world\n */\nconst identityOf = (\n entry: EManufacturerEntry,\n index: number,\n): { id: string; name: string } => {\n const round = Math.floor(index / manufacturers.length);\n return round === 0\n ? { id: entry.id, name: entry.name }\n : { id: `${entry.id}-${round + 1}`, name: `${entry.name} ${round + 1}` };\n};\n\n// .............................................................................\n/**\n * Announces every table of the world with its configuration.\n * @param emitter - Receives the configurations\n */\nconst announceTables = async (emitter: EEmitter): Promise<void> => {\n emitter.phaseIs('tableCfgs');\n const tableCfgs = carWorldTableCfgs();\n for (const key of carWorldTableKeys) {\n await emitter.table(tableCfgs[key]);\n }\n};\n\n// .............................................................................\n/**\n * Emits the catalogs of a manufacturer and returns their cakes and cars.\n * @param input - The configuration, the emitter and the manufacturer\n * @param manufacturer - What the catalogs need to know about the manufacturer\n */\nconst generateCatalogs = async (\n input: EManufacturerInput,\n manufacturer: ECatalogManufacturer,\n): Promise<{ catalogsRef: string[]; cars: number }> => {\n const { config, emitter } = input;\n const caches: ECatalogCaches = { boms: new Map(), scenes: new Map() };\n const catalogsRef: string[] = [];\n let cars = 0;\n for (let c = 0; c < config.manufacturers.catalogsPerManufacturer; c++) {\n const result = await new ECatalogGenerator({\n emitter,\n config,\n manufacturer,\n catalogIndex: c,\n caches,\n }).generate();\n catalogsRef.push(...result.cakeRefs);\n cars += result.cars;\n }\n return { catalogsRef, cars };\n};\n\n// #############################################################################\n/** What the row of a manufacturer is made of */\ninterface EManufacturerRowInput {\n /** The manufacturer in the dictionary */\n entry: EManufacturerEntry;\n\n /** The id and the name of the manufacturer within the world */\n identity: { id: string; name: string };\n\n /** The hash of the headquarters address */\n headquartersRef: string;\n\n /** The hashes of the catalogs, every model year, oldest first */\n catalogsRef: string[];\n}\n\n// .............................................................................\n/**\n * Returns the row of a manufacturer.\n * @param input - The dictionary entry, the identity and the referenced rows\n */\nconst manufacturerRow = (input: EManufacturerRowInput): EManufacturer => {\n const { entry, identity, headquartersRef, catalogsRef } = input;\n return {\n ...identity,\n brand: entry.brand,\n country: entry.country,\n founded: entry.founded,\n website: `https://www.${slug(entry.brand)}.example`,\n headquartersRef,\n catalogsRef,\n };\n};\n\n// .............................................................................\n/**\n * Emits a manufacturer: its headquarters, its catalogs and its own row.\n * Returns how many cars its catalogs hold.\n * @param input - The configuration, the emitter and the index\n */\nconst generateManufacturer = async (\n input: EManufacturerInput,\n): Promise<number> => {\n const { emitter, index } = input;\n const entry = pick(manufacturers, index);\n const identity = identityOf(entry, index);\n\n emitter.phaseIs('addresses');\n const address = addressRow(cityNamed(entry.city), headquartersOffset + index);\n const headquarters = await emitter.emit('addresses', address);\n\n const { catalogsRef, cars } = await generateCatalogs(input, {\n index,\n id: identity.id,\n prefix: prefixOf(entry.brand),\n country: entry.country,\n models: modelsOf(entry.brand),\n });\n\n emitter.phaseIs('manufacturers');\n const headquartersRef = headquarters._hash;\n const row = manufacturerRow({\n entry,\n identity,\n headquartersRef,\n catalogsRef,\n });\n await emitter.emit('manufacturers', row);\n return cars;\n};\n\n// .............................................................................\n/**\n * Emits a whole car world: the table configurations, then manufacturer by\n * manufacturer their catalogs, and returns how many cars it holds.\n * @param config - The resolved configuration\n * @param emitter - Receives the rows\n */\nexport const generateCarWorld = async (\n config: EResolvedConfig,\n emitter: EEmitter,\n): Promise<{ cars: number }> => {\n await announceTables(emitter);\n let cars = 0;\n for (let index = 0; index < config.manufacturers.count; index++) {\n cars += await generateManufacturer({ config, emitter, index });\n }\n return { cars };\n};\n","// @license\n// Copyright (c) 2025 Rljson\n//\n// Use of this source code is governed by terms that can be\n// found in the LICENSE file in the root of this package.\n\nimport type { TableKey } from '@rljson/rljson';\n\nimport { standardParts } from '../dictionaries/parts.ts';\n\n// #############################################################################\n/** Who shares a bill of materials or a CAD scene */\nexport type ESharing = 'perCar' | 'perModel' | 'perCatalog';\n\n// #############################################################################\n/** The prices layer */\nexport interface EPricesConfig {\n /** The currencies; each catalog uses one of them. Default ['EUR'] */\n currencies?: string[];\n\n /** The range of the prices. Default 5 000 to 150 000 */\n range?: { min: number; max: number };\n\n /** Prices are rounded to a multiple of this. Default 10 */\n roundTo?: number;\n\n /** The share of cars with a discount, between 0 and 1. Default 0 */\n discountShare?: number;\n}\n\n// #############################################################################\n/** The brands layer */\nexport interface EBrandsConfig {\n /** How many models of a manufacturer the cars use. Default 5 */\n modelsPerManufacturer?: number;\n\n /** How the cars spread over the models. Default 'uniform' */\n popularity?: 'uniform' | 'zipf';\n}\n\n// #############################################################################\n/** The workshops layer */\nexport interface EWorkshopsConfig {\n /** How many workshops serve a catalog. Default 10 */\n perCatalog?: number;\n\n /** How many persons own the workshops of a manufacturer. Default 5 */\n ownersPerManufacturer?: number;\n}\n\n// #############################################################################\n/** The parts layer: bills of materials */\nexport interface EPartsConfig {\n /** Levels below the bill of materials, 1 to 4. Default 4 */\n depth?: 1 | 2 | 3 | 4;\n\n /** Sub parts per part, 1 to 6. Default 3 */\n fanOut?: number;\n\n /** Who shares a bill of materials. Default 'perModel' */\n sharing?: ESharing;\n\n /** How many distinct standard parts the lowest level uses, 1 to 40. Default 20 */\n standardPartsPool?: number;\n}\n\n// #############################################################################\n/** The CAD layer: scenes as trees */\nexport interface ECadConfig {\n /** Levels below the scene, 1 to 4. Default 3 */\n depth?: 1 | 2 | 3 | 4;\n\n /** Children per group, 1 to 6. Default 4 */\n fanOut?: number;\n\n /** Who shares a scene. Default 'perModel' */\n sharing?: ESharing;\n\n /** Whether a mesh refers to a part of the bill of materials. Default true */\n linkToParts?: boolean;\n}\n\n// #############################################################################\n/** The layers of every catalog. A layer set to false is left out. */\nexport interface ELayersConfig {\n /** The prices of the cars */\n prices?: EPricesConfig | false;\n\n /** The brands and models of the cars */\n brands?: EBrandsConfig | false;\n\n /** The workshops that service the cars */\n workshops?: EWorkshopsConfig | false;\n\n /** The bills of materials of the cars */\n parts?: EPartsConfig | false;\n\n /** The CAD scenes of the cars */\n cad?: ECadConfig | false;\n}\n\n// #############################################################################\n/** Further model years of every catalog */\nexport interface ERevisionsConfig {\n /** How many model years follow the first one. Default 0 */\n count?: number;\n\n /** The share of cars a model year adds, between 0 and 1. Default 0.2 */\n addShare?: number;\n\n /** The share of cars a model year removes, between 0 and 1. Default 0.1 */\n removeShare?: number;\n\n /** The share of cars whose price a model year changes, between 0 and 1. Default 0.2 */\n changeShare?: number;\n}\n\n// #############################################################################\n/** The progress of a run */\nexport interface EProgress {\n /** The phase of the run, e.g. the table being generated */\n phase: string;\n\n /** The rows handed to the sink so far */\n rowsDone: number;\n\n /** The rows the run produces at most, from the estimate */\n rowsTotal: number;\n\n /** The table of the row that triggered the report, if any */\n table?: TableKey;\n}\n\n// #############################################################################\n/**\n * The configuration of a car world.\n *\n * Every field has a default. Nothing is random: the same configuration yields\n * the same data and the same hashes, on every machine.\n */\nexport interface EConfig {\n /** The manufacturers, the entry point of the world */\n manufacturers?: {\n /** How many manufacturers. Default 1 */\n count?: number;\n\n /** How many catalogs each manufacturer has. Default 1 */\n catalogsPerManufacturer?: number;\n };\n\n /** The catalogs: cakes whose slices are cars */\n catalogs?: {\n /** How many cars a catalog lists, up to a million. Default 10 */\n carsPerCatalog?: number;\n\n /** The model year of the first version of every catalog. Default 2026 */\n startYear?: number;\n\n /** Further model years */\n revisions?: ERevisionsConfig;\n };\n\n /** The layers of every catalog. A layer set to false is left out. */\n layers?: ELayersConfig;\n\n /** Lets Edge choose the cars per catalog for a number of rows */\n scale?: {\n /** The number of rows the world should have at most; null for no target */\n targetRows?: number | null;\n };\n\n /** Receives the progress of a run */\n progress?: (progress: EProgress) => void;\n\n /** Report progress after every this many rows. Default 1000 */\n progressEvery?: number;\n\n /** Stops a run when aborted */\n abortSignal?: AbortSignal;\n}\n\n// #############################################################################\n/** The layers with every default filled in; a layer that is off stays false */\nexport interface EResolvedLayers {\n prices: Required<EPricesConfig> | false;\n brands: Required<EBrandsConfig> | false;\n workshops: Required<EWorkshopsConfig> | false;\n parts: Required<EPartsConfig> | false;\n cad: Required<ECadConfig> | false;\n}\n\n// #############################################################################\n/** The configuration with every default filled in */\nexport interface EResolvedConfig {\n manufacturers: { count: number; catalogsPerManufacturer: number };\n catalogs: {\n carsPerCatalog: number;\n startYear: number;\n revisions: Required<ERevisionsConfig>;\n };\n layers: EResolvedLayers;\n scale: { targetRows: number | null };\n progress?: (progress: EProgress) => void;\n progressEvery: number;\n abortSignal?: AbortSignal;\n}\n\n// #############################################################################\n/** The layers with their defaults, none of them off */\ntype EDefaultLayers = {\n [K in keyof EResolvedLayers]: Exclude<EResolvedLayers[K], false>;\n};\n\n// .............................................................................\n/** The deepest level below a bill of materials or a scene */\nexport const maxDepth = 4;\n\n/** The most children a part or a group has: the dictionaries list six */\nexport const maxFanOut = 6;\n\n/** The most cars a catalog may list */\nexport const maxCarsPerCatalog = 1_000_000;\n\n/** The model years a catalog may start with */\nconst modelYears = { min: 1800, max: 9999 } as const;\n\n// .............................................................................\n/** Returns the defaults of the layers */\nconst defaultLayers = (): EDefaultLayers => ({\n prices: {\n currencies: ['EUR'],\n range: { min: 5000, max: 150000 },\n roundTo: 10,\n discountShare: 0,\n },\n brands: { modelsPerManufacturer: 5, popularity: 'uniform' },\n workshops: { perCatalog: 10, ownersPerManufacturer: 5 },\n parts: { depth: 4, fanOut: 3, sharing: 'perModel', standardPartsPool: 20 },\n cad: { depth: 3, fanOut: 4, sharing: 'perModel', linkToParts: true },\n});\n\n// .............................................................................\n/** Returns the defaults of every section */\nexport const edgeDefaults = (): EResolvedConfig => ({\n manufacturers: { count: 1, catalogsPerManufacturer: 1 },\n catalogs: {\n carsPerCatalog: 10,\n startYear: 2026,\n revisions: { count: 0, addShare: 0.2, removeShare: 0.1, changeShare: 0.2 },\n },\n layers: defaultLayers(),\n scale: { targetRows: null },\n progressEvery: 1000,\n});\n\n// .............................................................................\n/**\n * Returns the fallback with every defined value of the overrides on top.\n * A value that is undefined keeps its default.\n * @param fallback - The defaults\n * @param overrides - The values of the user, or undefined\n */\nexport const withDefaults = <T extends object>(\n fallback: T,\n overrides: Partial<T> | undefined,\n): T => {\n const result = { ...fallback };\n for (const [key, value] of Object.entries(overrides ?? {})) {\n if (value !== undefined) {\n (result as Record<string, unknown>)[key] = value;\n }\n }\n return result;\n};\n\n// .............................................................................\n/**\n * Returns a layer with its defaults, or false when the layer is off.\n * @param value - The layer configuration of the user\n * @param fallback - The defaults of the layer\n */\nconst resolveLayer = <T extends object>(\n value: Partial<T> | false | undefined,\n fallback: T,\n): T | false => (value === false ? false : withDefaults(fallback, value));\n\n// .............................................................................\n/**\n * Fills the defaults into the layers.\n * @param layers - The layers of the user\n */\nconst resolveLayers = (layers: ELayersConfig = {}): EResolvedLayers => {\n const defaults = defaultLayers();\n return {\n prices: resolveLayer(layers.prices, defaults.prices),\n brands: resolveLayer(layers.brands, defaults.brands),\n workshops: resolveLayer(layers.workshops, defaults.workshops),\n parts: resolveLayer(layers.parts, defaults.parts),\n cad: resolveLayer(layers.cad, defaults.cad),\n };\n};\n\n// .............................................................................\n/**\n * Fills the defaults into a configuration and checks its values.\n * @param config - The configuration of the user\n */\nexport const resolveEdgeConfig = (config: EConfig): EResolvedConfig => {\n const defaults = edgeDefaults();\n const { revisions, ...catalogValues } = config.catalogs ?? {};\n const resolved: EResolvedConfig = {\n manufacturers: withDefaults(defaults.manufacturers, config.manufacturers),\n catalogs: {\n ...withDefaults(defaults.catalogs, catalogValues),\n revisions: withDefaults(defaults.catalogs.revisions, revisions),\n },\n layers: resolveLayers(config.layers),\n scale: { targetRows: config.scale?.targetRows ?? null },\n progress: config.progress,\n progressEvery: config.progressEvery ?? defaults.progressEvery,\n abortSignal: config.abortSignal,\n };\n\n validateEdgeConfig(resolved);\n return resolved;\n};\n\n// #############################################################################\n/** An integer setting and the range it must lie in */\ninterface EIntegerRule {\n /** The path of the setting, for the error message */\n name: string;\n\n /** The value of the setting */\n value: number;\n\n /** The smallest allowed value */\n min: number;\n\n /** The largest allowed value; no limit when left out */\n max?: number;\n}\n\n// .............................................................................\n/**\n * Throws unless a setting is an integer within its range.\n * @param rule - The setting and its range\n */\nconst expectInteger = (rule: EIntegerRule): void => {\n const { name, value, min, max } = rule;\n const upper = max ?? Infinity;\n if (Number.isInteger(value) && value >= min && value <= upper) {\n return;\n }\n const range = max === undefined ? `at least ${min}` : `${min} to ${max}`;\n throw new Error(`Edge: ${name} must be an integer of ${range}, not ${value}`);\n};\n\n// .............................................................................\n/**\n * Throws unless a setting is a share between 0 and 1.\n * @param name - The path of the setting, for the error message\n * @param value - The value of the setting\n */\nconst expectShare = (name: string, value: number): void => {\n if (!(value >= 0 && value <= 1)) {\n throw new Error(`Edge: ${name} must be between 0 and 1, not ${value}`);\n }\n};\n\n// .............................................................................\n/**\n * Checks the sizes of the world: manufacturers, catalogs and cars.\n * @param config - The resolved configuration\n */\nconst validateSizes = (config: EResolvedConfig): void => {\n const { manufacturers, catalogs } = config;\n expectInteger({\n name: 'manufacturers.count',\n value: manufacturers.count,\n min: 1,\n });\n expectInteger({\n name: 'manufacturers.catalogsPerManufacturer',\n value: manufacturers.catalogsPerManufacturer,\n min: 1,\n });\n expectInteger({\n name: 'catalogs.carsPerCatalog',\n value: catalogs.carsPerCatalog,\n min: 1,\n max: maxCarsPerCatalog,\n });\n expectInteger({\n name: 'catalogs.startYear',\n value: catalogs.startYear,\n ...modelYears,\n });\n};\n\n// .............................................................................\n/**\n * Checks the model years that follow the first one.\n * @param revisions - The resolved revisions\n */\nconst validateRevisions = (revisions: Required<ERevisionsConfig>): void => {\n expectInteger({\n name: 'catalogs.revisions.count',\n value: revisions.count,\n min: 0,\n });\n expectShare('catalogs.revisions.addShare', revisions.addShare);\n expectShare('catalogs.revisions.removeShare', revisions.removeShare);\n expectShare('catalogs.revisions.changeShare', revisions.changeShare);\n};\n\n// .............................................................................\n/**\n * Checks the prices layer.\n * @param prices - The resolved prices layer\n */\nconst validatePrices = (prices: Required<EPricesConfig>): void => {\n const { currencies, range, roundTo, discountShare } = prices;\n if (currencies.length === 0) {\n throw new Error('Edge: layers.prices.currencies must not be empty');\n }\n if (!(range.min >= 0 && range.min < range.max)) {\n throw new Error('Edge: layers.prices.range needs 0 <= min < max');\n }\n if (!(roundTo > 0)) {\n throw new Error('Edge: layers.prices.roundTo must be positive');\n }\n expectShare('layers.prices.discountShare', discountShare);\n};\n\n// .............................................................................\n/**\n * Checks the brands and workshops layers.\n * @param layers - The resolved layers\n */\nconst validateBrandsAndWorkshops = (layers: EResolvedLayers): void => {\n const { brands, workshops } = layers;\n if (brands) {\n expectInteger({\n name: 'layers.brands.modelsPerManufacturer',\n value: brands.modelsPerManufacturer,\n min: 1,\n });\n }\n if (workshops) {\n expectInteger({\n name: 'layers.workshops.perCatalog',\n value: workshops.perCatalog,\n min: 1,\n });\n expectInteger({\n name: 'layers.workshops.ownersPerManufacturer',\n value: workshops.ownersPerManufacturer,\n min: 1,\n });\n }\n};\n\n// .............................................................................\n/**\n * Checks the depth and the fan-out of a parts or CAD tree.\n * @param name - The name of the layer, parts or cad\n * @param tree - The depth and the fan-out of the layer\n */\nconst validateTree = (\n name: 'parts' | 'cad',\n tree: Pick<Required<ECadConfig>, 'depth' | 'fanOut'>,\n): void => {\n const prefix = `layers.${name}`;\n expectInteger({\n name: `${prefix}.depth`,\n value: tree.depth,\n min: 1,\n max: maxDepth,\n });\n expectInteger({\n name: `${prefix}.fanOut`,\n value: tree.fanOut,\n min: 1,\n max: maxFanOut,\n });\n};\n\n// .............................................................................\n/**\n * Checks the parts and CAD layers.\n * @param layers - The resolved layers\n */\nconst validateTrees = (layers: EResolvedLayers): void => {\n const { parts, cad } = layers;\n if (parts) {\n validateTree('parts', parts);\n expectInteger({\n name: 'layers.parts.standardPartsPool',\n value: parts.standardPartsPool,\n min: 1,\n max: standardParts.length,\n });\n }\n if (cad) {\n validateTree('cad', cad);\n }\n};\n\n// .............................................................................\n/**\n * Checks the settings of a run: the target size and the progress interval.\n * @param config - The resolved configuration\n */\nconst validateRun = (config: EResolvedConfig): void => {\n const { scale, progressEvery } = config;\n if (scale.targetRows !== null) {\n expectInteger({\n name: 'scale.targetRows',\n value: scale.targetRows,\n min: 1,\n });\n }\n expectInteger({ name: 'progressEvery', value: progressEvery, min: 1 });\n};\n\n// .............................................................................\n/**\n * Throws when a value of the configuration is out of range.\n * @param config - The resolved configuration\n */\nexport const validateEdgeConfig = (config: EResolvedConfig): void => {\n validateSizes(config);\n validateRevisions(config.catalogs.revisions);\n if (config.layers.prices) {\n validatePrices(config.layers.prices);\n }\n validateBrandsAndWorkshops(config.layers);\n validateTrees(config.layers);\n validateRun(config);\n};\n","// @license\n// Copyright (c) 2025 Rljson\n//\n// Use of this source code is governed by terms that can be\n// found in the LICENSE file in the root of this package.\n\nimport type { EConfig } from './config.ts';\n\n// .............................................................................\n/** The names of the presets, from the smallest to the largest */\nexport const edgePresetNames = [\n 'tiny',\n 'small',\n 'medium',\n 'large',\n 'xl',\n] as const;\n\n// #############################################################################\n/** The name of a preset */\nexport type EPresetName = (typeof edgePresetNames)[number];\n\n// .............................................................................\n/**\n * Ready-made configurations.\n *\n * tiny and small fit unit and component tests, medium an integration test.\n * large reaches more than 20 million rows by giving every car a bill of\n * materials and a scene of its own; xl reaches 20 million cars.\n */\nexport const edgePresets: Readonly<Record<EPresetName, EConfig>> = {\n tiny: {\n manufacturers: { count: 1, catalogsPerManufacturer: 1 },\n catalogs: { carsPerCatalog: 5 },\n layers: {\n workshops: { perCatalog: 2, ownersPerManufacturer: 2 },\n parts: { depth: 2, fanOut: 2, sharing: 'perModel', standardPartsPool: 6 },\n cad: { depth: 2, fanOut: 2, sharing: 'perModel' },\n },\n },\n small: {\n manufacturers: { count: 2, catalogsPerManufacturer: 2 },\n catalogs: { carsPerCatalog: 100 },\n layers: {\n workshops: { perCatalog: 10 },\n parts: { depth: 3, fanOut: 3, sharing: 'perModel' },\n cad: { depth: 2, fanOut: 4, sharing: 'perModel' },\n },\n },\n medium: {\n manufacturers: { count: 5, catalogsPerManufacturer: 4 },\n catalogs: { carsPerCatalog: 5000 },\n layers: {\n workshops: { perCatalog: 50 },\n parts: { depth: 4, fanOut: 3, sharing: 'perModel' },\n cad: { depth: 3, fanOut: 4, sharing: 'perModel' },\n },\n },\n large: {\n manufacturers: { count: 10, catalogsPerManufacturer: 10 },\n catalogs: { carsPerCatalog: 2000 },\n layers: {\n workshops: { perCatalog: 50 },\n parts: { depth: 4, fanOut: 3, sharing: 'perCar' },\n cad: { depth: 3, fanOut: 4, sharing: 'perCar' },\n },\n },\n xl: {\n manufacturers: { count: 20, catalogsPerManufacturer: 20 },\n catalogs: { carsPerCatalog: 50000 },\n layers: {\n workshops: { perCatalog: 100 },\n parts: { depth: 4, fanOut: 3, sharing: 'perModel' },\n cad: { depth: 3, fanOut: 4, sharing: 'perModel' },\n },\n },\n};\n","// @license\n// Copyright (c) 2025 Rljson\n//\n// Use of this source code is governed by terms that can be\n// found in the LICENSE file in the root of this package.\n\nimport { hsh } from '@rljson/hash';\nimport type { Json } from '@rljson/json';\nimport type { TableCfg, TableKey } from '@rljson/rljson';\n\nimport type { EProgress } from '../config/config.ts';\n\nimport type { ESink } from './sink.ts';\n\n// #############################################################################\n/** A row with the hash that hsh wrote into it */\nexport type EHashed<T extends Json> = T & { _hash: string };\n\n// #############################################################################\n/** What an emitter needs */\nexport interface EEmitterOptions {\n /** Receives the rows */\n sink: ESink;\n\n /** The number of rows the run will produce at most, from the estimate */\n rowsTotal: number;\n\n /** Report progress after every this many rows */\n progressEvery: number;\n\n /** Receives the progress */\n progress?: (progress: EProgress) => void;\n\n /** Stops the run when aborted */\n abortSignal?: AbortSignal;\n}\n\n// #############################################################################\n/**\n * Hashes rows, drops duplicates and hands the rest to the sink.\n *\n * Equal content has an equal hash, so a row that was emitted before is not\n * emitted again; the emitter keeps one set of hashes per table for that.\n * The rows are handed over one after the other, and every handover is\n * awaited: a row may only follow the rows it refers to, and a slow sink\n * slows the generator down.\n */\nexport class EEmitter {\n /**\n * Constructor\n * @param options - The sink and the progress settings\n */\n constructor(private readonly options: EEmitterOptions) {}\n\n // ...........................................................................\n /**\n * Announces a table: hands its configuration to the sink and writes the\n * configuration into the tableCfgs table.\n * @param tableCfg - The configuration of the table\n */\n async table(tableCfg: TableCfg): Promise<EHashed<TableCfg>> {\n const hashed = hsh(tableCfg) as EHashed<TableCfg>;\n this.counts[tableCfg.key] ??= 0;\n await this.options.sink.onTable?.(tableCfg.key, hashed);\n await this.emit('tableCfgs', hashed);\n return hashed;\n }\n\n // ...........................................................................\n /**\n * Sets the phase of the run and reports it.\n * @param phase - The name of the phase, e.g. the table being generated\n */\n phaseIs(phase: string): void {\n if (phase !== this.phase) {\n this.phase = phase;\n this.report();\n }\n }\n\n // ...........................................................................\n /**\n * Hashes a row and hands it to the sink, unless an equal row was emitted\n * before. Returns the hashed row either way.\n * @param table - The key of the table\n * @param row - The row without hash\n */\n async emit<T extends Json>(table: TableKey, row: T): Promise<EHashed<T>> {\n const hashed = hsh(row) as EHashed<T>;\n this.produced++;\n if (this.isDuplicate(table, hashed._hash)) {\n return hashed;\n }\n\n this.throwIfAborted();\n await this.options.sink.onRow(table, hashed);\n this.count(table);\n return hashed;\n }\n\n // ...........................................................................\n /** The number of rows handed to the sink */\n get rowsDone(): number {\n return this.done;\n }\n\n /** The number of rows produced, including the duplicates that were dropped */\n get rowsProduced(): number {\n return this.produced;\n }\n\n /** The number of rows handed to the sink, per table */\n get rowsPerTable(): Record<string, number> {\n return { ...this.counts };\n }\n\n // ######################\n // Private\n // ######################\n\n private phase = '';\n private done = 0;\n private produced = 0;\n private readonly counts: Record<string, number> = {};\n private readonly seen = new Map<TableKey, Set<string>>();\n\n private isDuplicate(table: TableKey, hash: string): boolean {\n let seen = this.seen.get(table);\n if (!seen) {\n seen = new Set<string>();\n this.seen.set(table, seen);\n }\n if (seen.has(hash)) {\n return true;\n }\n seen.add(hash);\n return false;\n }\n\n private throwIfAborted(): void {\n if (this.options.abortSignal?.aborted) {\n throw new Error(`Edge: generation aborted after ${this.done} rows`);\n }\n }\n\n private count(table: TableKey): void {\n this.done++;\n this.counts[table] = (this.counts[table] ?? 0) + 1;\n if (this.done % this.options.progressEvery === 0) {\n this.report(table);\n }\n }\n\n private report(table?: TableKey): void {\n this.options.progress?.({\n phase: this.phase,\n rowsDone: this.done,\n rowsTotal: this.options.rowsTotal,\n table,\n });\n }\n}\n","// @license\n// Copyright (c) 2025 Rljson\n//\n// Use of this source code is governed by terms that can be\n// found in the LICENSE file in the root of this package.\n\nimport { standardPartsLevel } from '../car-world/bom-builder.ts';\nimport { carWorldTableKeys } from '../car-world/car-world.ts';\nimport type { ECarWorldTableKey } from '../car-world/car-world.ts';\nimport { countVersions, modelCountOf } from '../car-world/plan.ts';\nimport type { EVersionCounts } from '../car-world/plan.ts';\nimport { discountSteps, pricesPerModel } from '../car-world/prices.ts';\nimport type {\n ECadConfig,\n EPartsConfig,\n EResolvedConfig,\n EResolvedLayers,\n ESharing,\n} from '../config/config.ts';\nimport { manufacturers } from '../dictionaries/manufacturers.ts';\nimport { modelsOf } from '../dictionaries/vehicles.ts';\n\nimport { pick } from './pick.ts';\n\n// #############################################################################\n/** How big a world will be, calculated from the configuration alone */\nexport interface EEstimate {\n /** How many different cars the world holds */\n cars: number;\n\n /** How many rows the world has at most; rows that happen to be equal fold into one */\n rowsTotal: number;\n\n /** How many rows each table has at most */\n rowsPerTable: Record<string, number>;\n\n /** The approximate size of the world as JSON, in bytes */\n approxBytes: number;\n}\n\n// #############################################################################\n/** The counts the rows of the tables derive from */\ninterface EWorldCounts {\n /** The catalogs of all manufacturers */\n catalogs: number;\n\n /** The model years of every catalog */\n versions: number;\n\n /** The different cars of all catalogs */\n cars: number;\n\n /** The models all manufacturers use together */\n models: number;\n\n /** The price rows all catalogs need at most */\n priceRows: number;\n\n /** The assignments the layers of all catalogs hold */\n assignments: number;\n}\n\n// .............................................................................\n/** The approximate size of a row of each table, in bytes */\nconst bytesPerRow: Readonly<Record<ECarWorldTableKey, number>> = {\n tableCfgs: 600,\n addresses: 180,\n persons: 160,\n workshops: 260,\n prices: 140,\n brands: 150,\n parts: 220,\n cadScenes: 300,\n carIds: 60,\n carPrices: 100,\n carBrands: 100,\n carWorkshops: 100,\n carParts: 100,\n carCad: 100,\n catalogs: 250,\n revisions: 160,\n manufacturers: 320,\n};\n\n/** The bytes a slice id takes in a slice ids row or a layer */\nconst bytesPerAssignment = 50;\n\n/** The most cars Edge puts into one catalog when it fits a target */\nexport const maxFittedCarsPerCatalog = 100_000;\n\n// .............................................................................\n/**\n * Sums the nodes of a tree: fanOut to the power of 0 up to levels.\n * @param fanOut - The children per node\n * @param levels - The levels below the root\n */\nconst treeNodes = (fanOut: number, levels: number): number => {\n let nodes = 0;\n for (let level = 0; level <= levels; level++) {\n nodes += fanOut ** level;\n }\n return nodes;\n};\n\n// .............................................................................\n/**\n * Counts the models of every manufacturer and the price rows they allow: a\n * model has at most pricesPerModel prices per year, times the discounts.\n * @param config - The resolved configuration\n * @param versions - The counts of one catalog across its model years\n */\nconst countModels = (\n config: EResolvedConfig,\n versions: EVersionCounts,\n): { models: number; priceRows: number } => {\n const { manufacturers: m, layers } = config;\n const discounted = layers.prices && layers.prices.discountShare > 0;\n const discountVariants = discounted ? discountSteps + 1 : 1;\n let models = 0;\n let priceRows = 0;\n for (let i = 0; i < m.count; i++) {\n const used = modelCountOf(config, modelsOf(pick(manufacturers, i).brand));\n const variants = used * pricesPerModel * discountVariants;\n models += used;\n for (const needed of versions.priceRowsPerVersion) {\n priceRows += m.catalogsPerManufacturer * Math.min(needed, variants);\n }\n }\n return { models, priceRows };\n};\n\n// .............................................................................\n/**\n * Counts catalogs, model years, cars, models, prices and assignments.\n * @param config - The resolved configuration\n */\nconst countWorld = (config: EResolvedConfig): EWorldCounts => {\n const { manufacturers: m, catalogs: c } = config;\n const catalogs = m.count * m.catalogsPerManufacturer;\n const versions = countVersions(c.carsPerCatalog, c.revisions);\n return {\n catalogs,\n versions: c.revisions.count + 1,\n cars: catalogs * versions.distinctCars,\n ...countModels(config, versions),\n assignments: catalogs * versions.assignments,\n };\n};\n\n// .............................................................................\n/**\n * Returns how many variants share bills of materials or scenes.\n * @param sharing - perCar, perModel or perCatalog\n * @param counts - The counts of the world\n */\nconst variantsOf = (sharing: ESharing, counts: EWorldCounts): number => {\n if (sharing === 'perCar') {\n return counts.cars;\n }\n return sharing === 'perModel' ? counts.models : counts.catalogs;\n};\n\n// .............................................................................\n/**\n * Returns the rows of the parts table: one tree per variant down to level\n * 3, plus the pool of standard parts every tree shares.\n * @param parts - The parts layer, or false when it is off\n * @param counts - The counts of the world\n */\nconst partsRows = (\n parts: Required<EPartsConfig> | false,\n counts: EWorldCounts,\n): number => {\n if (!parts) {\n return 0;\n }\n const levels = Math.min(parts.depth, standardPartsLevel - 1);\n const pool = parts.depth === standardPartsLevel ? parts.standardPartsPool : 0;\n return (\n variantsOf(parts.sharing, counts) * treeNodes(parts.fanOut, levels) + pool\n );\n};\n\n// .............................................................................\n/**\n * Returns the rows of the scenes table: one tree per variant.\n * @param cad - The CAD layer, or false when it is off\n * @param counts - The counts of the world\n */\nconst cadRows = (\n cad: Required<ECadConfig> | false,\n counts: EWorldCounts,\n): number =>\n cad ? variantsOf(cad.sharing, counts) * treeNodes(cad.fanOut, cad.depth) : 0;\n\n// .............................................................................\n/**\n * Returns the rows of every table.\n * @param config - The resolved configuration\n * @param counts - The counts of the world\n */\nconst rowsOf = (\n config: EResolvedConfig,\n counts: EWorldCounts,\n): Record<ECarWorldTableKey, number> => {\n const { manufacturers: m, catalogs: c, layers } = config;\n const perVersion = counts.catalogs * counts.versions;\n const layerRows = (layer: object | false) => (layer ? perVersion : 0);\n const workshops = layers.workshops\n ? counts.catalogs * layers.workshops.perCatalog\n : 0;\n return {\n tableCfgs: carWorldTableKeys.length,\n addresses: m.count + workshops,\n persons: layers.workshops\n ? m.count * layers.workshops.ownersPerManufacturer\n : 0,\n workshops,\n prices: layers.prices ? counts.priceRows : 0,\n brands: layers.brands ? counts.models : 0,\n parts: partsRows(layers.parts, counts),\n cadScenes: cadRows(layers.cad, counts),\n carIds: perVersion,\n carPrices: layerRows(layers.prices),\n carBrands: layerRows(layers.brands),\n carWorkshops: layerRows(layers.workshops),\n carParts: layerRows(layers.parts),\n carCad: layerRows(layers.cad),\n catalogs: perVersion,\n revisions: counts.catalogs * c.revisions.count,\n manufacturers: m.count,\n };\n};\n\n// .............................................................................\n/**\n * Returns the approximate size of the world in bytes. Every layer and the\n * slice ids hold one entry per assignment.\n * @param rows - The rows of every table\n * @param counts - The counts of the world\n * @param layers - The resolved layers\n */\nconst approxBytesOf = (\n rows: Record<ECarWorldTableKey, number>,\n counts: EWorldCounts,\n layers: EResolvedLayers,\n): number => {\n let bytes = 0;\n for (const key of carWorldTableKeys) {\n bytes += rows[key] * bytesPerRow[key];\n }\n const lists = Object.values(layers).filter((l) => l !== false).length + 1;\n return bytes + counts.assignments * bytesPerAssignment * lists;\n};\n\n// .............................................................................\n/**\n * Estimates the rows of a car world without generating a single one.\n *\n * The counts are exact for everything that is unique by construction, and an\n * upper bound where two rows may happen to be equal, like prices.\n * @param config - The resolved configuration\n */\nexport const estimateCarWorld = (config: EResolvedConfig): EEstimate => {\n const counts = countWorld(config);\n const rowsPerTable = rowsOf(config, counts);\n const rowsTotal = carWorldTableKeys.reduce(\n (sum, key) => sum + rowsPerTable[key],\n 0,\n );\n const approxBytes = approxBytesOf(rowsPerTable, counts, config.layers);\n return { cars: counts.cars, rowsTotal, rowsPerTable, approxBytes };\n};\n\n// .............................................................................\n/**\n * Returns the largest number of cars per catalog whose world stays within a\n * number of rows: at least 1, at most maxFittedCarsPerCatalog.\n *\n * When the rows never reach the target, because the cars share their bills\n * of materials and scenes, the result is maxFittedCarsPerCatalog. More rows\n * then come from more catalogs or from sharing per car.\n * @param config - The resolved configuration\n * @param targetRows - The number of rows the world should have at most\n */\nexport const fitCarsPerCatalog = (\n config: EResolvedConfig,\n targetRows: number,\n): number => {\n const rowsFor = (carsPerCatalog: number): number =>\n estimateCarWorld({\n ...config,\n catalogs: { ...config.catalogs, carsPerCatalog },\n }).rowsTotal;\n\n if (rowsFor(1) > targetRows) {\n return 1;\n }\n let low = 1;\n let high = maxFittedCarsPerCatalog;\n while (low < high) {\n const middle = Math.ceil((low + high) / 2);\n if (rowsFor(middle) <= targetRows) {\n low = middle;\n } else {\n high = middle - 1;\n }\n }\n return low;\n};\n","// @license\n// Copyright (c) 2025 Rljson\n//\n// Use of this source code is governed by terms that can be\n// found in the LICENSE file in the root of this package.\n\nimport { hip } from '@rljson/hash';\nimport type { Rljson, Row, TableCfg, TableKey } from '@rljson/rljson';\n\n// #############################################################################\n/**\n * Receives the rows of a run.\n *\n * Edge writes nothing itself: no file, no database. The application decides\n * where the rows go, in Node.js, in the browser or in a Web Worker.\n */\nexport interface ESink {\n /**\n * Receives a row of a table. The rows come in the order of their\n * references. A returned promise is awaited, so a slow sink slows the\n * generator down.\n * @param table - The key of the table\n * @param row - The hashed row\n */\n onRow(table: TableKey, row: Row): void | Promise<void>;\n\n /**\n * Receives the configuration of a table before its first row. A database\n * creates the table here.\n * @param table - The key of the table\n * @param tableCfg - The hashed configuration of the table\n */\n onTable?(table: TableKey, tableCfg: TableCfg): void | Promise<void>;\n}\n\n// #############################################################################\n/** The configuration and the rows a memory sink collected for a table */\ninterface ECollectedTable {\n tableCfg: TableCfg | null;\n rows: Row[];\n}\n\n// #############################################################################\n/** Collects the rows of a run in memory: the sink behind generate() */\nexport class EMemorySink implements ESink {\n // ...........................................................................\n /**\n * Remembers the configuration of a table.\n * @param table - The key of the table\n * @param tableCfg - The hashed configuration of the table\n */\n onTable(table: TableKey, tableCfg: TableCfg): void {\n this.entry(table).tableCfg = tableCfg;\n }\n\n // ...........................................................................\n /**\n * Collects a row.\n * @param table - The key of the table\n * @param row - The hashed row\n */\n onRow(table: TableKey, row: Row): void {\n this.entry(table).rows.push(row);\n }\n\n // ...........................................................................\n /**\n * Returns the collected rows as an Rljson object.\n *\n * Every table carries its content type, the hash of its configuration and\n * a hash of its own.\n */\n toRljson(): Rljson {\n const result: Rljson = {};\n for (const [key, collected] of this.tables) {\n result[key] = this.tableOf(key, collected);\n }\n return result;\n }\n\n // ######################\n // Private\n // ######################\n\n private readonly tables = new Map<TableKey, ECollectedTable>();\n\n private entry(table: TableKey): ECollectedTable {\n let entry = this.tables.get(table);\n if (!entry) {\n entry = { tableCfg: null, rows: [] };\n this.tables.set(table, entry);\n }\n return entry;\n }\n\n private tableOf(key: TableKey, { tableCfg, rows }: ECollectedTable) {\n if (!tableCfg) {\n throw new Error(`EMemorySink: onTable was not called for \"${key}\"`);\n }\n const table: Row = { _type: tableCfg.type, _data: rows };\n if (key !== 'tableCfgs') {\n table._tableCfg = tableCfg._hash;\n }\n return hip(table) as Rljson[string];\n }\n}\n","// @license\n// Copyright (c) 2025 Rljson\n//\n// Use of this source code is governed by terms that can be\n// found in the LICENSE file in the root of this package.\n\nimport type { ECarWorld } from './car-world/car-world.ts';\nimport { generateCarWorld } from './car-world/generate-car-world.ts';\nimport { resolveEdgeConfig } from './config/config.ts';\nimport type {\n EConfig,\n ELayersConfig,\n EResolvedConfig,\n} from './config/config.ts';\nimport { edgePresets } from './config/presets.ts';\nimport type { EPresetName } from './config/presets.ts';\nimport { EEmitter } from './core/emitter.ts';\nimport { estimateCarWorld, fitCarsPerCatalog } from './core/estimate.ts';\nimport type { EEstimate } from './core/estimate.ts';\nimport { EMemorySink } from './core/sink.ts';\nimport type { ESink } from './core/sink.ts';\n\n// #############################################################################\n/** What a run produced */\nexport interface EStats extends EEstimate {\n /** How long the run took, in milliseconds */\n durationMs: number;\n\n /** The share of produced rows that equalled an earlier row and were dropped */\n dedupRatio: number;\n}\n\n// #############################################################################\n/** What the statistics of a run derive from */\ninterface ERunResult {\n estimate: EEstimate;\n emitter: EEmitter;\n cars: number;\n start: number;\n}\n\n// .............................................................................\n/**\n * Returns the configuration with the cars per catalog fitted to the target\n * number of rows, or the configuration itself when it has no target.\n * @param config - The resolved configuration\n */\nconst fitToTarget = (config: EResolvedConfig): EResolvedConfig => {\n const { targetRows } = config.scale;\n if (targetRows === null) {\n return config;\n }\n const carsPerCatalog = fitCarsPerCatalog(config, targetRows);\n return { ...config, catalogs: { ...config.catalogs, carsPerCatalog } };\n};\n\n// .............................................................................\n/**\n * Returns the statistics of a run.\n * @param result - The estimate, the emitter, the cars and the start time\n */\nconst statsOf = (result: ERunResult): EStats => {\n const { estimate, emitter, cars, start } = result;\n return {\n ...estimate,\n cars,\n rowsTotal: emitter.rowsDone,\n rowsPerTable: emitter.rowsPerTable,\n durationMs: performance.now() - start,\n dedupRatio: 1 - emitter.rowsDone / emitter.rowsProduced,\n };\n};\n\n// #############################################################################\n/**\n * Edge, the example data generator for Rljson.\n *\n * Edge builds a car world: manufacturers with catalogs of cars, and for every\n * car a price, a brand, a workshop, a bill of materials and a CAD scene. The\n * world uses components, slice ids, layers, cakes, trees, revisions and table\n * configurations. Nothing is random: the same configuration yields the same\n * data and the same hashes, everywhere.\n */\nexport class Edge {\n /**\n * Constructor\n * @param config - The configuration; every field has a default\n */\n constructor(config: EConfig = {}) {\n this.config = fitToTarget(resolveEdgeConfig(config));\n }\n\n // ...........................................................................\n /**\n * Creates a generator from a preset.\n * @param name - tiny, small, medium, large or xl\n * @param overrides - Settings that replace parts of the preset\n */\n static preset(name: EPresetName, overrides: EConfig = {}): Edge {\n return new Edge(mergeConfigs(edgePresets[name], overrides));\n }\n\n // ...........................................................................\n /** Returns an example instance for test purposes: the tiny preset */\n static get example(): Edge {\n return Edge.preset('tiny');\n }\n\n // ...........................................................................\n /** Calculates how big the world will be, without generating a row */\n estimate(): EEstimate {\n return estimateCarWorld(this.config);\n }\n\n // ...........................................................................\n /**\n * Generates the world in memory and returns it with the statistics of the\n * run. This is the default way to use Edge and fits worlds up to the medium\n * preset.\n */\n async generate(): Promise<{ world: ECarWorld; stats: EStats }> {\n const sink = new EMemorySink();\n const stats = await this.run(sink);\n return { world: sink.toRljson() as ECarWorld, stats };\n }\n\n // ...........................................................................\n /**\n * Generates the world and hands every row to a sink, in the order of the\n * references. Nothing is kept. Without a sink the rows are dropped, which\n * serves benchmarks and progress tests.\n * @param sink - Receives the rows\n */\n async run(sink: ESink = { onRow: () => undefined }): Promise<EStats> {\n const { progressEvery, progress, abortSignal } = this.config;\n const estimate = this.estimate();\n const rowsTotal = estimate.rowsTotal;\n const emitter = new EEmitter({\n sink,\n rowsTotal,\n progressEvery,\n progress,\n abortSignal,\n });\n const start = performance.now();\n const { cars } = await generateCarWorld(this.config, emitter);\n return statsOf({ estimate, emitter, cars, start });\n }\n\n // ...........................................................................\n /** The configuration with every default filled in */\n readonly config: EResolvedConfig;\n}\n\n// .............................................................................\n/**\n * Merges the configuration of one layer: false switches it off, an object\n * extends the existing settings.\n * @param existing - The layer configuration to start from\n * @param value - The layer configuration that overrides it\n */\nconst mergeLayer = <T extends object>(\n existing: T | false | undefined,\n value: T | false | undefined,\n): T | false | undefined =>\n value === false || value === undefined || existing === false\n ? value\n : { ...existing, ...value };\n\n// .............................................................................\n/**\n * Merges the layer sections of two configurations.\n * @param base - The layers to start from\n * @param overrides - The layers that replace parts of them\n */\nconst mergeLayers = (\n base: ELayersConfig = {},\n overrides: ELayersConfig = {},\n): ELayersConfig => {\n const result: Record<string, unknown> = { ...base };\n for (const [key, value] of Object.entries(overrides)) {\n result[key] = mergeLayer(result[key] as object | false | undefined, value);\n }\n return result as ELayersConfig;\n};\n\n// .............................................................................\n/**\n * Merges overrides into a configuration, section by section.\n * @param base - The configuration to start from\n * @param overrides - The settings that replace parts of it\n */\nexport const mergeConfigs = (base: EConfig, overrides: EConfig): EConfig => ({\n ...base,\n ...overrides,\n manufacturers: { ...base.manufacturers, ...overrides.manufacturers },\n catalogs: {\n ...base.catalogs,\n ...overrides.catalogs,\n revisions: {\n ...base.catalogs?.revisions,\n ...overrides.catalogs?.revisions,\n },\n },\n layers: mergeLayers(base.layers, overrides.layers),\n scale: { ...base.scale, ...overrides.scale },\n});\n","// @license\n// Copyright (c) 2025 Rljson\n//\n// Use of this source code is governed by terms that can be\n// found in the LICENSE file in the root of this package.\n\nexport { Edge, mergeConfigs } from './edge.ts';\nexport type { EStats } from './edge.ts';\n\nexport { edgeDefaults, resolveEdgeConfig } from './config/config.ts';\nexport type {\n EBrandsConfig,\n ECadConfig,\n EConfig,\n ELayersConfig,\n EPartsConfig,\n EPricesConfig,\n EProgress,\n EResolvedConfig,\n EResolvedLayers,\n ERevisionsConfig,\n ESharing,\n EWorkshopsConfig,\n} from './config/config.ts';\nexport { edgePresetNames, edgePresets } from './config/presets.ts';\nexport type { EPresetName } from './config/presets.ts';\n\nexport { EMemorySink } from './core/sink.ts';\nexport type { ESink } from './core/sink.ts';\nexport type { EEstimate } from './core/estimate.ts';\n\nexport { carWorldTableKeys } from './car-world/car-world.ts';\nexport type {\n EAddress,\n EBrand,\n ECadMeta,\n ECarWorld,\n ECarWorldTableKey,\n EManufacturer,\n EPart,\n EPerson,\n EPrice,\n EWorkshop,\n} from './car-world/car-world.ts';\nexport { carWorldTableCfgs } from './car-world/table-cfgs.ts';\n\nexport { manufacturers } from './dictionaries/manufacturers.ts';\nexport type { EManufacturerEntry } from './dictionaries/manufacturers.ts';\nexport { modelsOf, vehicles } from './dictionaries/vehicles.ts';\nexport type {\n EBodyType,\n EFuel,\n EVehicleModel,\n} from './dictionaries/vehicles.ts';\nexport {\n assemblies,\n materialsOf,\n standardParts,\n} from './dictionaries/parts.ts';\nexport type {\n EAssembly,\n EStandardPart,\n ESubAssembly,\n} from './dictionaries/parts.ts';\nexport { cadDetails, cadMaterials, cadSystems } from './dictionaries/cad.ts';\nexport type { ECadSystem } from './dictionaries/cad.ts';\nexport { cities, citiesIn, cityNamed, streets } from './dictionaries/places.ts';\nexport type { ECity } from './dictionaries/places.ts';\nexport { firstNames, lastNames } from './dictionaries/people.ts';\n"],"mappings":";;;;;;;;;AAgBA,IAAa,QAAW,MAAoB,UAAqB;CAC/D,IAAI,KAAK,WAAW,GAClB,MAAM,IAAI,MAAM,yBAAyB;CAE3C,OAAO,KAAK,QAAQ,KAAK;AAC3B;;;;;;;;;AAWA,IAAa,YACX,MACA,QACA,UACQ,MAAM,KAAK,EAAE,QAAQ,MAAM,IAAI,GAAG,MAAM,KAAK,MAAM,SAAS,CAAC,CAAC;;;;;;;;;AAWxE,IAAa,WAAW,OAAe,UACrC,KAAK,OAAO,QAAQ,KAAK,KAAK,IAAI,KAAK,MAAM,QAAQ,KAAK;;;;;AAoB5D,IAAa,YAAY,MAAsB;CAC7C,IAAI,MAAM;CACV,KAAK,IAAI,IAAI,GAAG,KAAK,GAAG,KACtB,OAAO,IAAI;CAEb,OAAO;AACT;;;;;;;;AAUA,IAAa,cAAc,YAAkC;CAC3D,MAAM,EAAE,OAAO,OAAO,YAAY;CAClC,MAAM,QAAQ,SAAS,OAAO;CAC9B,MAAM,YAAY,QAAQ,MAAO;CACjC,IAAI,aAAa;CACjB,KAAK,IAAI,SAAS,GAAG,SAAS,UAAU,GAAG,UAAU;EACnD,cAAc,KAAK,SAAS,KAAK;EACjC,IAAI,WAAW,YACb,OAAO;CAEX;CACA,OAAO,UAAU;AACnB;;;;;;AAQA,IAAa,UAAU,OAAe,UACpC,OAAO,KAAK,CAAC,CAAC,SAAS,OAAO,GAAG;;;;;AAOnC,IAAa,QAAQ,SACnB,KACG,YAAY,CAAC,CACb,UAAU,KAAK,CAAC,CAChB,QAAQ,WAAW,EAAE,CAAC,CACtB,QAAQ,MAAM,KAAK,CAAC,CACpB,QAAQ,eAAe,GAAG,CAAC,CAC3B,QAAQ,UAAU,EAAE;;;;;;AAQzB,IAAa,WAAW,OAAe,SACrC,KAAK,MAAM,QAAQ,IAAI,IAAI;;;;;;AAQ7B,IAAa,iBAAiB,OAAe,aAA6B;CACxE,MAAM,SAAS,MAAM;CACrB,OAAO,KAAK,MAAM,QAAQ,MAAM,IAAI;AACtC;;;;;;;;;ACzGA,IAAa,gBAA+C;CAC1D;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;CACX;CACA;EA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CA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;;;;ACxMA,IAAa,gBAAsC;CACjD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;AAGA,IAAM,cAAmD;CACvD,UAAU;CACV,WAAW;CACX,SAAS;CACT,KAAK;CACL,OAAO;CACP,OAAO;CACP,QAAQ;CACR,KAAK;CACL,OAAO;CACP,aAAa;CACb,OAAO;CACP,WAAW;AACb;;AAGA,IAAM,kBAAkB;;;;;;;AASxB,IAAa,aAAa,OAAsB,eAC9C,YAAY,MAAM,YAAY,aAAa;;;;;;AAQ7C,IAAa,YAAY,OAAsB,gBAAgC;CAC7E,OAAO,MAAM;CACb,OAAO,MAAM;CACb,UAAU,MAAM;CAChB,MAAM,MAAM;CACZ,SAAS,UAAU,OAAO,UAAU;AACtC;;;;;AC3BA,IAAa,aAAmC;CAC9C;EACE,MAAM;EACN,UAAU;EACV,eAAe;GACb;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;GACA;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;GACA;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;GACA;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;GACA;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;GACA;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;EACF;CACF;CACA;EACE,MAAM;EACN,UAAU;EACV,eAAe;GACb;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;GACA;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;GACA;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;GACA;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;GACA;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;GACA;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;EACF;CACF;CACA;EACE,MAAM;EACN,UAAU;EACV,eAAe;GACb;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;GACA;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;GACA;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;GACA;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;GACA;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;GACA;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;EACF;CACF;CACA;EACE,MAAM;EACN,UAAU;EACV,eAAe;GACb;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;GACA;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;GACA;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;GACA;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;GACA;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;GACA;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;EACF;CACF;CACA;EACE,MAAM;EACN,UAAU;EACV,eAAe;GACb;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;GACA;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;GACA;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;GACA;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;GACA;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;GACA;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;EACF;CACF;CACA;EACE,MAAM;EACN,UAAU;EACV,eAAe;GACb;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;GACA;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;GACA;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;GACA;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;GACA;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;GACA;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;EACF;CACF;CACA;EACE,MAAM;EACN,UAAU;EACV,eAAe;GACb;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;GACA;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;GACA;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;GACA;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;GACA;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;GACA;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;EACF;CACF;CACA;EACE,MAAM;EACN,UAAU;EACV,eAAe;GACb;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;GACA;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;GACA;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;GACA;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;GACA;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;GACA;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;EACF;CACF;CACA;EACE,MAAM;EACN,UAAU;EACV,eAAe;GACb;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;GACA;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;GACA;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;GACA;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;GACA;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;GACA;IACE,MAAM;IACN,OAAO;KACL;KACA;KACA;KACA;KACA;KACA;IACF;GACF;EACF;CACF;AACF;;AAIA,IAAa,gBAA0C;CACrD;EAAE,MAAM;EAAkB,UAAU;CAAQ;CAC5C;EAAE,MAAM;EAAkB,UAAU;CAAQ;CAC5C;EAAE,MAAM;EAAmB,UAAU;CAAQ;CAC7C;EAAE,MAAM;EAAqB,UAAU;CAAQ;CAC/C;EAAE,MAAM;EAAc,UAAU;CAAQ;CACxC;EAAE,MAAM;EAAc,UAAU;CAAQ;CACxC;EAAE,MAAM;EAAkB,UAAU;CAAQ;CAC5C;EAAE,MAAM;EAAgB,UAAU;CAAQ;CAC1C;EAAE,MAAM;EAAe,UAAU;CAAkB;CACnD;EAAE,MAAM;EAAe,UAAU;CAAkB;CACnD;EAAE,MAAM;EAAsB,UAAU;CAAe;CACvD;EAAE,MAAM;EAAe,UAAU;CAAU;CAC3C;EAAE,MAAM;EAAiB,UAAU;CAAU;CAC7C;EAAE,MAAM;EAAsB,UAAU;CAAS;CACjD;EAAE,MAAM;EAAuB,UAAU;CAAe;CACxD;EAAE,MAAM;EAAiB,UAAU;CAAe;CAClD;EAAE,MAAM;EAAmB,UAAU;CAAQ;CAC7C;EAAE,MAAM;EAAa,UAAU;CAAY;CAC3C;EAAE,MAAM;EAAqB,UAAU;CAAQ;CAC/C;EAAE,MAAM;EAAoB,UAAU;CAAQ;CAC9C;EAAE,MAAM;EAAoB,UAAU;CAAkB;CACxD;EAAE,MAAM;EAAoB,UAAU;CAAkB;CACxD;EAAE,MAAM;EAAqB,UAAU;CAAgB;CACvD;EAAE,MAAM;EAAqB,UAAU;CAAgB;CACvD;EAAE,MAAM;EAA2B,UAAU;CAAgB;CAC7D;EAAE,MAAM;EAA4B,UAAU;CAAe;CAC7D;EAAE,MAAM;EAAwB,UAAU;CAAe;CACzD;EAAE,MAAM;EAAoB,UAAU;CAAQ;CAC9C;EAAE,MAAM;EAAoB,UAAU;CAAS;CAC/C;EAAE,MAAM;EAAiB,UAAU;CAAS;CAC5C;EAAE,MAAM;EAAiB,UAAU;CAAY;CAC/C;EAAE,MAAM;EAAsB,UAAU;CAAQ;CAChD;EAAE,MAAM;EAAc,UAAU;CAAQ;CACxC;EAAE,MAAM;EAAmB,UAAU;CAAQ;CAC7C;EAAE,MAAM;EAAgB,UAAU;CAAQ;CAC1C;EAAE,MAAM;EAAmB,UAAU;CAAe;CACpD;EAAE,MAAM;EAAsB,UAAU;CAAQ;CAChD;EAAE,MAAM;EAAe,UAAU;CAAQ;CACzC;EAAE,MAAM;EAAkB,UAAU;CAAU;CAC9C;EAAE,MAAM;EAAkB,UAAU;CAAQ;AAC9C;;AAIA,IAAa,cAA2D;CACtE,QAAQ;EAAC;EAAa;EAAa;EAAS;CAAc;CAC1D,cAAc;EAAC;EAAS;EAAa;EAAkB;CAAgB;CACvE,SAAS;EAAC;EAAS;EAAa;EAAa;CAAQ;CACrD,MAAM;EAAC;EAAS;EAAa;EAAS;CAAS;CAC/C,UAAU;EAAC;EAAW;EAAW;EAAU;CAAM;CACjD,YAAY;EAAC;EAAU;EAAW;EAAW;CAAa;CAC1D,MAAM;EAAC;EAAa;EAAW;EAAU;CAAQ;CACjD,MAAM;EAAC;EAAmB;EAAW;EAAS;CAAS;CACvD,IAAI;EAAC;EAAa;EAAU;EAAW;CAAS;AAClD;;;AC/qBA,IAAM,sBAAsB;AAC5B,IAAM,mBAAmB;;AAGzB,IAAM,qBAAqB;;AAG3B,IAAM,aAAa;CAAC;CAAG;CAAG;CAAG;CAAG;AAAE;;AAGlC,IAAM,mBAAmB;;AAGzB,IAAM,UAAU;CACd,UAAU;EAAE,MAAM;EAAI,MAAM;CAAG;CAC/B,aAAa;EAAE,MAAM;EAAG,MAAM;CAAE;CAChC,MAAM;EAAE,MAAM;EAAK,MAAM;EAAK,SAAS;CAAK;CAC5C,UAAU;EAAE,MAAM;EAAM,UAAU;EAAI,MAAM;CAAM;AACpD;;AAGA,IAAM,qBAAqB;;;;;AAO3B,IAAM,kBAAkB,kBACtB,QAAQ,SAAS,OAAO,gBAAgB,QAAQ,SAAS;;;;;AAO3D,IAAM,mBAAmB,UAAyB;CAChD,MAAM,EAAE,MAAM,aAAa,cAAc;CACzC,MAAM,EAAE,MAAM,UAAU,SAAS,QAAQ;CACzC,OAAO;EACL;EACA,YAAY,OAAO,OAAO,QAAQ,GAAG,gBAAgB;EACrD,UAAU;EACV,OAAA;EACA,UAAU,IAAK,QAAQ;EACvB,UAAU,cAAc,OAAQ,QAAQ,WAAY,MAAM,CAAC;EAC3D;EACA,aAAa,CAAC;CAChB;AACF;;;;;;;;;;AAYA,IAAa,cAAb,MAAyB;CAKM;;;;;CAA7B,YAAY,SAA8C;EAA7B,KAAA,UAAA;CAA8B;;CAI3D,MAAM,QAAuB;EAC3B,MAAM,EAAE,QAAQ,YAAY,KAAK;EACjC,MAAM,eAAyB,CAAC;EAChC,IAAI,WAAW;EACf,KAAK,MAAM,YAAY,SACrB,YACA,QAAQ,QACR,OAAO,MACT,GAAG;GACD,MAAM,gBAAgB,WAAW,QAAQ,QAAQ;GACjD,YAAY,eAAe,aAAa;GACxC,aAAa,KAAK,MAAM,KAAK,SAAS,UAAU,aAAa,CAAC;EAChE;EACA,MAAM,UAAU,MAAM,KAAK,KAAK,cAAc,QAAQ;EACtD,OAAO;GAAE;GAAS,UAAU,CAAC,SAAS,GAAG,KAAK,SAAS,MAAM,GAAG,EAAE,CAAC;EAAE;CACvE;CAMA,WAAmB;CACnB,WAAsC,CAAC;CAEvC,IAAY,OAAe;EACzB,OAAO,GAAG,KAAK,QAAQ,OAAO,GAAG,KAAK,QAAQ,QAAQ,KAAK,YAAY;CACzE;CAEA,eAAuB,OAAuB;EAC5C,KAAK;EACL,OAAO,GAAG,KAAK,KAAK,GAAG,MAAM,GAAG,OAAO,KAAK,UAAU,gBAAgB;CACxE;CAEA,MAAc,KAAK,MAA8B;EAC/C,MAAM,EAAE,UAAU,MAAM,KAAK,QAAQ,QAAQ,KAAK,SAAS,IAAI;EAC/D,KAAK,SAAS,KAAK,KAAK;EACxB,OAAO;CACT;CAEA,KAAa,aAAuB,UAAmC;EACrE,OAAO,KAAK,KAAK;GACf,MAAM,qBAAqB,KAAK,QAAQ,QAAQ;GAChD,YAAY,GAAG,KAAK,KAAK;GACzB,UAAU;GACV,OAAO;GACP,UAAU;GACV;GACA,UAAU;GACV;EACF,CAAC;CACH;CAEA,MAAc,SACZ,UACA,eACiB;EACjB,MAAM,aAAa,KAAK,eAAe,CAAC;EACxC,MAAM,cACJ,KAAK,QAAQ,OAAO,SAAS,IACzB,MAAM,KAAK,cAAc,UAAU,aAAa,IAChD,CAAC;EACP,OAAO,KAAK,KAAK;GACf,MAAM,SAAS;GACf;GACA,UAAU,SAAS;GACnB,OAAO;GACP,UAAU;GACV,UAAU,eAAe,aAAa;GACtC,UAAU;GACV;EACF,CAAC;CACH;CAEA,MAAc,cACZ,UACA,eACmB;EACnB,MAAM,SAAS,KAAK,QAAQ,OAAO;EACnC,MAAM,SAAmB,CAAC;EAC1B,KAAK,MAAM,CAAC,UAAU,QAAQ,SAC5B,SAAS,eACT,GACA,MACF,CAAC,CAAC,QAAQ,GAAG;GACX,MAAM,WAAW;IAAE;IAAU;IAAe;IAAK;GAAS;GAC1D,OAAO,KAAK,MAAM,KAAK,YAAY,QAAQ,CAAC;EAC9C;EACA,OAAO;CACT;CAEA,MAAc,YAAY,UAAyC;EACjE,MAAM,EAAE,UAAU,eAAe,KAAK,aAAa;EACnD,MAAM,EAAE,MAAM,SAAS,QAAQ;EAC/B,MAAM,aAAa,KAAK,eAAe,CAAC;EACxC,MAAM,cACJ,KAAK,QAAQ,OAAO,SAAS,IAAI,MAAM,KAAK,MAAM,QAAQ,IAAI,CAAC;EACjE,OAAO,KAAK,KAAK;GACf,MAAM,IAAI;GACV;GACA,UAAU,SAAS;GACnB,OAAO;GACP,UAAU,IAAK,WAAW;GAC1B,UAAU,cAAc,OAAO,WAAW,OAAO,eAAe,CAAC;GACjE,UAAU,KAAK,YAAY,SAAS,WAAW,QAAQ;GACvD;EACF,CAAC;CACH;CAEA,MAAc,MAAM,UAA2C;EAC7D,MAAM,QAAQ,SAAS,SAAS,IAAI,OAAO,GAAG,KAAK,QAAQ,OAAO,MAAM;EACxE,MAAM,SAAmB,CAAC;EAC1B,KAAK,MAAM,CAAC,GAAG,SAAS,MAAM,QAAQ,GACpC,OAAO,KAAK,MAAM,KAAK,KAAK,UAAU;GAAE;GAAM;EAAE,CAAC,CAAC;EAEpD,OAAO;CACT;CAEA,MAAc,KACZ,EAAE,UAAU,eAAe,YAC3B,EAAE,MAAM,KACS;EACjB,MAAM,EAAE,MAAM,MAAM,YAAY,QAAQ;EACxC,MAAM,aAAa,KAAK,eAAe,CAAC;EACxC,MAAM,YACJ,gBAAgB,mBAAmB,WAAW,sBAAsB;EACtE,MAAM,cACJ,KAAK,QAAQ,OAAO,SAAA,IAChB,MAAM,KAAK,cAAc,SAAS,IAClC,CAAC;EACP,OAAO,KAAK,KAAK;GACf;GACA;GACA,UAAU,SAAS;GACnB,OAAO;GACP,UAAU,KAAK,YAAY,CAAC;GAC5B,UAAU,cAAc,OAAO,IAAI,OAAO,WAAW,SAAS,CAAC;GAC/D,UAAU,KAAK,YAAY,SAAS,WAAW,IAAI,QAAQ;GAC3D;EACF,CAAC;CACH;CAEA,MAAc,cAAc,WAAsC;EAChE,MAAM,EAAE,QAAQ,sBAAsB,KAAK,QAAQ;EACnD,MAAM,QAAQ,YAAY;EAC1B,MAAM,SAAmB,CAAC;EAC1B,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,KAAK;GAC/B,MAAM,SAAS,QAAQ,KAAK;GAC5B,OAAO,KAAK,MAAM,KAAK,KAAK,gBAAgB,KAAK,CAAC,CAAC;EACrD;EACA,OAAO;CACT;AACF;;;;;ACzQA,IAAa,aAAoC;CAC/C;EACE,IAAI;EACJ,UAAU;GAAC;GAAQ;GAAQ;GAAS;GAAS;GAAW;EAAS;CACnE;CACA;EACE,IAAI;EACJ,UAAU;GACR;GACA;GACA;GACA;GACA;GACA;EACF;CACF;CACA;EACE,IAAI;EACJ,UAAU;GACR;GACA;GACA;GACA;GACA;GACA;EACF;CACF;CACA;EACE,IAAI;EACJ,UAAU;GAAC;GAAS;GAAa;GAAW;GAAa;GAAU;EAAM;CAC3E;CACA;EACE,IAAI;EACJ,UAAU;GACR;GACA;GACA;GACA;GACA;GACA;EACF;CACF;CACA;EACE,IAAI;EACJ,UAAU;GAAC;GAAY;GAAY;GAAY;GAAY;GAAS;EAAM;CAC5E;CACA;EACE,IAAI;EACJ,UAAU;GAAC;GAAU;GAAW;GAAW;GAAS;GAAa;EAAQ;CAC3E;CACA;EACE,IAAI;EACJ,UAAU;GAAC;GAAW;GAAS;GAAO;GAAU;GAAS;EAAY;CACvE;AACF;;AAIA,IAAa,aAAgC;CAC3C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;AAIA,IAAa,eAAkC;CAC7C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;;;;ACjEA,IAAM,SAAS;CAAE,OAAO;CAAK,OAAO;AAAI;;AAGxC,IAAM,eAAe;CAAE,KAAK;CAAK,OAAO;CAAO,QAAQ;AAAI;;AAG3D,IAAM,eAAe;CACnB;EAAE,MAAM;EAAK,UAAU;EAAG,MAAM;CAAK;CACrC;EAAE,MAAM;EAAK,UAAU;EAAG,MAAM;CAAI;CACpC;EAAE,MAAM;EAAK,UAAU;EAAG,MAAM;CAAI;AACtC;;AAGA,IAAM,qBAAqB;;;;;AAO3B,IAAM,YAAY,UAChB,aAAa,KAAK,EAAE,MAAM,UAAU,WAClC,cAAc,OAAQ,QAAQ,WAAY,MAAM,CAAC,CACnD;;;;;;;;AAUF,IAAa,gBAAb,MAA2B;CAKI;;;;;CAA7B,YAAY,SAAgD;EAA/B,KAAA,UAAA;CAAgC;;CAI7D,MAAM,QAAyB;EAC7B,MAAM,EAAE,QAAQ,YAAY,KAAK;EACjC,MAAM,UAAoB,CAAC;EAC3B,KAAK,MAAM,UAAU,SAAS,YAAY,QAAQ,QAAQ,OAAO,MAAM,GACrE,QAAQ,KAAK,MAAM,KAAK,OAAO,MAAM,CAAC;EAExC,OAAO,KAAK,MAAM,SAAS,GAAG,OAAO;CACvC;CAMA,QAAgB;CAEhB,MAAc,OAAO,QAAqC;EACxD,IAAI,KAAK,QAAQ,OAAO,QAAQ,GAC9B,OAAO,KAAK,KAAK,OAAO,IAAI,CAAC;EAE/B,OAAO,KAAK,MAAM,OAAO,IAAI,GAAG,MAAM,KAAK,WAAW,MAAM,CAAC;CAC/D;CAEA,MAAc,WAAW,QAAuC;EAC9D,MAAM,EAAE,OAAO,WAAW,KAAK,QAAQ;EACvC,MAAM,SAAmB,CAAC;EAC1B,KAAK,MAAM,MAAM,SAAS,OAAO,UAAU,GAAG,MAAM,GAClD,OAAO,KACL,QAAQ,IACJ,MAAM,KAAK,MAAM,IAAI,GAAG,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,IACjD,MAAM,KAAK,KAAK,IAAI,CAAC,CAC3B;EAEF,OAAO;CACT;CAEA,MAAc,QAAQ,UAAkB,OAAkC;EACxE,MAAM,EAAE,OAAO,WAAW,KAAK,QAAQ;EACvC,MAAM,SAAS,UAAU,qBAAqB,SAAS;EACvD,MAAM,SAAmB,CAAC;EAC1B,KAAK,MAAM,QAAQ,SAAS,YAAY,QAAQ,MAAM,GAAG;GACvD,MAAM,KAAK,GAAG,SAAS,GAAG;GAC1B,OAAO,KACL,QAAQ,QACJ,MAAM,KAAK,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,QAAQ,CAAC,CAAC,IAC7D,MAAM,KAAK,KAAK,IAAI,KAAK,CAC/B;EACF;EACA,OAAO;CACT;CAEA,MAAc,IAAY,OAAe,UAAoB;EAC3D,OAAO,KAAK,KAAK;GACf;GACA,UAAU;GACV,MAAM,KAAK,KAAK,SAAS,KAAK;GAC9B;EACF,CAAC;CACH;CAEA,KAAa,IAAY,OAAgC;EACvD,OAAO,KAAK,KAAK;GACf;GACA,UAAU;GACV,MAAM,KAAK,KAAK,QAAQ,KAAK;GAC7B,UAAU;EACZ,CAAC;CACH;CAEA,MAAc,KAAK,KAA4B;EAC7C,QAAQ,MAAM,KAAK,QAAQ,QAAQ,KAAK,aAAa,GAAG,EAAA,CAAG;CAC7D;CAEA,KAAa,MAAwB,OAAyB;EAC5D,MAAM,IAAI,KAAK;EACf,MAAM,SAAS,SAAS;EACxB,OAAO;GACL;GACA,SAAS,KAAK,QAAQ,QAAQ;GAC9B,WAAW;IACT,UAAU;KACR,cAAc,IAAI,OAAO,OAAO,CAAC;KACjC,cAAc,QAAQ,OAAO,OAAO,CAAC;KACrC;IACF;IACA,UAAU;KAAC;KAAG;KAAG;IAAC;IAClB,OAAO;KAAC;KAAG;KAAG;IAAC;GACjB;GACA,UAAU,SAAS,KAAK,cAAc,CAAC,IAAI;GAC3C,UAAU,SACN,aAAa,MAAQ,IAAI,aAAa,SAAU,aAAa,QAC7D;GACJ,SAAS,SAAS,CAAC;GACnB,SAAS,SAAS,KAAK,UAAU,CAAC,IAAI;EACxC;CACF;CAEA,UAAkB,OAA8B;EAC9C,MAAM,EAAE,QAAQ,aAAa,KAAK;EAClC,OAAO,OAAO,eAAe,SAAS,SAAS,IAC3C,KAAK,UAAU,KAAK,IACpB;CACN;AACF;;;;;ACnKA,IAAa,WAAW;CACtB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;;;;AAaA,IAAa,aAAa,iBAAiC;CACzD,MAAM,UAAU,KAAK,UAAU,YAAY;CAC3C,MAAM,QAAQ,KAAK,MAAM,eAAe,SAAS,MAAM;CACvD,OAAO,UAAU,IAAI,UAAU,GAAG,QAAQ,GAAG,QAAQ;AACvD;;;;;;AAQA,IAAa,iBACX,gBACA,iBACW,GAAG,eAAe,GAAG,UAAU,YAAY;;;;;;AAQxD,IAAa,cAAc,QAAgB,UACzC,GAAG,OAAO,GAAG,OAAO,OAAA,CAAkB;;;;;AAOxC,IAAa,WAAW,YACtB,OAAO,QAAQ,MAAM,QAAQ,YAAY,GAAG,IAAI,CAAC,CAAC;;;;;AA0CpD,IAAM,iBAAiB,WAAkD;CACvE,IAAI,OAAO;CACX,QAAQ,UACN,MAAM,KAAK,EAAE,QAAQ,MAAM,SAAS,WAAW,QAAQ,MAAM,CAAC;AAClE;;;;;;;;AAUA,IAAM,eACJ,UACA,SACA,cACiB;CACjB,MAAM,OAAO,SAAS;CACtB,MAAM,UAAU,KAAK,QAAQ,GAAG,MAAM,QAAQ,GAAG,UAAU,WAAW,CAAC;CACvE,MAAM,OAAO,KAAK,QAAQ,GAAG,MAAM,CAAC,QAAQ,GAAG,UAAU,WAAW,CAAC;CACrE,MAAM,QAAQ,QAAQ,KAAK,MAAM,KAAK,SAAS,UAAU,QAAQ,CAAC;CAClE,MAAM,UAAU,KAAK,QAAQ,GAAG,MAAM,QAAQ,GAAG,UAAU,WAAW,CAAC;CACvE,MAAM,SAAS,CAAC,GAAG,MAAM,GAAG,KAAK;CACjC,OAAO;EAAE,MAAM,SAAS,OAAO;EAAG;EAAQ;EAAO;EAAS;CAAQ;AACpE;;;;;;AAQA,IAAa,gBAAgB,YAA0C;CACrE,MAAM,EAAE,QAAQ,MAAM,WAAW,cAAc;CAC/C,MAAM,UAAU,cAAc,MAAM;CACpC,MAAM,UAAU,QAAQ,IAAI;CAE5B,MAAM,SAAyB,CAAC;EADhB,MAAM;EAAW,QAAQ;EAAS,OAAO;EACb,SAAS,CAAC;EAAG,SAAS,CAAC;CAAE,CAAC;CACtE,KAAK,IAAI,IAAI,GAAG,KAAK,UAAU,OAAO,KACpC,OAAO,KAAK,YAAY,OAAO,IAAI,IAAI,SAAS,SAAS,CAAC;CAE5D,OAAO;AACT;;;;;;AAwBA,IAAa,iBACX,MACA,cACmB;CACnB,MAAM,SAAyB;EAC7B,cAAc;EACd,WAAW;EACX,qBAAqB,CAAC,IAAI;EAC1B,aAAa;CACf;CACA,IAAI,SAAS;CACb,KAAK,IAAI,IAAI,GAAG,KAAK,UAAU,OAAO,KAAK;EACzC,MAAM,UAAU,KAAK,MAAM,SAAS,UAAU,WAAW;EACzD,MAAM,OAAO,SAAS;EACtB,MAAM,QAAQ,KAAK,MAAM,SAAS,UAAU,QAAQ;EACpD,MAAM,UAAU,KAAK,MAAM,OAAO,UAAU,WAAW;EACvD,OAAO,gBAAgB;EACvB,OAAO,aAAa,QAAQ;EAC5B,OAAO,oBAAoB,KAAK,QAAQ,OAAO;EAC/C,OAAO,eAAe,QAAQ,UAAU;EACxC,SAAS,OAAO;CAClB;CACA,OAAO;AACT;;;;;;;AASA,IAAa,gBACX,QACA,WAEA,KAAK,IACH,OAAO,OAAO,SACV,OAAO,OAAO,OAAO,wBAAA,GAEzB,OAAO,MACT;;;;;;AAwBF,IAAa,gBAAgB,YAAmC;CAC9D,MAAM,EAAE,OAAO,aAAa,QAAQ,eAAe;CACnD,OAAO,eAAe,SAClB,WAAW;EAAE,OAAO,QAAQ;EAAG,OAAO;EAAa,SAAS;CAAO,CAAC,KACnE,QAAQ,KAAK;AACpB;;;;;AA0CA,IAAa,aAAa,YAAuC;CAC/D,MAAM,EAAE,SAAS,SAAS,OAAO,YAAY,YAAY;CACzD,IAAI,YAAY,UAAU;EACxB,MAAM,QAAQ,QAAQ,OAAO;EAE7B,OAAO;GAAE,MAAA,GADO,KAAK,OAAO,EAAE,GAAG,OAAO,OAAA,CAAkB;GAC3C,MAAM;GAAS,QAAQ;EAAM;CAC9C;CACA,IAAI,YAAY,YAAY;EAC1B,MAAM,OAAO,GAAG,MAAM,MAAM,GAAG,MAAM;EACrC,OAAO;GAAE,MAAM,KAAK,MAAM,KAAK;GAAG;GAAM,QAAQ;EAAW;CAC7D;CACA,MAAM,OAAO,GAAG,MAAM,MAAM,GAAG;CAC/B,OAAO;EAAE,MAAM,KAAK,OAAO;EAAG;EAAM,QAAQ,QAAQ;CAAa;AACnE;;;AC9RA,IAAM,sBAAsB;;AAG5B,IAAM,cAAc;CAAE,UAAU;CAAK,OAAO;CAAM,KAAK;AAAK;;AAG5D,IAAM,kBAAkB;;AAGxB,IAAM,aAAa;;;;;AA6BnB,IAAM,mBAAmB,UAA+B;CACtD,MAAM,EAAE,OAAO,YAAY,UAAU;CAErC,QADa,cAAc,QAAQ,MAAM,QAErC,IAAO,MAAM,cAAc,SAAS,KAAM,YAAY,WACtD,aAAa,kBAAmB,kBAAmB,YAAY,QAC/D,QAAA,MAAA,MAA4C,YAAY;AAE9D;;;;;;AAQA,IAAM,cAAc,QAAiC,UACnD,QAAQ,QAAQ,GAAG,OAAO,aAAa,IACnC,uBAAuB,IAAK,QAAA,KAC5B;;;;;;;;;;AAYN,IAAa,YACX,QACA,UACW;CACX,MAAM,EAAE,KAAK,QAAQ,OAAO;CAE5B,MAAM,UADO,OAAO,MAAM,OAAO,gBAAgB,KAAK,MAC/B,IAAI,aAAa,MAAM;CAC9C,OAAO;EACL,QAAQ,KAAK,IAAI,KAAK,QAAQ,QAAQ,OAAO,OAAO,CAAC;EACrD,UAAU,MAAM;EAChB,WAAW,GAAG,MAAM,KAAK;EACzB,iBAAiB,WAAW,QAAQ,MAAM,KAAK;EAC/C,aAAa;CACf;AACF;;;;;AChGA,IAAa,aAAgC;CAC3C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;AAIA,IAAa,YAA+B;CAC1C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;;;;AC1XA,IAAa,WAA8B;CACzC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;AAGA,IAAM,gBAAmC;CACvC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;AAGA,IAAM,YAA8C;CAClD,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;AAGA,IAAM,gBAAgB;CAAE,UAAU;CAAG,UAAU;CAAG,SAAS;AAAK;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"}
|