n2words 1.23.1 → 2.0.0

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.
Files changed (322) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +317 -59
  3. package/dist/ArabicConverter.js +3 -0
  4. package/dist/ArabicConverter.js.map +1 -0
  5. package/dist/AzerbaijaniConverter.js +3 -0
  6. package/dist/AzerbaijaniConverter.js.map +1 -0
  7. package/dist/BanglaConverter.js +3 -0
  8. package/dist/BanglaConverter.js.map +1 -0
  9. package/dist/BiblicalHebrewConverter.js +3 -0
  10. package/dist/BiblicalHebrewConverter.js.map +1 -0
  11. package/dist/CroatianConverter.js +3 -0
  12. package/dist/CroatianConverter.js.map +1 -0
  13. package/dist/CzechConverter.js +3 -0
  14. package/dist/CzechConverter.js.map +1 -0
  15. package/dist/DanishConverter.js +3 -0
  16. package/dist/DanishConverter.js.map +1 -0
  17. package/dist/DutchConverter.js +3 -0
  18. package/dist/DutchConverter.js.map +1 -0
  19. package/dist/EnglishConverter.js +3 -0
  20. package/dist/EnglishConverter.js.map +1 -0
  21. package/dist/FilipinoConverter.js +3 -0
  22. package/dist/FilipinoConverter.js.map +1 -0
  23. package/dist/FrenchBelgiumConverter.js +3 -0
  24. package/dist/FrenchBelgiumConverter.js.map +1 -0
  25. package/dist/FrenchConverter.js +3 -0
  26. package/dist/FrenchConverter.js.map +1 -0
  27. package/dist/GermanConverter.js +3 -0
  28. package/dist/GermanConverter.js.map +1 -0
  29. package/dist/GreekConverter.js +3 -0
  30. package/dist/GreekConverter.js.map +1 -0
  31. package/dist/GujaratiConverter.js +3 -0
  32. package/dist/GujaratiConverter.js.map +1 -0
  33. package/dist/HebrewConverter.js +3 -0
  34. package/dist/HebrewConverter.js.map +1 -0
  35. package/dist/HindiConverter.js +3 -0
  36. package/dist/HindiConverter.js.map +1 -0
  37. package/dist/HungarianConverter.js +3 -0
  38. package/dist/HungarianConverter.js.map +1 -0
  39. package/dist/IndonesianConverter.js +3 -0
  40. package/dist/IndonesianConverter.js.map +1 -0
  41. package/dist/ItalianConverter.js +3 -0
  42. package/dist/ItalianConverter.js.map +1 -0
  43. package/dist/JapaneseConverter.js +3 -0
  44. package/dist/JapaneseConverter.js.map +1 -0
  45. package/dist/KannadaConverter.js +3 -0
  46. package/dist/KannadaConverter.js.map +1 -0
  47. package/dist/KoreanConverter.js +3 -0
  48. package/dist/KoreanConverter.js.map +1 -0
  49. package/dist/LatvianConverter.js +3 -0
  50. package/dist/LatvianConverter.js.map +1 -0
  51. package/dist/LithuanianConverter.js +3 -0
  52. package/dist/LithuanianConverter.js.map +1 -0
  53. package/dist/MalayConverter.js +3 -0
  54. package/dist/MalayConverter.js.map +1 -0
  55. package/dist/MarathiConverter.js +3 -0
  56. package/dist/MarathiConverter.js.map +1 -0
  57. package/dist/NorwegianBokmalConverter.js +3 -0
  58. package/dist/NorwegianBokmalConverter.js.map +1 -0
  59. package/dist/PersianConverter.js +3 -0
  60. package/dist/PersianConverter.js.map +1 -0
  61. package/dist/PolishConverter.js +3 -0
  62. package/dist/PolishConverter.js.map +1 -0
  63. package/dist/PortugueseConverter.js +3 -0
  64. package/dist/PortugueseConverter.js.map +1 -0
  65. package/dist/PunjabiConverter.js +3 -0
  66. package/dist/PunjabiConverter.js.map +1 -0
  67. package/dist/RomanianConverter.js +3 -0
  68. package/dist/RomanianConverter.js.map +1 -0
  69. package/dist/RussianConverter.js +3 -0
  70. package/dist/RussianConverter.js.map +1 -0
  71. package/dist/SerbianCyrillicConverter.js +3 -0
  72. package/dist/SerbianCyrillicConverter.js.map +1 -0
  73. package/dist/SerbianLatinConverter.js +3 -0
  74. package/dist/SerbianLatinConverter.js.map +1 -0
  75. package/dist/SimplifiedChineseConverter.js +3 -0
  76. package/dist/SimplifiedChineseConverter.js.map +1 -0
  77. package/dist/SpanishConverter.js +3 -0
  78. package/dist/SpanishConverter.js.map +1 -0
  79. package/dist/SwahiliConverter.js +3 -0
  80. package/dist/SwahiliConverter.js.map +1 -0
  81. package/dist/SwedishConverter.js +3 -0
  82. package/dist/SwedishConverter.js.map +1 -0
  83. package/dist/TamilConverter.js +3 -0
  84. package/dist/TamilConverter.js.map +1 -0
  85. package/dist/TeluguConverter.js +3 -0
  86. package/dist/TeluguConverter.js.map +1 -0
  87. package/dist/ThaiConverter.js +3 -0
  88. package/dist/ThaiConverter.js.map +1 -0
  89. package/dist/TraditionalChineseConverter.js +3 -0
  90. package/dist/TraditionalChineseConverter.js.map +1 -0
  91. package/dist/TurkishConverter.js +3 -0
  92. package/dist/TurkishConverter.js.map +1 -0
  93. package/dist/UkrainianConverter.js +3 -0
  94. package/dist/UkrainianConverter.js.map +1 -0
  95. package/dist/UrduConverter.js +3 -0
  96. package/dist/UrduConverter.js.map +1 -0
  97. package/dist/VietnameseConverter.js +3 -0
  98. package/dist/VietnameseConverter.js.map +1 -0
  99. package/dist/n2words.js +3 -2
  100. package/dist/n2words.js.map +1 -1
  101. package/lib/classes/abstract-language.d.ts +158 -34
  102. package/lib/classes/abstract-language.js +223 -115
  103. package/lib/classes/greedy-scale-language.d.ts +109 -0
  104. package/lib/classes/greedy-scale-language.js +201 -0
  105. package/lib/classes/slavic-language.d.ts +148 -0
  106. package/lib/classes/slavic-language.js +281 -0
  107. package/lib/classes/south-asian-language.d.ts +70 -0
  108. package/lib/classes/south-asian-language.js +154 -0
  109. package/lib/classes/turkic-language.d.ts +26 -0
  110. package/lib/classes/turkic-language.js +59 -0
  111. package/lib/languages/ar.d.ts +30 -0
  112. package/lib/languages/ar.js +159 -0
  113. package/lib/languages/az.d.ts +12 -0
  114. package/lib/languages/az.js +42 -0
  115. package/lib/languages/bn.d.ts +11 -0
  116. package/lib/languages/bn.js +131 -0
  117. package/lib/languages/cs.d.ts +88 -0
  118. package/lib/languages/cs.js +143 -0
  119. package/lib/languages/da.d.ts +15 -0
  120. package/lib/languages/da.js +120 -0
  121. package/lib/languages/de.d.ts +14 -0
  122. package/lib/languages/de.js +101 -0
  123. package/lib/languages/el.d.ts +14 -0
  124. package/lib/languages/el.js +90 -0
  125. package/lib/languages/en.d.ts +16 -0
  126. package/lib/languages/en.js +86 -0
  127. package/lib/languages/es.d.ts +15 -0
  128. package/lib/languages/es.js +121 -0
  129. package/lib/languages/fa.d.ts +47 -0
  130. package/lib/languages/fa.js +144 -0
  131. package/lib/languages/fil.d.ts +16 -0
  132. package/lib/languages/fil.js +121 -0
  133. package/lib/languages/fr-BE.d.ts +11 -0
  134. package/lib/languages/fr-BE.js +25 -0
  135. package/lib/languages/fr.d.ts +15 -0
  136. package/lib/languages/fr.js +106 -0
  137. package/lib/languages/gu.d.ts +11 -0
  138. package/lib/languages/gu.js +132 -0
  139. package/lib/languages/hbo.d.ts +113 -0
  140. package/lib/languages/hbo.js +251 -0
  141. package/lib/languages/he.d.ts +80 -0
  142. package/lib/languages/he.js +206 -0
  143. package/lib/languages/hi.d.ts +11 -0
  144. package/lib/languages/hi.js +131 -0
  145. package/lib/languages/hr.d.ts +80 -0
  146. package/lib/languages/hr.js +113 -0
  147. package/lib/languages/hu.d.ts +22 -0
  148. package/lib/languages/hu.js +137 -0
  149. package/lib/languages/id.d.ts +37 -0
  150. package/lib/languages/id.js +159 -0
  151. package/lib/languages/it.d.ts +37 -0
  152. package/lib/languages/it.js +132 -0
  153. package/lib/languages/ja.d.ts +17 -0
  154. package/lib/languages/ja.js +137 -0
  155. package/lib/languages/kn.d.ts +11 -0
  156. package/lib/languages/kn.js +42 -0
  157. package/lib/languages/ko.d.ts +14 -0
  158. package/lib/languages/ko.js +55 -0
  159. package/lib/{i18n/pl.d.ts → languages/lt.d.ts} +18 -15
  160. package/lib/languages/lt.js +136 -0
  161. package/lib/{i18n/lt.d.ts → languages/lv.d.ts} +16 -14
  162. package/lib/languages/lv.js +130 -0
  163. package/lib/languages/mr.d.ts +11 -0
  164. package/lib/languages/mr.js +132 -0
  165. package/lib/languages/ms.d.ts +31 -0
  166. package/lib/languages/ms.js +150 -0
  167. package/lib/languages/nb.d.ts +12 -0
  168. package/lib/languages/nb.js +100 -0
  169. package/lib/languages/nl.d.ts +16 -0
  170. package/lib/languages/nl.js +155 -0
  171. package/lib/languages/pa.d.ts +11 -0
  172. package/lib/languages/pa.js +131 -0
  173. package/lib/{i18n/uk.d.ts → languages/pl.d.ts} +16 -14
  174. package/lib/languages/pl.js +110 -0
  175. package/lib/languages/pt.d.ts +29 -0
  176. package/lib/languages/pt.js +112 -0
  177. package/lib/languages/ro.d.ts +158 -0
  178. package/lib/languages/ro.js +273 -0
  179. package/lib/languages/ru.d.ts +85 -0
  180. package/lib/languages/ru.js +96 -0
  181. package/lib/languages/sr-Cyrl.d.ts +80 -0
  182. package/lib/languages/sr-Cyrl.js +113 -0
  183. package/lib/{i18n/cz.d.ts → languages/sr-Latn.d.ts} +26 -14
  184. package/lib/languages/sr-Latn.js +113 -0
  185. package/lib/languages/sv.d.ts +14 -0
  186. package/lib/languages/sv.js +90 -0
  187. package/lib/languages/sw.d.ts +39 -0
  188. package/lib/languages/sw.js +126 -0
  189. package/lib/languages/ta.d.ts +20 -0
  190. package/lib/languages/ta.js +226 -0
  191. package/lib/languages/te.d.ts +22 -0
  192. package/lib/languages/te.js +219 -0
  193. package/lib/languages/th.d.ts +17 -0
  194. package/lib/languages/th.js +117 -0
  195. package/lib/languages/tr.d.ts +12 -0
  196. package/lib/languages/tr.js +56 -0
  197. package/lib/languages/uk.d.ts +85 -0
  198. package/lib/{i18n → languages}/uk.js +33 -32
  199. package/lib/languages/ur.d.ts +11 -0
  200. package/lib/languages/ur.js +131 -0
  201. package/lib/{i18n → languages}/vi.d.ts +15 -13
  202. package/lib/languages/vi.js +147 -0
  203. package/lib/languages/zh-Hans.d.ts +21 -0
  204. package/lib/languages/zh-Hans.js +111 -0
  205. package/lib/languages/zh-Hant.d.ts +21 -0
  206. package/lib/languages/zh-Hant.js +111 -0
  207. package/lib/n2words.d.ts +207 -7
  208. package/lib/n2words.js +535 -81
  209. package/package.json +126 -79
  210. package/dist/ar.js +0 -2
  211. package/dist/ar.js.map +0 -1
  212. package/dist/az.js +0 -2
  213. package/dist/az.js.map +0 -1
  214. package/dist/cz.js +0 -2
  215. package/dist/cz.js.map +0 -1
  216. package/dist/de.js +0 -2
  217. package/dist/de.js.map +0 -1
  218. package/dist/dk.js +0 -2
  219. package/dist/dk.js.map +0 -1
  220. package/dist/en.js +0 -2
  221. package/dist/en.js.map +0 -1
  222. package/dist/es.js +0 -2
  223. package/dist/es.js.map +0 -1
  224. package/dist/fa.js +0 -2
  225. package/dist/fa.js.map +0 -1
  226. package/dist/fr-BE.js +0 -2
  227. package/dist/fr-BE.js.map +0 -1
  228. package/dist/fr.js +0 -2
  229. package/dist/fr.js.map +0 -1
  230. package/dist/he.js +0 -2
  231. package/dist/he.js.map +0 -1
  232. package/dist/hr.js +0 -2
  233. package/dist/hr.js.map +0 -1
  234. package/dist/hu.js +0 -2
  235. package/dist/hu.js.map +0 -1
  236. package/dist/id.js +0 -2
  237. package/dist/id.js.map +0 -1
  238. package/dist/it.js +0 -2
  239. package/dist/it.js.map +0 -1
  240. package/dist/ko.js +0 -2
  241. package/dist/ko.js.map +0 -1
  242. package/dist/lt.js +0 -2
  243. package/dist/lt.js.map +0 -1
  244. package/dist/lv.js +0 -2
  245. package/dist/lv.js.map +0 -1
  246. package/dist/n2words.d.ts +0 -2
  247. package/dist/nl.js +0 -2
  248. package/dist/nl.js.map +0 -1
  249. package/dist/no.js +0 -2
  250. package/dist/no.js.map +0 -1
  251. package/dist/pl.js +0 -2
  252. package/dist/pl.js.map +0 -1
  253. package/dist/pt.js +0 -2
  254. package/dist/pt.js.map +0 -1
  255. package/dist/ro.js +0 -2
  256. package/dist/ro.js.map +0 -1
  257. package/dist/ru.js +0 -2
  258. package/dist/ru.js.map +0 -1
  259. package/dist/sr.js +0 -2
  260. package/dist/sr.js.map +0 -1
  261. package/dist/tr.js +0 -2
  262. package/dist/tr.js.map +0 -1
  263. package/dist/uk.js +0 -2
  264. package/dist/uk.js.map +0 -1
  265. package/dist/vi.js +0 -2
  266. package/dist/vi.js.map +0 -1
  267. package/dist/zh.js +0 -2
  268. package/dist/zh.js.map +0 -1
  269. package/lib/classes/base-language.d.ts +0 -58
  270. package/lib/classes/base-language.js +0 -172
  271. package/lib/i18n/ar.d.ts +0 -41
  272. package/lib/i18n/ar.js +0 -209
  273. package/lib/i18n/az.d.ts +0 -15
  274. package/lib/i18n/az.js +0 -66
  275. package/lib/i18n/cz.js +0 -135
  276. package/lib/i18n/de.d.ts +0 -17
  277. package/lib/i18n/de.js +0 -103
  278. package/lib/i18n/dk.d.ts +0 -14
  279. package/lib/i18n/dk.js +0 -110
  280. package/lib/i18n/en.d.ts +0 -22
  281. package/lib/i18n/en.js +0 -86
  282. package/lib/i18n/es.d.ts +0 -16
  283. package/lib/i18n/es.js +0 -110
  284. package/lib/i18n/fa.d.ts +0 -54
  285. package/lib/i18n/fa.js +0 -106
  286. package/lib/i18n/fr-BE.d.ts +0 -11
  287. package/lib/i18n/fr-BE.js +0 -20
  288. package/lib/i18n/fr.d.ts +0 -15
  289. package/lib/i18n/fr.js +0 -99
  290. package/lib/i18n/he.d.ts +0 -61
  291. package/lib/i18n/he.js +0 -132
  292. package/lib/i18n/hr.d.ts +0 -68
  293. package/lib/i18n/hr.js +0 -129
  294. package/lib/i18n/hu.d.ts +0 -17
  295. package/lib/i18n/hu.js +0 -135
  296. package/lib/i18n/id.d.ts +0 -43
  297. package/lib/i18n/id.js +0 -156
  298. package/lib/i18n/it.d.ts +0 -29
  299. package/lib/i18n/it.js +0 -137
  300. package/lib/i18n/ko.d.ts +0 -15
  301. package/lib/i18n/ko.js +0 -56
  302. package/lib/i18n/lt.js +0 -138
  303. package/lib/i18n/lv.d.ts +0 -57
  304. package/lib/i18n/lv.js +0 -120
  305. package/lib/i18n/nl.d.ts +0 -20
  306. package/lib/i18n/nl.js +0 -125
  307. package/lib/i18n/no.d.ts +0 -15
  308. package/lib/i18n/no.js +0 -77
  309. package/lib/i18n/pl.js +0 -126
  310. package/lib/i18n/pt.d.ts +0 -26
  311. package/lib/i18n/pt.js +0 -118
  312. package/lib/i18n/ro.d.ts +0 -109
  313. package/lib/i18n/ro.js +0 -360
  314. package/lib/i18n/ru.d.ts +0 -30
  315. package/lib/i18n/ru.js +0 -198
  316. package/lib/i18n/sr.d.ts +0 -56
  317. package/lib/i18n/sr.js +0 -127
  318. package/lib/i18n/tr.d.ts +0 -15
  319. package/lib/i18n/tr.js +0 -64
  320. package/lib/i18n/vi.js +0 -151
  321. package/lib/i18n/zh.d.ts +0 -18
  322. package/lib/i18n/zh.js +0 -78
@@ -1 +1 @@
1
- {"version":3,"file":"n2words.js","mappings":"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","sources":["webpack://n2words/webpack/universalModuleDefinition","webpack://n2words/./node_modules/core-js/internals/is-object.js","webpack://n2words/./node_modules/core-js/internals/get-iterator.js","webpack://n2words/./node_modules/core-js/modules/es.iterator.find.js","webpack://n2words/./node_modules/core-js/internals/make-built-in.js","webpack://n2words/./node_modules/core-js/internals/function-name.js","webpack://n2words/./node_modules/core-js/internals/html.js","webpack://n2words/./node_modules/core-js/internals/hidden-keys.js","webpack://n2words/./node_modules/core-js/internals/iterate-simple.js","webpack://n2words/./node_modules/core-js/internals/function-bind-native.js","webpack://n2words/./lib/i18n/az.js","webpack://n2words/./node_modules/core-js/internals/an-instance.js","webpack://n2words/./node_modules/core-js/internals/iterator-helper-throws-on-invalid-iterator.js","webpack://n2words/./node_modules/core-js/internals/math-trunc.js","webpack://n2words/./node_modules/core-js/internals/is-symbol.js","webpack://n2words/./node_modules/core-js/internals/get-iterator-method.js","webpack://n2words/./lib/i18n/ar.js","webpack://n2words/./lib/i18n/fa.js","webpack://n2words/./node_modules/core-js/internals/object-keys.js","webpack://n2words/./lib/i18n/cz.js","webpack://n2words/./node_modules/core-js/internals/internal-state.js","webpack://n2words/./lib/i18n/pt.js","webpack://n2words/./node_modules/core-js/internals/to-integer-or-infinity.js","webpack://n2words/./lib/i18n/en.js","webpack://n2words/./node_modules/core-js/internals/iterator-close-all.js","webpack://n2words/./node_modules/core-js/modules/esnext.iterator.map.js","webpack://n2words/./lib/i18n/hu.js","webpack://n2words/./lib/i18n/hr.js","webpack://n2words/./node_modules/core-js/internals/object-is-prototype-of.js","webpack://n2words/./node_modules/core-js/modules/es.set.union.v2.js","webpack://n2words/./node_modules/core-js/modules/es.iterator.map.js","webpack://n2words/./node_modules/core-js/internals/get-iterator-direct.js","webpack://n2words/./node_modules/core-js/internals/object-keys-internal.js","webpack://n2words/./lib/i18n/he.js","webpack://n2words/./node_modules/core-js/internals/define-built-in-accessor.js","webpack://n2words/./node_modules/core-js/internals/to-string-tag-support.js","webpack://n2words/./node_modules/core-js/internals/classof-raw.js","webpack://n2words/./node_modules/core-js/internals/correct-prototype-getter.js","webpack://n2words/./node_modules/core-js/internals/object-create.js","webpack://n2words/./node_modules/core-js/modules/es.set.is-superset-of.v2.js","webpack://n2words/./node_modules/core-js/internals/create-iter-result-object.js","webpack://n2words/./node_modules/core-js/modules/esnext.iterator.find.js","webpack://n2words/./node_modules/core-js/internals/iterate.js","webpack://n2words/./lib/i18n/it.js","webpack://n2words/./node_modules/core-js/internals/to-primitive.js","webpack://n2words/./node_modules/core-js/internals/object-get-prototype-of.js","webpack://n2words/./node_modules/core-js/internals/is-forced.js","webpack://n2words/./node_modules/core-js/internals/environment-user-agent.js","webpack://n2words/./node_modules/core-js/internals/uid.js","webpack://n2words/./node_modules/core-js/internals/set-difference.js","webpack://n2words/./lib/i18n/pl.js","webpack://n2words/./node_modules/core-js/internals/set-symmetric-difference.js","webpack://n2words/./node_modules/core-js/internals/inspect-source.js","webpack://n2words/./node_modules/core-js/internals/object-get-own-property-symbols.js","webpack://n2words/./node_modules/core-js/internals/descriptors.js","webpack://n2words/./node_modules/core-js/internals/get-set-record.js","webpack://n2words/./node_modules/core-js/internals/set-is-subset-of.js","webpack://n2words/./lib/classes/base-language.js","webpack://n2words/./node_modules/core-js/modules/es.set.is-disjoint-from.v2.js","webpack://n2words/./node_modules/core-js/internals/document-create-element.js","webpack://n2words/./node_modules/core-js/modules/es.array.push.js","webpack://n2words/./node_modules/core-js/internals/is-null-or-undefined.js","webpack://n2words/./node_modules/core-js/internals/set-union.js","webpack://n2words/./node_modules/core-js/internals/is-array-iterator-method.js","webpack://n2words/./node_modules/core-js/internals/ordinary-to-primitive.js","webpack://n2words/./node_modules/core-js/internals/is-array.js","webpack://n2words/./node_modules/core-js/internals/set-helpers.js","webpack://n2words/./node_modules/core-js/internals/set-is-disjoint-from.js","webpack://n2words/./node_modules/core-js/internals/symbol-constructor-detection.js","webpack://n2words/./node_modules/core-js/internals/array-set-length.js","webpack://n2words/./node_modules/core-js/internals/iterator-helper-without-closing-on-early-error.js","webpack://n2words/./node_modules/core-js/internals/global-this.js","webpack://n2words/./node_modules/core-js/internals/create-property.js","webpack://n2words/./lib/i18n/ru.js","webpack://n2words/./node_modules/core-js/internals/is-callable.js","webpack://n2words/./node_modules/core-js/internals/object-define-property.js","webpack://n2words/./node_modules/core-js/internals/set-method-accept-set-like.js","webpack://n2words/./node_modules/core-js/modules/es.set.symmetric-difference.v2.js","webpack://n2words/./node_modules/core-js/internals/own-keys.js","webpack://n2words/./lib/i18n/lv.js","webpack://n2words/./node_modules/core-js/internals/set-size.js","webpack://n2words/./lib/i18n/vi.js","webpack://n2words/./node_modules/core-js/internals/to-indexed-object.js","webpack://n2words/./node_modules/core-js/internals/to-absolute-index.js","webpack://n2words/./lib/i18n/zh.js","webpack://n2words/./node_modules/core-js/internals/shared.js","webpack://n2words/./node_modules/core-js/modules/es.set.is-subset-of.v2.js","webpack://n2words/./node_modules/core-js/internals/ie8-dom-define.js","webpack://n2words/./node_modules/core-js/internals/get-method.js","webpack://n2words/./lib/i18n/ro.js","webpack://n2words/./node_modules/core-js/internals/function-bind-context.js","webpack://n2words/./node_modules/core-js/internals/shared-key.js","webpack://n2words/./node_modules/core-js/internals/length-of-array-like.js","webpack://n2words/./node_modules/core-js/internals/iterators.js","webpack://n2words/./node_modules/core-js/internals/define-built-ins.js","webpack://n2words/./lib/classes/abstract-language.js","webpack://n2words/./node_modules/core-js/internals/call-with-safe-iteration-closing.js","webpack://n2words/./node_modules/core-js/internals/is-pure.js","webpack://n2words/./lib/i18n/id.js","webpack://n2words/./node_modules/core-js/internals/add-to-unscopables.js","webpack://n2words/./node_modules/core-js/internals/export.js","webpack://n2words/./lib/i18n/fr.js","webpack://n2words/./node_modules/core-js/internals/create-non-enumerable-property.js","webpack://n2words/./node_modules/core-js/internals/function-uncurry-this-accessor.js","webpack://n2words/./node_modules/core-js/internals/object-define-properties.js","webpack://n2words/./node_modules/core-js/internals/try-to-string.js","webpack://n2words/./node_modules/core-js/internals/does-not-exceed-safe-integer.js","webpack://n2words/./node_modules/core-js/internals/define-built-in.js","webpack://n2words/./node_modules/core-js/internals/classof.js","webpack://n2words/./node_modules/core-js/internals/to-property-key.js","webpack://n2words/./node_modules/core-js/internals/create-property-descriptor.js","webpack://n2words/./node_modules/core-js/internals/use-symbol-as-uid.js","webpack://n2words/./node_modules/core-js/internals/indexed-object.js","webpack://n2words/./node_modules/core-js/internals/a-set.js","webpack://n2words/./lib/i18n/es.js","webpack://n2words/./lib/i18n/ko.js","webpack://n2words/./node_modules/core-js/internals/object-get-own-property-descriptor.js","webpack://n2words/./node_modules/core-js/internals/function-uncurry-this-clause.js","webpack://n2words/./node_modules/core-js/internals/array-to-reversed.js","webpack://n2words/./node_modules/core-js/internals/shared-store.js","webpack://n2words/./node_modules/core-js/modules/es.set.difference.v2.js","webpack://n2words/./node_modules/core-js/internals/iterators-core.js","webpack://n2words/./node_modules/core-js/internals/copy-constructor-properties.js","webpack://n2words/./node_modules/core-js/internals/require-object-coercible.js","webpack://n2words/./node_modules/core-js/internals/get-built-in.js","webpack://n2words/./lib/i18n/uk.js","webpack://n2words/./node_modules/core-js/modules/es.set.intersection.v2.js","webpack://n2words/./node_modules/core-js/internals/to-length.js","webpack://n2words/./node_modules/core-js/modules/es.iterator.constructor.js","webpack://n2words/./node_modules/core-js/internals/well-known-symbol.js","webpack://n2words/./node_modules/core-js/internals/set-iterate.js","webpack://n2words/./node_modules/core-js/internals/object-get-own-property-names.js","webpack://n2words/./node_modules/core-js/internals/set-is-superset-of.js","webpack://n2words/./node_modules/core-js/internals/an-object.js","webpack://n2words/./node_modules/core-js/internals/weak-map-basic-detection.js","webpack://n2words/./node_modules/core-js/internals/v8-prototype-define-bug.js","webpack://n2words/./node_modules/core-js/internals/enum-bug-keys.js","webpack://n2words/./node_modules/core-js/internals/set-intersection.js","webpack://n2words/./node_modules/core-js/internals/object-property-is-enumerable.js","webpack://n2words/./lib/i18n/de.js","webpack://n2words/./node_modules/core-js/internals/to-object.js","webpack://n2words/./node_modules/core-js/modules/esnext.iterator.constructor.js","webpack://n2words/./node_modules/core-js/internals/fails.js","webpack://n2words/./lib/i18n/tr.js","webpack://n2words/./lib/i18n/sr.js","webpack://n2words/./node_modules/core-js/internals/set-clone.js","webpack://n2words/./node_modules/core-js/internals/has-own-property.js","webpack://n2words/./node_modules/core-js/internals/a-callable.js","webpack://n2words/./lib/i18n/fr-BE.js","webpack://n2words/./lib/i18n/no.js","webpack://n2words/./node_modules/core-js/internals/define-global-property.js","webpack://n2words/./node_modules/core-js/internals/iterator-create-proxy.js","webpack://n2words/./node_modules/core-js/internals/function-uncurry-this.js","webpack://n2words/./node_modules/core-js/internals/environment-v8-version.js","webpack://n2words/./node_modules/core-js/internals/iterator-close.js","webpack://n2words/./node_modules/core-js/internals/function-call.js","webpack://n2words/./lib/i18n/nl.js","webpack://n2words/./lib/i18n/dk.js","webpack://n2words/./node_modules/core-js/internals/array-includes.js","webpack://n2words/./node_modules/core-js/modules/es.array.to-reversed.js","webpack://n2words/./node_modules/core-js/internals/set-method-get-keys-before-cloning-detection.js","webpack://n2words/./lib/i18n/lt.js","webpack://n2words/webpack/bootstrap","webpack://n2words/webpack/runtime/define property getters","webpack://n2words/webpack/runtime/hasOwnProperty shorthand","webpack://n2words/./lib/n2words.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"n2words\"] = factory();\n\telse\n\t\troot[\"n2words\"] = factory();\n})(this, () => {\nreturn ","'use strict';\nvar isCallable = require('../internals/is-callable');\n\nmodule.exports = function (it) {\n return typeof it == 'object' ? it !== null : isCallable(it);\n};\n","'use strict';\nvar call = require('../internals/function-call');\nvar aCallable = require('../internals/a-callable');\nvar anObject = require('../internals/an-object');\nvar tryToString = require('../internals/try-to-string');\nvar getIteratorMethod = require('../internals/get-iterator-method');\n\nvar $TypeError = TypeError;\n\nmodule.exports = function (argument, usingIterator) {\n var iteratorMethod = arguments.length < 2 ? getIteratorMethod(argument) : usingIterator;\n if (aCallable(iteratorMethod)) return anObject(call(iteratorMethod, argument));\n throw new $TypeError(tryToString(argument) + ' is not iterable');\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar iterate = require('../internals/iterate');\nvar aCallable = require('../internals/a-callable');\nvar anObject = require('../internals/an-object');\nvar getIteratorDirect = require('../internals/get-iterator-direct');\nvar iteratorClose = require('../internals/iterator-close');\nvar iteratorHelperWithoutClosingOnEarlyError = require('../internals/iterator-helper-without-closing-on-early-error');\n\nvar findWithoutClosingOnEarlyError = iteratorHelperWithoutClosingOnEarlyError('find', TypeError);\n\n// `Iterator.prototype.find` method\n// https://tc39.es/ecma262/#sec-iterator.prototype.find\n$({ target: 'Iterator', proto: true, real: true, forced: findWithoutClosingOnEarlyError }, {\n find: function find(predicate) {\n anObject(this);\n try {\n aCallable(predicate);\n } catch (error) {\n iteratorClose(this, 'throw', error);\n }\n\n if (findWithoutClosingOnEarlyError) return call(findWithoutClosingOnEarlyError, this, predicate);\n\n var record = getIteratorDirect(this);\n var counter = 0;\n return iterate(record, function (value, stop) {\n if (predicate(value, counter++)) return stop(value);\n }, { IS_RECORD: true, INTERRUPTED: true }).result;\n }\n});\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\nvar hasOwn = require('../internals/has-own-property');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar CONFIGURABLE_FUNCTION_NAME = require('../internals/function-name').CONFIGURABLE;\nvar inspectSource = require('../internals/inspect-source');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar enforceInternalState = InternalStateModule.enforce;\nvar getInternalState = InternalStateModule.get;\nvar $String = String;\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar defineProperty = Object.defineProperty;\nvar stringSlice = uncurryThis(''.slice);\nvar replace = uncurryThis(''.replace);\nvar join = uncurryThis([].join);\n\nvar CONFIGURABLE_LENGTH = DESCRIPTORS && !fails(function () {\n return defineProperty(function () { /* empty */ }, 'length', { value: 8 }).length !== 8;\n});\n\nvar TEMPLATE = String(String).split('String');\n\nvar makeBuiltIn = module.exports = function (value, name, options) {\n if (stringSlice($String(name), 0, 7) === 'Symbol(') {\n name = '[' + replace($String(name), /^Symbol\\(([^)]*)\\).*$/, '$1') + ']';\n }\n if (options && options.getter) name = 'get ' + name;\n if (options && options.setter) name = 'set ' + name;\n if (!hasOwn(value, 'name') || (CONFIGURABLE_FUNCTION_NAME && value.name !== name)) {\n if (DESCRIPTORS) defineProperty(value, 'name', { value: name, configurable: true });\n else value.name = name;\n }\n if (CONFIGURABLE_LENGTH && options && hasOwn(options, 'arity') && value.length !== options.arity) {\n defineProperty(value, 'length', { value: options.arity });\n }\n try {\n if (options && hasOwn(options, 'constructor') && options.constructor) {\n if (DESCRIPTORS) defineProperty(value, 'prototype', { writable: false });\n // in V8 ~ Chrome 53, prototypes of some methods, like `Array.prototype.values`, are non-writable\n } else if (value.prototype) value.prototype = undefined;\n } catch (error) { /* empty */ }\n var state = enforceInternalState(value);\n if (!hasOwn(state, 'source')) {\n state.source = join(TEMPLATE, typeof name == 'string' ? name : '');\n } return value;\n};\n\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n// eslint-disable-next-line no-extend-native -- required\nFunction.prototype.toString = makeBuiltIn(function toString() {\n return isCallable(this) && getInternalState(this).source || inspectSource(this);\n}, 'toString');\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar hasOwn = require('../internals/has-own-property');\n\nvar FunctionPrototype = Function.prototype;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar getDescriptor = DESCRIPTORS && Object.getOwnPropertyDescriptor;\n\nvar EXISTS = hasOwn(FunctionPrototype, 'name');\n// additional protection from minified / mangled / dropped function names\nvar PROPER = EXISTS && (function something() { /* empty */ }).name === 'something';\nvar CONFIGURABLE = EXISTS && (!DESCRIPTORS || (DESCRIPTORS && getDescriptor(FunctionPrototype, 'name').configurable));\n\nmodule.exports = {\n EXISTS: EXISTS,\n PROPER: PROPER,\n CONFIGURABLE: CONFIGURABLE\n};\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\n\nmodule.exports = getBuiltIn('document', 'documentElement');\n","'use strict';\nmodule.exports = {};\n","'use strict';\nvar call = require('../internals/function-call');\n\nmodule.exports = function (record, fn, ITERATOR_INSTEAD_OF_RECORD) {\n var iterator = ITERATOR_INSTEAD_OF_RECORD ? record : record.iterator;\n var next = record.next;\n var step, result;\n while (!(step = call(next, iterator)).done) {\n result = fn(step.value);\n if (result !== undefined) return result;\n }\n};\n","'use strict';\nvar fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n // eslint-disable-next-line es/no-function-prototype-bind -- safe\n var test = (function () { /* empty */ }).bind();\n // eslint-disable-next-line no-prototype-builtins -- safe\n return typeof test != 'function' || test.hasOwnProperty('prototype');\n});\n","import BaseLanguage from '../classes/base-language.js';\n\nexport class N2WordsAZ extends BaseLanguage {\n constructor(options) {\n options = Object.assign({\n negativeWord: 'mənfi',\n separatorWord: 'nöqtə',\n zero: 'sıfır'\n }, options);\n\n super(options, [\n [1_000_000_000_000_000_000n, 'kentilyon'],\n [1_000_000_000_000_000n, 'katrilyon'],\n [1_000_000_000_000n, 'trilyon'],\n [1_000_000_000n, 'milyar'],\n [1_000_000n, 'milyon'],\n [1000n, 'min'],\n [100n, 'yüz'],\n [90n, 'doxsan'],\n [80n, 'səksən'],\n [70n, 'yetmiş'],\n [60n, 'altmış'],\n [50n, 'əlli'],\n [40n, 'qırx'],\n [30n, 'otuz'],\n [20n, 'iyirmi'],\n [10n, 'on'],\n [9n, 'doqquz'],\n [8n, 'səkkiz'],\n [7n, 'yeddi'],\n [6n, 'altı'],\n [5n, 'beş'],\n [4n, 'dörd'],\n [3n, 'üç'],\n [2n, 'iki'],\n [1n, 'bir'],\n [0n, 'sıfır']\n ]);\n }\n\n merge(lPair, rPair) {\n const lText = Object.keys(lPair)[0];\n const rText = Object.keys(rPair)[0];\n const lNumber = BigInt(Object.values(lPair)[0]);\n const rNumber = BigInt(Object.values(rPair)[0]);\n\n if (lNumber == 1 && (rNumber <= 100 || rNumber == 1000)) {\n return { [rText]: rNumber };\n } else if (rNumber > lNumber) {\n return { [`${lText}${this.spaceSeparator}${rText}`]: lNumber * rNumber };\n } else {\n return { [`${lText}${this.spaceSeparator}${rText}`]: lNumber + rNumber };\n }\n }\n}\n\n/**\n * Converts a value to cardinal (written) form.\n * @param {number|string|bigint} value Number to be convert.\n * @param {object} [options] Options for class.\n * @returns {string} Value in cardinal (written) format.\n * @throws {Error} Value cannot be invalid.\n */\nexport default function floatToCardinal (value, options = {}) {\n return new N2WordsAZ(options).floatToCardinal(value);\n}\n","'use strict';\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\n\nvar $TypeError = TypeError;\n\nmodule.exports = function (it, Prototype) {\n if (isPrototypeOf(Prototype, it)) return it;\n throw new $TypeError('Incorrect invocation');\n};\n","'use strict';\n// Should throw an error on invalid iterator\n// https://issues.chromium.org/issues/336839115\nmodule.exports = function (methodName, argument) {\n // eslint-disable-next-line es/no-iterator -- required for testing\n var method = typeof Iterator == 'function' && Iterator.prototype[methodName];\n if (method) try {\n method.call({ next: null }, argument).next();\n } catch (error) {\n return true;\n }\n};\n","'use strict';\nvar ceil = Math.ceil;\nvar floor = Math.floor;\n\n// `Math.trunc` method\n// https://tc39.es/ecma262/#sec-math.trunc\n// eslint-disable-next-line es/no-math-trunc -- safe\nmodule.exports = Math.trunc || function trunc(x) {\n var n = +x;\n return (n > 0 ? floor : ceil)(n);\n};\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar isCallable = require('../internals/is-callable');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\n\nvar $Object = Object;\n\nmodule.exports = USE_SYMBOL_AS_UID ? function (it) {\n return typeof it == 'symbol';\n} : function (it) {\n var $Symbol = getBuiltIn('Symbol');\n return isCallable($Symbol) && isPrototypeOf($Symbol.prototype, $Object(it));\n};\n","'use strict';\nvar classof = require('../internals/classof');\nvar getMethod = require('../internals/get-method');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\nvar Iterators = require('../internals/iterators');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = function (it) {\n if (!isNullOrUndefined(it)) return getMethod(it, ITERATOR)\n || getMethod(it, '@@iterator')\n || Iterators[classof(it)];\n};\n","import AbstractLanguage from '../classes/abstract-language.js';\n\nexport class Arabic extends AbstractLanguage {\n number;\n\n feminine;\n\n ones = {\n masculine: [\n 'واحد',\n 'اثنان',\n 'ثلاثة',\n 'أربعة',\n 'خمسة',\n 'ستة',\n 'سبعة',\n 'ثمانية',\n 'تسعة',\n 'عشرة',\n 'أحد عشر',\n 'اثنا عشر',\n 'ثلاثة عشر',\n 'أربعة عشر',\n 'خمسة عشر',\n 'ستة عشر',\n 'سبعة عشر',\n 'ثمانية عشر',\n 'تسعة عشر',\n ],\n feminine: [\n 'واحدة',\n 'اثنتان',\n 'ثلاث',\n 'أربع',\n 'خمس',\n 'ست',\n 'سبع',\n 'ثمان',\n 'تسع',\n 'عشر',\n 'إحدى عشرة',\n 'اثنتا عشرة',\n 'ثلاث عشرة',\n 'أربع عشرة',\n 'خمس عشرة',\n 'ست عشرة',\n 'سبع عشرة',\n 'ثماني عشرة',\n 'تسع عشرة',\n ]\n };\n\n arabicTens = ['عشرون', 'ثلاثون', 'أربعون', 'خمسون', 'ستون', 'سبعون', 'ثمانون', 'تسعون'];\n\n arabicHundreds = ['', 'مائة', 'مئتان', 'ثلاثمائة', 'أربعمائة', 'خمسمائة', 'ستمائة', 'سبعمائة', 'ثمانمائة', 'تسعمائة'];\n\n arabicAppendedTwos = ['مئتا', 'ألفا', 'مليونا', 'مليارا', 'تريليونا', 'كوادريليونا', 'كوينتليونا', 'سكستيليونا'];\n\n arabicTwos = ['مئتان', 'ألفان', 'مليونان', 'ملياران', 'تريليونان', 'كوادريليونان', 'كوينتليونان', 'سكستيليونان'];\n\n arabicGroup = ['مائة', 'ألف', 'مليون', 'مليار', 'تريليون', 'كوادريليون', 'كوينتليون', 'سكستيليون'];\n\n arabicAppendedGroup = ['', 'ألفاً', 'مليوناً', 'ملياراً', 'تريليوناً', 'كوادريليوناً', 'كوينتليوناً', 'سكستيليوناً'];\n\n arabicPluralGroups = ['', 'آلاف', 'ملايين', 'مليارات', 'تريليونات', 'كوادريليونات', 'كوينتليونات', 'سكستيليونات'];\n\n constructor(options) {\n options = Object.assign({\n negativeWord: 'ناقص',\n separatorWord: 'فاصلة',\n zero: 'صفر',\n feminine: false,\n }, options);\n\n super(options);\n\n this.feminine = options.feminine;\n }\n\n digitFeminineStatus(digit) {\n return this.ones[this.feminine ? 'feminine' : 'masculine'][digit - 1];\n }\n\n /**\n * Processes the Arabic group number and returns the corresponding Arabic representation.\n * @param {number} groupNumber - The number to process. (Range: 1-999)\n * @param {number} groupLevel - Group level to process. (See example)\n * @returns {string} The Arabic representation of the group number.\n * @example 12345678 is processed in blocks of 3: '678' (group 0), '345' (group 1), '12' (group 2).\n */\n processArabicGroup(groupNumber, groupLevel) {\n let tens = groupNumber % 100;\n const hundreds = groupNumber / 100;\n let returnValue = '';\n\n if (Math.trunc(hundreds) > 0) {\n if (tens == 0 && Math.trunc(hundreds) == 2) {\n returnValue = this.arabicTwos[0];\n } else {\n returnValue = this.arabicHundreds[Math.trunc(hundreds)];\n if (returnValue != '' && tens != 0) {\n returnValue += ' و';\n }\n }\n }\n\n if (tens > 0 && tens < 20) { // 1 -> 19\n if (tens === 2 && Math.trunc(hundreds) === 0 && groupLevel > 0) {\n const pow = Math.trunc(Math.log10(Number(this.number)));\n if (pow % 3 === 0 && this.number === 2 * Math.pow(10, pow)) {\n returnValue = groupNumber === 2 ? this.arabicTwos[Math.trunc(groupLevel)] : this.arabicAppendedTwos[Math.trunc(groupLevel)];\n } else {\n returnValue = this.arabicTwos[Math.trunc(groupLevel)];\n }\n } else if (tens === 1 && groupLevel > 0) {\n returnValue += this.arabicGroup[Math.trunc(groupLevel)];\n } else {\n returnValue += this.digitFeminineStatus(Math.trunc(tens), groupLevel);\n }\n } else if (tens >= 20) { // 20 -> 99\n const ones = tens % 10;\n const tensIndex = (tens / 10) - 2;\n if (ones > 0) {\n returnValue += this.digitFeminineStatus(ones, groupLevel);\n }\n if (returnValue != '' && ones != 0) {\n returnValue += ' و';\n }\n returnValue += this.arabicTens[Math.trunc(tensIndex)];\n }\n\n return returnValue;\n }\n\n /**\n * Converts a number to its cardinal representation in Arabic.\n * It process by blocks of 3 digits.\n * @param {number} number - The number to convert.\n * @returns {string} The cardinal representation of the number in Arabic.\n */\n toCardinal(number) {\n if (number == 0) {\n return this.zero;\n }\n\n this.number = number;\n let temporaryNumber = number;\n let temporaryNumberDec;\n let group = 0;\n let returnValue = '';\n\n // Loop until number has been reduced to zero or less\n while (temporaryNumber > 0) {\n temporaryNumberDec = temporaryNumber;\n // Get the remaining value after dividing by 1000\n const numberToProcess = Number(temporaryNumberDec % 1000n); // Maximum: 999\n temporaryNumber = temporaryNumberDec / 1000n;\n\n // Process \"group\"\n const groupDescription = this.processArabicGroup(numberToProcess, group);\n\n // Did the group return anything?\n if (groupDescription != '') {\n // Is this after the first \"group\" ? Because nothing is appeded after group 0.\n if (group > 0) { // hundreds, thousands, etc...\n // Is the return value still empty ?\n if (returnValue != '') {\n returnValue = ' و' + returnValue;\n }\n\n if (numberToProcess > 2) {\n if (numberToProcess % 100 == 1) {\n returnValue = this.arabicGroup[group] + ' ' + returnValue;\n } else {\n if (numberToProcess >= 3 && numberToProcess <= 10) {\n returnValue = this.arabicPluralGroups[group] + ' ' + returnValue;\n } else {\n returnValue = returnValue == '' ? this.arabicGroup[group] + ' ' + returnValue : this.arabicAppendedGroup[group] + ' ' + returnValue;\n }\n }\n }\n }\n\n // Add \"group\" return to output variable\n // NOTE: Language is right-to-left\n returnValue = groupDescription + ' ' + returnValue;\n }\n\n // Increase group level/number\n group++;\n }\n\n // Replace multiple spaces with one space\n returnValue = returnValue.replaceAll(/ +/g, ' ');\n\n return returnValue.trim();\n }\n}\n\n/**\n * Converts a value to cardinal (written) form.\n * @param {number|string|bigint} value Number to be convert.\n * @param {object} [options] Options for class.\n * @returns {string} Value in cardinal (written) format.\n * @throws {Error} Value cannot be invalid.\n */\nexport default function floatToCardinal (value, options = {}) {\n return new Arabic(options).floatToCardinal(value);\n}\n","import AbstractLanguage from '../classes/abstract-language.js';\n\nexport class N2WordsFA extends AbstractLanguage {\n namedNumbers = {\n 0: 'صفر',\n 1: 'یک',\n 2: 'دو',\n 3: 'سه',\n 4: 'چهار',\n 5: 'پنج',\n 6: 'شش',\n 7: 'هفت',\n 8: 'هشت',\n 9: 'نه',\n 10: 'ده',\n 11: 'یازده',\n 12: 'دوازده',\n 13: 'سیزده',\n 14: 'چهارده',\n 15: 'پانزده',\n 16: 'شانزده',\n 17: 'هفده',\n 18: 'هجده',\n 19: 'نوزده',\n 20: 'بیست',\n 30: 'سی',\n 40: 'چهل',\n 50: 'پنجاه',\n 60: 'شصت',\n 70: 'هفتاد',\n 80: 'هشتاد',\n 90: 'نود',\n 100: 'صد',\n 200: 'دویست',\n 300: 'سيصد',\n 400: 'چهار صد',\n 500: 'پانصد',\n 600: 'ششصد',\n 700: 'هفتصد',\n 800: 'هشتصد',\n 900: 'نهصد',\n 1000: 'هزار',\n 1_000_000: 'میلیون',\n };\n\n constructor(options) {\n options = Object.assign({\n negativeWord: 'منفى',\n separatorWord: 'ممیّز',\n zero: 'صفر'\n }, options);\n\n super(options);\n }\n\n toCardinal(number) {\n if (this.namedNumbers[number] && number !== 1_000_000n) {\n return this.namedNumbers[number];\n }\n\n if (number > 20n && number < 100n) {\n let xone = number % 10n;\n let xten = number - xone;\n return `${this.namedNumbers[xten]} و ${this.namedNumbers[xone]}`;\n }\n\n if (number > 100n && number < 1000n) {\n let xhundred = 100n * (number / 100n);\n let tail = this.toCardinal(number - xhundred);\n return `${this.namedNumbers[xhundred]} و ${tail}`;\n }\n\n if (number > 1000n && number < 1_000_000n) {\n let thousandMultiplier = number / 1000n;\n let namedThousandMultiplier =\n (thousandMultiplier == 1n\n ? ''\n : this.toCardinal(thousandMultiplier)) +\n ' ' +\n this.namedNumbers[1000];\n let tailNumber = number - thousandMultiplier * 1000n;\n let tail = tailNumber == 0n ? '' : ' ' + this.toCardinal(tailNumber);\n return `${namedThousandMultiplier}${tail}`;\n }\n\n if (number >= 1_000_000n) {\n let millionMultiplier = number / 1_000_000n;\n let namedMillion =\n this.toCardinal(millionMultiplier) + ' ' + this.namedNumbers[1_000_000];\n let tailNumber = number - millionMultiplier * 1_000_000n;\n let tail = tailNumber == 0n ? '' : ' و ' + this.toCardinal(tailNumber);\n return `${namedMillion}${tail}`;\n }\n }\n}\n\n/**\n * Converts a value to cardinal (written) form.\n * @param {number|string|bigint} value Number to be convert.\n * @param {object} [options] Options for class.\n * @returns {string} Value in cardinal (written) format.\n * @throws {Error} Value cannot be invalid.\n */\nexport default function floatToCardinal (value, options = {}) {\n return new N2WordsFA(options).floatToCardinal(value);\n}\n","'use strict';\nvar internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\n// `Object.keys` method\n// https://tc39.es/ecma262/#sec-object.keys\n// eslint-disable-next-line es/no-object-keys -- safe\nmodule.exports = Object.keys || function keys(O) {\n return internalObjectKeys(O, enumBugKeys);\n};\n","import { N2WordsRU } from './ru.js';\n\nexport class N2WordsCZ extends N2WordsRU {\n ones = {\n 1: 'jedna',\n 2: 'dva',\n 3: 'tři',\n 4: 'čtyři',\n 5: 'pět',\n 6: 'šest',\n 7: 'sedm',\n 8: 'osm',\n 9: 'devět'\n };\n\n tens = {\n 0: 'deset',\n 1: 'jedenáct',\n 2: 'dvanáct',\n 3: 'třináct',\n 4: 'čtrnáct',\n 5: 'patnáct',\n 6: 'šestnáct',\n 7: 'sedmnáct',\n 8: 'osmnáct',\n 9: 'devatenáct'\n };\n\n twenties = {\n 2: 'dvacet',\n 3: 'třicet',\n 4: 'čtyřicet',\n 5: 'padesát',\n 6: 'šedesát',\n 7: 'sedmdesát',\n 8: 'osmdesát',\n 9: 'devadesát'\n };\n\n hundreds = {\n 1: 'sto',\n 2: 'dvě stě',\n 3: 'tři sta',\n 4: 'čtyři sta',\n 5: 'pět set',\n 6: 'šest set',\n 7: 'sedm set',\n 8: 'osm set',\n 9: 'devět set'\n };\n\n thousands = {\n 1: ['tisíc', 'tisíce', 'tisíc'], // 10^ 3\n 2: ['milion', 'miliony', 'milionů'], // 10^ 6\n 3: ['miliarda', 'miliardy', 'miliard'], // 10^ 9\n 4: ['bilion', 'biliony', 'bilionů'], // 10^ 12\n 5: ['biliarda', 'biliardy', 'biliard'], // 10^ 15\n 6: ['trilion', 'triliony', 'trilionů'], // 10^ 18\n 7: ['triliarda', 'triliardy', 'triliard'], // 10^ 21\n 8: ['kvadrilion', 'kvadriliony', 'kvadrilionů'], // 10^ 24\n 9: ['kvadriliarda', 'kvadriliardy', 'kvadriliard'], // 10^ 27\n 10: ['quintillion', 'quintilliony', 'quintillionů'], // 10^ 30\n };\n\n constructor(options) {\n options = Object.assign({\n negativeWord: 'mínus',\n zero: 'nula'\n }, options);\n\n super(options);\n }\n\n get separatorWord() {\n if (this.wholeNumber == 0n || this.wholeNumber == 1n) {\n return 'celá';\n } else if (this.wholeNumber >= 2n && this.wholeNumber <= 4n) {\n return 'celé';\n } else {\n return 'celých';\n }\n }\n\n pluralize(n, forms) {\n let form = 2;\n if (n == 1) {\n form = 0;\n } else if (((n % 10n < 5n) && (n % 10n > 1n)) && (n % 100n < 10n || n % 100n > 20n)) {\n form = 1;\n }\n return forms[form];\n }\n\n toCardinal(number) {\n if (number == 0) {\n return this.zero;\n }\n const words = [];\n const chunks = this.splitByX(number.toString(), 3);\n let index = chunks.length;\n for (const x of chunks) {\n index = index - 1;\n if (x == 0) {\n continue;\n }\n const [n1, n2, n3] = this.getDigits(x);\n if (n3 > 0) {\n words.push(this.hundreds[n3]);\n }\n if (n2 > 1) {\n words.push(this.twenties[n2]);\n }\n if (n2 == 1) {\n words.push(this.tens[n1]);\n } else if (n1 > 0 && !(index > 0 && x == 1)) {\n words.push(this.ones[n1]);\n }\n if (index > 0) {\n words.push(this.pluralize(x, this.thousands[index]));\n }\n }\n return words.join(' ');\n }\n}\n\n/**\n * Converts a value to cardinal (written) form.\n * @param {number|string|bigint} value Number to be convert.\n * @param {object} [options] Options for class.\n * @returns {string} Value in cardinal (written) format.\n * @throws {Error} Value cannot be invalid.\n */\nexport default function floatToCardinal (value, options = {}) {\n return new N2WordsCZ(options).floatToCardinal(value);\n}\n","'use strict';\nvar NATIVE_WEAK_MAP = require('../internals/weak-map-basic-detection');\nvar globalThis = require('../internals/global-this');\nvar isObject = require('../internals/is-object');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar hasOwn = require('../internals/has-own-property');\nvar shared = require('../internals/shared-store');\nvar sharedKey = require('../internals/shared-key');\nvar hiddenKeys = require('../internals/hidden-keys');\n\nvar OBJECT_ALREADY_INITIALIZED = 'Object already initialized';\nvar TypeError = globalThis.TypeError;\nvar WeakMap = globalThis.WeakMap;\nvar set, get, has;\n\nvar enforce = function (it) {\n return has(it) ? get(it) : set(it, {});\n};\n\nvar getterFor = function (TYPE) {\n return function (it) {\n var state;\n if (!isObject(it) || (state = get(it)).type !== TYPE) {\n throw new TypeError('Incompatible receiver, ' + TYPE + ' required');\n } return state;\n };\n};\n\nif (NATIVE_WEAK_MAP || shared.state) {\n var store = shared.state || (shared.state = new WeakMap());\n /* eslint-disable no-self-assign -- prototype methods protection */\n store.get = store.get;\n store.has = store.has;\n store.set = store.set;\n /* eslint-enable no-self-assign -- prototype methods protection */\n set = function (it, metadata) {\n if (store.has(it)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);\n metadata.facade = it;\n store.set(it, metadata);\n return metadata;\n };\n get = function (it) {\n return store.get(it) || {};\n };\n has = function (it) {\n return store.has(it);\n };\n} else {\n var STATE = sharedKey('state');\n hiddenKeys[STATE] = true;\n set = function (it, metadata) {\n if (hasOwn(it, STATE)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);\n metadata.facade = it;\n createNonEnumerableProperty(it, STATE, metadata);\n return metadata;\n };\n get = function (it) {\n return hasOwn(it, STATE) ? it[STATE] : {};\n };\n has = function (it) {\n return hasOwn(it, STATE);\n };\n}\n\nmodule.exports = {\n set: set,\n get: get,\n has: has,\n enforce: enforce,\n getterFor: getterFor\n};\n","import BaseLanguage from '../classes/base-language.js';\n\nexport class N2WordsPT extends BaseLanguage {\n hundreds = {\n 1: 'cento',\n 2: 'duzentos',\n 3: 'trezentos',\n 4: 'quatrocentos',\n 5: 'quinhentos',\n 6: 'seiscentos',\n 7: 'setecentos',\n 8: 'oitocentos',\n 9: 'novecentos'\n };\n\n constructor(options) {\n options = Object.assign({\n negativeWord: 'menos',\n separatorWord: 'vírgula',\n zero: 'zero'\n }, options);\n\n super(options, [\n [1_000_000_000_000_000_000_000_000n, 'quatrilião'],\n [1_000_000_000_000_000_000n, 'trilião'],\n [1_000_000_000_000n, 'bilião'],\n [1_000_000n, 'milião'],\n [1000n, 'mil'],\n [100n, 'cem'],\n [90n, 'noventa'],\n [80n, 'oitenta'],\n [70n, 'setenta'],\n [60n, 'sessenta'],\n [50n, 'cinquenta'],\n [40n, 'quarenta'],\n [30n, 'trinta'],\n [20n, 'vinte'],\n [19n, 'dezanove'],\n [18n, 'dezoito'],\n [17n, 'dezassete'],\n [16n, 'dezasseis'],\n [15n, 'quinze'],\n [14n, 'catorze'],\n [13n, 'treze'],\n [12n, 'doze'],\n [11n, 'onze'],\n [10n, 'dez'],\n [9n, 'nove'],\n [8n, 'oito'],\n [7n, 'sete'],\n [6n, 'seis'],\n [5n, 'cinco'],\n [4n, 'quatro'],\n [3n, 'três'],\n [2n, 'dois'],\n [1n, 'um'],\n [0n, 'zero']\n ]);\n }\n\n postClean(words) {\n const transforms = ['mil', 'milhão', 'milhões', 'mil milhões', 'bilião', 'biliões', 'mil biliões'];\n\n for (const transform of transforms) {\n if (new RegExp(`.*${transform} e \\\\w*entos? (?=.*e)`).test(words)) {\n words = words.replaceAll(new RegExp(`${transform} e`, 'g'), `${transform}`);\n }\n }\n\n return words;\n }\n\n merge(current, next) {\n let cText = Object.keys(current)[0];\n let nText = Object.keys(next)[0];\n const cNumber = BigInt(Object.values(current)[0]);\n const nNumber = BigInt(Object.values(next)[0]);\n\n if (cNumber == 1) {\n if (nNumber < 1_000_000) return { [nText]: nNumber };\n cText = 'um';\n } else if (cNumber == 100 && nNumber % 1000n != 0) {\n cText = 'cento';\n }\n\n if (nNumber < cNumber) {\n // if (cNum < 100) {\n // return { [`${cText} e ${nText}`]: cNum + nNum }\n // }\n return { [`${cText} e ${nText}`]: cNumber + nNumber };\n } else if (nNumber % 1_000_000_000n == 0 && cNumber > 1) {\n nText = nText.slice(0, -4) + 'liões';\n } else if (nNumber % 1_000_000n == 0 && cNumber > 1) {\n nText = nText.slice(0, -4) + 'lhões';\n }\n\n if (nText == 'milião') nText = 'milhão';\n\n if (nNumber == 100) {\n cText = this.hundreds[cNumber];\n nText = '';\n } else {\n nText = ' ' + nText;\n }\n return { [`${cText}${nText}`]: cNumber * nNumber };\n }\n}\n\n/**\n * Converts a value to cardinal (written) form.\n * @param {number|string|bigint} value Number to be convert.\n * @param {object} [options] Options for class.\n * @returns {string} Value in cardinal (written) format.\n * @throws {Error} Value cannot be invalid.\n */\nexport default function floatToCardinal (value, options = {}) {\n return new N2WordsPT(options).floatToCardinal(value);\n}\n","'use strict';\nvar trunc = require('../internals/math-trunc');\n\n// `ToIntegerOrInfinity` abstract operation\n// https://tc39.es/ecma262/#sec-tointegerorinfinity\nmodule.exports = function (argument) {\n var number = +argument;\n // eslint-disable-next-line no-self-compare -- NaN check\n return number !== number || number === 0 ? 0 : trunc(number);\n};\n","import BaseLanguage from '../classes/base-language.js';\n\n/**\n * This class is for converting numbers to english words.\n */\nexport class English extends BaseLanguage {\n constructor(options) {\n options = Object.assign({\n negativeWord: 'minus',\n separatorWord: 'point',\n zero: 'zero'\n }, options);\n\n super(options, [\n [1_000_000_000_000_000_000_000_000_000n, 'octillion'],\n [1_000_000_000_000_000_000_000_000n, 'septillion'],\n [1_000_000_000_000_000_000_000n, 'sextillion'],\n [1_000_000_000_000_000_000n, 'quintillion'],\n [1_000_000_000_000_000n, 'quadrillion'],\n [1_000_000_000_000n, 'trillion'],\n [1_000_000_000n, 'billion'],\n [1_000_000n, 'million'],\n [1000n, 'thousand'],\n [100n, 'hundred'],\n [90n, 'ninety'],\n [80n, 'eighty'],\n [70n, 'seventy'],\n [60n, 'sixty'],\n [50n, 'fifty'],\n [40n, 'forty'],\n [30n, 'thirty'],\n [20n, 'twenty'],\n [19n, 'nineteen'],\n [18n, 'eighteen'],\n [17n, 'seventeen'],\n [16n, 'sixteen'],\n [15n, 'fifteen'],\n [14n, 'fourteen'],\n [13n, 'thirteen'],\n [12n, 'twelve'],\n [11n, 'eleven'],\n [10n, 'ten'],\n [9n, 'nine'],\n [8n, 'eight'],\n [7n, 'seven'],\n [6n, 'six'],\n [5n, 'five'],\n [4n, 'four'],\n [3n, 'three'],\n [2n, 'two'],\n [1n, 'one'],\n [0n, 'zero']\n ]);\n }\n\n /**\n * Merge word set pairs\n * @param {object} lPair {'one':1}\n * @param {object} rPair {'hundred':100}\n * @returns {object} {'one hundred': 100}\n */\n merge(lPair, rPair) {\n const lText = Object.keys(lPair)[0];\n const lNumber = BigInt(Object.values(lPair)[0]);\n const rText = Object.keys(rPair)[0];\n const rNumber = BigInt(Object.values(rPair)[0]);\n\n if (lNumber == 1 && rNumber < 100) return { [rText]: rNumber };\n else if (100 > lNumber && lNumber > rNumber) return { [`${lText}-${rText}`]: lNumber + rNumber };\n else if (lNumber >= 100 && 100 > rNumber) return { [`${lText} and ${rText}`]: lNumber + rNumber };\n else if (rNumber > lNumber) return { [`${lText} ${rText}`]: lNumber * rNumber };\n\n return { [`${lText} ${rText}`]: lNumber + rNumber };\n }\n}\n\n/**\n * Converts a value to cardinal (written) form.\n * @param {number|string|bigint} value Number to be convert.\n * @param {object} [options] Options for class.\n * @returns {string} Value in cardinal (written) format.\n * @throws {Error} Value cannot be invalid.\n */\nexport default function floatToCardinal (value, options = {}) {\n return new English(options).floatToCardinal(value);\n}\n","'use strict';\nvar iteratorClose = require('../internals/iterator-close');\n\nmodule.exports = function (iters, kind, value) {\n for (var i = iters.length - 1; i >= 0; i--) {\n if (iters[i] === undefined) continue;\n try {\n value = iteratorClose(iters[i].iterator, kind, value);\n } catch (error) {\n kind = 'throw';\n value = error;\n }\n }\n if (kind === 'throw') throw value;\n return value;\n};\n","'use strict';\n// TODO: Remove from `core-js@4`\nrequire('../modules/es.iterator.map');\n","import BaseLanguage from '../classes/base-language.js';\n\nexport class N2WordsHU extends BaseLanguage {\n constructor(options) {\n options = Object.assign({\n negativeWord: 'mínusz',\n separatorWord: 'egész',\n zero: 'nulla'\n }, options);\n\n super(options, [\n [1_000_000_000_000_000_000_000_000_000n, 'quadrilliárd'],\n [1_000_000_000_000_000_000_000_000n, 'quadrillió'],\n [1_000_000_000_000_000_000_000n, 'trilliárd'],\n [1_000_000_000_000_000_000n, 'trillió'],\n [1_000_000_000_000_000n, 'billiárd'],\n [1_000_000_000_000n, 'billió'],\n [1_000_000_000n, 'milliárd'],\n [1_000_000n, 'millió'],\n [1000n, 'ezer'],\n [100n, 'száz'],\n [90n, 'kilencven'],\n [80n, 'nyolcvan'],\n [70n, 'hetven'],\n [60n, 'hatvan'],\n [50n, 'ötven'],\n [40n, 'negyven'],\n [30n, 'harminc'],\n [29n, 'huszonkilenc'],\n [28n, 'huszonnyolc'],\n [27n, 'huszonhét'],\n [26n, 'huszonhat'],\n [25n, 'huszonöt'],\n [24n, 'huszonnégy'],\n [23n, 'huszonhárom'],\n [22n, 'huszonkettő'],\n [21n, 'huszonegy'],\n [20n, 'húsz'],\n [19n, 'tizenkilenc'],\n [18n, 'tizennyolc'],\n [17n, 'tizenhét'],\n [16n, 'tizenhat'],\n [15n, 'tizenöt'],\n [14n, 'tizennégy'],\n [13n, 'tizenhárom'],\n [12n, 'tizenkettő'],\n [11n, 'tizenegy'],\n [10n, 'tíz'],\n [9n, 'kilenc'],\n [8n, 'nyolc'],\n [7n, 'hét'],\n [6n, 'hat'],\n [5n, 'öt'],\n [4n, 'négy'],\n [3n, 'három'],\n [2n, 'kettő'],\n [1n, 'egy'],\n [0n, 'nulla']\n ]);\n }\n\n tensToCardinal(number) {\n if (this.getCardWord(number)) {\n return this.getCardWord(number);\n } else {\n const tens = Math.floor(number / 10);\n const units = number % 10;\n return this.getCardWord(tens * 10) + this.toCardinal(units);\n }\n }\n\n hundredsToCardinal(number) {\n const hundreds = Math.floor(number / 100);\n let prefix = 'száz';\n if (hundreds != 1) {\n prefix = this.toCardinal(hundreds, '') + prefix;\n }\n const postfix = this.toCardinal(number % 100, '');\n return prefix + postfix;\n }\n\n thousandsToCardinal(number) {\n const thousands = Math.floor(number / 1000);\n let prefix = 'ezer';\n if (thousands != 1) {\n prefix = this.toCardinal(thousands, '') + prefix;\n }\n let postfix = this.toCardinal(number % 1000, '');\n let middle = (number <= 2000 || postfix == '') ? '' : '-';\n return prefix + middle + postfix;\n }\n\n bigNumberToCardinal(number) {\n const numberLength = number.toString().length;\n let digits = (numberLength % 3 === 0) ? numberLength - 2 : numberLength;\n let exp = 10 ** (Math.floor(digits / 3) * 3);\n let prefix = this.toCardinal(number / BigInt(exp), '');\n let rest = this.toCardinal(number % BigInt(exp), '');\n let postfix = (rest === '') ? '' : ('-' + rest);\n return prefix + this.getCardWord(exp) + postfix;\n }\n\n toCardinal(number, zero = this.zero) {\n let words = '';\n\n if (number == 0n) {\n words = zero;\n } else if (zero == '' && number == 2) {\n words = 'két';\n } else if (number < 30n) {\n words = this.getCardWord(Number(number));\n } else if (number < 100n) {\n words = this.tensToCardinal(Number(number));\n } else if (number < 1000n) {\n words = this.hundredsToCardinal(Number(number));\n } else if (number < 1_000_000n) {\n words = this.thousandsToCardinal(Number(number));\n } else {\n words = this.bigNumberToCardinal(number);\n }\n\n return words;\n }\n}\n\n/**\n * Converts a value to cardinal (written) form.\n * @param {number|string|bigint} value Number to be convert.\n * @param {object} [options] Options for class.\n * @returns {string} Value in cardinal (written) format.\n * @throws {Error} Value cannot be invalid.\n */\nexport default function floatToCardinal (value, options = {}) {\n return new N2WordsHU(options).floatToCardinal(value);\n}\n","import { N2WordsRU } from './ru.js';\n\nexport class N2WordsHR extends N2WordsRU {\n ones = {\n 1: ['jedan', 'jedna'],\n 2: ['dva', 'dvije'],\n 3: ['tri', 'tri'],\n 4: ['četiri', 'četiri'],\n 5: ['pet', 'pet'],\n 6: ['šest', 'šest'],\n 7: ['sedam', 'sedam'],\n 8: ['osam', 'osam'],\n 9: ['devet', 'devet']\n };\n\n tens = {\n 0: 'deset',\n 1: 'jedanaest',\n 2: 'dvanaest',\n 3: 'trinaest',\n 4: 'četrnaest',\n 5: 'petnaest',\n 6: 'šesnaest',\n 7: 'sedamnaest',\n 8: 'osamnaest',\n 9: 'devetnaest'\n };\n\n twenties = {\n 2: 'dvadeset',\n 3: 'trideset',\n 4: 'četrdeset',\n 5: 'pedeset',\n 6: 'šezdeset',\n 7: 'sedamdeset',\n 8: 'osamdeset',\n 9: 'devedeset'\n };\n\n hundreds = {\n 1: 'sto',\n 2: 'dvjesto',\n 3: 'tristo',\n 4: 'četiristo',\n 5: 'petsto',\n 6: 'šesto',\n 7: 'sedamsto',\n 8: 'osamsto',\n 9: 'devetsto'\n };\n\n SCALE = {\n 0: ['', '', '', false],\n 1: ['tisuća', 'tisuće', 'tisuća', true], // 10 ^ 3\n 2: ['milijun', 'milijuna', 'milijuna', false], // 10 ^ 6\n 3: ['milijarda', 'milijarde', 'milijarda', false], // 10 ^ 9\n 4: ['bilijun', 'bilijuna', 'bilijuna', false], // 10 ^ 12\n 5: ['bilijarda', 'bilijarde', 'bilijarda', false], // 10 ^ 15\n 6: ['trilijun', 'trilijuna', 'trilijuna', false], // 10 ^ 18\n 7: ['trilijarda', 'trilijarde', 'trilijarda', false], // 10 ^ 21\n 8: ['kvadrilijun', 'kvadrilijuna', 'kvadrilijuna', false], // 10 ^ 24\n 9: ['kvadrilijarda', 'kvadrilijarde', 'kvadrilijarda', false], // 10 ^ 27\n 10: ['kvintilijun', 'kvintilijuna', 'kvintilijuna', false], // 10 ^ 30\n };\n\n constructor(options) {\n options = Object.assign({\n negativeWord: 'minus',\n separatorWord: 'zarez',\n zero: 'nula'\n }, options);\n\n super(options);\n }\n\n pluralize(n, forms) {\n let form = 2;\n if ((n % 100n < 10n) || (n % 100n > 20n)) {\n if (n % 10n == 1n) {\n form = 0;\n } else if ((n % 10n > 1n) && (n % 10n < 5n)) {\n form = 1;\n }\n }\n return forms[form];\n }\n\n toCardinal(number) {\n if (number == 0) {\n return this.zero;\n }\n const words = [];\n const chunks = this.splitByX(number.toString(), 3);\n let index = chunks.length;\n for (const x of chunks) {\n index = index - 1;\n // if (x == 0) { continue; }\n const [n1, n2, n3] = this.getDigits(x);\n if (n3 > 0) {\n words.push(this.hundreds[n3]);\n }\n if (n2 > 1) {\n words.push(this.twenties[n2]);\n }\n if (n2 == 1) {\n words.push(this.tens[n1]);\n } else if (n1 > 0) {\n const isFeminine = (this.feminine || this.SCALE[index][3]);\n const genderIndex = isFeminine ? 1 : 0;\n words.push(this.ones[n1][genderIndex]);\n }\n if ((index > 0) && (x != 0)) {\n words.push(this.pluralize(x, this.SCALE[index]));\n }\n }\n return words.join(' ');\n }\n}\n\n/**\n * Converts a value to cardinal (written) form.\n * @param {number|string|bigint} value Number to be convert.\n * @param {object} [options] Options for class.\n * @returns {string} Value in cardinal (written) format.\n * @throws {Error} Value cannot be invalid.\n */\nexport default function floatToCardinal (value, options = {}) {\n return new N2WordsHR(options).floatToCardinal(value);\n}\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\nmodule.exports = uncurryThis({}.isPrototypeOf);\n","'use strict';\nvar $ = require('../internals/export');\nvar union = require('../internals/set-union');\nvar setMethodGetKeysBeforeCloning = require('../internals/set-method-get-keys-before-cloning-detection');\nvar setMethodAcceptSetLike = require('../internals/set-method-accept-set-like');\n\nvar FORCED = !setMethodAcceptSetLike('union') || !setMethodGetKeysBeforeCloning('union');\n\n// `Set.prototype.union` method\n// https://tc39.es/ecma262/#sec-set.prototype.union\n$({ target: 'Set', proto: true, real: true, forced: FORCED }, {\n union: union\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar aCallable = require('../internals/a-callable');\nvar anObject = require('../internals/an-object');\nvar getIteratorDirect = require('../internals/get-iterator-direct');\nvar createIteratorProxy = require('../internals/iterator-create-proxy');\nvar callWithSafeIterationClosing = require('../internals/call-with-safe-iteration-closing');\nvar iteratorClose = require('../internals/iterator-close');\nvar iteratorHelperThrowsOnInvalidIterator = require('../internals/iterator-helper-throws-on-invalid-iterator');\nvar iteratorHelperWithoutClosingOnEarlyError = require('../internals/iterator-helper-without-closing-on-early-error');\nvar IS_PURE = require('../internals/is-pure');\n\nvar MAP_WITHOUT_THROWING_ON_INVALID_ITERATOR = !IS_PURE && !iteratorHelperThrowsOnInvalidIterator('map', function () { /* empty */ });\nvar mapWithoutClosingOnEarlyError = !IS_PURE && !MAP_WITHOUT_THROWING_ON_INVALID_ITERATOR\n && iteratorHelperWithoutClosingOnEarlyError('map', TypeError);\n\nvar FORCED = IS_PURE || MAP_WITHOUT_THROWING_ON_INVALID_ITERATOR || mapWithoutClosingOnEarlyError;\n\nvar IteratorProxy = createIteratorProxy(function () {\n var iterator = this.iterator;\n var result = anObject(call(this.next, iterator));\n var done = this.done = !!result.done;\n if (!done) return callWithSafeIterationClosing(iterator, this.mapper, [result.value, this.counter++], true);\n});\n\n// `Iterator.prototype.map` method\n// https://tc39.es/ecma262/#sec-iterator.prototype.map\n$({ target: 'Iterator', proto: true, real: true, forced: FORCED }, {\n map: function map(mapper) {\n anObject(this);\n try {\n aCallable(mapper);\n } catch (error) {\n iteratorClose(this, 'throw', error);\n }\n\n if (mapWithoutClosingOnEarlyError) return call(mapWithoutClosingOnEarlyError, this, mapper);\n\n return new IteratorProxy(getIteratorDirect(this), {\n mapper: mapper\n });\n }\n});\n","'use strict';\n// `GetIteratorDirect(obj)` abstract operation\n// https://tc39.es/ecma262/#sec-getiteratordirect\nmodule.exports = function (obj) {\n return {\n iterator: obj,\n next: obj.next,\n done: false\n };\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar hasOwn = require('../internals/has-own-property');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar indexOf = require('../internals/array-includes').indexOf;\nvar hiddenKeys = require('../internals/hidden-keys');\n\nvar push = uncurryThis([].push);\n\nmodule.exports = function (object, names) {\n var O = toIndexedObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) !hasOwn(hiddenKeys, key) && hasOwn(O, key) && push(result, key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (hasOwn(O, key = names[i++])) {\n ~indexOf(result, key) || push(result, key);\n }\n return result;\n};\n","import { N2WordsRU } from './ru.js';\n\nexport class N2WordsHE extends N2WordsRU {\n and;\n\n ones = {\n 1: 'אחת',\n 2: 'שתים',\n 3: 'שלש',\n 4: 'ארבע',\n 5: 'חמש',\n 6: 'שש',\n 7: 'שבע',\n 8: 'שמונה',\n 9: 'תשע'\n };\n\n tens = {\n 0: 'עשר',\n 1: 'אחת עשרה',\n 2: 'שתים עשרה',\n 3: 'שלש עשרה',\n 4: 'ארבע עשרה',\n 5: 'חמש עשרה',\n 6: 'שש עשרה',\n 7: 'שבע עשרה',\n 8: 'שמונה עשרה',\n 9: 'תשע עשרה'\n };\n\n twenties = {\n 2: 'עשרים',\n 3: 'שלשים',\n 4: 'ארבעים',\n 5: 'חמישים',\n 6: 'ששים',\n 7: 'שבעים',\n 8: 'שמונים',\n 9: 'תשעים'\n };\n\n hundreds = {\n 1: 'מאה',\n 2: 'מאתיים',\n 3: 'מאות'\n };\n\n thousands = {\n 1: 'אלף',\n 2: 'אלפיים',\n 3: 'שלשת אלפים',\n 4: 'ארבעת אלפים',\n 5: 'חמשת אלפים',\n 6: 'ששת אלפים',\n 7: 'שבעת אלפים',\n 8: 'שמונת אלפים',\n 9: 'תשעת אלפים'\n };\n\n constructor(options) {\n // TODO Confirm `negativeWord`\n // TODO Set `separatorWord`\n options = Object.assign({\n negativeWord: 'מינוס',\n //separatorWord: ,\n zero: 'אפס',\n and: 'ו'\n }, options);\n\n super(options);\n\n this.and = options.and;\n }\n\n toCardinal(number) {\n if (number == 0) {\n return this.zero;\n }\n const words = [];\n const chunks = this.splitByX(number.toString(), 3);\n let index = chunks.length;\n for (const x of chunks) {\n index = index - 1;\n if (x == 0) {\n continue;\n }\n\n const [n1, n2, n3] = this.getDigits(x);\n\n if (index > 0) {\n words.push(this.thousands[n1]);\n continue;\n }\n\n\n if (n3 > 0) {\n if (n3 <= 2) {\n words.push(this.hundreds[n3]);\n } else {\n words.push(this.ones[n3] + ' ' + this.hundreds[3]);\n }\n }\n\n if (n2 > 1) {\n words.push(this.twenties[n2]);\n }\n\n if (n2 == 1) {\n words.push(this.tens[n1]);\n } else if (n1 > 0) {\n words.push(this.ones[n1]);\n }\n }\n\n if (words.length > 1) {\n words[words.length - 1] = this.and + words.at(-1);\n }\n\n return words.join(' ');\n }\n}\n\n/**\n * Converts a value to cardinal (written) form.\n * @param {number|string|bigint} value Number to be convert.\n * @param {object} [options] Options for class.\n * @returns {string} Value in cardinal (written) format.\n * @throws {Error} Value cannot be invalid.\n */\nexport default function floatToCardinal (value, options = {}) {\n return new N2WordsHE(options).floatToCardinal(value);\n}\n","'use strict';\nvar makeBuiltIn = require('../internals/make-built-in');\nvar defineProperty = require('../internals/object-define-property');\n\nmodule.exports = function (target, name, descriptor) {\n if (descriptor.get) makeBuiltIn(descriptor.get, name, { getter: true });\n if (descriptor.set) makeBuiltIn(descriptor.set, name, { setter: true });\n return defineProperty.f(target, name, descriptor);\n};\n","'use strict';\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar test = {};\n\ntest[TO_STRING_TAG] = 'z';\n\nmodule.exports = String(test) === '[object z]';\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\nvar toString = uncurryThis({}.toString);\nvar stringSlice = uncurryThis(''.slice);\n\nmodule.exports = function (it) {\n return stringSlice(toString(it), 8, -1);\n};\n","'use strict';\nvar fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n function F() { /* empty */ }\n F.prototype.constructor = null;\n // eslint-disable-next-line es/no-object-getprototypeof -- required for testing\n return Object.getPrototypeOf(new F()) !== F.prototype;\n});\n","'use strict';\n/* global ActiveXObject -- old IE, WSH */\nvar anObject = require('../internals/an-object');\nvar definePropertiesModule = require('../internals/object-define-properties');\nvar enumBugKeys = require('../internals/enum-bug-keys');\nvar hiddenKeys = require('../internals/hidden-keys');\nvar html = require('../internals/html');\nvar documentCreateElement = require('../internals/document-create-element');\nvar sharedKey = require('../internals/shared-key');\n\nvar GT = '>';\nvar LT = '<';\nvar PROTOTYPE = 'prototype';\nvar SCRIPT = 'script';\nvar IE_PROTO = sharedKey('IE_PROTO');\n\nvar EmptyConstructor = function () { /* empty */ };\n\nvar scriptTag = function (content) {\n return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;\n};\n\n// Create object with fake `null` prototype: use ActiveX Object with cleared prototype\nvar NullProtoObjectViaActiveX = function (activeXDocument) {\n activeXDocument.write(scriptTag(''));\n activeXDocument.close();\n var temp = activeXDocument.parentWindow.Object;\n // eslint-disable-next-line no-useless-assignment -- avoid memory leak\n activeXDocument = null;\n return temp;\n};\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar NullProtoObjectViaIFrame = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = documentCreateElement('iframe');\n var JS = 'java' + SCRIPT + ':';\n var iframeDocument;\n iframe.style.display = 'none';\n html.appendChild(iframe);\n // https://github.com/zloirock/core-js/issues/475\n iframe.src = String(JS);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(scriptTag('document.F=Object'));\n iframeDocument.close();\n return iframeDocument.F;\n};\n\n// Check for document.domain and active x support\n// No need to use active x approach when document.domain is not set\n// see https://github.com/es-shims/es5-shim/issues/150\n// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346\n// avoid IE GC bug\nvar activeXDocument;\nvar NullProtoObject = function () {\n try {\n activeXDocument = new ActiveXObject('htmlfile');\n } catch (error) { /* ignore */ }\n NullProtoObject = typeof document != 'undefined'\n ? document.domain && activeXDocument\n ? NullProtoObjectViaActiveX(activeXDocument) // old IE\n : NullProtoObjectViaIFrame()\n : NullProtoObjectViaActiveX(activeXDocument); // WSH\n var length = enumBugKeys.length;\n while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];\n return NullProtoObject();\n};\n\nhiddenKeys[IE_PROTO] = true;\n\n// `Object.create` method\n// https://tc39.es/ecma262/#sec-object.create\n// eslint-disable-next-line es/no-object-create -- safe\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n EmptyConstructor[PROTOTYPE] = anObject(O);\n result = new EmptyConstructor();\n EmptyConstructor[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = NullProtoObject();\n return Properties === undefined ? result : definePropertiesModule.f(result, Properties);\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar isSupersetOf = require('../internals/set-is-superset-of');\nvar setMethodAcceptSetLike = require('../internals/set-method-accept-set-like');\n\nvar INCORRECT = !setMethodAcceptSetLike('isSupersetOf', function (result) {\n return !result;\n});\n\n// `Set.prototype.isSupersetOf` method\n// https://tc39.es/ecma262/#sec-set.prototype.issupersetof\n$({ target: 'Set', proto: true, real: true, forced: INCORRECT }, {\n isSupersetOf: isSupersetOf\n});\n","'use strict';\n// `CreateIterResultObject` abstract operation\n// https://tc39.es/ecma262/#sec-createiterresultobject\nmodule.exports = function (value, done) {\n return { value: value, done: done };\n};\n","'use strict';\n// TODO: Remove from `core-js@4`\nrequire('../modules/es.iterator.find');\n","'use strict';\nvar bind = require('../internals/function-bind-context');\nvar call = require('../internals/function-call');\nvar anObject = require('../internals/an-object');\nvar tryToString = require('../internals/try-to-string');\nvar isArrayIteratorMethod = require('../internals/is-array-iterator-method');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar getIterator = require('../internals/get-iterator');\nvar getIteratorMethod = require('../internals/get-iterator-method');\nvar iteratorClose = require('../internals/iterator-close');\n\nvar $TypeError = TypeError;\n\nvar Result = function (stopped, result) {\n this.stopped = stopped;\n this.result = result;\n};\n\nvar ResultPrototype = Result.prototype;\n\nmodule.exports = function (iterable, unboundFunction, options) {\n var that = options && options.that;\n var AS_ENTRIES = !!(options && options.AS_ENTRIES);\n var IS_RECORD = !!(options && options.IS_RECORD);\n var IS_ITERATOR = !!(options && options.IS_ITERATOR);\n var INTERRUPTED = !!(options && options.INTERRUPTED);\n var fn = bind(unboundFunction, that);\n var iterator, iterFn, index, length, result, next, step;\n\n var stop = function (condition) {\n if (iterator) iteratorClose(iterator, 'normal');\n return new Result(true, condition);\n };\n\n var callFn = function (value) {\n if (AS_ENTRIES) {\n anObject(value);\n return INTERRUPTED ? fn(value[0], value[1], stop) : fn(value[0], value[1]);\n } return INTERRUPTED ? fn(value, stop) : fn(value);\n };\n\n if (IS_RECORD) {\n iterator = iterable.iterator;\n } else if (IS_ITERATOR) {\n iterator = iterable;\n } else {\n iterFn = getIteratorMethod(iterable);\n if (!iterFn) throw new $TypeError(tryToString(iterable) + ' is not iterable');\n // optimisation for array iterators\n if (isArrayIteratorMethod(iterFn)) {\n for (index = 0, length = lengthOfArrayLike(iterable); length > index; index++) {\n result = callFn(iterable[index]);\n if (result && isPrototypeOf(ResultPrototype, result)) return result;\n } return new Result(false);\n }\n iterator = getIterator(iterable, iterFn);\n }\n\n next = IS_RECORD ? iterable.next : iterator.next;\n while (!(step = call(next, iterator)).done) {\n try {\n result = callFn(step.value);\n } catch (error) {\n iteratorClose(iterator, 'throw', error);\n }\n if (typeof result == 'object' && result && isPrototypeOf(ResultPrototype, result)) return result;\n } return new Result(false);\n};\n","import BaseLanguage from '../classes/base-language.js';\n\n// TODO Adapt language to work with {@link BaseLanguage} better\nexport class N2WordsIT extends BaseLanguage {\n cardinalWords = [\n this.zero, 'uno', 'due', 'tre', 'quattro', 'cinque', 'sei', 'sette', 'otto',\n 'nove', 'dieci', 'undici', 'dodici', 'tredici', 'quattordici', 'quindici',\n 'sedici', 'diciassette', 'diciotto', 'diciannove',\n ];\n\n strTens = { '2': 'venti', '3': 'trenta', '4': 'quaranta', '6': 'sessanta' };\n\n exponentPrefixes = [this.zero, 'm', 'b', 'tr', 'quadr', 'quint', 'sest', 'sett', 'ott', 'nov', 'dec'];\n\n constructor(options) {\n options = Object.assign({\n negativeWord: 'meno',\n separatorWord: 'virgola',\n zero: 'zero'\n }, options);\n\n super(options, []);\n }\n\n accentuate(string) {\n const splittedString = string.split(' ');\n\n const result = splittedString.map(word => {\n return word.slice(-3) == 'tre' && word.length > 3 ? word.replaceAll('tré', 'tre').slice(0, -3) + 'tré' : word.replaceAll('tré', 'tre');\n });\n return result.join(' ');\n }\n\n omitIfZero(numberToString) {\n return numberToString == this.zero ? '' : numberToString;\n }\n\n phoneticContraction(string) {\n return string.replaceAll('oo', 'o').replaceAll('ao', 'o').replaceAll('io', 'o').replaceAll('au', 'u').replaceAll('iu', 'u');\n }\n\n tensToCardinal(number) {\n const tens = Math.floor(number / 10);\n const units = number % 10;\n let prefix;\n prefix = Object.prototype.hasOwnProperty.call(this.strTens, tens) ? this.strTens[tens] : this.cardinalWords[tens].slice(0, -1) + 'anta';\n const postfix = this.omitIfZero(this.cardinalWords[units]);\n return this.phoneticContraction(prefix + postfix);\n }\n\n hundredsToCardinal(number) {\n const hundreds = Math.floor(number / 100);\n let prefix = 'cento';\n if (hundreds != 1) {\n prefix = this.cardinalWords[hundreds] + prefix;\n }\n const postfix = this.omitIfZero(this.toCardinal(number % 100));\n return this.phoneticContraction(prefix + postfix);\n }\n\n thousandsToCardinal(number) {\n const thousands = Math.floor(number / 1000);\n let prefix;\n prefix = thousands == 1 ? 'mille' : this.toCardinal(thousands) + 'mila';\n const postfix = this.omitIfZero(this.toCardinal(number % 1000));\n return prefix + postfix;\n }\n\n exponentLengthToString(exponentLength) {\n const prefix = this.exponentPrefixes[Math.floor(exponentLength / 6)];\n return exponentLength % 6 == 0 ? prefix + 'ilione' : prefix + 'iliardo';\n }\n\n bigNumberToCardinal(number) {\n const digits = [...number.toString()];\n\n let preDigits = digits.length % 3;\n if (preDigits == 0) {\n preDigits = 3;\n }\n\n const multiplier = digits.slice(0, preDigits); // first `preDigits` elements\n const exponent = digits.slice(preDigits); // without the first `preDigits` elements\n\n let prefix, postfix;\n let infix = this.exponentLengthToString(exponent.length);\n\n if (multiplier == '1') {\n prefix = 'un ';\n } else {\n prefix = this.toCardinal(Math.trunc(Number(multiplier.join(''))));\n infix = ' ' + infix.slice(0, -1) + 'i'; // without last element\n }\n\n // TODO ESLint suggestion\n // eslint-disable-next-line unicorn/consistent-function-scoping\n const isSetsEqual = (a, b) => a.size == b.size && [...a].every(value => b.has(value));\n if (isSetsEqual(new Set(exponent), new Set(['0']))) {\n postfix = '';\n } else {\n postfix = this.toCardinal(Math.trunc(exponent.join('')));\n\n infix += (postfix.includes(' e ') ? ', ' : ' e ');\n }\n\n return prefix + infix + postfix;\n }\n\n toCardinal(number) {\n let words = '';\n\n if (number < 20) {\n words = this.cardinalWords[number];\n } else if (number < 100) {\n words = this.tensToCardinal(Number(number));\n } else if (number < 1000) {\n words = this.hundredsToCardinal(Number(number));\n } else if (number < 1_000_000) {\n words = this.thousandsToCardinal(Number(number));\n } else {\n words = this.bigNumberToCardinal(number);\n }\n\n return this.accentuate(words);\n }\n}\n\n/**\n * Converts a value to cardinal (written) form.\n * @param {number|string|bigint} value Number to be convert.\n * @param {object} [options] Options for class.\n * @returns {string} Value in cardinal (written) format.\n * @throws {Error} Value cannot be invalid.\n */\nexport default function floatToCardinal (value, options = {}) {\n return new N2WordsIT(options).floatToCardinal(value);\n}\n","'use strict';\nvar call = require('../internals/function-call');\nvar isObject = require('../internals/is-object');\nvar isSymbol = require('../internals/is-symbol');\nvar getMethod = require('../internals/get-method');\nvar ordinaryToPrimitive = require('../internals/ordinary-to-primitive');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar $TypeError = TypeError;\nvar TO_PRIMITIVE = wellKnownSymbol('toPrimitive');\n\n// `ToPrimitive` abstract operation\n// https://tc39.es/ecma262/#sec-toprimitive\nmodule.exports = function (input, pref) {\n if (!isObject(input) || isSymbol(input)) return input;\n var exoticToPrim = getMethod(input, TO_PRIMITIVE);\n var result;\n if (exoticToPrim) {\n if (pref === undefined) pref = 'default';\n result = call(exoticToPrim, input, pref);\n if (!isObject(result) || isSymbol(result)) return result;\n throw new $TypeError(\"Can't convert object to primitive value\");\n }\n if (pref === undefined) pref = 'number';\n return ordinaryToPrimitive(input, pref);\n};\n","'use strict';\nvar hasOwn = require('../internals/has-own-property');\nvar isCallable = require('../internals/is-callable');\nvar toObject = require('../internals/to-object');\nvar sharedKey = require('../internals/shared-key');\nvar CORRECT_PROTOTYPE_GETTER = require('../internals/correct-prototype-getter');\n\nvar IE_PROTO = sharedKey('IE_PROTO');\nvar $Object = Object;\nvar ObjectPrototype = $Object.prototype;\n\n// `Object.getPrototypeOf` method\n// https://tc39.es/ecma262/#sec-object.getprototypeof\n// eslint-disable-next-line es/no-object-getprototypeof -- safe\nmodule.exports = CORRECT_PROTOTYPE_GETTER ? $Object.getPrototypeOf : function (O) {\n var object = toObject(O);\n if (hasOwn(object, IE_PROTO)) return object[IE_PROTO];\n var constructor = object.constructor;\n if (isCallable(constructor) && object instanceof constructor) {\n return constructor.prototype;\n } return object instanceof $Object ? ObjectPrototype : null;\n};\n","'use strict';\nvar fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\n\nvar replacement = /#|\\.prototype\\./;\n\nvar isForced = function (feature, detection) {\n var value = data[normalize(feature)];\n return value === POLYFILL ? true\n : value === NATIVE ? false\n : isCallable(detection) ? fails(detection)\n : !!detection;\n};\n\nvar normalize = isForced.normalize = function (string) {\n return String(string).replace(replacement, '.').toLowerCase();\n};\n\nvar data = isForced.data = {};\nvar NATIVE = isForced.NATIVE = 'N';\nvar POLYFILL = isForced.POLYFILL = 'P';\n\nmodule.exports = isForced;\n","'use strict';\nvar globalThis = require('../internals/global-this');\n\nvar navigator = globalThis.navigator;\nvar userAgent = navigator && navigator.userAgent;\n\nmodule.exports = userAgent ? String(userAgent) : '';\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\nvar id = 0;\nvar postfix = Math.random();\nvar toString = uncurryThis(1.1.toString);\n\nmodule.exports = function (key) {\n return 'Symbol(' + (key === undefined ? '' : key) + ')_' + toString(++id + postfix, 36);\n};\n","'use strict';\nvar aSet = require('../internals/a-set');\nvar SetHelpers = require('../internals/set-helpers');\nvar clone = require('../internals/set-clone');\nvar size = require('../internals/set-size');\nvar getSetRecord = require('../internals/get-set-record');\nvar iterateSet = require('../internals/set-iterate');\nvar iterateSimple = require('../internals/iterate-simple');\n\nvar has = SetHelpers.has;\nvar remove = SetHelpers.remove;\n\n// `Set.prototype.difference` method\n// https://tc39.es/ecma262/#sec-set.prototype.difference\nmodule.exports = function difference(other) {\n var O = aSet(this);\n var otherRec = getSetRecord(other);\n var result = clone(O);\n if (size(O) <= otherRec.size) iterateSet(O, function (e) {\n if (otherRec.includes(e)) remove(result, e);\n });\n else iterateSimple(otherRec.getIterator(), function (e) {\n if (has(result, e)) remove(result, e);\n });\n return result;\n};\n","import { N2WordsRU } from './ru.js';\n\nexport class N2WordsPL extends N2WordsRU {\n ones = {\n 1: 'jeden',\n 2: 'dwa',\n 3: 'trzy',\n 4: 'cztery',\n 5: 'pięć',\n 6: 'sześć',\n 7: 'siedem',\n 8: 'osiem',\n 9: 'dziewięć'\n };\n\n tens = {\n 0: 'dziesięć',\n 1: 'jedenaście',\n 2: 'dwanaście',\n 3: 'trzynaście',\n 4: 'czternaście',\n 5: 'piętnaście',\n 6: 'szesnaście',\n 7: 'siedemnaście',\n 8: 'osiemnaście',\n 9: 'dziewiętnaście'\n };\n\n twenties = {\n 2: 'dwadzieścia',\n 3: 'trzydzieści',\n 4: 'czterdzieści',\n 5: 'pięćdziesiąt',\n 6: 'sześćdziesiąt',\n 7: 'siedemdziesiąt',\n 8: 'osiemdziesiąt',\n 9: 'dziewięćdzisiąt'\n };\n\n hundreds = {\n 1: 'sto',\n 2: 'dwieście',\n 3: 'trzysta',\n 4: 'czterysta',\n 5: 'pięćset',\n 6: 'sześćset',\n 7: 'siedemset',\n 8: 'osiemset',\n 9: 'dziewięćset'\n };\n\n thousands = {\n 1: ['tysiąc', 'tysiące', 'tysięcy'], // 10^ 3\n 2: ['milion', 'miliony', 'milionów'], // 10^ 6\n 3: ['miliard', 'miliardy', 'miliardów'], // 10^ 9\n 4: ['bilion', 'biliony', 'bilionów'], // 10^ 12\n 5: ['biliard', 'biliardy', 'biliardów'], // 10^ 15\n 6: ['trylion', 'tryliony', 'trylionów'], // 10^ 18\n 7: ['tryliard', 'tryliardy', 'tryliardów'], // 10^ 21\n 8: ['kwadrylion', 'kwadryliony', 'kwadrylionów'], // 10^ 24\n 9: ['kwaryliard', 'kwadryliardy', 'kwadryliardów'], // 10^ 27\n 10: ['kwintylion', 'kwintyliony', 'kwintylionów'], // 10^ 30\n };\n\n constructor(options) {\n options = Object.assign({\n negativeWord: 'minus',\n separatorWord: 'przecinek',\n zero: 'zero'\n }, options);\n\n super(options);\n }\n\n pluralize(n, forms) {\n let form = 2;\n if (n == 1) {\n form = 0;\n } else if ((n % 10n < 5n) && (n % 10n > 1n) && ((n % 100n < 10n) || (n % 100n > 20n))) {\n form = 1;\n }\n return forms[form];\n }\n\n toCardinal(number) {\n if (number == 0) {\n return this.zero;\n }\n const words = [];\n const chunks = this.splitByX(number.toString(), 3);\n let index = chunks.length;\n for (const x of chunks) {\n index = index - 1;\n if (x == 0) {\n continue;\n }\n const [n1, n2, n3] = this.getDigits(x);\n if (n3 > 0) {\n words.push(this.hundreds[n3]);\n }\n if (n2 > 1) {\n words.push(this.twenties[n2]);\n }\n if (n2 == 1) {\n words.push(this.tens[n1]);\n } else if (n1 > 0 && !(index > 0 && x == 1)) {\n words.push(this.ones[n1]);\n }\n if (index > 0) {\n words.push(this.pluralize(x, this.thousands[index]));\n }\n }\n return words.join(' ');\n }\n}\n\n/**\n * Converts a value to cardinal (written) form.\n * @param {number|string|bigint} value Number to be convert.\n * @param {object} [options] Options for class.\n * @returns {string} Value in cardinal (written) format.\n * @throws {Error} Value cannot be invalid.\n */\nexport default function floatToCardinal (value, options = {}) {\n return new N2WordsPL(options).floatToCardinal(value);\n}\n","'use strict';\nvar aSet = require('../internals/a-set');\nvar SetHelpers = require('../internals/set-helpers');\nvar clone = require('../internals/set-clone');\nvar getSetRecord = require('../internals/get-set-record');\nvar iterateSimple = require('../internals/iterate-simple');\n\nvar add = SetHelpers.add;\nvar has = SetHelpers.has;\nvar remove = SetHelpers.remove;\n\n// `Set.prototype.symmetricDifference` method\n// https://tc39.es/ecma262/#sec-set.prototype.symmetricdifference\nmodule.exports = function symmetricDifference(other) {\n var O = aSet(this);\n var keysIter = getSetRecord(other).getIterator();\n var result = clone(O);\n iterateSimple(keysIter, function (e) {\n if (has(O, e)) remove(result, e);\n else add(result, e);\n });\n return result;\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar isCallable = require('../internals/is-callable');\nvar store = require('../internals/shared-store');\n\nvar functionToString = uncurryThis(Function.toString);\n\n// this helper broken in `core-js@3.4.1-3.4.4`, so we can't use `shared` helper\nif (!isCallable(store.inspectSource)) {\n store.inspectSource = function (it) {\n return functionToString(it);\n };\n}\n\nmodule.exports = store.inspectSource;\n","'use strict';\n// eslint-disable-next-line es/no-object-getownpropertysymbols -- safe\nexports.f = Object.getOwnPropertySymbols;\n","'use strict';\nvar fails = require('../internals/fails');\n\n// Detect IE8's incomplete defineProperty implementation\nmodule.exports = !fails(function () {\n // eslint-disable-next-line es/no-object-defineproperty -- required for testing\n return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] !== 7;\n});\n","'use strict';\nvar aCallable = require('../internals/a-callable');\nvar anObject = require('../internals/an-object');\nvar call = require('../internals/function-call');\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\nvar getIteratorDirect = require('../internals/get-iterator-direct');\n\nvar INVALID_SIZE = 'Invalid size';\nvar $RangeError = RangeError;\nvar $TypeError = TypeError;\nvar max = Math.max;\n\nvar SetRecord = function (set, intSize) {\n this.set = set;\n this.size = max(intSize, 0);\n this.has = aCallable(set.has);\n this.keys = aCallable(set.keys);\n};\n\nSetRecord.prototype = {\n getIterator: function () {\n return getIteratorDirect(anObject(call(this.keys, this.set)));\n },\n includes: function (it) {\n return call(this.has, this.set, it);\n }\n};\n\n// `GetSetRecord` abstract operation\n// https://tc39.es/proposal-set-methods/#sec-getsetrecord\nmodule.exports = function (obj) {\n anObject(obj);\n var numSize = +obj.size;\n // NOTE: If size is undefined, then numSize will be NaN\n // eslint-disable-next-line no-self-compare -- NaN check\n if (numSize !== numSize) throw new $TypeError(INVALID_SIZE);\n var intSize = toIntegerOrInfinity(numSize);\n if (intSize < 0) throw new $RangeError(INVALID_SIZE);\n return new SetRecord(obj, intSize);\n};\n","'use strict';\nvar aSet = require('../internals/a-set');\nvar size = require('../internals/set-size');\nvar iterate = require('../internals/set-iterate');\nvar getSetRecord = require('../internals/get-set-record');\n\n// `Set.prototype.isSubsetOf` method\n// https://tc39.es/ecma262/#sec-set.prototype.issubsetof\nmodule.exports = function isSubsetOf(other) {\n var O = aSet(this);\n var otherRec = getSetRecord(other);\n if (size(O) > otherRec.size) return false;\n return iterate(O, function (e) {\n if (!otherRec.includes(e)) return false;\n }, true) !== false;\n};\n","import AbstractLanguage from './abstract-language.js';\n\n/**\n * Creates new common language class that uses a highest matching word value algorithm.\n * Number matching word {@link cards} must be provided for this to work.\n * See {@link AbstractLanguage} for further requirements.\n */\nclass BaseLanguage extends AbstractLanguage {\n #cards;\n\n /**\n * @param {object} options Options for class.\n * @param {string} [options.negativeWord] Word that precedes a negative number (if any).\n * @param {string} options.separatorWord Word that separates cardinal numbers (i.e. \"and\").\n * @param {string} options.zero Word for 0 (i.e. \"zero\").\n * @param {string} [options.spaceSeparator] Character that separates words.\n * @param {Array} cards Array of number matching \"cards\" from highest-to-lowest.\n */\n constructor(options, cards) {\n super(options);\n\n this.#cards = cards;\n }\n\n /**\n * Array of number matching \"cards\" from highest-to-lowest.\n * First element in card array is the number to match while the second is the word to use.\n * @example\n * [\n * ...\n * [100, 'hundred'],\n * ...\n * [1, 'one'],\n * ]\n * @type {Array}\n */\n get cards() {\n return this.#cards;\n }\n\n set cards(value) {\n this.#cards = value;\n }\n\n /**\n * Get word for number if it matches a language card.\n * @param {number|bigint} number Card number value.\n * @returns {string|undefined} Return card word or undefined if no card.\n */\n getCardWord(number) {\n // Get matching card from number\n const card = this.cards.find(_card => _card[0] == number);\n\n // Return card word or undefined if no card found\n return (Array.isArray(card) ? card[1] : undefined);\n }\n\n /**\n * Get array of card matches.\n * @param {number|bigint} value The number value to convert to cardinal form.\n * @returns {object} Word sets (and pairs) from value.\n */\n // TODO Simplify return object.\n toCardMatches(value) {\n const out = [];\n let remaining = value;\n\n do {\n // Find card with highest matching number\n const card = this.cards.find(card => {\n return remaining >= card[0];\n });\n\n let quantity; // Quantity of card set values\n\n // Calculate quantity and remaining value\n // Override variables for 0 as math will fail\n if (remaining == 0) {\n quantity = 1;\n remaining = 0;\n } else {\n quantity = remaining / card[0];\n remaining = remaining % card[0];\n }\n\n // Is value perfect match of card number?\n if (quantity == 1) {\n // TODO Merge word set pairs together (if possible) to simplify return object\n out.push({\n [this.getCardWord(1)]: 1,\n });\n } else {\n // TODO Understand the logic for this\n /*if (quantity == remaining) {\n return [(quantity * this.getCardWord(card[0]), quantity * card[0])];\n }*/\n\n // TODO Remove reciprocating calls.\n out.push(this.toCardMatches(quantity));\n }\n\n // Add matching word set to output list\n out.push({\n [card[1]]: card[0],\n });\n }\n while (remaining > 0);\n\n return out;\n }\n\n clean(words) {\n let out = words;\n\n // Loop through word sets while array size is greater or less than 1\n // TODO Change logic to work in for loop to better understand loop intentions\n while (words.length != 1) {\n out = [];\n const left = words[0];\n const right = words[1];\n\n // Are the first & second word sets arrays?\n if (!Array.isArray(left) && !Array.isArray(right)) {\n // Merge word set pair and add to output array\n out.push(this.merge(left, right));\n\n // TODO Understand\n if (words.slice(2).length > 0) {\n out.push(words.slice(2));\n }\n } else {\n // Loop through\n for (const element of words) {\n\n if (Array.isArray(element)) {\n if (element.length == 1) out.push(element[0]);\n else out.push(this.clean(element));\n } else {\n out.push(element);\n }\n }\n }\n\n words = out;\n }\n\n return out[0];\n }\n\n postClean(out0) {\n return out0.trimEnd();\n }\n\n /**\n * Convert a whole number to written format.\n * @param {number|bigint} value The number value to convert to cardinal form.\n * @returns {string} Value in written format.\n */\n toCardinal(value) {\n // Convert value to word sets\n const words = this.toCardMatches(value);\n\n // Process word sets\n const preWords = Object.keys(this.clean(words))[0];\n\n // Process word sets some more and return result\n // TODO Look into language functions/events\n return this.postClean(preWords);\n }\n}\n\nexport default BaseLanguage;\n","'use strict';\nvar $ = require('../internals/export');\nvar isDisjointFrom = require('../internals/set-is-disjoint-from');\nvar setMethodAcceptSetLike = require('../internals/set-method-accept-set-like');\n\nvar INCORRECT = !setMethodAcceptSetLike('isDisjointFrom', function (result) {\n return !result;\n});\n\n// `Set.prototype.isDisjointFrom` method\n// https://tc39.es/ecma262/#sec-set.prototype.isdisjointfrom\n$({ target: 'Set', proto: true, real: true, forced: INCORRECT }, {\n isDisjointFrom: isDisjointFrom\n});\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar isObject = require('../internals/is-object');\n\nvar document = globalThis.document;\n// typeof document.createElement is 'object' in old IE\nvar EXISTS = isObject(document) && isObject(document.createElement);\n\nmodule.exports = function (it) {\n return EXISTS ? document.createElement(it) : {};\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar toObject = require('../internals/to-object');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar setArrayLength = require('../internals/array-set-length');\nvar doesNotExceedSafeInteger = require('../internals/does-not-exceed-safe-integer');\nvar fails = require('../internals/fails');\n\nvar INCORRECT_TO_LENGTH = fails(function () {\n return [].push.call({ length: 0x100000000 }, 1) !== 4294967297;\n});\n\n// V8 <= 121 and Safari <= 15.4; FF < 23 throws InternalError\n// https://bugs.chromium.org/p/v8/issues/detail?id=12681\nvar properErrorOnNonWritableLength = function () {\n try {\n // eslint-disable-next-line es/no-object-defineproperty -- safe\n Object.defineProperty([], 'length', { writable: false }).push();\n } catch (error) {\n return error instanceof TypeError;\n }\n};\n\nvar FORCED = INCORRECT_TO_LENGTH || !properErrorOnNonWritableLength();\n\n// `Array.prototype.push` method\n// https://tc39.es/ecma262/#sec-array.prototype.push\n$({ target: 'Array', proto: true, arity: 1, forced: FORCED }, {\n // eslint-disable-next-line no-unused-vars -- required for `.length`\n push: function push(item) {\n var O = toObject(this);\n var len = lengthOfArrayLike(O);\n var argCount = arguments.length;\n doesNotExceedSafeInteger(len + argCount);\n for (var i = 0; i < argCount; i++) {\n O[len] = arguments[i];\n len++;\n }\n setArrayLength(O, len);\n return len;\n }\n});\n","'use strict';\n// we can't use just `it == null` since of `document.all` special case\n// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot-aec\nmodule.exports = function (it) {\n return it === null || it === undefined;\n};\n","'use strict';\nvar aSet = require('../internals/a-set');\nvar add = require('../internals/set-helpers').add;\nvar clone = require('../internals/set-clone');\nvar getSetRecord = require('../internals/get-set-record');\nvar iterateSimple = require('../internals/iterate-simple');\n\n// `Set.prototype.union` method\n// https://tc39.es/ecma262/#sec-set.prototype.union\nmodule.exports = function union(other) {\n var O = aSet(this);\n var keysIter = getSetRecord(other).getIterator();\n var result = clone(O);\n iterateSimple(keysIter, function (it) {\n add(result, it);\n });\n return result;\n};\n","'use strict';\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar Iterators = require('../internals/iterators');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar ArrayPrototype = Array.prototype;\n\n// check on default Array iterator\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it);\n};\n","'use strict';\nvar call = require('../internals/function-call');\nvar isCallable = require('../internals/is-callable');\nvar isObject = require('../internals/is-object');\n\nvar $TypeError = TypeError;\n\n// `OrdinaryToPrimitive` abstract operation\n// https://tc39.es/ecma262/#sec-ordinarytoprimitive\nmodule.exports = function (input, pref) {\n var fn, val;\n if (pref === 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val;\n if (isCallable(fn = input.valueOf) && !isObject(val = call(fn, input))) return val;\n if (pref !== 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val;\n throw new $TypeError(\"Can't convert object to primitive value\");\n};\n","'use strict';\nvar classof = require('../internals/classof-raw');\n\n// `IsArray` abstract operation\n// https://tc39.es/ecma262/#sec-isarray\n// eslint-disable-next-line es/no-array-isarray -- safe\nmodule.exports = Array.isArray || function isArray(argument) {\n return classof(argument) === 'Array';\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\n// eslint-disable-next-line es/no-set -- safe\nvar SetPrototype = Set.prototype;\n\nmodule.exports = {\n // eslint-disable-next-line es/no-set -- safe\n Set: Set,\n add: uncurryThis(SetPrototype.add),\n has: uncurryThis(SetPrototype.has),\n remove: uncurryThis(SetPrototype['delete']),\n proto: SetPrototype\n};\n","'use strict';\nvar aSet = require('../internals/a-set');\nvar has = require('../internals/set-helpers').has;\nvar size = require('../internals/set-size');\nvar getSetRecord = require('../internals/get-set-record');\nvar iterateSet = require('../internals/set-iterate');\nvar iterateSimple = require('../internals/iterate-simple');\nvar iteratorClose = require('../internals/iterator-close');\n\n// `Set.prototype.isDisjointFrom` method\n// https://tc39.es/ecma262/#sec-set.prototype.isdisjointfrom\nmodule.exports = function isDisjointFrom(other) {\n var O = aSet(this);\n var otherRec = getSetRecord(other);\n if (size(O) <= otherRec.size) return iterateSet(O, function (e) {\n if (otherRec.includes(e)) return false;\n }, true) !== false;\n var iterator = otherRec.getIterator();\n return iterateSimple(iterator, function (e) {\n if (has(O, e)) return iteratorClose(iterator, 'normal', false);\n }) !== false;\n};\n","'use strict';\n/* eslint-disable es/no-symbol -- required for testing */\nvar V8_VERSION = require('../internals/environment-v8-version');\nvar fails = require('../internals/fails');\nvar globalThis = require('../internals/global-this');\n\nvar $String = globalThis.String;\n\n// eslint-disable-next-line es/no-object-getownpropertysymbols -- required for testing\nmodule.exports = !!Object.getOwnPropertySymbols && !fails(function () {\n var symbol = Symbol('symbol detection');\n // Chrome 38 Symbol has incorrect toString conversion\n // `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances\n // nb: Do not call `String` directly to avoid this being optimized out to `symbol+''` which will,\n // of course, fail.\n return !$String(symbol) || !(Object(symbol) instanceof Symbol) ||\n // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances\n !Symbol.sham && V8_VERSION && V8_VERSION < 41;\n});\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar isArray = require('../internals/is-array');\n\nvar $TypeError = TypeError;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Safari < 13 does not throw an error in this case\nvar SILENT_ON_NON_WRITABLE_LENGTH_SET = DESCRIPTORS && !function () {\n // makes no sense without proper strict mode support\n if (this !== undefined) return true;\n try {\n // eslint-disable-next-line es/no-object-defineproperty -- safe\n Object.defineProperty([], 'length', { writable: false }).length = 1;\n } catch (error) {\n return error instanceof TypeError;\n }\n}();\n\nmodule.exports = SILENT_ON_NON_WRITABLE_LENGTH_SET ? function (O, length) {\n if (isArray(O) && !getOwnPropertyDescriptor(O, 'length').writable) {\n throw new $TypeError('Cannot set read only .length');\n } return O.length = length;\n} : function (O, length) {\n return O.length = length;\n};\n","'use strict';\nvar globalThis = require('../internals/global-this');\n\n// https://github.com/tc39/ecma262/pull/3467\nmodule.exports = function (METHOD_NAME, ExpectedError) {\n var Iterator = globalThis.Iterator;\n var IteratorPrototype = Iterator && Iterator.prototype;\n var method = IteratorPrototype && IteratorPrototype[METHOD_NAME];\n\n var CLOSED = false;\n\n if (method) try {\n method.call({\n next: function () { return { done: true }; },\n 'return': function () { CLOSED = true; }\n }, -1);\n } catch (error) {\n // https://bugs.webkit.org/show_bug.cgi?id=291195\n if (!(error instanceof ExpectedError)) CLOSED = false;\n }\n\n if (!CLOSED) return method;\n};\n","'use strict';\nvar check = function (it) {\n return it && it.Math === Math && it;\n};\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nmodule.exports =\n // eslint-disable-next-line es/no-global-this -- safe\n check(typeof globalThis == 'object' && globalThis) ||\n check(typeof window == 'object' && window) ||\n // eslint-disable-next-line no-restricted-globals -- safe\n check(typeof self == 'object' && self) ||\n check(typeof global == 'object' && global) ||\n check(typeof this == 'object' && this) ||\n // eslint-disable-next-line no-new-func -- fallback\n (function () { return this; })() || Function('return this')();\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = function (object, key, value) {\n if (DESCRIPTORS) definePropertyModule.f(object, key, createPropertyDescriptor(0, value));\n else object[key] = value;\n};\n","import AbstractLanguage from '../classes/abstract-language.js';\n\nexport class N2WordsRU extends AbstractLanguage {\n /** @type {boolean} */\n feminine;\n\n /** @type {object} */\n ones = {\n 1: 'один',\n 2: 'два',\n 3: 'три',\n 4: 'четыре',\n 5: 'пять',\n 6: 'шесть',\n 7: 'семь',\n 8: 'восемь',\n 9: 'девять'\n };\n\n /** @type {object} */\n onesFeminine = {\n 1: 'одна',\n 2: 'две',\n 3: 'три',\n 4: 'четыре',\n 5: 'пять',\n 6: 'шесть',\n 7: 'семь',\n 8: 'восемь',\n 9: 'девять'\n };\n\n /** @type {object} */\n tens = {\n 0: 'десять',\n 1: 'одиннадцать',\n 2: 'двенадцать',\n 3: 'тринадцать',\n 4: 'четырнадцать',\n 5: 'пятнадцать',\n 6: 'шестнадцать',\n 7: 'семнадцать',\n 8: 'восемнадцать',\n 9: 'девятнадцать'\n };\n\n /** @type {object} */\n twenties = {\n 2: 'двадцать',\n 3: 'тридцать',\n 4: 'сорок',\n 5: 'пятьдесят',\n 6: 'шестьдесят',\n 7: 'семьдесят',\n 8: 'восемьдесят',\n 9: 'девяносто'\n };\n\n /** @type {object} */\n hundreds = {\n 1: 'сто',\n 2: 'двести',\n 3: 'триста',\n 4: 'четыреста',\n 5: 'пятьсот',\n 6: 'шестьсот',\n 7: 'семьсот',\n 8: 'восемьсот',\n 9: 'девятьсот'\n };\n\n /** @type {object} */\n thousands = {\n 1: ['тысяча', 'тысячи', 'тысяч'], // 10^ 3\n 2: ['миллион', 'миллиона', 'миллионов'], // 10^ 6\n 3: ['миллиард', 'миллиарда', 'миллиардов'], // 10^ 9\n 4: ['триллион', 'триллиона', 'триллионов'], // 10^ 12\n 5: ['квадриллион', 'квадриллиона', 'квадриллионов'], // 10^ 15\n 6: ['квинтиллион', 'квинтиллиона', 'квинтиллионов'], // 10^ 18\n 7: ['секстиллион', 'секстиллиона', 'секстиллионов'], // 10^ 21\n 8: ['септиллион', 'септиллиона', 'септиллионов'], // 10^ 24\n 9: ['октиллион', 'октиллиона', 'октиллионов'], // 10^ 27\n 10: ['нониллион', 'нониллиона', 'нониллионов'], // 10^ 30\n };\n\n constructor(options) {\n options = Object.assign({\n negativeWord: 'минус',\n separatorWord: 'запятая',\n zero: 'ноль',\n feminine: false\n }, options);\n\n super(options);\n\n this.feminine = options.feminine;\n }\n\n toCardinal(number) {\n if (number == 0) {\n return this.zero;\n }\n\n const words = [];\n\n const chunks = this.splitByX(number.toString(), 3);\n\n let index = chunks.length;\n\n for (const x of chunks) {\n let ones = [];\n index = index - 1;\n\n if (x == 0) {\n continue;\n }\n\n const [n1, n2, n3] = this.getDigits(x);\n\n if (n3 > 0) {\n words.push(this.hundreds[n3]);\n }\n\n if (n2 > 1) {\n words.push(this.twenties[n2]);\n }\n\n if (n2 == 1) {\n words.push(this.tens[n1]);\n } else if (n1 > 0) {\n ones = (index == 1 || this.feminine && index == 0) ? this.onesFeminine : this.ones;\n words.push(ones[n1]);\n }\n\n if (index > 0) {\n words.push(this.pluralize(x, this.thousands[index]));\n }\n }\n\n return words.join(' ');\n }\n\n splitByX(n, x) {\n const results = [];\n const l = n.length;\n let result;\n\n if (l > x) {\n const start = l % x;\n\n if (start > 0) {\n result = n.slice(0, start);\n\n results.push(BigInt(result));\n }\n\n for (let index = start; index < l; index += x) {\n result = n.slice(index, index + x);\n\n results.push(BigInt(result));\n }\n } else {\n results.push(BigInt(n));\n }\n\n return results;\n }\n\n getDigits(value) {\n // TODO ESLint suggestion\n // eslint-disable-next-line unicorn/no-useless-spread\n const a = [...value.toString().padStart(3, '0').slice(-3)].toReversed();\n return a.map(BigInt);\n }\n\n pluralize(n, forms) {\n let form = 2;\n if ((n % 100n < 10n) || (n % 100n > 20n)) {\n if (n % 10n == 1n) {\n form = 0;\n } else if ((n % 10n < 5n) && (n % 10n > 1n)) {\n form = 1;\n }\n }\n return forms[form];\n }\n}\n\n/**\n * Converts a value to cardinal (written) form.\n * @param {number|string|bigint} value Number to be convert.\n * @param {object} [options] Options for class.\n * @returns {string} Value in cardinal (written) format.\n * @throws {Error} Value cannot be invalid.\n */\nexport default function floatToCardinal (value, options = {}) {\n return new N2WordsRU(options).floatToCardinal(value);\n}\n","'use strict';\n// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot\nvar documentAll = typeof document == 'object' && document.all;\n\n// `IsCallable` abstract operation\n// https://tc39.es/ecma262/#sec-iscallable\n// eslint-disable-next-line unicorn/no-typeof-undefined -- required for testing\nmodule.exports = typeof documentAll == 'undefined' && documentAll !== undefined ? function (argument) {\n return typeof argument == 'function' || argument === documentAll;\n} : function (argument) {\n return typeof argument == 'function';\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\nvar V8_PROTOTYPE_DEFINE_BUG = require('../internals/v8-prototype-define-bug');\nvar anObject = require('../internals/an-object');\nvar toPropertyKey = require('../internals/to-property-key');\n\nvar $TypeError = TypeError;\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar $defineProperty = Object.defineProperty;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\nvar ENUMERABLE = 'enumerable';\nvar CONFIGURABLE = 'configurable';\nvar WRITABLE = 'writable';\n\n// `Object.defineProperty` method\n// https://tc39.es/ecma262/#sec-object.defineproperty\nexports.f = DESCRIPTORS ? V8_PROTOTYPE_DEFINE_BUG ? function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPropertyKey(P);\n anObject(Attributes);\n if (typeof O === 'function' && P === 'prototype' && 'value' in Attributes && WRITABLE in Attributes && !Attributes[WRITABLE]) {\n var current = $getOwnPropertyDescriptor(O, P);\n if (current && current[WRITABLE]) {\n O[P] = Attributes.value;\n Attributes = {\n configurable: CONFIGURABLE in Attributes ? Attributes[CONFIGURABLE] : current[CONFIGURABLE],\n enumerable: ENUMERABLE in Attributes ? Attributes[ENUMERABLE] : current[ENUMERABLE],\n writable: false\n };\n }\n } return $defineProperty(O, P, Attributes);\n} : $defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPropertyKey(P);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return $defineProperty(O, P, Attributes);\n } catch (error) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw new $TypeError('Accessors not supported');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\n\nvar createSetLike = function (size) {\n return {\n size: size,\n has: function () {\n return false;\n },\n keys: function () {\n return {\n next: function () {\n return { done: true };\n }\n };\n }\n };\n};\n\nvar createSetLikeWithInfinitySize = function (size) {\n return {\n size: size,\n has: function () {\n return true;\n },\n keys: function () {\n throw new Error('e');\n }\n };\n};\n\nmodule.exports = function (name, callback) {\n var Set = getBuiltIn('Set');\n try {\n new Set()[name](createSetLike(0));\n try {\n // late spec change, early WebKit ~ Safari 17 implementation does not pass it\n // https://github.com/tc39/proposal-set-methods/pull/88\n // also covered engines with\n // https://bugs.webkit.org/show_bug.cgi?id=272679\n new Set()[name](createSetLike(-1));\n return false;\n } catch (error2) {\n if (!callback) return true;\n // early V8 implementation bug\n // https://issues.chromium.org/issues/351332634\n try {\n new Set()[name](createSetLikeWithInfinitySize(-Infinity));\n return false;\n } catch (error) {\n var set = new Set();\n set.add(1);\n set.add(2);\n return callback(set[name](createSetLikeWithInfinitySize(Infinity)));\n }\n }\n } catch (error) {\n return false;\n }\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar symmetricDifference = require('../internals/set-symmetric-difference');\nvar setMethodGetKeysBeforeCloning = require('../internals/set-method-get-keys-before-cloning-detection');\nvar setMethodAcceptSetLike = require('../internals/set-method-accept-set-like');\n\nvar FORCED = !setMethodAcceptSetLike('symmetricDifference') || !setMethodGetKeysBeforeCloning('symmetricDifference');\n\n// `Set.prototype.symmetricDifference` method\n// https://tc39.es/ecma262/#sec-set.prototype.symmetricdifference\n$({ target: 'Set', proto: true, real: true, forced: FORCED }, {\n symmetricDifference: symmetricDifference\n});\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar anObject = require('../internals/an-object');\n\nvar concat = uncurryThis([].concat);\n\n// all object keys, includes non-enumerable and symbols\nmodule.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {\n var keys = getOwnPropertyNamesModule.f(anObject(it));\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n return getOwnPropertySymbols ? concat(keys, getOwnPropertySymbols(it)) : keys;\n};\n","import { N2WordsRU } from './ru.js';\n\nexport class N2WordsLV extends N2WordsRU {\n ones = {\n 1: 'viens',\n 2: 'divi',\n 3: 'trīs',\n 4: 'četri',\n 5: 'pieci',\n 6: 'seši',\n 7: 'septiņi',\n 8: 'astoņi',\n 9: 'deviņi'\n };\n\n tens = {\n 0: 'desmit',\n 1: 'vienpadsmit',\n 2: 'divpadsmit',\n 3: 'trīspadsmit',\n 4: 'četrpadsmit',\n 5: 'piecpadsmit',\n 6: 'sešpadsmit',\n 7: 'septiņpadsmit',\n 8: 'astoņpadsmit',\n 9: 'deviņpadsmit'\n };\n\n twenties = {\n 2: 'divdesmit',\n 3: 'trīsdesmit',\n 4: 'četrdesmit',\n 5: 'piecdesmit',\n 6: 'sešdesmit',\n 7: 'septiņdesmit',\n 8: 'astoņdesmit',\n 9: 'deviņdesmit'\n };\n\n hundreds = ['simts', 'simti', 'simtu'];\n\n thousands = {\n 1: ['tūkstotis', 'tūkstoši', 'tūkstošu'],\n 2: ['miljons', 'miljoni', 'miljonu'],\n 3: ['miljards', 'miljardi', 'miljardu'],\n 4: ['triljons', 'triljoni', 'triljonu'],\n 5: ['kvadriljons', 'kvadriljoni', 'kvadriljonu'],\n 6: ['kvintiljons', 'kvintiljoni', 'kvintiljonu'],\n 7: ['sikstiljons', 'sikstiljoni', 'sikstiljonu'],\n 8: ['septiljons', 'septiljoni', 'septiljonu'],\n 9: ['oktiljons', 'oktiljoni', 'oktiljonu'],\n 10: ['nontiljons', 'nontiljoni', 'nontiljonu'],\n };\n\n constructor(options) {\n options = Object.assign({\n negativeWord: 'mīnus',\n separatorWord: 'komats',\n zero: 'nulle'\n }, options);\n\n super(options);\n }\n\n pluralize(n, forms) {\n let form = 2;\n if (n != 0n) {\n form = n % 10n == 1n && n % 100n != 11n ? 0 : 1;\n }\n return forms[form];\n }\n\n toCardinal(number) {\n if (number == 0) {\n return this.zero;\n }\n const words = [];\n const chunks = this.splitByX(number.toString(), 3);\n let index = chunks.length;\n for (const x of chunks) {\n index = index - 1;\n if (x == 0) {\n continue;\n }\n const [n1, n2, n3] = this.getDigits(x);\n if (n3 > 0) {\n if (n3 == 1 && n2 == 0 && n1 > 0) {\n words.push(this.hundreds[2]);\n } else if (n3 > 1) {\n words.push(this.ones[n3], this.hundreds[1]);\n } else {\n words.push(this.hundreds[0]);\n }\n }\n if (n2 > 1) {\n words.push(this.twenties[n2]);\n }\n if (n2 == 1) {\n words.push(this.tens[n1]);\n } else if (n1 > 0 && !(index > 0 && x == 1)) {\n words.push(this.ones[n1]);\n }\n if (index > 0) {\n words.push(this.pluralize(x, this.thousands[index]));\n }\n }\n return words.join(' ');\n }\n}\n\n/**\n * Converts a value to cardinal (written) form.\n * @param {number|string|bigint} value Number to be convert.\n * @param {object} [options] Options for class.\n * @returns {string} Value in cardinal (written) format.\n * @throws {Error} Value cannot be invalid.\n */\nexport default function floatToCardinal (value, options = {}) {\n return new N2WordsLV(options).floatToCardinal(value);\n}\n","'use strict';\nvar uncurryThisAccessor = require('../internals/function-uncurry-this-accessor');\nvar SetHelpers = require('../internals/set-helpers');\n\nmodule.exports = uncurryThisAccessor(SetHelpers.proto, 'size', 'get') || function (set) {\n return set.size;\n};\n","import AbstractLanguage from '../classes/abstract-language.js';\n\nexport class N2WordsID extends AbstractLanguage {\n base = {\n 0: 'không',\n 1: 'một',\n 2: 'hai',\n 3: 'ba',\n 4: 'bốn',\n 5: 'năm',\n 6: 'sáu',\n 7: 'bảy',\n 8: 'tám',\n 9: 'chín',\n 10: 'mười',\n 11: 'mười một',\n 12: 'mười hai',\n 13: 'mười ba',\n 14: 'mười bốn',\n 15: 'mười lăm',\n 16: 'mười sáu',\n 17: 'mười bảy',\n 18: 'mười tám',\n 19: 'mười chín',\n };\n\n tens = {\n 20: 'hai mươi',\n 30: 'ba mươi',\n 40: 'bốn mươi',\n 50: 'năm mươi',\n 60: 'sáu mươi',\n 70: 'bảy mươi',\n 80: 'tám mươi',\n 90: 'chín mươi',\n };\n\n thousands = {\n 1: 'nghìn', // 10^1\n 2: 'triệu', // 10^2\n 3: 'tỷ', // 10^3\n 4: 'nghìn tỷ',\n 5: 'trăm nghìn tỷ',\n 6: 'Quintillion',\n 7: 'Sextillion',\n 8: 'Septillion',\n 9: 'Octillion',\n 10: 'Nonillion',\n 11: 'Decillion',\n 12: 'Undecillion',\n 13: 'Duodecillion',\n 14: 'Tredecillion',\n 15: 'Quattuordecillion',\n 16: 'Sexdecillion',\n 17: 'Septendecillion',\n 18: 'Octodecillion',\n 19: 'Novemdecillion',\n 20: 'Vigintillion',\n };\n\n constructor(options) {\n super(Object.assign({\n negativeWord: 'âm',\n separatorWord: 'phẩy',\n zero: 'không'\n }, options));\n }\n\n convertLess100(number) {\n let unitsPart = number % 10;\n let tensPart = number - unitsPart;\n let tensPartText = this.tens[tensPart];\n if (unitsPart == 0) {\n return tensPartText;\n }\n let unitsPartText = this.base[unitsPart];\n let suffix = unitsPartText;\n if (unitsPart == 1) {\n suffix = 'mốt';\n }\n if (unitsPart == 5) {\n suffix = 'lăm';\n }\n return tensPartText + ' ' + suffix;\n }\n\n convertLess1000(number) {\n let words = [];\n let tensUnitsPart = number % 100;\n let hundredsPart = number - tensUnitsPart;\n if (hundredsPart > 0) {\n words.push(this.base[hundredsPart / 100], 'trăm');\n }\n if (0 < tensUnitsPart && tensUnitsPart < 10) {\n if (words.length > 0) {\n words.push('lẻ');\n }\n if (tensUnitsPart == 5) {\n words.push('năm');\n } else {\n words.push(this.base[tensUnitsPart]);\n }\n }\n if (tensUnitsPart >= 10) {\n words.push(this.toCardinal(tensUnitsPart));\n }\n return words.join(' ');\n }\n\n convertMore1000(number) {\n let words = [];\n let division = number / 1000n;\n let power = 1;\n while (division >= 1000n) {\n division = division / 1000n;\n power = power + 1;\n }\n let r = number - (division * BigInt(Math.pow(1000, power)));\n words.push(this.toCardinal(division), this.thousands[power]);\n if (r > 0n) {\n if (r <= 99n) {\n words.push('lẻ');\n }\n words.push(this.toCardinal(r));\n }\n return words.join(' ');\n }\n\n toCardinal(number) {\n if (number < 20n) {\n return this.base[Number(number)];\n } else {\n if (number < 100n) {\n return this.convertLess100(Number(number));\n } else {\n return (number < 1000n ? this.convertLess1000(Number(number)) : this.convertMore1000(number));\n }\n }\n }\n}\n\n/**\n * Converts a value to cardinal (written) form.\n * @param {number|string|bigint} value Number to be convert.\n * @param {object} [options] Options for class.\n * @returns {string} Value in cardinal (written) format.\n * @throws {Error} Value cannot be invalid.\n */\nexport default function floatToCardinal (value, options = {}) {\n return new N2WordsID(options).floatToCardinal(value);\n}\n","'use strict';\n// toObject with fallback for non-array-like ES3 strings\nvar IndexedObject = require('../internals/indexed-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nmodule.exports = function (it) {\n return IndexedObject(requireObjectCoercible(it));\n};\n","'use strict';\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\n\nvar max = Math.max;\nvar min = Math.min;\n\n// Helper for a popular repeating case of the spec:\n// Let integer be ? ToInteger(index).\n// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).\nmodule.exports = function (index, length) {\n var integer = toIntegerOrInfinity(index);\n return integer < 0 ? max(integer + length, 0) : min(integer, length);\n};\n","import BaseLanguage from '../classes/base-language.js';\n\nexport class N2WordsZH extends BaseLanguage {\n constructor(options) {\n super(Object.assign({\n negativeWord: '负',\n separatorWord: '点',\n zero: '零',\n spaceSeparator: ''\n }, options), [\n [1_000_000_000_000n, '万'],\n [100_000_000n, '亿'],\n [10_000n, '万'],\n [1000n, '仟'],\n [100n, '佰'],\n [10n, '拾'],\n [9n, '玖'],\n [8n, '捌'],\n [7n, '柒'],\n [6n, '陆'],\n [5n, '伍'],\n [4n, '肆'],\n [3n, '叁'],\n [2n, '贰'],\n [1n, '壹'],\n [0n, '零']\n ]);\n }\n\n merge(lPair, rPair) {\n // {'one':1}, {'hundred':100}\n const ltext = Object.keys(lPair)[0];\n const lnum = BigInt(Object.values(lPair)[0]);\n const rtext = Object.keys(rPair)[0];\n const rnum = BigInt(Object.values(rPair)[0]);\n\n let result = { [`${ltext}${rtext}`]: lnum + rnum };\n\n if (lnum == 1 && rnum < 10) {\n result = { [rtext]: rnum };\n } else if (rnum > lnum) {\n result = { [`${ltext}${rtext}`]: lnum * rnum };\n } else if (this.zeroDigit(lnum) > this.digit(rnum)) {\n result = { [`${ltext}${this.zero}${rtext}`]: lnum + rnum };\n }\n\n return result;\n }\n\n decimalToCardinal(decimal) {\n const decimalPartArray = [...decimal];\n\n const decimalPartWordsArray = decimalPartArray.map(decimal =>\n this.getCardWord(decimal)\n );\n\n return decimalPartWordsArray.join(this.spaceSeparator);\n }\n\n digit(number_) {\n return number_.toString().length;\n }\n\n zeroDigit(number_) {\n return [...number_.toString()].filter(c => c == '0').length;\n }\n}\n\n/**\n * Converts a value to cardinal (written) form.\n * @param {number|string|bigint} value Number to be convert.\n * @param {object} [options] Options for class.\n * @returns {string} Value in cardinal (written) format.\n * @throws {Error} Value cannot be invalid.\n */\nexport default function floatToCardinal (value, options = {}) {\n return new N2WordsZH(options).floatToCardinal(value);\n}\n","'use strict';\nvar store = require('../internals/shared-store');\n\nmodule.exports = function (key, value) {\n return store[key] || (store[key] = value || {});\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar isSubsetOf = require('../internals/set-is-subset-of');\nvar setMethodAcceptSetLike = require('../internals/set-method-accept-set-like');\n\nvar INCORRECT = !setMethodAcceptSetLike('isSubsetOf', function (result) {\n return result;\n});\n\n// `Set.prototype.isSubsetOf` method\n// https://tc39.es/ecma262/#sec-set.prototype.issubsetof\n$({ target: 'Set', proto: true, real: true, forced: INCORRECT }, {\n isSubsetOf: isSubsetOf\n});\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar createElement = require('../internals/document-create-element');\n\n// Thanks to IE8 for its funny defineProperty\nmodule.exports = !DESCRIPTORS && !fails(function () {\n // eslint-disable-next-line es/no-object-defineproperty -- required for testing\n return Object.defineProperty(createElement('div'), 'a', {\n get: function () { return 7; }\n }).a !== 7;\n});\n","'use strict';\nvar aCallable = require('../internals/a-callable');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\n\n// `GetMethod` abstract operation\n// https://tc39.es/ecma262/#sec-getmethod\nmodule.exports = function (V, P) {\n var func = V[P];\n return isNullOrUndefined(func) ? undefined : aCallable(func);\n};\n","import AbstractLanguage from '../classes/abstract-language.js';\n\nexport class N2WordsRO extends AbstractLanguage {\n /** @type {boolean} */\n feminine;\n\n /** @type {object} */\n ones = {\n 1: 'unu',\n 2: 'doi',\n 3: 'trei',\n 4: 'patru',\n 5: 'cinci',\n 6: 'șase',\n 7: 'șapte',\n 8: 'opt',\n 9: 'nouă'\n };\n\n /** @type {object} */\n onesFeminine = {\n 1: 'una',\n 2: 'două',\n 3: 'trei',\n 4: 'patru',\n 5: 'cinci',\n 6: 'șase',\n 7: 'șapte',\n 8: 'opt',\n 9: 'nouă'\n };\n\n /** @type {object} */\n tens = {\n 0: 'zece',\n 1: 'unsprezece',\n 2: 'douăsprezece',\n 3: 'treisprezece',\n 4: 'paisprezece',\n 5: 'cincisprezece',\n 6: 'șaisprezece',\n 7: 'șaptesprezece',\n 8: 'optsprezece',\n 9: 'nouăsprezece'\n };\n\n /** @type {object} */\n tensMasculine = {\n 0: 'zece',\n 1: 'unsprezece',\n 2: 'doisprezece',\n 3: 'treisprezece',\n 4: 'paisprezece',\n 5: 'cincisprezece',\n 6: 'șaisprezece',\n 7: 'șaptesprezece',\n 8: 'optsprezece',\n 9: 'nouăsprezece'\n };\n\n /** @type {object} */\n twenties = {\n 2: 'douăzeci',\n 3: 'treizeci',\n 4: 'patruzeci',\n 5: 'cincizeci',\n 6: 'șaizeci',\n 7: 'șaptezeci',\n 8: 'optzeci',\n 9: 'nouăzeci'\n };\n\n /** @type {object} */\n hundreds = {\n 1: 'o sută',\n 2: 'două sute',\n 3: 'trei sute',\n 4: 'patru sute',\n 5: 'cinci sute',\n 6: 'șase sute',\n 7: 'șapte sute',\n 8: 'opt sute',\n 9: 'nouă sute'\n };\n\n /**\n * Romanian big units.\n * For each power group we keep: singular, plural, feminineUnits?, needsDe?\n * - 10^3: mie/mii (feminine units in chunk; \"de\" for chunk >= 20)\n * - 10^6: milion/milioane (\"de\" for chunk >= 20)\n * - 10^9: miliard/miliarde (\"de\" for chunk >= 20)\n */\n thousands = {\n 1: { singular: 'mie', plural: 'mii', feminine: true, needsDe: true }, // 10^3\n 2: { singular: 'milion', plural: 'milioane', feminine: false, needsDe: true }, // 10^6\n 3: { singular: 'miliard', plural: 'miliarde', feminine: false, needsDe: true },// 10^9\n 4: { singular: 'trilion', plural: 'trilioane', feminine: false, needsDe: true }, // 10^12\n 5: { singular: 'cvadrilion', plural: 'cvadrilioane', feminine: false, needsDe: true }, // 10^15\n 6: { singular: 'cvintilion', plural: 'cvintilioane', feminine: false, needsDe: true }, // 10^18\n 7: { singular: 'sextilion', plural: 'sextilioane', feminine: false, needsDe: true }, // 10^21\n 8: { singular: 'septilion', plural: 'septilioane', feminine: false, needsDe: true }, // 10^24\n };\n\n constructor(options) {\n options = Object.assign({\n negativeWord: 'minus',\n separatorWord: 'virgulă',\n zero: 'zero',\n feminine: false\n }, options);\n\n super(options);\n this.feminine = options.feminine;\n }\n\n toCardinal(number) {\n if (number == 0) {\n return this.zero;\n }\n\n const words = [];\n const chunks = this.splitByX(number.toString(), 3);\n let index = chunks.length;\n\n for (const x of chunks) {\n let onesMap = [];\n index = index - 1;\n\n if (x == 0n) continue;\n\n const [n1, n2, n3] = this.getDigits(x); // units, tens, hundreds (as BigInt)\n\n // hundreds (only for the last group, not for thousands)\n if (n3 > 0n && index === 0) {\n words.push(this.hundreds[Number(n3)]);\n }\n\n // tens & teens (only for the last group, not for thousands)\n if (index === 0) {\n if (n2 > 1n) {\n words.push(this.twenties[Number(n2)]);\n }\n\n if (n2 == 1n) {\n words.push(this.tens[Number(n1)]);\n } else if (n1 > 0n) {\n // pick masculine/feminine units (only for the last group, not for thousands)\n const feminineUnits = this.feminine && index === 0;\n onesMap = feminineUnits ? this.onesFeminine : this.ones;\n\n // if there is a twenty/treizeci/etc AND ones > 0 → add \"și\"\n if (n2 > 1n) words.push('și');\n words.push(onesMap[Number(n1)]);\n }\n }\n\n // big unit name (mie/mii, milion/milioane, …)\n if (index > 0) {\n const form = this.thousands[index];\n if (form) {\n words.push(this.romanianPluralize(x, form));\n } else {\n // For very large numbers beyond our defined units, just spell out the number\n words.push(this.spellUnder1000(Number(x), true));\n }\n }\n }\n\n return words.join(' ').replaceAll(/\\s+/g, ' ').trim();\n }\n\n /**\n * Split numeric string into BigInt groups of size x from left to right.\n * @param {string} n - The numeric string to split\n * @param {number} x - The size of each group\n * @returns {bigint[]} Array of BigInt groups\n */\n splitByX(n, x) {\n const results = [];\n const l = n.length;\n let result;\n\n if (l > x) {\n const start = l % x;\n if (start > 0) {\n result = n.slice(0, start);\n results.push(BigInt(result));\n }\n for (let index = start; index < l; index += x) {\n result = n.slice(index, index + x);\n results.push(BigInt(result));\n }\n } else {\n results.push(BigInt(n));\n }\n return results;\n }\n\n getDigits(value) {\n // returns [units, tens, hundreds] as BigInt\n const stringValue = value.toString().padStart(3, '0').slice(-3);\n const a = [...stringValue].toReversed();\n return a.map(BigInt);\n }\n\n /**\n * Romanian pluralization & \"de\" rule for big units.\n * - 1 → singular with article (\"o mie\", \"un milion\", \"un miliard\", …)\n * - otherwise → spell chunk + (optional \"de\") + plural\n * \"de\" is inserted when chunk >= 20 (e.g., \"douăzeci de mii/milioane/miliarde\").\n * @param {bigint} chunk - The chunk value\n * @param {object} form - The form object with singular, plural, feminine, needsDe properties\n * @returns {string} The pluralized form\n */\n romanianPluralize(chunk, form) {\n const n = Number(chunk);\n\n if (n === 1) {\n // article differs for feminine \"mie\" (o mie) vs the rest (un milion/miliard…)\n const article = form.feminine ? 'o' : 'un';\n return `${article} ${form.singular}`;\n }\n\n // For 21 with big units, use feminine \"una\" with plural nouns\n if (n === 21 && form.needsDe) {\n return `douăzeci și una de ${form.plural}`;\n }\n\n // spell the chunk itself (use feminine units for big numbers)\n const words = this.spellUnder1000(n, true);\n\n // \"de\" after >= 20 (covers 20, 21, 100, 101, 999, etc.)\n const needsDe = form.needsDe && n >= 20;\n const de = needsDe ? ' de ' : ' ';\n\n return `${words}${de}${form.plural}`;\n }\n\n spellUnder100(n, feminineUnits = false) {\n if (n < 10) {\n return (feminineUnits ? this.onesFeminine : this.ones)[n];\n }\n if (n < 20) {\n return this.tens[n - 10];\n }\n const t = Math.floor(n / 10);\n const u = n % 10;\n return u\n ? `${this.twenties[t]} și ${(feminineUnits ? this.onesFeminine : this.ones)[u]}`\n : this.twenties[t];\n }\n\n spellUnder1000(n, feminineUnits = false) {\n if (n < 100) return this.spellUnder100(n, feminineUnits);\n const h = Math.floor(n / 100);\n const r = n % 100;\n const hundredWords = this.hundreds[h];\n if (!r) return hundredWords;\n // Standard readable form: \"o sută unu\" (for units) or \"o sută cincizeci\" (for tens)\n const separator = r < 20 ? ' ' : ' ';\n return `${hundredWords}${separator}${this.spellUnder100(r, feminineUnits)}`;\n }\n\n /**\n * Override decimalToCardinal to use masculine forms for decimal places\n * @param {string} decimal Decimal string to convert\n * @returns {string} Value in written format\n */\n decimalToCardinal(decimal) {\n const words = [];\n\n // Split decimal string into an array of characters\n const chars = [...decimal];\n\n // Loop through characters adding leading zeros to words array\n let index = 0;\n while (index < chars.length && chars[index] === '0') {\n words.push(this.zero);\n index++;\n }\n\n // Prevent further processing if entire string was zeros\n if (index === chars.length) {\n return words;\n }\n\n // Convert and add remaining using masculine forms for decimal places\n const decimalNumber = BigInt(decimal);\n const masculineWords = this.toCardinalWithMasculine(decimalNumber);\n return [...words, masculineWords];\n }\n\n /**\n * Convert number to cardinal form using masculine units\n * @param {bigint} number Number to convert\n * @returns {string} Value in written format\n */\n toCardinalWithMasculine(number) {\n if (number == 0) {\n return this.zero;\n }\n\n const words = [];\n const chunks = this.splitByX(number.toString(), 3);\n let index = chunks.length;\n\n for (const x of chunks) {\n let onesMap = [];\n index = index - 1;\n\n if (x == 0n) continue;\n\n const [n1, n2, n3] = this.getDigits(x); // units, tens, hundreds (as BigInt)\n\n // hundreds\n if (n3 > 0n) {\n words.push(this.hundreds[Number(n3)]);\n }\n\n // tens & teens\n if (n2 > 1n) {\n words.push(this.twenties[Number(n2)]);\n }\n\n if (n2 == 1n) {\n words.push(this.tensMasculine[Number(n1)]);\n } else if (n1 > 0n) {\n // Always use masculine units for decimal places\n onesMap = this.ones;\n\n // if there is a twenty/treizeci/etc AND ones > 0 → add \"și\"\n if (n2 > 1n) words.push('și');\n words.push(onesMap[Number(n1)]);\n }\n\n // big unit name (mie/mii, milion/milioane, …)\n if (index > 0) {\n const form = this.thousands[index];\n if (form) {\n words.push(this.romanianPluralize(x, form));\n } else {\n // For very large numbers beyond our defined units, just spell out the number\n words.push(this.spellUnder1000(Number(x), false));\n }\n }\n }\n\n return words.join(' ').replaceAll(/\\s+/g, ' ').trim();\n }\n}\n\n/**\n * Converts a value to cardinal (written) form.\n * @param {number|string|bigint} value Number to be convert.\n * @param {object} [options] Options for class.\n * @returns {string} Value in cardinal (written) format.\n */\nexport default function floatToCardinal(value, options = {}) {\n return new N2WordsRO(options).floatToCardinal(value);\n}\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this-clause');\nvar aCallable = require('../internals/a-callable');\nvar NATIVE_BIND = require('../internals/function-bind-native');\n\nvar bind = uncurryThis(uncurryThis.bind);\n\n// optional / simple context binding\nmodule.exports = function (fn, that) {\n aCallable(fn);\n return that === undefined ? fn : NATIVE_BIND ? bind(fn, that) : function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n","'use strict';\nvar shared = require('../internals/shared');\nvar uid = require('../internals/uid');\n\nvar keys = shared('keys');\n\nmodule.exports = function (key) {\n return keys[key] || (keys[key] = uid(key));\n};\n","'use strict';\nvar toLength = require('../internals/to-length');\n\n// `LengthOfArrayLike` abstract operation\n// https://tc39.es/ecma262/#sec-lengthofarraylike\nmodule.exports = function (obj) {\n return toLength(obj.length);\n};\n","'use strict';\nmodule.exports = {};\n","'use strict';\nvar defineBuiltIn = require('../internals/define-built-in');\n\nmodule.exports = function (target, src, options) {\n for (var key in src) defineBuiltIn(target, key, src[key], options);\n return target;\n};\n","/**\n * Creates new common language class that processes decimals separately.\n * Requires implementing `toCardinal`.\n */\nclass AbstractLanguage {\n #negativeWord;\n #separatorWord;\n #zero;\n #spaceSeparator;\n #wholeNumber;\n\n /**\n * @param {object} options Options for class.\n * @param {string} [options.negativeWord] Word that precedes a negative number (if any).\n * @param {string} options.separatorWord Word that separates cardinal numbers (i.e. \"and\").\n * @param {string} options.zero Word for 0 (i.e. \"zero\").\n * @param {string} [options.spaceSeparator] Character that separates words.\n */\n constructor(options) {\n // Merge supplied options with defaults\n options = Object.assign({\n negativeWord: '',\n separatorWord: '',\n zero: '',\n spaceSeparator: ' '\n }, options);\n\n // Make options available to class\n this.#negativeWord = options.negativeWord;\n this.#separatorWord = options.separatorWord;\n this.#zero = options.zero;\n this.#spaceSeparator = options.spaceSeparator;\n }\n\n /**\n * @returns {string} Word that precedes a negative number (if any).\n */\n get negativeWord() {\n return this.#negativeWord;\n }\n\n /**\n * @returns {string} Word that separates cardinal numbers (i.e. \"and\").\n */\n get separatorWord() {\n return this.#separatorWord;\n }\n\n /**\n * @returns {string} Word for 0 (i.e. \"zero\").\n */\n get zero() {\n return this.#zero;\n }\n\n /**\n * @returns {string} Character that separates words.\n */\n get spaceSeparator() {\n return this.#spaceSeparator;\n }\n\n /**\n * @returns {number} Input value without decimal.\n */\n get wholeNumber() {\n return this.#wholeNumber;\n }\n\n /**\n * Convert ONLY decimal portion of number (processing leading zeros) to a string array of cardinal numbers.\n * @param {string} decimal Decimal string to convert.\n * @returns {string} Value in written format.\n */\n decimalToCardinal(decimal) {\n const words = [];\n\n // Split decimal string into an array of characters\n const chars = [...decimal];\n\n // Loop through characters adding leading zeros to words array\n let index = 0;\n while (index < chars.length && chars[index] === '0') {\n words.push(this.zero);\n index++;\n }\n\n // Prevent further processing if entire string was zeros\n if (index === chars.length) {\n return words;\n }\n\n // Convert and add remaining then return words array\n return [...words, this.toCardinal(BigInt(decimal))];\n }\n\n /**\n * Convert a number to cardinal form.\n * @param {number|string|bigint} value Number to be convert.\n * @returns {string} Value in written format.\n * @throws {Error} Value must be a valid number.\n */\n floatToCardinal(value) {\n // Validate user input value and convert to string (excluding BigInt)\n if (typeof value == 'number') {\n if (Number.isNaN(value)) {\n throw new TypeError('NaN is not an accepted number.');\n }\n value = value.toString();\n } else if (typeof value == 'string') {\n value = value.trim();\n if (value.length === 0 || Number.isNaN(Number(value))) {\n throw new Error('\"' + value + '\" is not a valid number.');\n }\n } else if (typeof value != 'bigint') {\n throw new TypeError('Invalid variable type: ' + typeof value);\n }\n\n let words = [];\n let wholeNumber;\n let decimalNumber;\n\n // If negative number add negative word\n if (value < 0) {\n words.push(this.negativeWord);\n }\n\n // Split value decimal (if any) then convert to BigInt\n if (typeof value == 'bigint') {\n wholeNumber = value;\n } else {\n const splitValue = value.split('.');\n wholeNumber = BigInt(splitValue[0]);\n decimalNumber = splitValue[1];\n }\n\n // Convert whole number to positive (if negative)\n if (wholeNumber < 0) {\n wholeNumber = -wholeNumber;\n }\n\n // NOTE: Only needed for CZ\n this.#wholeNumber = wholeNumber;\n\n // Add whole number in written form\n words = [...words, this.toCardinal(wholeNumber)];\n\n // Add decimal number in written form (if any)\n if (decimalNumber) {\n words.push(this.separatorWord);\n\n words = [...words, ...this.decimalToCardinal(decimalNumber)];\n }\n\n // Join words with spaces\n return words.join(this.spaceSeparator);\n }\n}\n\nexport default AbstractLanguage;\n","'use strict';\nvar anObject = require('../internals/an-object');\nvar iteratorClose = require('../internals/iterator-close');\n\n// call something on iterator step with safe closing on error\nmodule.exports = function (iterator, fn, value, ENTRIES) {\n try {\n return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value);\n } catch (error) {\n iteratorClose(iterator, 'throw', error);\n }\n};\n","'use strict';\nmodule.exports = false;\n","import AbstractLanguage from '../classes/abstract-language.js';\n\nexport class N2WordsID extends AbstractLanguage {\n base = {\n 0: [],\n 1: ['satu'],\n 2: ['dua'],\n 3: ['tiga'],\n 4: ['empat'],\n 5: ['lima'],\n 6: ['enam'],\n 7: ['tujuh'],\n 8: ['delapan'],\n 9: ['sembilan'],\n };\n\n thousands = {\n 3: 'ribu', // 10^3\n 6: 'juta', // 10^6\n 9: 'miliar', // 10^9\n 12: 'triliun',\n 15: 'kuadriliun',\n 18: 'kuantiliun',\n 21: 'sekstiliun',\n 24: 'septiliun',\n 27: 'oktiliun',\n 30: 'noniliun',\n 33: 'desiliun',\n };\n\n constructor(options) {\n options = Object.assign({\n negativeWord: 'min',\n separatorWord: 'koma',\n zero: 'nol'\n }, options);\n\n super(options);\n }\n\n splitBy3(number) {\n // Split to groups of 3 numbers: 1234567 -> [['1'], ['234'], ['567']]\n let blocks = [];\n let stringNumber = number.toString();\n let length = stringNumber.length;\n let firstBlock;\n\n if (length < 3) {\n blocks.push([stringNumber]);\n } else {\n let firstBlockLength = length % 3;\n\n if (firstBlockLength > 0) {\n firstBlock = [stringNumber.slice(0, firstBlockLength)];\n blocks.push(firstBlock);\n }\n\n for (let index = firstBlockLength; index < length; index += 3) {\n let nextBlock = [stringNumber.slice(index, index + 3)];\n blocks.push(nextBlock);\n }\n }\n return blocks;\n }\n\n spell(blocks) {\n // Example:\n // blocks: [['1'], ['234']]\n // return: [['1', ['satu']], ['234', ['dua', 'ratus', 'tiga', 'puluh', ['empat']]]]\n let wordBlocks = [];\n let spelling;\n let firstBlock = blocks[0];\n if (firstBlock[0].length == 1) {\n spelling = firstBlock[0] == '0' ? ['nol'] : this.base[Math.trunc(firstBlock[0])];\n } else if (firstBlock[0].length == 2) {\n spelling = this.getTens(firstBlock[0]);\n } else {\n spelling = [...this.getHundreds(firstBlock[0][0]), ...this.getTens(firstBlock[0].slice(1, 3))];\n }\n wordBlocks = [...wordBlocks, [firstBlock[0], spelling]];\n for (let index = 1; index < blocks.length; index++) {\n let block = blocks[index];\n spelling = [...this.getHundreds(block[0][0]), ...this.getTens(block[0].slice(1, 3))];\n block = [...block, spelling];\n wordBlocks = [...wordBlocks, block];\n }\n return wordBlocks;\n }\n\n getHundreds(number) { // 'ratus'\n if (number == '1') {\n return ['seratus'];\n } else if (number == '0') {\n return [];\n } else {\n return [...this.base[Math.trunc(number)], 'ratus'];\n }\n }\n\n getTens(number) { // 'puluh'\n if (number[0] == '1') {\n if (number[1] == '0') {\n return ['sepuluh'];\n } else if (number[1] == '1') {\n return ['sebelas'];\n } else {\n return [...this.base[Math.trunc(number[1])], 'belas'];\n }\n } else if (number[0] == '0') {\n return this.base[Math.trunc(number[1])];\n } else {\n return [...this.base[Math.trunc(number[0])], 'puluh', this.base[Math.trunc(number[1])]];\n }\n }\n\n join(wordBlocks) {\n let wordList = [];\n let length = wordBlocks.length - 1;\n let firstBlock = [wordBlocks[0]];\n let start = 0;\n if (length == 1 && firstBlock[0][0] == '1') {\n wordList.push('seribu');\n start = 1;\n }\n for (let index = start; index < length + 1; index++) {\n wordList = [...wordList, ...wordBlocks[index][1]];\n if (wordBlocks[index][1].length === 0) {\n continue;\n }\n if (index == length) {\n break;\n }\n wordList = [...wordList, this.thousands[(length - index) * 3]];\n }\n return wordList.join(' ');\n }\n\n toCardinal(number) {\n return this.join(\n this.spell(\n this.splitBy3(number)\n )\n ).trim();\n }\n}\n\n/**\n * Converts a value to cardinal (written) form.\n * @param {number|string|bigint} value Number to be convert.\n * @param {object} [options] Options for class.\n * @returns {string} Value in cardinal (written) format.\n * @throws {Error} Value cannot be invalid.\n */\nexport default function floatToCardinal (value, options = {}) {\n return new N2WordsID(options).floatToCardinal(value);\n}\n","'use strict';\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar create = require('../internals/object-create');\nvar defineProperty = require('../internals/object-define-property').f;\n\nvar UNSCOPABLES = wellKnownSymbol('unscopables');\nvar ArrayPrototype = Array.prototype;\n\n// Array.prototype[@@unscopables]\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\nif (ArrayPrototype[UNSCOPABLES] === undefined) {\n defineProperty(ArrayPrototype, UNSCOPABLES, {\n configurable: true,\n value: create(null)\n });\n}\n\n// add a key to Array.prototype[@@unscopables]\nmodule.exports = function (key) {\n ArrayPrototype[UNSCOPABLES][key] = true;\n};\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar defineGlobalProperty = require('../internals/define-global-property');\nvar copyConstructorProperties = require('../internals/copy-constructor-properties');\nvar isForced = require('../internals/is-forced');\n\n/*\n options.target - name of the target object\n options.global - target is the global object\n options.stat - export as static methods of target\n options.proto - export as prototype methods of target\n options.real - real prototype method for the `pure` version\n options.forced - export even if the native feature is available\n options.bind - bind methods to the target, required for the `pure` version\n options.wrap - wrap constructors to preventing global pollution, required for the `pure` version\n options.unsafe - use the simple assignment of property instead of delete + defineProperty\n options.sham - add a flag to not completely full polyfills\n options.enumerable - export as enumerable property\n options.dontCallGetSet - prevent calling a getter on target\n options.name - the .name of the function if it does not match the key\n*/\nmodule.exports = function (options, source) {\n var TARGET = options.target;\n var GLOBAL = options.global;\n var STATIC = options.stat;\n var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n if (GLOBAL) {\n target = globalThis;\n } else if (STATIC) {\n target = globalThis[TARGET] || defineGlobalProperty(TARGET, {});\n } else {\n target = globalThis[TARGET] && globalThis[TARGET].prototype;\n }\n if (target) for (key in source) {\n sourceProperty = source[key];\n if (options.dontCallGetSet) {\n descriptor = getOwnPropertyDescriptor(target, key);\n targetProperty = descriptor && descriptor.value;\n } else targetProperty = target[key];\n FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n // contained in target\n if (!FORCED && targetProperty !== undefined) {\n if (typeof sourceProperty == typeof targetProperty) continue;\n copyConstructorProperties(sourceProperty, targetProperty);\n }\n // add a flag to not completely full polyfills\n if (options.sham || (targetProperty && targetProperty.sham)) {\n createNonEnumerableProperty(sourceProperty, 'sham', true);\n }\n defineBuiltIn(target, key, sourceProperty, options);\n }\n};\n","import BaseLanguage from '../classes/base-language.js';\n\nexport class N2WordsFR extends BaseLanguage {\n constructor(options) {\n options = Object.assign({\n negativeWord: 'moins',\n separatorWord: 'virgule',\n zero: 'zéro',\n _region: 'FR',\n withHyphenSeparator: false,\n spaceSeparator: (options.withHyphenSeparator === true ? '-' : ' '),\n }, options);\n\n super(options, [\n [1_000_000_000_000_000_000_000_000_000n, 'quadrilliard'],\n [1_000_000_000_000_000_000_000_000n, 'quadrillion'],\n [1_000_000_000_000_000_000_000n, 'trilliard'],\n [1_000_000_000_000_000_000n, 'trillion'],\n [1_000_000_000_000_000n, 'billiard'],\n [1_000_000_000_000n, 'billion'],\n [1_000_000_000n, 'milliard'],\n [1_000_000n, 'million'],\n [1000n, 'mille'],\n [100n, 'cent'],\n ...(['BE'].includes(options._region) ? [[90n, 'nonante']] : []),\n [80n, 'quatre-vingts'],\n ...(['BE'].includes(options._region) ? [[70n, 'septante']] : []),\n [60n, 'soixante'],\n [50n, 'cinquante'],\n [40n, 'quarante'],\n [30n, 'trente'],\n [20n, 'vingt'],\n [19n, 'dix-neuf'],\n [18n, 'dix-huit'],\n [17n, 'dix-sept'],\n [16n, 'seize'],\n [15n, 'quinze'],\n [14n, 'quatorze'],\n [13n, 'treize'],\n [12n, 'douze'],\n [11n, 'onze'],\n [10n, 'dix'],\n [9n, 'neuf'],\n [8n, 'huit'],\n [7n, 'sept'],\n [6n, 'six'],\n [5n, 'cinq'],\n [4n, 'quatre'],\n [3n, 'trois'],\n [2n, 'deux'],\n [1n, 'un'],\n [0n, 'zéro']\n ]);\n }\n\n merge(current, next) { // {'cent':100}, {'vingt-cinq':25}\n let cText = Object.keys(current)[0];\n let nText = Object.keys(next)[0];\n const cNumber = BigInt(Object.values(current)[0]);\n const nNumber = BigInt(Object.values(next)[0]);\n if (cNumber == 1) {\n if (nNumber < 1_000_000) {\n return { [nText]: nNumber };\n }\n } else {\n if (\n ((cNumber - 80n) % 100n == 0 || (cNumber % 100n == 0 && cNumber < 1000)) &&\n nNumber < 1_000_000 &&\n cText.at(-1) == 's'\n ) {\n cText = cText.slice(0, -1); // without last elem\n }\n if (\n cNumber < 1000 && nNumber != 1000 &&\n nText.at(-1) != 's' &&\n nNumber % 100n == 0\n ) {\n nText += 's';\n }\n }\n if (nNumber < cNumber && cNumber < 100) {\n if (nNumber % 10n == 1 && cNumber != 80) return { [`${cText}${this.spaceSeparator}et${this.spaceSeparator}${nText}`]: cNumber + nNumber };\n return { [`${cText}-${nText}`]: cNumber + nNumber };\n }\n if (nNumber > cNumber) return { [`${cText}${this.spaceSeparator}${nText}`]: cNumber * nNumber };\n return { [`${cText}${this.spaceSeparator}${nText}`]: cNumber + nNumber };\n }\n}\n\n/**\n * Converts a value to cardinal (written) form.\n * @param {number|string|bigint} value Number to be converted.\n * @param {object} [options] Options for class.\n * @returns {string} Value in cardinal (written) format.\n * @throws {Error} Value cannot be invalid.\n */\nexport default function floatToCardinal (value, options = {}) {\n return new N2WordsFR(options).floatToCardinal(value);\n}\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = DESCRIPTORS ? function (object, key, value) {\n return definePropertyModule.f(object, key, createPropertyDescriptor(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar aCallable = require('../internals/a-callable');\n\nmodule.exports = function (object, key, method) {\n try {\n // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\n return uncurryThis(aCallable(Object.getOwnPropertyDescriptor(object, key)[method]));\n } catch (error) { /* empty */ }\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar V8_PROTOTYPE_DEFINE_BUG = require('../internals/v8-prototype-define-bug');\nvar definePropertyModule = require('../internals/object-define-property');\nvar anObject = require('../internals/an-object');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar objectKeys = require('../internals/object-keys');\n\n// `Object.defineProperties` method\n// https://tc39.es/ecma262/#sec-object.defineproperties\n// eslint-disable-next-line es/no-object-defineproperties -- safe\nexports.f = DESCRIPTORS && !V8_PROTOTYPE_DEFINE_BUG ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var props = toIndexedObject(Properties);\n var keys = objectKeys(Properties);\n var length = keys.length;\n var index = 0;\n var key;\n while (length > index) definePropertyModule.f(O, key = keys[index++], props[key]);\n return O;\n};\n","'use strict';\nvar $String = String;\n\nmodule.exports = function (argument) {\n try {\n return $String(argument);\n } catch (error) {\n return 'Object';\n }\n};\n","'use strict';\nvar $TypeError = TypeError;\nvar MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF; // 2 ** 53 - 1 == 9007199254740991\n\nmodule.exports = function (it) {\n if (it > MAX_SAFE_INTEGER) throw $TypeError('Maximum allowed index exceeded');\n return it;\n};\n","'use strict';\nvar isCallable = require('../internals/is-callable');\nvar definePropertyModule = require('../internals/object-define-property');\nvar makeBuiltIn = require('../internals/make-built-in');\nvar defineGlobalProperty = require('../internals/define-global-property');\n\nmodule.exports = function (O, key, value, options) {\n if (!options) options = {};\n var simple = options.enumerable;\n var name = options.name !== undefined ? options.name : key;\n if (isCallable(value)) makeBuiltIn(value, name, options);\n if (options.global) {\n if (simple) O[key] = value;\n else defineGlobalProperty(key, value);\n } else {\n try {\n if (!options.unsafe) delete O[key];\n else if (O[key]) simple = true;\n } catch (error) { /* empty */ }\n if (simple) O[key] = value;\n else definePropertyModule.f(O, key, {\n value: value,\n enumerable: false,\n configurable: !options.nonConfigurable,\n writable: !options.nonWritable\n });\n } return O;\n};\n","'use strict';\nvar TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar isCallable = require('../internals/is-callable');\nvar classofRaw = require('../internals/classof-raw');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar $Object = Object;\n\n// ES3 wrong here\nvar CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) === 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (error) { /* empty */ }\n};\n\n// getting tag from ES6+ `Object.prototype.toString`\nmodule.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) {\n var O, tag, result;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (tag = tryGet(O = $Object(it), TO_STRING_TAG)) == 'string' ? tag\n // builtinTag case\n : CORRECT_ARGUMENTS ? classofRaw(O)\n // ES3 arguments fallback\n : (result = classofRaw(O)) === 'Object' && isCallable(O.callee) ? 'Arguments' : result;\n};\n","'use strict';\nvar toPrimitive = require('../internals/to-primitive');\nvar isSymbol = require('../internals/is-symbol');\n\n// `ToPropertyKey` abstract operation\n// https://tc39.es/ecma262/#sec-topropertykey\nmodule.exports = function (argument) {\n var key = toPrimitive(argument, 'string');\n return isSymbol(key) ? key : key + '';\n};\n","'use strict';\nmodule.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n","'use strict';\n/* eslint-disable es/no-symbol -- required for testing */\nvar NATIVE_SYMBOL = require('../internals/symbol-constructor-detection');\n\nmodule.exports = NATIVE_SYMBOL &&\n !Symbol.sham &&\n typeof Symbol.iterator == 'symbol';\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar fails = require('../internals/fails');\nvar classof = require('../internals/classof-raw');\n\nvar $Object = Object;\nvar split = uncurryThis(''.split);\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nmodule.exports = fails(function () {\n // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n // eslint-disable-next-line no-prototype-builtins -- safe\n return !$Object('z').propertyIsEnumerable(0);\n}) ? function (it) {\n return classof(it) === 'String' ? split(it, '') : $Object(it);\n} : $Object;\n","'use strict';\nvar has = require('../internals/set-helpers').has;\n\n// Perform ? RequireInternalSlot(M, [[SetData]])\nmodule.exports = function (it) {\n has(it);\n return it;\n};\n","import BaseLanguage from '../classes/base-language.js';\n\nexport class N2WordsES extends BaseLanguage {\n genderStem;\n\n constructor(options) {\n options = Object.assign({\n negativeWord: 'menos',\n separatorWord: 'punto',\n zero: 'cero',\n genderStem: 'o'\n }, options);\n\n super(options, [\n [1_000_000_000_000_000_000_000_000n, 'cuatrillón'],\n [1_000_000_000_000_000_000n, 'trillón'],\n [1_000_000_000_000n, 'billón'],\n [1_000_000n, 'millón'],\n [1000n, 'mil'],\n [100n, 'cien'],\n [90n, 'noventa'],\n [80n, 'ochenta'],\n [70n, 'setenta'],\n [60n, 'sesenta'],\n [50n, 'cincuenta'],\n [40n, 'cuarenta'],\n [30n, 'treinta'],\n [29n, 'veintinueve'],\n [28n, 'veintiocho'],\n [27n, 'veintisiete'],\n [26n, 'veintiséis'],\n [25n, 'veinticinco'],\n [24n, 'veinticuatro'],\n [23n, 'veintitrés'],\n [22n, 'veintidós'],\n [21n, 'veintiuno'],\n [20n, 'veinte'],\n [19n, 'diecinueve'],\n [18n, 'dieciocho'],\n [17n, 'diecisiete'],\n [16n, 'dieciseis'],\n [15n, 'quince'],\n [14n, 'catorce'],\n [13n, 'trece'],\n [12n, 'doce'],\n [11n, 'once'],\n [10n, 'diez'],\n [9n, 'nueve'],\n [8n, 'ocho'],\n [7n, 'siete'],\n [6n, 'seis'],\n [5n, 'cinco'],\n [4n, 'cuatro'],\n [3n, 'tres'],\n [2n, 'dos'],\n [1n, 'uno'],\n [0n, 'cero']\n ]);\n\n this.genderStem = options.genderStem;\n }\n\n merge(current, next) {\n let cText = Object.keys(current)[0];\n let nText = Object.keys(next)[0];\n const cNumber = BigInt(Object.values(current)[0]);\n const nNumber = BigInt(Object.values(next)[0]);\n if (cNumber == 1) {\n if (nNumber < 1_000_000) return { [nText]: nNumber };\n cText = 'un';\n } else if (cNumber == 100 && nNumber % 1000n != 0) {\n cText += 't' + this.genderStem;\n }\n\n if (nNumber < cNumber) {\n if (cNumber < 100) {\n return { [`${cText} y ${nText}`]: cNumber + nNumber };\n }\n return { [`${cText} ${nText}`]: cNumber + nNumber };\n } else if (nNumber % 1_000_000n == 0 && cNumber > 1) {\n nText = nText.slice(0, -3) + 'lones';\n }\n\n if (nNumber == 100) {\n if (cNumber == 5) {\n cText = 'quinien';\n nText = '';\n } else if (cNumber == 7) {\n cText = 'sete';\n } else if (cNumber == 9) {\n cText = 'nove';\n }\n nText += 't' + this.genderStem + 's';\n } else {\n nText = ' ' + nText;\n }\n return { [`${cText}${nText}`]: cNumber * nNumber };\n }\n}\n\n/**\n * Converts a value to cardinal (written) form.\n * @param {number|string|bigint} value Number to be convert.\n * @param {object} [options] Options for class.\n * @returns {string} Value in cardinal (written) format.\n * @throws {Error} Value cannot be invalid.\n */\nexport default function floatToCardinal (value, options = {}) {\n return new N2WordsES(options).floatToCardinal(value);\n}\n","import BaseLanguage from '../classes/base-language.js';\n\nexport class N2WordsKO extends BaseLanguage {\n constructor(options) {\n options = Object.assign({\n negativeWord: '마이너스',\n separatorWord: '점',\n zero: '영'\n }, options);\n\n super(options, [\n [10_000_000_000_000_000_000_000_000_000n, '양'],\n [1_000_000_000_000_000_000_000_000n, '자'],\n [100_000_000_000_000_000_000n, '해'],\n [10_000_000_000_000_000n, '경'],\n [1_000_000_000_000n, '조'],\n [100_000_000n, '억'],\n [10_000n, '만'],\n [1000n, '천'],\n [100n, '백'],\n [10n, '십'],\n [9n, '구'],\n [8n, '팔'],\n [7n, '칠'],\n [6n, '육'],\n [5n, '오'],\n [4n, '사'],\n [3n, '삼'],\n [2n, '이'],\n [1n, '일'],\n [0n, '영']\n ]);\n }\n\n merge(lPair, rPair) {\n const lText = Object.keys(lPair)[0];\n const rText = Object.keys(rPair)[0];\n const lNumber = BigInt(Object.values(lPair)[0]);\n const rNumber = BigInt(Object.values(rPair)[0]);\n if (lNumber == 1 && rNumber <= 10_000) return { [rText]: rNumber };\n else if (10_000 > lNumber && lNumber > rNumber) return { [`${lText}${rText}`]: lNumber + rNumber };\n else if (lNumber >= 10_000 && lNumber > rNumber) return { [`${lText} ${rText}`]: lNumber + rNumber };\n else return { [`${lText}${rText}`]: lNumber * rNumber };\n }\n}\n\n/**\n * Converts a value to cardinal (written) form.\n * @param {number|string|bigint} value Number to be convert.\n * @param {object} [options] Options for class.\n * @returns {string} Value in cardinal (written) format.\n * @throws {Error} Value cannot be invalid.\n */\nexport default function floatToCardinal (value, options = {}) {\n return new N2WordsKO(options).floatToCardinal(value);\n}\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar call = require('../internals/function-call');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toPropertyKey = require('../internals/to-property-key');\nvar hasOwn = require('../internals/has-own-property');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\n\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.es/ecma262/#sec-object.getownpropertydescriptor\nexports.f = DESCRIPTORS ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n O = toIndexedObject(O);\n P = toPropertyKey(P);\n if (IE8_DOM_DEFINE) try {\n return $getOwnPropertyDescriptor(O, P);\n } catch (error) { /* empty */ }\n if (hasOwn(O, P)) return createPropertyDescriptor(!call(propertyIsEnumerableModule.f, O, P), O[P]);\n};\n","'use strict';\nvar classofRaw = require('../internals/classof-raw');\nvar uncurryThis = require('../internals/function-uncurry-this');\n\nmodule.exports = function (fn) {\n // Nashorn bug:\n // https://github.com/zloirock/core-js/issues/1128\n // https://github.com/zloirock/core-js/issues/1130\n if (classofRaw(fn) === 'Function') return uncurryThis(fn);\n};\n","'use strict';\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\n\n// https://tc39.es/ecma262/#sec-array.prototype.toreversed\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.toreversed\nmodule.exports = function (O, C) {\n var len = lengthOfArrayLike(O);\n var A = new C(len);\n var k = 0;\n for (; k < len; k++) A[k] = O[len - k - 1];\n return A;\n};\n","'use strict';\nvar IS_PURE = require('../internals/is-pure');\nvar globalThis = require('../internals/global-this');\nvar defineGlobalProperty = require('../internals/define-global-property');\n\nvar SHARED = '__core-js_shared__';\nvar store = module.exports = globalThis[SHARED] || defineGlobalProperty(SHARED, {});\n\n(store.versions || (store.versions = [])).push({\n version: '3.46.0',\n mode: IS_PURE ? 'pure' : 'global',\n copyright: '© 2014-2025 Denis Pushkarev (zloirock.ru), 2025 CoreJS Company (core-js.io)',\n license: 'https://github.com/zloirock/core-js/blob/v3.46.0/LICENSE',\n source: 'https://github.com/zloirock/core-js'\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar difference = require('../internals/set-difference');\nvar fails = require('../internals/fails');\nvar setMethodAcceptSetLike = require('../internals/set-method-accept-set-like');\n\nvar SET_LIKE_INCORRECT_BEHAVIOR = !setMethodAcceptSetLike('difference', function (result) {\n return result.size === 0;\n});\n\nvar FORCED = SET_LIKE_INCORRECT_BEHAVIOR || fails(function () {\n // https://bugs.webkit.org/show_bug.cgi?id=288595\n var setLike = {\n size: 1,\n has: function () { return true; },\n keys: function () {\n var index = 0;\n return {\n next: function () {\n var done = index++ > 1;\n if (baseSet.has(1)) baseSet.clear();\n return { done: done, value: 2 };\n }\n };\n }\n };\n // eslint-disable-next-line es/no-set -- testing\n var baseSet = new Set([1, 2, 3, 4]);\n // eslint-disable-next-line es/no-set-prototype-difference -- testing\n return baseSet.difference(setLike).size !== 3;\n});\n\n// `Set.prototype.difference` method\n// https://tc39.es/ecma262/#sec-set.prototype.difference\n$({ target: 'Set', proto: true, real: true, forced: FORCED }, {\n difference: difference\n});\n","'use strict';\nvar fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\nvar isObject = require('../internals/is-object');\nvar create = require('../internals/object-create');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar BUGGY_SAFARI_ITERATORS = false;\n\n// `%IteratorPrototype%` object\n// https://tc39.es/ecma262/#sec-%iteratorprototype%-object\nvar IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;\n\n/* eslint-disable es/no-array-prototype-keys -- safe */\nif ([].keys) {\n arrayIterator = [].keys();\n // Safari 8 has buggy iterators w/o `next`\n if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;\n else {\n PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator));\n if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype;\n }\n}\n\nvar NEW_ITERATOR_PROTOTYPE = !isObject(IteratorPrototype) || fails(function () {\n var test = {};\n // FF44- legacy iterators case\n return IteratorPrototype[ITERATOR].call(test) !== test;\n});\n\nif (NEW_ITERATOR_PROTOTYPE) IteratorPrototype = {};\nelse if (IS_PURE) IteratorPrototype = create(IteratorPrototype);\n\n// `%IteratorPrototype%[@@iterator]()` method\n// https://tc39.es/ecma262/#sec-%iteratorprototype%-@@iterator\nif (!isCallable(IteratorPrototype[ITERATOR])) {\n defineBuiltIn(IteratorPrototype, ITERATOR, function () {\n return this;\n });\n}\n\nmodule.exports = {\n IteratorPrototype: IteratorPrototype,\n BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS\n};\n","'use strict';\nvar hasOwn = require('../internals/has-own-property');\nvar ownKeys = require('../internals/own-keys');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar definePropertyModule = require('../internals/object-define-property');\n\nmodule.exports = function (target, source, exceptions) {\n var keys = ownKeys(source);\n var defineProperty = definePropertyModule.f;\n var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n if (!hasOwn(target, key) && !(exceptions && hasOwn(exceptions, key))) {\n defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n }\n }\n};\n","'use strict';\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\n\nvar $TypeError = TypeError;\n\n// `RequireObjectCoercible` abstract operation\n// https://tc39.es/ecma262/#sec-requireobjectcoercible\nmodule.exports = function (it) {\n if (isNullOrUndefined(it)) throw new $TypeError(\"Can't call method on \" + it);\n return it;\n};\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar isCallable = require('../internals/is-callable');\n\nvar aFunction = function (argument) {\n return isCallable(argument) ? argument : undefined;\n};\n\nmodule.exports = function (namespace, method) {\n return arguments.length < 2 ? aFunction(globalThis[namespace]) : globalThis[namespace] && globalThis[namespace][method];\n};\n","import { N2WordsRU } from './ru.js';\n\nexport class N2WordsUK extends N2WordsRU {\n ones = {\n 1: 'один',\n 2: 'два',\n 3: 'три',\n 4: 'чотири',\n 5: 'п\\'ять',\n 6: 'шiсть',\n 7: 'сiм',\n 8: 'вiсiм',\n 9: 'дев\\'ять'\n };\n\n onesFeminine = {\n 1: 'одна',\n 2: 'двi',\n 3: 'три',\n 4: 'чотири',\n 5: 'п\\'ять',\n 6: 'шiсть',\n 7: 'сiм',\n 8: 'вiсiм',\n 9: 'дев\\'ять'\n };\n\n tens = {\n 0: 'десять',\n 1: 'одинадцять',\n 2: 'дванадцять',\n 3: 'тринадцять',\n 4: 'чотирнадцять',\n 5: 'п\\'ятнадцять',\n 6: 'шiстнадцять',\n 7: 'сiмнадцять',\n 8: 'вiсiмнадцять',\n 9: 'дев\\'ятнадцять'\n };\n\n twenties = {\n 2: 'двадцять',\n 3: 'тридцять',\n 4: 'сорок',\n 5: 'п\\'ятдесят',\n 6: 'шiстдесят',\n 7: 'сiмдесят',\n 8: 'вiсiмдесят',\n 9: 'дев\\'яносто'\n };\n\n hundreds = {\n 1: 'сто',\n 2: 'двiстi',\n 3: 'триста',\n 4: 'чотириста',\n 5: 'п\\'ятсот',\n 6: 'шiстсот',\n 7: 'сiмсот',\n 8: 'вiсiмсот',\n 9: 'дев\\'ятсот'\n };\n\n thousands = {\n 1: ['тисяча', 'тисячi', 'тисяч'], // 10^ 3\n 2: ['мiльйон', 'мiльйони', 'мiльйонiв'], // 10^ 6\n 3: ['мiльярд', 'мiльярди', 'мiльярдiв'], // 10^ 9\n 4: ['трильйон', 'трильйони', 'трильйонiв'], // 10^ 12\n 5: ['квадрильйон', 'квадрильйони', 'квадрильйонiв'], // 10^ 15\n 6: ['квiнтильйон', 'квiнтильйони', 'квiнтильйонiв'], // 10^ 18\n 7: ['секстильйон', 'секстильйони', 'секстильйонiв'], // 10^ 21\n 8: ['септильйон', 'септильйони', 'септильйонiв'], // 10^ 24\n 9: ['октильйон', 'октильйони', 'октильйонiв'], // 10^ 27\n 10: ['нонiльйон', 'нонiльйони', 'нонiльйонiв'], // 10^ 30\n };\n\n constructor(options) {\n super(Object.assign({\n negativeWord: 'мiнус',\n separatorWord: 'кома',\n zero: 'нуль'\n }, options));\n }\n}\n\n/**\n * Converts a value to cardinal (written) form.\n * @param {number|string|bigint} value Number to be convert.\n * @param {object} [options] Options for class.\n * @returns {string} Value in cardinal (written) format.\n * @throws {Error} Value cannot be invalid.\n */\nexport default function floatToCardinal (value, options = {}) {\n return new N2WordsUK(options).floatToCardinal(value);\n}\n","'use strict';\nvar $ = require('../internals/export');\nvar fails = require('../internals/fails');\nvar intersection = require('../internals/set-intersection');\nvar setMethodAcceptSetLike = require('../internals/set-method-accept-set-like');\n\nvar INCORRECT = !setMethodAcceptSetLike('intersection', function (result) {\n return result.size === 2 && result.has(1) && result.has(2);\n}) || fails(function () {\n // eslint-disable-next-line es/no-array-from, es/no-set, es/no-set-prototype-intersection -- testing\n return String(Array.from(new Set([1, 2, 3]).intersection(new Set([3, 2])))) !== '3,2';\n});\n\n// `Set.prototype.intersection` method\n// https://tc39.es/ecma262/#sec-set.prototype.intersection\n$({ target: 'Set', proto: true, real: true, forced: INCORRECT }, {\n intersection: intersection\n});\n","'use strict';\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\n\nvar min = Math.min;\n\n// `ToLength` abstract operation\n// https://tc39.es/ecma262/#sec-tolength\nmodule.exports = function (argument) {\n var len = toIntegerOrInfinity(argument);\n return len > 0 ? min(len, 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar globalThis = require('../internals/global-this');\nvar anInstance = require('../internals/an-instance');\nvar anObject = require('../internals/an-object');\nvar isCallable = require('../internals/is-callable');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar defineBuiltInAccessor = require('../internals/define-built-in-accessor');\nvar createProperty = require('../internals/create-property');\nvar fails = require('../internals/fails');\nvar hasOwn = require('../internals/has-own-property');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IteratorPrototype = require('../internals/iterators-core').IteratorPrototype;\nvar DESCRIPTORS = require('../internals/descriptors');\nvar IS_PURE = require('../internals/is-pure');\n\nvar CONSTRUCTOR = 'constructor';\nvar ITERATOR = 'Iterator';\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n\nvar $TypeError = TypeError;\nvar NativeIterator = globalThis[ITERATOR];\n\n// FF56- have non-standard global helper `Iterator`\nvar FORCED = IS_PURE\n || !isCallable(NativeIterator)\n || NativeIterator.prototype !== IteratorPrototype\n // FF44- non-standard `Iterator` passes previous tests\n || !fails(function () { NativeIterator({}); });\n\nvar IteratorConstructor = function Iterator() {\n anInstance(this, IteratorPrototype);\n if (getPrototypeOf(this) === IteratorPrototype) throw new $TypeError('Abstract class Iterator not directly constructable');\n};\n\nvar defineIteratorPrototypeAccessor = function (key, value) {\n if (DESCRIPTORS) {\n defineBuiltInAccessor(IteratorPrototype, key, {\n configurable: true,\n get: function () {\n return value;\n },\n set: function (replacement) {\n anObject(this);\n if (this === IteratorPrototype) throw new $TypeError(\"You can't redefine this property\");\n if (hasOwn(this, key)) this[key] = replacement;\n else createProperty(this, key, replacement);\n }\n });\n } else IteratorPrototype[key] = value;\n};\n\nif (!hasOwn(IteratorPrototype, TO_STRING_TAG)) defineIteratorPrototypeAccessor(TO_STRING_TAG, ITERATOR);\n\nif (FORCED || !hasOwn(IteratorPrototype, CONSTRUCTOR) || IteratorPrototype[CONSTRUCTOR] === Object) {\n defineIteratorPrototypeAccessor(CONSTRUCTOR, IteratorConstructor);\n}\n\nIteratorConstructor.prototype = IteratorPrototype;\n\n// `Iterator` constructor\n// https://tc39.es/ecma262/#sec-iterator\n$({ global: true, constructor: true, forced: FORCED }, {\n Iterator: IteratorConstructor\n});\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar shared = require('../internals/shared');\nvar hasOwn = require('../internals/has-own-property');\nvar uid = require('../internals/uid');\nvar NATIVE_SYMBOL = require('../internals/symbol-constructor-detection');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\n\nvar Symbol = globalThis.Symbol;\nvar WellKnownSymbolsStore = shared('wks');\nvar createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol['for'] || Symbol : Symbol && Symbol.withoutSetter || uid;\n\nmodule.exports = function (name) {\n if (!hasOwn(WellKnownSymbolsStore, name)) {\n WellKnownSymbolsStore[name] = NATIVE_SYMBOL && hasOwn(Symbol, name)\n ? Symbol[name]\n : createWellKnownSymbol('Symbol.' + name);\n } return WellKnownSymbolsStore[name];\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar iterateSimple = require('../internals/iterate-simple');\nvar SetHelpers = require('../internals/set-helpers');\n\nvar Set = SetHelpers.Set;\nvar SetPrototype = SetHelpers.proto;\nvar forEach = uncurryThis(SetPrototype.forEach);\nvar keys = uncurryThis(SetPrototype.keys);\nvar next = keys(new Set()).next;\n\nmodule.exports = function (set, fn, interruptible) {\n return interruptible ? iterateSimple({ iterator: keys(set), next: next }, fn) : forEach(set, fn);\n};\n","'use strict';\nvar internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\nvar hiddenKeys = enumBugKeys.concat('length', 'prototype');\n\n// `Object.getOwnPropertyNames` method\n// https://tc39.es/ecma262/#sec-object.getownpropertynames\n// eslint-disable-next-line es/no-object-getownpropertynames -- safe\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return internalObjectKeys(O, hiddenKeys);\n};\n","'use strict';\nvar aSet = require('../internals/a-set');\nvar has = require('../internals/set-helpers').has;\nvar size = require('../internals/set-size');\nvar getSetRecord = require('../internals/get-set-record');\nvar iterateSimple = require('../internals/iterate-simple');\nvar iteratorClose = require('../internals/iterator-close');\n\n// `Set.prototype.isSupersetOf` method\n// https://tc39.es/ecma262/#sec-set.prototype.issupersetof\nmodule.exports = function isSupersetOf(other) {\n var O = aSet(this);\n var otherRec = getSetRecord(other);\n if (size(O) < otherRec.size) return false;\n var iterator = otherRec.getIterator();\n return iterateSimple(iterator, function (e) {\n if (!has(O, e)) return iteratorClose(iterator, 'normal', false);\n }) !== false;\n};\n","'use strict';\nvar isObject = require('../internals/is-object');\n\nvar $String = String;\nvar $TypeError = TypeError;\n\n// `Assert: Type(argument) is Object`\nmodule.exports = function (argument) {\n if (isObject(argument)) return argument;\n throw new $TypeError($String(argument) + ' is not an object');\n};\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar isCallable = require('../internals/is-callable');\n\nvar WeakMap = globalThis.WeakMap;\n\nmodule.exports = isCallable(WeakMap) && /native code/.test(String(WeakMap));\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\n\n// V8 ~ Chrome 36-\n// https://bugs.chromium.org/p/v8/issues/detail?id=3334\nmodule.exports = DESCRIPTORS && fails(function () {\n // eslint-disable-next-line es/no-object-defineproperty -- required for testing\n return Object.defineProperty(function () { /* empty */ }, 'prototype', {\n value: 42,\n writable: false\n }).prototype !== 42;\n});\n","'use strict';\n// IE8- don't enum bug keys\nmodule.exports = [\n 'constructor',\n 'hasOwnProperty',\n 'isPrototypeOf',\n 'propertyIsEnumerable',\n 'toLocaleString',\n 'toString',\n 'valueOf'\n];\n","'use strict';\nvar aSet = require('../internals/a-set');\nvar SetHelpers = require('../internals/set-helpers');\nvar size = require('../internals/set-size');\nvar getSetRecord = require('../internals/get-set-record');\nvar iterateSet = require('../internals/set-iterate');\nvar iterateSimple = require('../internals/iterate-simple');\n\nvar Set = SetHelpers.Set;\nvar add = SetHelpers.add;\nvar has = SetHelpers.has;\n\n// `Set.prototype.intersection` method\n// https://tc39.es/ecma262/#sec-set.prototype.intersection\nmodule.exports = function intersection(other) {\n var O = aSet(this);\n var otherRec = getSetRecord(other);\n var result = new Set();\n\n if (size(O) > otherRec.size) {\n iterateSimple(otherRec.getIterator(), function (e) {\n if (has(O, e)) add(result, e);\n });\n } else {\n iterateSet(O, function (e) {\n if (otherRec.includes(e)) add(result, e);\n });\n }\n\n return result;\n};\n","'use strict';\nvar $propertyIsEnumerable = {}.propertyIsEnumerable;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Nashorn ~ JDK8 bug\nvar NASHORN_BUG = getOwnPropertyDescriptor && !$propertyIsEnumerable.call({ 1: 2 }, 1);\n\n// `Object.prototype.propertyIsEnumerable` method implementation\n// https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable\nexports.f = NASHORN_BUG ? function propertyIsEnumerable(V) {\n var descriptor = getOwnPropertyDescriptor(this, V);\n return !!descriptor && descriptor.enumerable;\n} : $propertyIsEnumerable;\n","import BaseLanguage from '../classes/base-language.js';\n\nexport class N2WordsDE extends BaseLanguage {\n constructor(options) {\n options = Object.assign({\n negativeWord: 'minus',\n separatorWord: 'komma',\n zero: 'null'\n }, options);\n\n super(options, [\n [1_000_000_000_000_000_000_000_000_000n, 'Quadrilliarde'],\n [1_000_000_000_000_000_000_000_000n, 'Quadrillion'],\n [1_000_000_000_000_000_000_000n, 'Trilliarde'],\n [1_000_000_000_000_000_000n, 'Trillion'],\n [1_000_000_000_000_000n, 'Billiarde'],\n [1_000_000_000_000n, 'Billion'],\n [1_000_000_000n, 'Milliarde'],\n [1_000_000n, 'Million'],\n [1000n, 'tausend'],\n [100n, 'hundert'],\n [90n, 'neunzig'],\n [80n, 'achtzig'],\n [70n, 'siebzig'],\n [60n, 'sechzig'],\n [50n, 'fünfzig'],\n [40n, 'vierzig'],\n [30n, 'dreißig'],\n [20n, 'zwanzig'],\n [19n, 'neunzehn'],\n [18n, 'achtzehn'],\n [17n, 'siebzehn'],\n [16n, 'sechzehn'],\n [15n, 'fünfzehn'],\n [14n, 'vierzehn'],\n [13n, 'dreizehn'],\n [12n, 'zwölf'],\n [11n, 'elf'],\n [10n, 'zehn'],\n [9n, 'neun'],\n [8n, 'acht'],\n [7n, 'sieben'],\n [6n, 'sechs'],\n [5n, 'fünf'],\n [4n, 'vier'],\n [3n, 'drei'],\n [2n, 'zwei'],\n [1n, 'eins'],\n [0n, 'null']\n ]);\n }\n\n merge(current, next) {\n let cText = Object.keys(current)[0];\n let nText = Object.keys(next)[0];\n const cNumber = BigInt(Object.values(current)[0]);\n const nNumber = BigInt(Object.values(next)[0]);\n if (cNumber == 1) {\n if (nNumber == 100 || nNumber == 1000) {\n return { [`ein${nText}`]: nNumber };\n } else if (nNumber < 1_000_000) {\n return { [nText]: nNumber };\n }\n cText = 'eine';\n }\n\n let value = 0;\n if (nNumber > cNumber) {\n if (nNumber >= 1_000_000) {\n if (cNumber > 1) {\n nText += nText.at(-1) == 'e' ? 'n' : 'en';\n }\n cText += ' ';\n }\n value = cNumber * nNumber;\n } else {\n if (nNumber < 10 && cNumber > 10 && cNumber < 100) {\n if (nNumber == 1) {\n nText = 'ein';\n }\n const temporary = nText;\n nText = cText;\n cText = `${temporary}und`;\n } else if (cNumber >= 1_000_000) {\n cText += ' ';\n }\n value = cNumber + nNumber;\n }\n\n return { [`${cText}${nText}`]: value };\n }\n}\n\n/**\n * Converts a value to cardinal (written) form.\n * @param {number|string|bigint} value Number to be convert.\n * @param {object} [options] Options for class.\n * @returns {string} Value in cardinal (written) format.\n * @throws {Error} Value cannot be invalid.\n */\nexport default function floatToCardinal (value, options = {}) {\n return new N2WordsDE(options).floatToCardinal(value);\n}\n","'use strict';\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nvar $Object = Object;\n\n// `ToObject` abstract operation\n// https://tc39.es/ecma262/#sec-toobject\nmodule.exports = function (argument) {\n return $Object(requireObjectCoercible(argument));\n};\n","'use strict';\n// TODO: Remove from `core-js@4`\nrequire('../modules/es.iterator.constructor');\n","'use strict';\nmodule.exports = function (exec) {\n try {\n return !!exec();\n } catch (error) {\n return true;\n }\n};\n","import BaseLanguage from '../classes/base-language.js';\n\nexport class N2WordsTR extends BaseLanguage {\n constructor(options = {}) {\n super(Object.assign({\n negativeWord: 'eksi',\n separatorWord: 'virgül',\n zero: 'sıfır',\n spaceSeparator: (options.dropSpaces === true ? '' : ' '),\n }, options), [\n [1_000_000_000_000_000_000n, 'kentilyon'],\n [1_000_000_000_000_000n, 'katrilyon'],\n [1_000_000_000_000n, 'trilyon'],\n [1_000_000_000n, 'milyar'],\n [1_000_000n, 'milyon'],\n [1000n, 'bin'],\n [100n, 'yüz'],\n [90n, 'doksan'],\n [80n, 'seksen'],\n [70n, 'yetmiş'],\n [60n, 'altmış'],\n [50n, 'elli'],\n [40n, 'kırk'],\n [30n, 'otuz'],\n [20n, 'yirmi'],\n [10n, 'on'],\n [9n, 'dokuz'],\n [8n, 'sekiz'],\n [7n, 'yedi'],\n [6n, 'altı'],\n [5n, 'beş'],\n [4n, 'dört'],\n [3n, 'üç'],\n [2n, 'iki'],\n [1n, 'bir'],\n [0n, 'sıfır']\n ]);\n }\n\n merge(lPair, rPair) {\n const lText = Object.keys(lPair)[0];\n const rText = Object.keys(rPair)[0];\n const lNumber = BigInt(Object.values(lPair)[0]);\n const rNumber = BigInt(Object.values(rPair)[0]);\n if (lNumber == 1 && (rNumber <= 100 || rNumber == 1000)) {\n return { [rText]: rNumber };\n } else if (rNumber > lNumber) {\n return { [`${lText}${this.spaceSeparator}${rText}`]: lNumber * rNumber };\n } else {\n return { [`${lText}${this.spaceSeparator}${rText}`]: lNumber + rNumber };\n }\n }\n}\n\n/**\n * Converts a value to cardinal (written) form.\n * @param {number|string|bigint} value Number to be convert.\n * @param {object} [options] Options for class.\n * @returns {string} Value in cardinal (written) format.\n * @throws {Error} Value cannot be invalid.\n */\nexport default function floatToCardinal (value, options = {}) {\n return new N2WordsTR(options).floatToCardinal(value);\n}\n","import { N2WordsRU } from './ru.js';\n\nexport class N2WordsSR extends N2WordsRU {\n ones = {\n 1: ['jedan', 'jedna'],\n 2: ['dva', 'dve'],\n 3: ['tri', 'tri'],\n 4: ['četiri', 'četiri'],\n 5: ['pet', 'pet'],\n 6: ['šest', 'šest'],\n 7: ['sedam', 'sedam'],\n 8: ['osam', 'osam'],\n 9: ['devet', 'devet']\n };\n\n tens = {\n 0: 'deset',\n 1: 'jedanaest',\n 2: 'dvanaest',\n 3: 'trinaest',\n 4: 'četrnaest',\n 5: 'petnaest',\n 6: 'šesnaest',\n 7: 'sedamnaest',\n 8: 'osamnaest',\n 9: 'devetnaest'\n };\n\n twenties = {\n 2: 'dvadeset',\n 3: 'trideset',\n 4: 'četrdeset',\n 5: 'pedeset',\n 6: 'šezdeset',\n 7: 'sedamdeset',\n 8: 'osamdeset',\n 9: 'devedeset'\n };\n\n hundreds = {\n 1: 'sto',\n 2: 'dvesta',\n 3: 'trista',\n 4: 'četiristo',\n 5: 'petsto',\n 6: 'šesto',\n 7: 'sedamsto',\n 8: 'osamsto',\n 9: 'devetsto'\n };\n\n SCALE = [\n ['', '', '', false],\n ['hiljada', 'hiljade', 'hiljada', true], // 10 ^ 3\n ['milion', 'miliona', 'miliona', false], // 10 ^ 6\n ['milijarda', 'milijarde', 'milijarda', false], // 10 ^ 9\n ['bilion', 'biliona', 'biliona', false], // 10 ^ 12\n ['bilijarda', 'bilijarde', 'bilijarda', false], // 10 ^ 15\n ['trilion', 'triliona', 'triliona', false], // 10 ^ 18\n ['trilijarda', 'trilijarde', 'trilijarda', false], // 10 ^ 21\n ['kvadrilion', 'kvadriliona', 'kvadriliona', false], // 10 ^ 24\n ['kvadrilijarda', 'kvadrilijarde', 'kvadrilijarda', false], // 10 ^ 27\n ['kvintilion', 'kvintiliona', 'kvintiliona', false], // 10 ^ 30\n ];\n\n constructor(options) {\n super(Object.assign({\n negativeWord: 'minus',\n separatorWord: 'zapeta',\n zero: 'nula'\n }, options));\n }\n\n pluralize(n, forms) {\n let form = 2;\n if ((n % 100n < 10n) || (n % 100n > 20n)) {\n if (n % 10n == 1n) {\n form = 0;\n } else if ((n % 10n > 1n) && (n % 10n < 5n)) {\n form = 1;\n }\n }\n return forms[form];\n }\n\n toCardinal(number) {\n if (number == 0) {\n return this.zero;\n }\n const words = [];\n const chunks = this.splitByX(number.toString(), 3);\n let index = chunks.length;\n for (const x of chunks) {\n index = index - 1;\n // if (x == 0) { continue; }\n const [n1, n2, n3] = this.getDigits(x);\n if (n3 > 0) {\n words.push(this.hundreds[n3]);\n }\n if (n2 > 1) {\n words.push(this.twenties[n2]);\n }\n if (n2 == 1) {\n words.push(this.tens[n1]);\n } else if (n1 > 0) {\n const isFeminine = (this.feminine || this.SCALE[index][3]);\n const genderIndex = isFeminine ? 1 : 0;\n words.push(this.ones[n1][genderIndex]);\n }\n if ((index > 0) && (x != 0)) {\n words.push(this.pluralize(x, this.SCALE[index]));\n }\n }\n return words.join(' ');\n }\n}\n\n/**\n * Converts a value to cardinal (written) form.\n * @param {number|string|bigint} value Number to be convert.\n * @param {object} [options] Options for class.\n * @returns {string} Value in cardinal (written) format.\n * @throws {Error} Value cannot be invalid.\n */\nexport default function floatToCardinal (value, options = {}) {\n return new N2WordsSR(options).floatToCardinal(value);\n}\n","'use strict';\nvar SetHelpers = require('../internals/set-helpers');\nvar iterate = require('../internals/set-iterate');\n\nvar Set = SetHelpers.Set;\nvar add = SetHelpers.add;\n\nmodule.exports = function (set) {\n var result = new Set();\n iterate(set, function (it) {\n add(result, it);\n });\n return result;\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar toObject = require('../internals/to-object');\n\nvar hasOwnProperty = uncurryThis({}.hasOwnProperty);\n\n// `HasOwnProperty` abstract operation\n// https://tc39.es/ecma262/#sec-hasownproperty\n// eslint-disable-next-line es/no-object-hasown -- safe\nmodule.exports = Object.hasOwn || function hasOwn(it, key) {\n return hasOwnProperty(toObject(it), key);\n};\n","'use strict';\nvar isCallable = require('../internals/is-callable');\nvar tryToString = require('../internals/try-to-string');\n\nvar $TypeError = TypeError;\n\n// `Assert: IsCallable(argument) is true`\nmodule.exports = function (argument) {\n if (isCallable(argument)) return argument;\n throw new $TypeError(tryToString(argument) + ' is not a function');\n};\n","import { N2WordsFR } from './fr.js';\n\nexport class N2WordsFRBE extends N2WordsFR {\n constructor(options) {\n options = Object.assign({}, options, { _region: 'BE' });\n\n super(options);\n }\n}\n\n/**\n * Converts a value to cardinal (written) form.\n * @param {number|string|bigint} value Number to be convert.\n * @param {object} [options] Options for class.\n * @returns {string} Value in cardinal (written) format.\n * @throws {Error} Value cannot be invalid.\n */\nexport default function floatToCardinal (value, options = {}) {\n return new N2WordsFRBE(options).floatToCardinal(value);\n}\n","import BaseLanguage from '../classes/base-language.js';\n\nexport class N2WordsNO extends BaseLanguage {\n constructor(options) {\n options = Object.assign({\n negativeWord: 'minus',\n separatorWord: 'komma',\n zero: 'null'\n }, options);\n\n super(options, [\n [1_000_000_000_000_000_000_000_000_000_000_000n, 'quintillard'],\n [1_000_000_000_000_000_000_000_000_000_000n, 'quintillion'],\n [1_000_000_000_000_000_000_000_000_000n, 'quadrillard'],\n [1_000_000_000_000_000_000_000_000n, 'quadrillion'],\n [1_000_000_000_000_000_000_000n, 'trillard'],\n [1_000_000_000_000_000_000n, 'trillion'],\n [1_000_000_000_000_000n, 'billard'],\n [1_000_000_000_000n, 'billion'],\n [1_000_000_000n, 'millard'],\n [1_000_000n, 'million'],\n [1000n, 'tusen'],\n [100n, 'hundre'],\n [90n, 'nitti'],\n [80n, 'åtti'],\n [70n, 'sytti'],\n [60n, 'seksti'],\n [50n, 'femti'],\n [40n, 'førti'],\n [30n, 'tretti'],\n [20n, 'tjue'],\n [19n, 'nitten'],\n [18n, 'atten'],\n [17n, 'sytten'],\n [16n, 'seksten'],\n [15n, 'femten'],\n [14n, 'fjorten'],\n [13n, 'tretten'],\n [12n, 'tolv'],\n [11n, 'elleve'],\n [10n, 'ti'],\n [9n, 'ni'],\n [8n, 'åtte'],\n [7n, 'syv'],\n [6n, 'seks'],\n [5n, 'fem'],\n [4n, 'fire'],\n [3n, 'tre'],\n [2n, 'to'],\n [1n, 'en'],\n [0n, 'null']\n ]);\n }\n\n merge(lPair, rPair) { // {'one':1}, {'hundred':100}\n const lText = Object.keys(lPair)[0];\n const rText = Object.keys(rPair)[0];\n const lNumber = BigInt(Object.values(lPair)[0]);\n const rNumber = BigInt(Object.values(rPair)[0]);\n if (lNumber == 1 && rNumber < 100) return { [rText]: rNumber };\n else if (lNumber < 100 && lNumber > rNumber) return { [`${lText}-${rText}`]: lNumber + rNumber };\n else if (lNumber >= 100 && rNumber < 100) return { [`${lText} og ${rText}`]: lNumber + rNumber };\n else if (rNumber > lNumber) return { [`${lText} ${rText}`]: lNumber * rNumber };\n return { [`${lText}, ${rText}`]: lNumber + rNumber };\n }\n}\n\n/**\n * Converts a value to cardinal (written) form.\n * @param {number|string|bigint} value Number to be convert.\n * @param {object} [options] Options for class.\n * @returns {string} Value in cardinal (written) format.\n * @throws {Error} Value cannot be invalid.\n */\nexport default function floatToCardinal (value, options = {}) {\n return new N2WordsNO(options).floatToCardinal(value);\n}\n","'use strict';\nvar globalThis = require('../internals/global-this');\n\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar defineProperty = Object.defineProperty;\n\nmodule.exports = function (key, value) {\n try {\n defineProperty(globalThis, key, { value: value, configurable: true, writable: true });\n } catch (error) {\n globalThis[key] = value;\n } return value;\n};\n","'use strict';\nvar call = require('../internals/function-call');\nvar create = require('../internals/object-create');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar defineBuiltIns = require('../internals/define-built-ins');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar InternalStateModule = require('../internals/internal-state');\nvar getMethod = require('../internals/get-method');\nvar IteratorPrototype = require('../internals/iterators-core').IteratorPrototype;\nvar createIterResultObject = require('../internals/create-iter-result-object');\nvar iteratorClose = require('../internals/iterator-close');\nvar iteratorCloseAll = require('../internals/iterator-close-all');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar ITERATOR_HELPER = 'IteratorHelper';\nvar WRAP_FOR_VALID_ITERATOR = 'WrapForValidIterator';\nvar NORMAL = 'normal';\nvar THROW = 'throw';\nvar setInternalState = InternalStateModule.set;\n\nvar createIteratorProxyPrototype = function (IS_ITERATOR) {\n var getInternalState = InternalStateModule.getterFor(IS_ITERATOR ? WRAP_FOR_VALID_ITERATOR : ITERATOR_HELPER);\n\n return defineBuiltIns(create(IteratorPrototype), {\n next: function next() {\n var state = getInternalState(this);\n // for simplification:\n // for `%WrapForValidIteratorPrototype%.next` or with `state.returnHandlerResult` our `nextHandler` returns `IterResultObject`\n // for `%IteratorHelperPrototype%.next` - just a value\n if (IS_ITERATOR) return state.nextHandler();\n if (state.done) return createIterResultObject(undefined, true);\n try {\n var result = state.nextHandler();\n return state.returnHandlerResult ? result : createIterResultObject(result, state.done);\n } catch (error) {\n state.done = true;\n throw error;\n }\n },\n 'return': function () {\n var state = getInternalState(this);\n var iterator = state.iterator;\n state.done = true;\n if (IS_ITERATOR) {\n var returnMethod = getMethod(iterator, 'return');\n return returnMethod ? call(returnMethod, iterator) : createIterResultObject(undefined, true);\n }\n if (state.inner) try {\n iteratorClose(state.inner.iterator, NORMAL);\n } catch (error) {\n return iteratorClose(iterator, THROW, error);\n }\n if (state.openIters) try {\n iteratorCloseAll(state.openIters, NORMAL);\n } catch (error) {\n return iteratorClose(iterator, THROW, error);\n }\n if (iterator) iteratorClose(iterator, NORMAL);\n return createIterResultObject(undefined, true);\n }\n });\n};\n\nvar WrapForValidIteratorPrototype = createIteratorProxyPrototype(true);\nvar IteratorHelperPrototype = createIteratorProxyPrototype(false);\n\ncreateNonEnumerableProperty(IteratorHelperPrototype, TO_STRING_TAG, 'Iterator Helper');\n\nmodule.exports = function (nextHandler, IS_ITERATOR, RETURN_HANDLER_RESULT) {\n var IteratorProxy = function Iterator(record, state) {\n if (state) {\n state.iterator = record.iterator;\n state.next = record.next;\n } else state = record;\n state.type = IS_ITERATOR ? WRAP_FOR_VALID_ITERATOR : ITERATOR_HELPER;\n state.returnHandlerResult = !!RETURN_HANDLER_RESULT;\n state.nextHandler = nextHandler;\n state.counter = 0;\n state.done = false;\n setInternalState(this, state);\n };\n\n IteratorProxy.prototype = IS_ITERATOR ? WrapForValidIteratorPrototype : IteratorHelperPrototype;\n\n return IteratorProxy;\n};\n","'use strict';\nvar NATIVE_BIND = require('../internals/function-bind-native');\n\nvar FunctionPrototype = Function.prototype;\nvar call = FunctionPrototype.call;\n// eslint-disable-next-line es/no-function-prototype-bind -- safe\nvar uncurryThisWithBind = NATIVE_BIND && FunctionPrototype.bind.bind(call, call);\n\nmodule.exports = NATIVE_BIND ? uncurryThisWithBind : function (fn) {\n return function () {\n return call.apply(fn, arguments);\n };\n};\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar userAgent = require('../internals/environment-user-agent');\n\nvar process = globalThis.process;\nvar Deno = globalThis.Deno;\nvar versions = process && process.versions || Deno && Deno.version;\nvar v8 = versions && versions.v8;\nvar match, version;\n\nif (v8) {\n match = v8.split('.');\n // in old Chrome, versions of V8 isn't V8 = Chrome / 10\n // but their correct versions are not interesting for us\n version = match[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1]);\n}\n\n// BrowserFS NodeJS `process` polyfill incorrectly set `.v8` to `0.0`\n// so check `userAgent` even if `.v8` exists, but 0\nif (!version && userAgent) {\n match = userAgent.match(/Edge\\/(\\d+)/);\n if (!match || match[1] >= 74) {\n match = userAgent.match(/Chrome\\/(\\d+)/);\n if (match) version = +match[1];\n }\n}\n\nmodule.exports = version;\n","'use strict';\nvar call = require('../internals/function-call');\nvar anObject = require('../internals/an-object');\nvar getMethod = require('../internals/get-method');\n\nmodule.exports = function (iterator, kind, value) {\n var innerResult, innerError;\n anObject(iterator);\n try {\n innerResult = getMethod(iterator, 'return');\n if (!innerResult) {\n if (kind === 'throw') throw value;\n return value;\n }\n innerResult = call(innerResult, iterator);\n } catch (error) {\n innerError = true;\n innerResult = error;\n }\n if (kind === 'throw') throw value;\n if (innerError) throw innerResult;\n anObject(innerResult);\n return value;\n};\n","'use strict';\nvar NATIVE_BIND = require('../internals/function-bind-native');\n\nvar call = Function.prototype.call;\n// eslint-disable-next-line es/no-function-prototype-bind -- safe\nmodule.exports = NATIVE_BIND ? call.bind(call) : function () {\n return call.apply(call, arguments);\n};\n","import BaseLanguage from '../classes/base-language.js';\n\nexport class N2WordsNL extends BaseLanguage {\n includeOptionalAnd;\n noHundredPairs;\n\n constructor(options) {\n options = Object.assign({\n negativeWord: 'min',\n separatorWord: 'komma',\n zero: 'nul',\n includeOptionalAnd: false,\n noHundredPairs: false\n }, options);\n\n super(options, [\n [1_000_000_000_000_000_000_000_000_000n, 'quadriljard'],\n [1_000_000_000_000_000_000_000_000n, 'quadriljoen'],\n [1_000_000_000_000_000_000_000n, 'triljard'],\n [1_000_000_000_000_000_000n, 'triljoen'],\n [1_000_000_000_000_000n, 'biljard'],\n [1_000_000_000_000n, 'biljoen'],\n [1_000_000_000n, 'miljard'],\n [1_000_000n, 'miljoen'],\n [1000n, 'duizend'],\n [100n, 'honderd'],\n [90n, 'negentig'],\n [80n, 'tachtig'],\n [70n, 'zeventig'],\n [60n, 'zestig'],\n [50n, 'vijftig'],\n [40n, 'veertig'],\n [30n, 'dertig'],\n [20n, 'twintig'],\n [19n, 'negentien'],\n [18n, 'achttien'],\n [17n, 'zeventien'],\n [16n, 'zestien'],\n [15n, 'vijftien'],\n [14n, 'veertien'],\n [13n, 'dertien'],\n [12n, 'twaalf'],\n [11n, 'elf'],\n [10n, 'tien'],\n [9n, 'negen'],\n [8n, 'acht'],\n [7n, 'zeven'],\n [6n, 'zes'],\n [5n, 'vijf'],\n [4n, 'vier'],\n [3n, 'drie'],\n [2n, 'twee'],\n [1n, 'een'],\n [0n, 'nul'],\n ]);\n\n this.includeOptionalAnd = options.includeOptionalAnd;\n this.noHundredPairs = options.noHundredPairs;\n }\n\n merge(current, next) {\n let cText = Object.keys(current)[0];\n let nText = Object.keys(next)[0];\n const cNumber = BigInt(Object.values(current)[0]);\n const nNumber = BigInt(Object.values(next)[0]);\n if (cNumber == 1) {\n if (nNumber < 1_000_000) {\n return { [nText]: nNumber };\n }\n cText = 'een';\n }\n\n let value = 0;\n if (nNumber > cNumber) {\n if (nNumber >= 1_000_000) {\n cText += ' ';\n } else if (nNumber > 100) {\n nText += ' ';\n }\n value = cNumber * nNumber;\n } else {\n if (nNumber < 10 && cNumber > 10 && cNumber < 100) {\n const temporary = nText;\n nText = cText;\n const andTxt = temporary.endsWith('e') ? 'ën' : 'en';\n cText = `${temporary}${andTxt}`;\n } else if (nNumber < 13 && cNumber < 1000 && this.includeOptionalAnd) {\n cText = `${cText}en`;\n } else if (nNumber < 13 && cNumber >= 1000 && this.includeOptionalAnd) {\n nText = ` en ${nText}`;\n } else if (cNumber >= 1_000_000) {\n cText += ' ';\n } else {\n if (cNumber == 1000) {\n cText += ' ';\n }\n }\n value = cNumber + nNumber;\n }\n return { [`${cText}${nText}`]: value };\n }\n\n toCardinal(value) {\n if (value >= 1100n && value < 10_000n && !this.noHundredPairs) {\n const high = value / 100n;\n const low = value % 100n;\n if (high % 10n !== 0n) {\n return super.toCardinal(high) + 'honderd' +\n (low ? (this.includeOptionalAnd ? ' en ' : ' ') + super.toCardinal(low) : '');\n }\n }\n return super.toCardinal(value);\n }\n}\n\n/**\n * Converts a value to cardinal (written) form.\n * @param {number|string|bigint} value Number to be convert.\n * @param {object} [options] Options for class.\n * @returns {string} Value in cardinal (written) format.\n * @throws {Error} Value cannot be invalid.\n */\nexport default function floatToCardinal (value, options = {}) {\n return new N2WordsNL(options).floatToCardinal(value);\n}\n","import BaseLanguage from '../classes/base-language.js';\n\nexport class N2WordsDK extends BaseLanguage {\n ordFlag;\n\n constructor(options) {\n options = Object.assign({\n negativeWord: 'minus',\n separatorWord: 'komma',\n zero: 'nul',\n ordFlag: false\n }, options);\n\n super(options, [\n [1_000_000_000_000_000_000_000_000_000n, 'quadrillarder'],\n [1_000_000_000_000_000_000_000_000n, 'quadrillioner'],\n [1_000_000_000_000_000_000_000n, 'trillarder'],\n [1_000_000_000_000_000_000n, 'trillioner'],\n [1_000_000_000_000_000n, 'billarder'],\n [1_000_000_000_000n, 'billioner'],\n [1_000_000_000n, 'millarder'],\n [1_000_000n, 'millioner'],\n [1000n, 'tusind'],\n [100n, 'hundrede'],\n [90n, 'halvfems'],\n [80n, 'firs'],\n [70n, 'halvfjerds'],\n [60n, 'treds'],\n [50n, 'halvtreds'],\n [40n, 'fyrre'],\n [30n, 'tredive'],\n [20n, 'tyve'],\n [19n, 'nitten'],\n [18n, 'atten'],\n [17n, 'sytten'],\n [16n, 'seksten'],\n [15n, 'femten'],\n [14n, 'fjorten'],\n [13n, 'tretten'],\n [12n, 'tolv'],\n [11n, 'elleve'],\n [10n, 'ti'],\n [9n, 'ni'],\n [8n, 'otte'],\n [7n, 'syv'],\n [6n, 'seks'],\n [5n, 'fem'],\n [4n, 'fire'],\n [3n, 'tre'],\n [2n, 'to'],\n [1n, 'et'],\n [0n, 'nul']\n ]);\n\n this.ordFlag = options.ordFlag;\n }\n\n merge(current, next) {\n let cText = Object.keys(current)[0];\n let nText = Object.keys(next)[0];\n const cNumber = BigInt(Object.values(current)[0]);\n const nNumber = BigInt(Object.values(next)[0]);\n let value;\n if (nNumber == 100 || nNumber == 1000) {\n next = { [`et${nText}`]: nNumber };\n }\n if (cNumber == 1) {\n if (nNumber < 1_000_000 || this.ordFlag) {\n return next;\n }\n cText = 'en';\n }\n if (nNumber > cNumber) {\n if (nNumber >= 1_000_000) {\n cText += ' ';\n }\n value = cNumber * nNumber;\n } else {\n if (cNumber >= 100 && cNumber < 1000) {\n cText += ' og ';\n } else if (cNumber >= 1000 && cNumber <= 100_000) {\n cText += 'e og ';\n }\n if ((nNumber < 10) && (10 < cNumber) && (cNumber < 100)) {\n if (nNumber == 1) {\n nText = 'en';\n }\n const temporary = nText;\n nText = cText;\n cText = temporary + 'og';\n } else if (cNumber >= 1_000_000) {\n cText += ' ';\n }\n value = cNumber + nNumber;\n }\n const word = cText + nText;\n return { [`${word}`]: value };\n }\n}\n\n/**\n * Converts a value to cardinal (written) form.\n * @param {number|string|bigint} value Number to be convert.\n * @param {object} [options] Options for class.\n * @returns {string} Value in cardinal (written) format.\n * @throws {Error} Value cannot be invalid.\n */\nexport default function floatToCardinal (value, options = {}) {\n return new N2WordsDK(options).floatToCardinal(value);\n}\n","'use strict';\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\n\n// `Array.prototype.{ indexOf, includes }` methods implementation\nvar createMethod = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIndexedObject($this);\n var length = lengthOfArrayLike(O);\n if (length === 0) return !IS_INCLUDES && -1;\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare -- NaN check\n if (IS_INCLUDES && el !== el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare -- NaN check\n if (value !== value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) {\n if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.includes` method\n // https://tc39.es/ecma262/#sec-array.prototype.includes\n includes: createMethod(true),\n // `Array.prototype.indexOf` method\n // https://tc39.es/ecma262/#sec-array.prototype.indexof\n indexOf: createMethod(false)\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar arrayToReversed = require('../internals/array-to-reversed');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar addToUnscopables = require('../internals/add-to-unscopables');\n\nvar $Array = Array;\n\n// `Array.prototype.toReversed` method\n// https://tc39.es/ecma262/#sec-array.prototype.toreversed\n$({ target: 'Array', proto: true }, {\n toReversed: function toReversed() {\n return arrayToReversed(toIndexedObject(this), $Array);\n }\n});\n\naddToUnscopables('toReversed');\n","'use strict';\n// Should get iterator record of a set-like object before cloning this\n// https://bugs.webkit.org/show_bug.cgi?id=289430\nmodule.exports = function (METHOD_NAME) {\n try {\n // eslint-disable-next-line es/no-set -- needed for test\n var baseSet = new Set();\n var setLike = {\n size: 0,\n has: function () { return true; },\n keys: function () {\n // eslint-disable-next-line es/no-object-defineproperty -- needed for test\n return Object.defineProperty({}, 'next', {\n get: function () {\n baseSet.clear();\n baseSet.add(4);\n return function () {\n return { done: true };\n };\n }\n });\n }\n };\n var result = baseSet[METHOD_NAME](setLike);\n\n return result.size === 1 && result.values().next().value === 4;\n } catch (error) {\n return false;\n }\n};\n","import { N2WordsRU } from './ru.js';\n\nexport class N2WordsLT extends N2WordsRU {\n ones = {\n 1: 'vienas',\n 2: 'du',\n 3: 'trys',\n 4: 'keturi',\n 5: 'penki',\n 6: 'šeši',\n 7: 'septyni',\n 8: 'aštuoni',\n 9: 'devyni'\n };\n\n onesFeminine = {\n 1: 'viena',\n 2: 'dvi',\n 3: 'trys',\n 4: 'keturios',\n 5: 'penkios',\n 6: 'šešios',\n 7: 'septynios',\n 8: 'aštuonios',\n 9: 'devynios'\n };\n\n tens = {\n 0: 'dešimt',\n 1: 'vienuolika',\n 2: 'dvylika',\n 3: 'trylika',\n 4: 'keturiolika',\n 5: 'penkiolika',\n 6: 'šešiolika',\n 7: 'septyniolika',\n 8: 'aštuoniolika',\n 9: 'devyniolika'\n };\n\n twenties = {\n 2: 'dvidešimt',\n 3: 'trisdešimt',\n 4: 'keturiasdešimt',\n 5: 'penkiasdešimt',\n 6: 'šešiasdešimt',\n 7: 'septyniasdešimt',\n 8: 'aštuoniasdešimt',\n 9: 'devyniasdešimt'\n };\n\n hundreds = ['šimtas', 'šimtai'];\n\n thousands = {\n 1: ['tūkstantis', 'tūkstančiai', 'tūkstančių'],\n 2: ['milijonas', 'milijonai', 'milijonų'],\n 3: ['milijardas', 'milijardai', 'milijardų'],\n 4: ['trilijonas', 'trilijonai', 'trilijonų'],\n 5: ['kvadrilijonas', 'kvadrilijonai', 'kvadrilijonų'],\n 6: ['kvintilijonas', 'kvintilijonai', 'kvintilijonų'],\n 7: ['sikstilijonas', 'sikstilijonai', 'sikstilijonų'],\n 8: ['septilijonas', 'septilijonai', 'septilijonų'],\n 9: ['oktilijonas', 'oktilijonai', 'oktilijonų'],\n 10: ['naintilijonas', 'naintilijonai', 'naintilijonų'],\n };\n\n constructor(options) {\n options = Object.assign({\n negativeWord: 'minus',\n separatorWord: 'kablelis',\n zero: 'nulis'\n }, options);\n\n super(options);\n }\n\n pluralize(n, forms) {\n let form = 1;\n const [n1, n2] = this.getDigits(n);\n if (n2 == 1 || n1 == 0 || n == 0) {\n form = 2;\n } else if (n1 == 1) {\n form = 0;\n }\n return forms[form];\n }\n\n toCardinal(number) {\n if (number == 0) {\n return this.zero;\n }\n const words = [];\n const chunks = this.splitByX(number.toString(), 3);\n let index = chunks.length;\n for (const x of chunks) {\n index = index - 1;\n if (x == 0) {\n continue;\n }\n const [n1, n2, n3] = this.getDigits(x);\n if (n3 > 0) {\n words.push(this.ones[n3]);\n if (n3 > 1) {\n words.push(this.hundreds[1]);\n } else {\n words.push(this.hundreds[0]);\n }\n }\n if (n2 > 1) {\n words.push(this.twenties[n2]);\n }\n if (n2 == 1) {\n words.push(this.tens[n1]);\n } else if (n1 > 0) {\n if ((index == 1 || this.feminine && index == 0) && number < 1000) {\n words.push(this.onesFeminine[n1]);\n } else {\n words.push(this.ones[n1]);\n }\n }\n if (index > 0) {\n words.push(this.pluralize(x, this.thousands[index]));\n }\n }\n return words.join(' ');\n }\n}\n\n/**\n * Converts a value to cardinal (written) form.\n * @param {number|string|bigint} value Number to be convert.\n * @param {object} [options] Options for class.\n * @returns {string} Value in cardinal (written) format.\n * @throws {Error} Value cannot be invalid.\n */\nexport default function floatToCardinal (value, options = {}) {\n return new N2WordsLT(options).floatToCardinal(value);\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","/**\n * @module n2words\n */\n\nimport n2wordsAR from './i18n/ar.js';\nimport n2wordsAZ from './i18n/az.js';\nimport n2wordsCZ from './i18n/cz.js';\nimport n2wordsDE from './i18n/de.js';\nimport n2wordsDK from './i18n/dk.js';\nimport n2wordsEN from './i18n/en.js';\nimport n2wordsES from './i18n/es.js';\nimport n2wordsFA from './i18n/fa.js';\nimport n2wordsFR from './i18n/fr.js';\nimport n2wordsFRBE from './i18n/fr-BE.js';\nimport n2wordsHE from './i18n/he.js';\nimport n2wordsHR from './i18n/hr.js';\nimport n2wordsHU from './i18n/hu.js';\nimport n2wordsID from './i18n/id.js';\nimport n2wordsIT from './i18n/it.js';\nimport n2wordsKO from './i18n/ko.js';\nimport n2wordsLT from './i18n/lt.js';\nimport n2wordsLV from './i18n/lv.js';\nimport n2wordsNL from './i18n/nl.js';\nimport n2wordsNO from './i18n/no.js';\nimport n2wordsPL from './i18n/pl.js';\nimport n2wordsPT from './i18n/pt.js';\nimport n2wordsRO from './i18n/ro.js';\nimport n2wordsRU from './i18n/ru.js';\nimport n2wordsSR from './i18n/sr.js';\nimport n2wordsTR from './i18n/tr.js';\nimport n2wordsUK from './i18n/uk.js';\nimport n2wordsVI from './i18n/vi.js';\nimport n2wordsZH from './i18n/zh.js';\n\nconst dict = {\n 'ar': n2wordsAR,\n 'az': n2wordsAZ,\n 'cz': n2wordsCZ,\n 'de': n2wordsDE,\n 'dk': n2wordsDK,\n 'en': n2wordsEN, // default\n 'es': n2wordsES,\n 'fa': n2wordsFA,\n 'fr': n2wordsFR,\n 'fr-BE': n2wordsFRBE,\n 'he': n2wordsHE, // currently only for numbers < 10000\n 'hr': n2wordsHR,\n 'hu': n2wordsHU,\n 'id': n2wordsID,\n 'it': n2wordsIT,\n 'ko': n2wordsKO,\n 'lt': n2wordsLT,\n 'lv': n2wordsLV,\n 'nl': n2wordsNL,\n 'no': n2wordsNO,\n 'pl': n2wordsPL,\n 'pt': n2wordsPT,\n 'ro': n2wordsRO,\n 'ru': n2wordsRU,\n 'sr': n2wordsSR,\n 'tr': n2wordsTR,\n 'uk': n2wordsUK,\n 'vi': n2wordsVI,\n 'zh': n2wordsZH,\n};\n\n/**\n * Converts a number to written form.\n * @param {number|string|bigint} value The number to convert.\n * @param {object} [options] User options.\n * @returns {string} Value in written format.\n * TODO [2024-06] Migrate to object destructing for parameters\n */\n// eslint-disable-next-line unicorn/no-object-as-default-parameter\nfunction floatToCardinal(value, options = { lang: 'en' }) {\n const function_ = dict[options.lang];\n if (function_ != undefined) return function_(value, options);\n\n const fallbackLang = options.lang.split('-') // 'en-UK' -> ['en', 'UK']\n .map((_, index, array) => array.slice(0, array.length - index).join('-')) // ['en-UK', 'en']\n .find(l => dict[l] != undefined);\n if (fallbackLang != undefined) return dict[fallbackLang](value, options);\n\n throw new Error('Unsupported language: ' + value + '.');\n}\n\nexport default floatToCardinal;\n"],"names":["root","factory","exports","module","define","amd","this","isCallable","it","call","aCallable","anObject","tryToString","getIteratorMethod","$TypeError","TypeError","argument","usingIterator","iteratorMethod","arguments","length","$","iterate","getIteratorDirect","iteratorClose","findWithoutClosingOnEarlyError","iteratorHelperWithoutClosingOnEarlyError","target","proto","real","forced","find","predicate","error","record","counter","value","stop","IS_RECORD","INTERRUPTED","result","uncurryThis","fails","hasOwn","DESCRIPTORS","CONFIGURABLE_FUNCTION_NAME","inspectSource","InternalStateModule","enforceInternalState","enforce","getInternalState","get","$String","String","defineProperty","Object","stringSlice","slice","replace","join","CONFIGURABLE_LENGTH","TEMPLATE","split","makeBuiltIn","name","options","getter","setter","configurable","arity","constructor","writable","prototype","undefined","state","source","Function","toString","FunctionPrototype","getDescriptor","getOwnPropertyDescriptor","EXISTS","PROPER","CONFIGURABLE","getBuiltIn","fn","ITERATOR_INSTEAD_OF_RECORD","step","iterator","next","done","test","bind","hasOwnProperty","N2WordsAZ","BaseLanguage","super","assign","negativeWord","separatorWord","zero","merge","lPair","rPair","lText","keys","rText","lNumber","BigInt","values","rNumber","spaceSeparator","floatToCardinal","isPrototypeOf","Prototype","methodName","method","Iterator","ceil","Math","floor","trunc","x","n","USE_SYMBOL_AS_UID","$Object","$Symbol","classof","getMethod","isNullOrUndefined","Iterators","ITERATOR","wellKnownSymbol","Arabic","AbstractLanguage","number","feminine","ones","masculine","arabicTens","arabicHundreds","arabicAppendedTwos","arabicTwos","arabicGroup","arabicAppendedGroup","arabicPluralGroups","digitFeminineStatus","digit","processArabicGroup","groupNumber","groupLevel","tens","hundreds","returnValue","pow","log10","Number","tensIndex","toCardinal","temporaryNumberDec","temporaryNumber","group","numberToProcess","groupDescription","replaceAll","trim","N2WordsFA","namedNumbers","xone","xten","xhundred","tail","thousandMultiplier","tailNumber","millionMultiplier","internalObjectKeys","enumBugKeys","O","N2WordsCZ","N2WordsRU","twenties","thousands","wholeNumber","pluralize","forms","form","words","chunks","splitByX","index","n1","n2","n3","getDigits","push","set","has","NATIVE_WEAK_MAP","globalThis","isObject","createNonEnumerableProperty","shared","sharedKey","hiddenKeys","OBJECT_ALREADY_INITIALIZED","WeakMap","store","metadata","facade","STATE","getterFor","TYPE","type","N2WordsPT","postClean","transforms","transform","RegExp","current","cText","nText","cNumber","nNumber","English","iters","kind","i","N2WordsHU","tensToCardinal","getCardWord","units","hundredsToCardinal","prefix","thousandsToCardinal","postfix","bigNumberToCardinal","numberLength","digits","exp","rest","N2WordsHR","SCALE","genderIndex","union","setMethodGetKeysBeforeCloning","setMethodAcceptSetLike","createIteratorProxy","callWithSafeIterationClosing","iteratorHelperThrowsOnInvalidIterator","IS_PURE","MAP_WITHOUT_THROWING_ON_INVALID_ITERATOR","mapWithoutClosingOnEarlyError","FORCED","IteratorProxy","mapper","map","obj","toIndexedObject","indexOf","object","names","key","N2WordsHE","and","at","descriptor","f","F","getPrototypeOf","activeXDocument","definePropertiesModule","html","documentCreateElement","PROTOTYPE","SCRIPT","IE_PROTO","EmptyConstructor","scriptTag","content","LT","NullProtoObjectViaActiveX","write","close","temp","parentWindow","NullProtoObject","ActiveXObject","iframeDocument","iframe","JS","document","domain","style","display","appendChild","src","contentWindow","open","create","Properties","isSupersetOf","isArrayIteratorMethod","lengthOfArrayLike","getIterator","Result","stopped","ResultPrototype","iterable","unboundFunction","iterFn","that","AS_ENTRIES","IS_ITERATOR","condition","callFn","N2WordsIT","cardinalWords","strTens","exponentPrefixes","accentuate","string","word","omitIfZero","numberToString","phoneticContraction","exponentLengthToString","exponentLength","preDigits","multiplier","exponent","infix","isSetsEqual","a","b","Set","size","every","includes","isSymbol","ordinaryToPrimitive","TO_PRIMITIVE","input","pref","exoticToPrim","toObject","CORRECT_PROTOTYPE_GETTER","ObjectPrototype","replacement","isForced","feature","detection","data","normalize","POLYFILL","NATIVE","toLowerCase","navigator","userAgent","id","random","aSet","SetHelpers","clone","getSetRecord","iterateSet","iterateSimple","remove","other","otherRec","e","N2WordsPL","add","keysIter","functionToString","getOwnPropertySymbols","toIntegerOrInfinity","INVALID_SIZE","$RangeError","RangeError","max","SetRecord","intSize","numSize","cards","card","_card","Array","isArray","toCardMatches","out","remaining","quantity","clean","left","right","element","out0","trimEnd","preWords","isDisjointFrom","createElement","setArrayLength","doesNotExceedSafeInteger","properErrorOnNonWritableLength","item","len","argCount","ArrayPrototype","val","valueOf","SetPrototype","V8_VERSION","symbol","Symbol","sham","SILENT_ON_NON_WRITABLE_LENGTH_SET","METHOD_NAME","ExpectedError","IteratorPrototype","CLOSED","check","window","self","global","definePropertyModule","createPropertyDescriptor","onesFeminine","results","l","start","padStart","toReversed","documentAll","all","IE8_DOM_DEFINE","V8_PROTOTYPE_DEFINE_BUG","toPropertyKey","$defineProperty","$getOwnPropertyDescriptor","ENUMERABLE","WRITABLE","P","Attributes","enumerable","createSetLike","createSetLikeWithInfinitySize","Error","callback","error2","Infinity","symmetricDifference","getOwnPropertyNamesModule","getOwnPropertySymbolsModule","concat","N2WordsLV","uncurryThisAccessor","N2WordsID","base","convertLess100","unitsPart","tensPart","tensPartText","suffix","convertLess1000","tensUnitsPart","hundredsPart","convertMore1000","division","power","r","IndexedObject","requireObjectCoercible","min","integer","N2WordsZH","ltext","lnum","rtext","rnum","zeroDigit","decimalToCardinal","decimal","number_","filter","c","isSubsetOf","V","func","N2WordsRO","tensMasculine","singular","plural","needsDe","onesMap","romanianPluralize","spellUnder1000","chunk","spellUnder100","feminineUnits","t","u","h","hundredWords","chars","decimalNumber","masculineWords","toCardinalWithMasculine","NATIVE_BIND","apply","uid","toLength","defineBuiltIn","isNaN","splitValue","ENTRIES","splitBy3","firstBlock","blocks","stringNumber","firstBlockLength","nextBlock","spell","spelling","wordBlocks","getTens","getHundreds","block","wordList","UNSCOPABLES","defineGlobalProperty","copyConstructorProperties","targetProperty","sourceProperty","TARGET","GLOBAL","STATIC","stat","dontCallGetSet","N2WordsFR","_region","withHyphenSeparator","objectKeys","defineProperties","props","simple","unsafe","nonConfigurable","nonWritable","TO_STRING_TAG_SUPPORT","classofRaw","TO_STRING_TAG","CORRECT_ARGUMENTS","tag","tryGet","callee","toPrimitive","bitmap","NATIVE_SYMBOL","propertyIsEnumerable","N2WordsES","genderStem","N2WordsKO","propertyIsEnumerableModule","C","A","k","SHARED","versions","version","mode","copyright","license","difference","setLike","baseSet","clear","PrototypeOfArrayIteratorPrototype","arrayIterator","BUGGY_SAFARI_ITERATORS","ownKeys","getOwnPropertyDescriptorModule","exceptions","namespace","N2WordsUK","intersection","from","anInstance","defineBuiltInAccessor","createProperty","CONSTRUCTOR","NativeIterator","IteratorConstructor","defineIteratorPrototypeAccessor","WellKnownSymbolsStore","createWellKnownSymbol","withoutSetter","forEach","interruptible","getOwnPropertyNames","$propertyIsEnumerable","NASHORN_BUG","N2WordsDE","temporary","exec","N2WordsTR","dropSpaces","N2WordsSR","N2WordsFRBE","N2WordsNO","defineBuiltIns","createIterResultObject","iteratorCloseAll","ITERATOR_HELPER","WRAP_FOR_VALID_ITERATOR","NORMAL","THROW","setInternalState","createIteratorProxyPrototype","nextHandler","returnHandlerResult","returnMethod","inner","openIters","WrapForValidIteratorPrototype","IteratorHelperPrototype","RETURN_HANDLER_RESULT","uncurryThisWithBind","match","process","Deno","v8","innerResult","innerError","N2WordsNL","includeOptionalAnd","noHundredPairs","andTxt","endsWith","high","low","N2WordsDK","ordFlag","toAbsoluteIndex","createMethod","IS_INCLUDES","$this","el","fromIndex","arrayToReversed","addToUnscopables","$Array","N2WordsLT","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","d","definition","o","prop","dict","n2wordsAR","n2wordsAZ","n2wordsCZ","n2wordsDE","n2wordsDK","n2wordsEN","n2wordsES","n2wordsFA","n2wordsFR","n2wordsFRBE","n2wordsHE","n2wordsHR","n2wordsHU","n2wordsID","n2wordsIT","n2wordsKO","n2wordsLT","n2wordsLV","n2wordsNL","n2wordsNO","n2wordsPL","n2wordsPT","n2wordsRO","n2wordsRU","n2wordsSR","n2wordsTR","n2wordsUK","n2wordsVI","n2wordsZH","lang","function_","fallbackLang","_","array"],"sourceRoot":""}
1
+ {"version":3,"file":"n2words.js","sources":["../lib/classes/abstract-language.js","../lib/classes/greedy-scale-language.js","../lib/classes/turkic-language.js","../lib/classes/south-asian-language.js","../lib/classes/slavic-language.js","../lib/languages/fr.js","../lib/languages/pt.js","../lib/n2words.js","../lib/languages/ar.js","../lib/languages/az.js","../lib/languages/bn.js","../lib/languages/hbo.js","../lib/languages/hr.js","../lib/languages/cs.js","../lib/languages/da.js","../lib/languages/nl.js","../lib/languages/en.js","../lib/languages/fil.js","../lib/languages/fr-BE.js","../lib/languages/de.js","../lib/languages/el.js","../lib/languages/gu.js","../lib/languages/he.js","../lib/languages/hi.js","../lib/languages/hu.js","../lib/languages/id.js","../lib/languages/it.js","../lib/languages/ja.js","../lib/languages/kn.js","../lib/languages/ko.js","../lib/languages/lv.js","../lib/languages/lt.js","../lib/languages/ms.js","../lib/languages/mr.js","../lib/languages/nb.js","../lib/languages/fa.js","../lib/languages/pl.js","../lib/languages/pa.js","../lib/languages/ro.js","../lib/languages/ru.js","../lib/languages/sr-Cyrl.js","../lib/languages/sr-Latn.js","../lib/languages/zh-Hans.js","../lib/languages/es.js","../lib/languages/sw.js","../lib/languages/sv.js","../lib/languages/ta.js","../lib/languages/te.js","../lib/languages/th.js","../lib/languages/zh-Hant.js","../lib/languages/tr.js","../lib/languages/uk.js","../lib/languages/ur.js","../lib/languages/vi.js"],"sourcesContent":["/**\n * Abstract base class for language converters.\n *\n * This class provides the framework for converting numbers to words in any language.\n * It handles the common conversion flow while delegating language-specific logic to subclasses.\n *\n * ## Responsibilities\n *\n * - Receives pre-validated and normalized input from the public API (n2words.js)\n * - Handles negative number prefixing via `negativeWord`\n * - Converts decimals via `decimalDigitsToWords()`, preserving leading zeros\n * - Delegates integer conversion to `integerToWords()` (implemented by subclasses)\n *\n * ## Required Subclass Implementation\n *\n * Subclasses MUST provide:\n * - `integerToWords(integerPart)` - Core conversion logic (abstract method)\n * - `negativeWord` - Word preceding negative numbers (e.g., \"minus\"))\n * - `zeroWord` - Word for the digit 0 (e.g., \"zero\")\n * - `decimalSeparatorWord` - Word between whole and decimal parts (e.g., \"point\")\n *\n * ## Optional Overrides\n *\n * Subclasses MAY override:\n * - `wordSeparator` - Character(s) between words (default: space, empty for CJK languages)\n * - `usePerDigitDecimals` - Enable per-digit decimal mode (default: false)\n * - `decimalIntegerToWords()` - Custom decimal conversion (e.g., Romanian masculine forms)\n * - `decimalDigitsToWords()` - Complete decimal conversion override\n * - `toWords()` - Override to capture integerPart for context-dependent rules (e.g., Czech)\n *\n * ## Input Contract\n *\n * Input validation and normalization happen at the public API boundary (n2words.js).\n * This class assumes it receives clean, pre-processed data via `toWords()`.\n *\n * @abstract\n */\nexport class AbstractLanguage {\n // ============================================================================\n // Private Fields\n // ============================================================================\n\n /**\n * Private storage for options.\n * @type {Object}\n */\n #options = {}\n\n // ============================================================================\n // Required Properties (subclasses must define)\n // ============================================================================\n\n /**\n * Word that precedes negative numbers (e.g., \"minus\", \"negative\", \"moins\").\n * @type {string}\n */\n negativeWord = ''\n\n /**\n * Word that separates integer and decimal parts (e.g., \"point\", \"virgule\", \"comma\").\n * @type {string}\n */\n decimalSeparatorWord = ''\n\n /**\n * Word representation for the digit 0 (e.g., \"zero\", \"zéro\", \"null\").\n * Used for zero values and leading zeros in decimals.\n * @type {string}\n */\n zeroWord = ''\n\n // ============================================================================\n // Optional Properties (subclasses may override)\n // ============================================================================\n\n /**\n * Character(s) used to separate words in the output.\n *\n * Defaults to a single space. Set to empty string for languages without\n * word separators (e.g., Japanese, Thai, Chinese).\n *\n * @type {string}\n */\n wordSeparator = ' '\n\n /**\n * Whether to convert decimal digits individually rather than grouped.\n *\n * - `false` (default): Leading zeros preserved, remaining digits grouped as a number\n * - Example: \"05\" → [\"zero\", \"five\"], \"14\" → [\"fourteen\"]\n * - Used by: English, Spanish, French, German, etc.\n *\n * - `true`: Each digit converted separately\n * - Example: \"05\" → [\"zero\", \"five\"], \"14\" → [\"one\", \"four\"]\n * - Used by: Japanese, Thai, Tamil, Telugu, Greek, Hebrew, Filipino\n *\n * @type {boolean}\n */\n usePerDigitDecimals = false\n\n // ============================================================================\n // Public Accessors\n // ============================================================================\n\n /**\n * Read-only access to options set via `setOptions()`.\n * @type {Object}\n */\n get options () {\n return this.#options\n }\n\n // ============================================================================\n // Public Methods\n // ============================================================================\n\n /**\n * Converts pre-normalized numeric components to words.\n *\n * This is the main entry point called by the public API (makeConverter in n2words.js).\n * It assembles the final word representation from the provided components.\n *\n * **Caller contract (enforced by makeConverter):**\n * - `integerPart` is a non-negative BigInt (>= 0n)\n * - `decimalPart` is a string of digits only (no sign, no decimal point)\n * - `isNegative` reflects the original input sign\n *\n * **Conversion flow:**\n * 1. Prepend negative word if applicable\n * 2. Convert integer part via `integerToWords()`\n * 3. If decimals present: append separator and decimal words\n * 4. Join all parts with `wordSeparator`\n *\n * Subclasses needing access to the integer part during decimal conversion\n * (e.g., for context-dependent separator words) should override this\n * method to cache the value before calling super.toWords().\n *\n * @public\n * @param {boolean} isNegative Whether the original number was negative\n * @param {bigint} integerPart The integer part (always non-negative)\n * @param {string} [decimalPart] - Decimal digits if present (e.g., \"14\" for 3.14)\n * @returns {string} The localized cardinal string\n */\n toWords (isNegative, integerPart, decimalPart) {\n const words = []\n\n if (isNegative) words.push(this.negativeWord)\n\n words.push(this.integerToWords(integerPart))\n\n if (decimalPart) {\n words.push(this.decimalSeparatorWord)\n words.push(...this.decimalDigitsToWords(decimalPart))\n }\n\n return words.join(this.wordSeparator)\n }\n\n // ============================================================================\n // Abstract Methods (subclasses must implement)\n // ============================================================================\n\n /**\n * Converts a BigInt integer part to its cardinal word representation.\n *\n * This is the core template method that subclasses MUST implement to provide\n * language-specific number conversion logic.\n *\n * @abstract\n * @param {bigint} integerPart The integer part to convert (always >= 0n)\n * @returns {string} The cardinal representation in the target language\n * @throws {Error} If not implemented by subclass\n */\n integerToWords (integerPart) {\n throw new Error('integerToWords() must be implemented by subclass')\n }\n\n // ============================================================================\n // Protected Methods (subclasses may override or call)\n // ============================================================================\n\n /**\n * Sets options by merging language defaults with user-provided options.\n *\n * Merges defaults first, then user options (later keys override earlier ones).\n * Stores the result in the private `#options` field, accessible via the\n * read-only `options` getter.\n *\n * @protected\n * @param {Object} [defaults={}] - Default option values for the language\n * @param {Object} [userOptions={}] - Runtime options supplied by the caller\n *\n * @example\n * constructor(options = {}) {\n * super()\n * this.setOptions({ gender: 'masculine' }, options)\n * }\n */\n setOptions (defaults = {}, userOptions = {}) {\n this.#options = {\n ...defaults,\n ...userOptions\n }\n }\n\n /**\n * Converts an integer to words in decimal context.\n *\n * By default, delegates to `integerToWords()`. Override this method\n * when decimal conversion requires different behavior than integer conversion.\n *\n * Called with:\n * - Single digits (0-9) when `usePerDigitDecimals = true`\n * - Grouped numbers when `usePerDigitDecimals = false`\n *\n * **Use cases for overriding:**\n * - Romanian: Decimals always use masculine forms regardless of gender option\n * - Languages with different plural/gender rules for decimal vs integer parts\n *\n * @protected\n * @param {bigint} integerPart The integer to convert (single digit or grouped)\n * @returns {string} The word representation for use in decimal context\n */\n decimalIntegerToWords (integerPart) {\n return this.integerToWords(integerPart)\n }\n\n /**\n * Converts decimal fractional digits into an array of words.\n *\n * Leading zeros are always preserved individually. The remaining digits\n * are converted based on `usePerDigitDecimals`:\n *\n * - `false` (default): Remaining digits grouped as a single number\n * - \"05\" → [\"zero\", \"five\"], \"14\" → [\"fourteen\"]\n *\n * - `true`: Each remaining digit converted separately\n * - \"05\" → [\"zero\", \"five\"], \"14\" → [\"one\", \"four\"]\n *\n * @protected\n * @param {string} decimalPart Decimal digits as string (e.g., \"05\" for 3.05)\n * @returns {string[]} Array of word tokens for the fractional part\n */\n decimalDigitsToWords (decimalPart) {\n const words = []\n\n // Always preserve leading zeros individually\n let i = 0\n while (i < decimalPart.length && decimalPart[i] === '0') {\n words.push(this.zeroWord)\n i++\n }\n\n const remainder = decimalPart.slice(i)\n if (!remainder) return words\n\n // Convert remainder: per-digit or as single number\n if (this.usePerDigitDecimals) {\n for (const char of remainder) {\n words.push(this.decimalIntegerToWords(BigInt(char)))\n }\n } else {\n words.push(this.decimalIntegerToWords(BigInt(remainder)))\n }\n\n return words\n }\n}\n","import { AbstractLanguage } from './abstract-language.js'\n\n/**\n * Greedy scale language converter implementing the \"highest-matching scale word\" algorithm.\n *\n * Responsibilities:\n * - Decompose an integer into a sequence of word-sets using greedy matching.\n * - Provide helpers to reduce and post-process matched word-sets.\n * - Inherits decimal handling from AbstractLanguage (supports grouped and per-digit\n * modes via the `usePerDigitDecimals` class property).\n *\n * Subclass requirements:\n * - Define `scaleWords` (ordered descending) as `[bigint, string]` tuples.\n * - Implement 'combineWordSets(preceding, following)' to combine adjacent word-sets\n * per language grammar.\n *\n * Scale words specification:\n * - `scaleWords` is an Array of 2-tuples: `[bigint, string]` where the first element\n * is the numeric scale value and the second is the word for that value.\n * - Scale words MUST be ordered from largest to smallest (descending) for the algorithm\n * to function correctly.\n *\n * Terminology:\n * - **Scale**: A magnitude value (100n, 1000n, 1000000n)\n * - **Word-set**: An object `{ word: bigint }` representing a partial result\n * - **Scale word**: The word for a scale value (\"hundred\", \"thousand\")\n *\n * @abstract\n * @extends AbstractLanguage\n */\n\nexport class GreedyScaleLanguage extends AbstractLanguage {\n // ============================================================================\n // Required Properties (subclasses must define)\n // ============================================================================\n\n /**\n * Array of scale words mapping numeric values to their word representations.\n *\n * Each element is a 2-tuple: `[bigint, string]` where the first element is the\n * numeric scale value and the second is the word for that value. The array MUST be\n * ordered from largest to smallest (descending) for the greedy algorithm to work correctly.\n *\n * @type {Array<[bigint, string]>}\n * @example\n * // English scale words (descending order):\n * // [[1000000000n, 'billion'], [1000000n, 'million'], [1000n, 'thousand'], [100n, 'hundred'], ..., [1n, 'one']]\n */\n scaleWords\n\n // ============================================================================\n // Public Methods\n // ============================================================================\n\n /**\n * Returns the word for an exact scale value.\n *\n * @param {bigint} scale The scale value to look up (prefer BigInt for exact matching).\n * @returns {string|undefined} The word for the provided scale, or `undefined`.\n */\n wordForScale (scale) {\n const match = this.scaleWords.find((pair) => pair[0] === scale)\n return match?.[1]\n }\n\n // ============================================================================\n // Protected Methods (subclasses may call or override)\n // ============================================================================\n\n /**\n * Decomposes an integer into a sequence of word-sets.\n *\n * This internal helper returns a nested structure that represents quantities and\n * their matching scale words (e.g. `[{ 'one': 1n }, { 'hundred': 100n }, ...]`).\n * The result is designed to be reduced by `reduceWordSets()` using language-specific `combineWordSets()`.\n *\n * For quantities > 1, the multiplier is recursively decomposed. For quantity = 1,\n * the implicit \"one\" is represented with `{ 'one': 1n }` and typically omitted during combineWordSets().\n *\n * @protected\n * @param {bigint} integerPart The integer to decompose.\n * @returns {Array<Object|Array>} An array of word-set objects and possibly nested arrays.\n */\n decomposeInteger (integerPart) {\n const wordSets = []\n let remaining = integerPart\n\n do {\n const match = this.scaleWords.find((pair) => remaining >= pair[0])\n if (!match) break\n\n const multiplier = remaining === 0n ? 1n : remaining / match[0]\n\n if (multiplier === 1n) {\n wordSets.push({ [this.wordForScale(1n)]: 1n })\n } else {\n wordSets.push(this.decomposeInteger(multiplier))\n }\n\n wordSets.push({ [match[1]]: match[0] })\n\n remaining = remaining === 0n ? 0n : remaining % match[0]\n } while (remaining > 0n)\n\n return wordSets\n }\n\n /**\n * Reduces a nested array of word-sets into a single word-set object.\n *\n * This method repeatedly applies the subclass `combineWordSets()` operation until a single\n * object remains. It normalizes nested arrays by recursively reducing them.\n *\n * @protected\n * @param {Array<Object|Array>} wordSets Array of word-set objects and nested arrays.\n * @returns {Object} Reduced word-set where the single object key is the language string\n * and its value is the numeric BigInt result for that string.\n */\n reduceWordSets (wordSets) {\n while (wordSets.length > 1) {\n const [first, second, ...rest] = wordSets\n\n if (!Array.isArray(first) && !Array.isArray(second)) {\n const combined = this.combineWordSets(first, second)\n wordSets = rest.length > 0 ? [combined, rest] : [combined]\n continue\n }\n\n const normalized = wordSets.map((element) => {\n if (!Array.isArray(element)) return element\n return element.length === 1 ? element[0] : this.reduceWordSets(element)\n })\n\n wordSets = normalized\n }\n\n return wordSets[0]\n }\n\n // ============================================================================\n // Abstract Methods (subclasses must implement)\n // ============================================================================\n\n /**\n * Combines two adjacent word-sets into a single word-set.\n *\n * This is the core language-specific method that must be implemented by subclasses\n * to define how adjacent word-sets are combined according to the language's grammar.\n * For example, English combines \"twenty\" + \"three\" → \"twenty-three\", while\n * French might combine \"quatre-vingts\" + \"dix\" → \"quatre-vingt-dix\".\n *\n * @abstract\n * @protected\n * @param {Object} preceding Preceding word-set as `{ word: bigint }`.\n * @param {Object} following Following word-set as `{ word: bigint }`.\n * @returns {Object} Combined word-set with merged text and resulting numeric value.\n *\n * @example\n * // English implementation might handle:\n * // combineWordSets({ 'twenty': 20n }, { 'three': 3n }) → { 'twenty-three': 23n }\n * // combineWordSets({ 'one': 1n }, { 'hundred': 100n }) → { 'one hundred': 100n }\n */\n combineWordSets (preceding, following) {\n throw new Error('combineWordSets() must be implemented by subclass')\n }\n\n // ============================================================================\n // Optional Methods (subclasses may override)\n // ============================================================================\n\n /**\n * Final string post-processing hook.\n *\n * Subclasses may override to apply language-specific whitespace, punctuation or\n * orthographic corrections.\n *\n * @protected\n * @param {string} output Language string produced by the conversion flow.\n * @returns {string} Final formatted string.\n */\n finalizeWords (output) {\n return output.trimEnd()\n }\n\n /**\n * Converts an integer to its language-specific cardinal words.\n *\n * This method orchestrates decomposition, reduction, and final formatting. It does\n * not handle decimals or sign; those concerns are implemented in\n * `AbstractLanguage.toWords` which calls this method for the integer part.\n *\n * @param {bigint} integerPart The integer to convert.\n * @returns {string} The cardinal representation for the integer in the language.\n */\n integerToWords (integerPart) {\n const wordSets = this.decomposeInteger(integerPart)\n const reduced = this.reduceWordSets(wordSets)\n const result = Object.keys(reduced)[0]\n return this.finalizeWords(result)\n }\n}\n","import { GreedyScaleLanguage } from './greedy-scale-language.js'\n\n/**\n * Base class for Turkic languages with shared grammar patterns.\n *\n * This class provides a reusable implementation for Turkic languages that share:\n * - Space-separated number combinations\n * - Implicit 'bir' (one) before hundreds and thousands\n * - Simple multiplication/addition logic\n * - Consistent magnitude handling\n * - Inherits decimal handling from AbstractLanguage via GreedyScaleLanguage\n * (supports both grouped and per-digit modes via the `usePerDigitDecimals` class property).\n *\n * Used by: Turkish (TR), Azerbaijani (AZ)\n *\n * Subclasses MUST define (from GreedyScaleLanguage requirements):\n * - `scaleWords` array of [value, word] tuples as a class property (ordered descending by value).\n * Optionally, language-specific class properties (e.g., `negativeWord`, `zeroWord`, `decimalSeparatorWord`, `wordSeparator`).\n *\n * TurkicLanguage provides a default `combineWordSets()` implementation; subclasses may override\n * if specialized combine logic is needed (unlikely for Turkic languages).\n *\n * @abstract\n * @extends GreedyScaleLanguage\n */\nexport class TurkicLanguage extends GreedyScaleLanguage {\n // ============================================================================\n // Inherited Implementation (overrides GreedyScaleLanguage)\n // ============================================================================\n\n /**\n * Combines two adjacent word-sets according to Turkic grammar rules.\n *\n * Shared Turkic patterns:\n * - Implicit 'bir' (one) before hundreds and thousands\n * - Space separator (wordSeparator property) for all combinations\n * - Multiplies when following > preceding (crossing magnitude boundary)\n * - Adds otherwise (combining same-magnitude components)\n *\n * @param {Object} preceding Preceding word-set as { word: bigint }.\n * @param {Object} following Following word-set as { word: bigint }.\n * @returns {Object} Combined word-set with merged word and resulting number.\n */\n combineWordSets (preceding, following) {\n const [[precedingWord, precedingValue]] = Object.entries(preceding)\n const [[followingWord, followingValue]] = Object.entries(following)\n\n // Implicit 'bir' (one) before certain magnitudes:\n // Omit '1' before hundreds (100n) and thousands (1000n) to form natural combinations\n if (precedingValue === 1n && (followingValue <= 100n || followingValue === 1000n)) {\n return following // Return just the magnitude word (e.g., \"yüz\", not \"bir yüz\")\n }\n\n // Combine numbers with space separator (wordSeparator from GreedyScaleLanguage):\n // Multiply when crossing magnitude boundary, add otherwise\n const resultNumber = followingValue > precedingValue ? precedingValue * followingValue : precedingValue + followingValue\n return { [`${precedingWord}${this.wordSeparator}${followingWord}`]: resultNumber }\n }\n}\n","import { AbstractLanguage } from './abstract-language.js'\n\n/**\n * Base class for South Asian languages with shared grouping patterns.\n *\n * This class provides a reusable implementation for South Asian languages that share:\n * - Indian-style number grouping: last 3 digits, then 2-2 (1,23,45,67,89)\n * - Lakh (100,000), Crore (10,000,000), Arab (1,000,000,000) scale words\n * - Standard negative and decimal handling (inherits AbstractLanguage decimal logic,\n * including `usePerDigitDecimals` support when set by subclasses)\n *\n * Used by: Hindi (hi), Bengali (bn), Urdu (ur), Punjabi (pa), Marathi (mr), Gujarati (gu), Kannada (kn)\n *\n * Subclasses MUST define language-specific vocabulary via class properties:\n * - `belowHundredWords` array with digit and teen words (0-99)\n * - `hundredWord` string used inside `segmentToWords`\n * - `scaleWords` array with grouping words (hazaar, lakh, crore, etc.) indexed by grouping level\n * - `negativeWord`, `decimalSeparatorWord`, `zeroWord`, `wordSeparator`\n *\n * @abstract\n * @extends AbstractLanguage\n */\nexport class SouthAsianLanguage extends AbstractLanguage {\n // ============================================================================\n // Required Properties (subclasses must define)\n // ============================================================================\n\n /**\n * Array of words for numbers 0-99 (digits and teens).\n * Index directly: belowHundredWords[0] through belowHundredWords[99].\n * @type {Array<string>}\n */\n belowHundredWords\n\n /**\n * Word for \"hundred\" in the language (e.g., 'सौ' in Hindi, 'শত' in Bengali).\n * Used to construct hundreds (e.g., \"1 hundred\", \"2 hundred\").\n * @type {string}\n */\n hundredWord\n\n /**\n * Array of scale words for Indian-style grouping (hazaar, lakh, crore, arab, etc.).\n * Index 0 contains empty string (ones place has no scale word).\n * Index 1 is for thousands, Index 2 for lakhs, Index 3 for crores, etc.\n * @type {Array<string>}\n */\n scaleWords\n\n // ============================================================================\n // Protected Methods (subclasses may call or override)\n // ============================================================================\n\n /**\n * Splits a number into Indian numbering system segments.\n *\n * The Indian system segments differently than Western (3-3-3) systems:\n * - First segment (rightmost): Up to 3 digits (ones, tens, hundreds)\n * - Subsequent segments: Exactly 2 digits each (thousands, lakhs, crores, etc.)\n *\n * This creates the familiar Indian comma pattern: 1,23,45,67,890\n *\n * @protected\n * @param {bigint} integerPart The integer to split into segments.\n * @returns {Array<number>} Array of segments from most significant to least significant.\n *\n * @example\n * // splitToSegments(1234567n) → [12, 34, 567]\n * // Reads as: 12 lakhs, 34 thousands, 567 units\n * // splitToSegments(98765432n) → [9, 87, 65, 432]\n * // Reads as: 9 crores, 87 lakhs, 65 thousands, 432 units\n */\n splitToSegments (integerPart) {\n const numStr = integerPart.toString()\n\n if (numStr.length <= 3) {\n return [Number(numStr)]\n }\n\n const segments = []\n const last3 = numStr.slice(-3)\n segments.unshift(Number(last3))\n\n let remaining = numStr.slice(0, -3)\n while (remaining.length > 0) {\n const segment = remaining.slice(-2)\n segments.unshift(Number(segment))\n remaining = remaining.slice(0, -2)\n }\n\n return segments\n }\n\n /**\n * Converts a segment (0-999) to words.\n *\n * @protected\n * @param {number} segmentValue Value between 0 and 999.\n * @returns {string} Language-specific word representation.\n */\n segmentToWords (segmentValue) {\n if (segmentValue === 0) return ''\n if (segmentValue < 100) return this.belowHundredWords[segmentValue]\n\n const hundreds = Math.trunc(segmentValue / 100)\n const remainder = segmentValue % 100\n const parts = []\n\n if (hundreds === 1) {\n parts.push(this.belowHundredWords[1] + ' ' + this.hundredWord)\n } else {\n parts.push(this.belowHundredWords[hundreds] + ' ' + this.hundredWord)\n }\n\n if (remainder > 0) {\n parts.push(this.belowHundredWords[remainder])\n }\n\n return parts.join(' ')\n }\n\n // ============================================================================\n // Public Methods\n // ============================================================================\n\n /**\n * Converts integer to cardinal words using South Asian grouping.\n *\n * @param {bigint} integerPart Number to convert.\n * @returns {string} Cardinal representation.\n */\n integerToWords (integerPart) {\n if (integerPart === 0n) {\n return this.zeroWord\n }\n\n const segments = this.splitToSegments(integerPart)\n const segmentCount = segments.length\n const words = []\n\n for (let i = 0; i < segmentCount; i++) {\n const segmentValue = segments[i]\n if (segmentValue === 0) continue\n\n const scaleIndex = segmentCount - i - 1\n words.push(this.segmentToWords(segmentValue))\n if (scaleIndex > 0 && this.scaleWords[scaleIndex]) {\n words.push(this.scaleWords[scaleIndex])\n }\n }\n\n return words.join(' ').trim()\n }\n}\n","import { AbstractLanguage } from './abstract-language.js'\n\n/**\n * Base class for Slavic and related languages with complex pluralization.\n *\n * This class provides a reusable implementation for languages that share:\n * - Three-form pluralization (singular/few/many)\n * - Gender-aware number forms (masculine/feminine for 1-9)\n * - Hundreds, tens, ones decomposition pattern\n * - Segment-based large number handling (thousands, millions, etc.)\n * - Inherits decimal handling from AbstractLanguage (supports both grouped and\n * per-digit modes via the `usePerDigitDecimals` class property).\n *\n * Used by: Russian (ru), Czech (cs), Polish (pl), Ukrainian (uk), Serbian (sr-Latn),\n * Croatian (hr), Lithuanian (lt), Latvian (lv), Hebrew (he), and Biblical Hebrew (hbo).\n *\n * Subclasses MUST define these properties with language-specific vocabulary:\n * - `onesWords` - Object mapping 1-9 to masculine forms (or default forms)\n * - `onesFeminineWords` - Object mapping 1-9 to feminine forms (if gender distinction exists)\n * - `teensWords` - Object mapping 0-9 to teen numbers (10-19)\n * - `twentiesWords` - Object mapping 2-9 to tens (20-90)\n * - `hundredsWords` - Object mapping 1-9 to hundreds (100-900) or special hundreds handling\n * - `pluralForms` - Object mapping segment indices to [singular, few, many] plural forms\n *\n * Optional properties:\n * - `scaleGenders` - Object mapping segment indices to boolean (true = feminine scale word)\n * If not defined, defaults to thousands (index 1) being feminine, others masculine.\n *\n * @abstract\n * @extends AbstractLanguage\n */\nexport class SlavicLanguage extends AbstractLanguage {\n // ============================================================================\n // Required Properties (subclasses must define)\n // ============================================================================\n\n /**\n * Masculine forms for digits 1-9 (or default forms if no gender distinction).\n *\n * @type {Object.<number, string>}\n */\n onesWords = {}\n\n /**\n * Feminine forms for digits 1-9 (if language has gender distinction).\n *\n * @type {Object.<number, string>}\n */\n onesFeminineWords = {}\n\n /**\n * Words for teen numbers (10-19).\n *\n * @type {Object.<number, string>}\n */\n teensWords = {}\n\n /**\n * Words for multiples of ten (20, 30, 40, etc.).\n *\n * @type {Object.<number, string>}\n */\n twentiesWords = {}\n\n /**\n * Words for hundreds (100, 200, 300, etc.) or special hundreds handling.\n *\n * @type {Object.<number, string>}\n */\n hundredsWords = {}\n\n /**\n * Plural forms for scale words (thousands, millions, billions, etc.).\n * Maps segment indices to [singular, few, many] forms.\n *\n * @type {Object.<number, string[]>}\n */\n pluralForms = {}\n\n // ============================================================================\n // Optional Properties (subclasses may override)\n // ============================================================================\n\n /**\n * Gender of each scale word.\n * Maps segment indices to boolean: true = feminine, false = masculine.\n * Default is empty (all masculine). Languages with feminine thousands\n * (Russian, Ukrainian, Serbian, Croatian) should set `{ 1: true }`.\n *\n * @type {Object.<number, boolean>}\n */\n scaleGenders = {}\n\n /**\n * Whether to omit \"one\" before scale words (e.g., \"thousand\" instead of \"one thousand\").\n * When true, 1000 becomes \"tysiąc\" (Polish) instead of \"jeden tysiąc\".\n * Used by Polish, Czech, and similar languages.\n *\n * @type {boolean}\n */\n omitOneBeforeScale = false\n\n // ============================================================================\n // Constructor\n // ============================================================================\n\n /**\n * Constructs a SlavicLanguage instance with optional configuration.\n *\n * @param {Object} [options] Configuration options.\n * @param {('masculine'|'feminine')} [options.gender='masculine'] Grammatical gender for number forms.\n */\n constructor (options = {}) {\n super()\n\n this.setOptions({\n gender: 'masculine'\n }, options)\n }\n\n // ============================================================================\n // Public Methods\n // ============================================================================\n\n /**\n * Converts an integer to its word representation.\n *\n * This method implements the Slavic number construction algorithm:\n * 1. Split number into 3-digit segments from right to left (567, 234, 1 for 1,234,567)\n * 2. For each segment (processing left to right): convert hundreds, tens, ones\n * 3. Apply gender rules: feminine forms for thousands segment or when feminine=true\n * 4. Add appropriate pluralized scale word (thousand/million/billion/etc.)\n * 5. Join all parts with spaces\n *\n * @param {bigint} integerPart The integer to convert (non-negative).\n * @returns {string} The number in words.\n */\n integerToWords (integerPart) {\n if (integerPart === 0n) {\n return this.zeroWord\n }\n\n const words = []\n const segments = this.splitToSegments(integerPart.toString(), 3)\n let segmentIndex = segments.length\n\n for (const segmentValue of segments) {\n segmentIndex = segmentIndex - 1\n\n if (segmentValue === 0n) {\n continue\n }\n\n const [onesDigit, tensDigit, hundredsDigit] = this.extractDigits(segmentValue)\n\n if (hundredsDigit > 0n) {\n words.push(this.hundredsWords[hundredsDigit])\n }\n\n if (tensDigit > 1n) {\n words.push(this.twentiesWords[tensDigit])\n }\n\n // Handle teens (10-19) or ones (1-9)\n if (tensDigit === 1n) {\n // Teens: use teensWords array directly\n words.push(this.teensWords[onesDigit])\n } else if (onesDigit > 0n) {\n // Skip \"one\" before scale words if omitOneBeforeScale is set\n // e.g., Polish says \"tysiąc\" not \"jeden tysiąc\" for 1000\n const shouldOmitOne = this.omitOneBeforeScale && segmentIndex > 0 && segmentValue === 1n\n\n if (!shouldOmitOne) {\n // Determine if feminine forms should be used:\n // 1. Check scaleGenders for this segment index (e.g., thousands = index 1)\n // 2. Also use feminine if user requested gender='feminine' for the ones segment\n const isScaleFeminine = this.scaleGenders[segmentIndex] === true\n const isFeminine = isScaleFeminine || (this.options.gender === 'feminine' && segmentIndex === 0)\n const onesArray = isFeminine ? this.onesFeminineWords : this.onesWords\n words.push(onesArray[onesDigit])\n }\n }\n\n // Add power word (thousand, million, etc.) with proper pluralization\n if (segmentIndex > 0) {\n words.push(this.pluralize(segmentValue, this.pluralForms[segmentIndex]))\n }\n }\n\n return words.join(' ')\n }\n\n // ============================================================================\n // Protected Methods (subclasses may call or override)\n // ============================================================================\n\n /**\n * Splits a number string into segments of specified size from right to left.\n *\n * Example: splitToSegments('1234567', 3) => [1n, 234n, 567n]\n * This represents: 1 million + 234 thousand + 567 ones\n *\n * @param {string} numberString The number as a string.\n * @param {number} segmentSize Segment size (typically 3 for thousands grouping).\n * @returns {bigint[]} Array of BigInt segments from highest to lowest scale.\n */\n splitToSegments (numberString, segmentSize) {\n const segments = []\n const stringLength = numberString.length\n\n if (stringLength > segmentSize) {\n const remainderLength = stringLength % segmentSize\n\n if (remainderLength > 0) {\n segments.push(BigInt(numberString.slice(0, remainderLength)))\n }\n\n for (let i = remainderLength; i < stringLength; i += segmentSize) {\n segments.push(BigInt(numberString.slice(i, i + segmentSize)))\n }\n } else {\n segments.push(BigInt(numberString))\n }\n\n return segments\n }\n\n /**\n * Extracts individual digits from a number (units, tens, hundreds).\n *\n * Returns digits in reverse order: [ones, tens, hundreds]\n * Example: 456 => [6n, 5n, 4n]\n *\n * @param {bigint} value The number to extract digits from (0-999).\n * @returns {bigint[]} Array of [ones, tens, hundreds] as BigInts.\n */\n extractDigits (value) {\n // Direct BigInt arithmetic is faster than string manipulation\n const onesPlace = value % 10n\n const tensPlace = (value / 10n) % 10n\n const hundredsPlace = value / 100n\n return [onesPlace, tensPlace, hundredsPlace]\n }\n\n /**\n * Selects the correct plural form based on Slavic pluralization rules.\n *\n * Slavic languages typically use three forms:\n * - Form 0 (singular): numbers ending in 1, except 11 (1, 21, 31, 101...)\n * - Form 1 (few): numbers ending in 2-4, except 12-14 (2-4, 22-24, 32-34...)\n * - Form 2 (many): all other numbers (0, 5-20, 25-30, 100, 111-119...)\n *\n * Examples using Russian тысяча (thousand):\n * - 1, 21, 31... ⇒ тысяча (form 0, singular)\n * - 2-4, 22-24, 32-34... ⇒ тысячи (form 1, few)\n * - 0, 5-20, 25-30, 100... ⇒ тысяч (form 2, many)\n *\n * @param {bigint} number The number to check.\n * @param {string[]} pluralForms Array of [singular, few, many] forms.\n * @returns {string} The appropriate form for the number.\n */\n pluralize (number, pluralForms) {\n const remainder100 = number % 100n\n const remainder10 = number % 10n\n\n // Check if in 11-19 range (special case)\n if (remainder100 >= 10n && remainder100 <= 20n) {\n return pluralForms[2] // Always use \"many\" form for 11-20\n }\n\n if (remainder10 === 1n) {\n return pluralForms[0] // Singular\n }\n\n if (remainder10 >= 2n && remainder10 <= 4n) {\n return pluralForms[1] // Few (2-4)\n }\n\n return pluralForms[2] // Many\n }\n}\n","import { GreedyScaleLanguage } from '../classes/greedy-scale-language.js'\n\n/**\n * French language converter.\n *\n * Supports:\n * - Pluralization of \"cent\" (hundred) and other words\n * - \"et\" (and) before odd numbers in tens place\n * - Optional hyphenation for compound numbers\n */\nexport class French extends GreedyScaleLanguage {\n negativeWord = 'moins'\n decimalSeparatorWord = 'virgule'\n zeroWord = 'zéro'\n\n scaleWords = [\n [1_000_000_000_000_000_000_000_000_000n, 'quadrilliard'],\n [1_000_000_000_000_000_000_000_000n, 'quadrillion'],\n [1_000_000_000_000_000_000_000n, 'trilliard'],\n [1_000_000_000_000_000_000n, 'trillion'],\n [1_000_000_000_000_000n, 'billiard'],\n [1_000_000_000_000n, 'billion'],\n [1_000_000_000n, 'milliard'],\n [1_000_000n, 'million'],\n [1000n, 'mille'],\n [100n, 'cent'],\n [80n, 'quatre-vingts'],\n [60n, 'soixante'],\n [50n, 'cinquante'],\n [40n, 'quarante'],\n [30n, 'trente'],\n [20n, 'vingt'],\n [19n, 'dix-neuf'],\n [18n, 'dix-huit'],\n [17n, 'dix-sept'],\n [16n, 'seize'],\n [15n, 'quinze'],\n [14n, 'quatorze'],\n [13n, 'treize'],\n [12n, 'douze'],\n [11n, 'onze'],\n [10n, 'dix'],\n [9n, 'neuf'],\n [8n, 'huit'],\n [7n, 'sept'],\n [6n, 'six'],\n [5n, 'cinq'],\n [4n, 'quatre'],\n [3n, 'trois'],\n [2n, 'deux'],\n [1n, 'un'],\n [0n, 'zéro']\n ]\n\n constructor (options = {}) {\n super()\n\n this.setOptions({\n withHyphenSeparator: false\n }, options)\n\n if (options.withHyphenSeparator) {\n this.wordSeparator = '-'\n }\n }\n\n /** Combines two word-sets with French pluralization and hyphenation rules. */\n combineWordSets (preceding, following) {\n let precedingWord = Object.keys(preceding)[0]\n let followingWord = Object.keys(following)[0]\n const precedingValue = Object.values(preceding)[0]\n const followingValue = Object.values(following)[0]\n\n if (precedingValue === 1n) {\n if (followingValue < 1_000_000n) {\n return following\n }\n } else {\n if (\n ((precedingValue - 80n) % 100n === 0n || (precedingValue % 100n === 0n && precedingValue < 1000n)) &&\n followingValue < 1_000_000n &&\n precedingWord.at(-1) === 's'\n ) {\n precedingWord = precedingWord.slice(0, -1)\n }\n\n if (\n precedingValue < 1000n && followingValue !== 1000n &&\n followingWord.at(-1) !== 's' &&\n followingValue % 100n === 0n\n ) {\n followingWord += 's'\n }\n }\n\n if (followingValue < precedingValue && precedingValue < 100n) {\n if (followingValue % 10n === 1n && precedingValue !== 80n) {\n return { [`${precedingWord}${this.wordSeparator}et${this.wordSeparator}${followingWord}`]: precedingValue + followingValue }\n }\n return { [`${precedingWord}-${followingWord}`]: precedingValue + followingValue }\n }\n\n if (followingValue > precedingValue) return { [`${precedingWord}${this.wordSeparator}${followingWord}`]: precedingValue * followingValue }\n return { [`${precedingWord}${this.wordSeparator}${followingWord}`]: precedingValue + followingValue }\n }\n}\n","import { GreedyScaleLanguage } from '../classes/greedy-scale-language.js'\n\n/**\n * (European) Portuguese language converter.\n *\n * Supports:\n * - Gender-aware hundreds (duzentos, trezentos)\n * - \"e\" (and) conjunction for number combinations\n * - Post-processing to normalize word flow\n */\nexport class Portuguese extends GreedyScaleLanguage {\n negativeWord = 'menos'\n decimalSeparatorWord = 'vírgula'\n zeroWord = 'zero'\n\n scaleWords = [\n [1_000_000_000_000_000_000_000_000n, 'quatrilião'],\n [1_000_000_000_000_000_000n, 'trilião'],\n [1_000_000_000_000n, 'bilião'],\n [1_000_000n, 'milião'],\n [1000n, 'mil'],\n [100n, 'cem'],\n [90n, 'noventa'],\n [80n, 'oitenta'],\n [70n, 'setenta'],\n [60n, 'sessenta'],\n [50n, 'cinquenta'],\n [40n, 'quarenta'],\n [30n, 'trinta'],\n [20n, 'vinte'],\n [19n, 'dezanove'],\n [18n, 'dezoito'],\n [17n, 'dezassete'],\n [16n, 'dezasseis'],\n [15n, 'quinze'],\n [14n, 'catorze'],\n [13n, 'treze'],\n [12n, 'doze'],\n [11n, 'onze'],\n [10n, 'dez'],\n [9n, 'nove'],\n [8n, 'oito'],\n [7n, 'sete'],\n [6n, 'seis'],\n [5n, 'cinco'],\n [4n, 'quatro'],\n [3n, 'três'],\n [2n, 'dois'],\n [1n, 'um'],\n [0n, 'zero']\n ]\n\n hundredsWords = {\n 1: 'cento',\n 2: 'duzentos',\n 3: 'trezentos',\n 4: 'quatrocentos',\n 5: 'quinhentos',\n 6: 'seiscentos',\n 7: 'setecentos',\n 8: 'oitocentos',\n 9: 'novecentos'\n }\n\n // Pre-compiled regex patterns for postClean - avoid recompilation\n static POSTCLEAN_REGEX = / e (.*entos?) (?=.*e)/g\n\n finalizeWords (words) {\n return words.replaceAll(Portuguese.POSTCLEAN_REGEX, ' $1 ')\n }\n\n /** Combines two word-sets according to Portuguese grammar rules. */\n combineWordSets (preceding, following) {\n // Extract words and numeric values\n let precedingWord = Object.keys(preceding)[0]\n let followingWord = Object.keys(following)[0]\n const precedingValue = Object.values(preceding)[0] // BigInt\n const followingValue = Object.values(following)[0] // BigInt\n\n // Implicit \"um\": omit before millions (\"um milhão\" → \"milhão\")\n if (precedingValue === 1n) {\n if (followingValue < 1_000_000n) return { [followingWord]: followingValue }\n precedingWord = 'um'\n } else if (precedingValue === 100n && followingValue % 1000n !== 0n) {\n // Special handling: \"cem\" (100) becomes \"cento\" when followed by non-thousands\n precedingWord = 'cento'\n }\n\n if (followingValue < precedingValue) {\n return { [`${precedingWord} e ${followingWord}`]: precedingValue + followingValue }\n }\n\n // Handle \"milião\" -> \"milhão\" conversion\n if (followingWord === 'milião') followingWord = 'milhão'\n\n // Pluralization logic for large numbers\n if (precedingValue > 1n) {\n if (followingValue % 1_000_000_000n === 0n) {\n followingWord = followingWord.replace('bilião', 'biliões')\n } else if (followingValue % 1_000_000n === 0n) {\n followingWord = followingWord.replace('milhão', 'milhões')\n }\n }\n\n if (followingValue === 100n) {\n precedingWord = this.hundredsWords[precedingValue]\n return { [`${precedingWord}`]: precedingValue * followingValue }\n }\n\n return { [`${precedingWord} ${followingWord}`]: precedingValue * followingValue }\n }\n}\n","/**\n * n2words - Convert numbers to words in multiple languages\n *\n * This file is the main entry point for the n2words library.\n * It exports converter functions for all supported languages.\n *\n * ## For Contributors\n *\n * When adding a new language, this file must be updated in THREE sections:\n * 1. Language Imports - Add import statement (alphabetically sorted)\n * 2. Language Converters - Create converter with makeConverter() (alphabetically sorted)\n * 3. Exports - Add to export list (alphabetically sorted)\n *\n * Use the scaffolding tool to automate this process:\n * npm run lang:add <language-code>\n *\n * ## Public API Structure\n *\n * Each language exports a converter function:\n * - Name: `{LanguageName}Converter` (e.g., EnglishConverter, SpanishConverter)\n * - Signature: `(value: NumericValue, options?: Options) => string`\n * - Input: number, bigint, or string (numeric strings only)\n * - Output: Words representing the number in the target language\n *\n * Languages without options use signature: `(value: NumericValue) => string`\n * Languages with options define a typedef (e.g., ArabicOptions) and use: `(value: NumericValue, options?: ArabicOptions) => string`\n *\n * @module n2words\n */\n\n// ============================================================================\n// Language Imports\n// ============================================================================\n\nimport { Arabic } from './languages/ar.js'\nimport { Azerbaijani } from './languages/az.js'\nimport { Bangla } from './languages/bn.js'\nimport { Czech } from './languages/cs.js'\nimport { Danish } from './languages/da.js'\nimport { German } from './languages/de.js'\nimport { Greek } from './languages/el.js'\nimport { English } from './languages/en.js'\nimport { Spanish } from './languages/es.js'\nimport { Persian } from './languages/fa.js'\nimport { Filipino } from './languages/fil.js'\nimport { French } from './languages/fr.js'\nimport { FrenchBelgium } from './languages/fr-BE.js'\nimport { Gujarati } from './languages/gu.js'\nimport { Hebrew } from './languages/he.js'\nimport { BiblicalHebrew } from './languages/hbo.js'\nimport { Hindi } from './languages/hi.js'\nimport { Croatian } from './languages/hr.js'\nimport { Hungarian } from './languages/hu.js'\nimport { Indonesian } from './languages/id.js'\nimport { Italian } from './languages/it.js'\nimport { Japanese } from './languages/ja.js'\nimport { Kannada } from './languages/kn.js'\nimport { Korean } from './languages/ko.js'\nimport { Lithuanian } from './languages/lt.js'\nimport { Latvian } from './languages/lv.js'\nimport { Marathi } from './languages/mr.js'\nimport { Malay } from './languages/ms.js'\nimport { Dutch } from './languages/nl.js'\nimport { NorwegianBokmal } from './languages/nb.js'\nimport { Punjabi } from './languages/pa.js'\nimport { Polish } from './languages/pl.js'\nimport { Portuguese } from './languages/pt.js'\nimport { Romanian } from './languages/ro.js'\nimport { Russian } from './languages/ru.js'\nimport { SerbianCyrillic } from './languages/sr-Cyrl.js'\nimport { SerbianLatin } from './languages/sr-Latn.js'\nimport { Swedish } from './languages/sv.js'\nimport { Swahili } from './languages/sw.js'\nimport { Tamil } from './languages/ta.js'\nimport { Telugu } from './languages/te.js'\nimport { Thai } from './languages/th.js'\nimport { Turkish } from './languages/tr.js'\nimport { Ukrainian } from './languages/uk.js'\nimport { Urdu } from './languages/ur.js'\nimport { Vietnamese } from './languages/vi.js'\nimport { SimplifiedChinese } from './languages/zh-Hans.js'\nimport { TraditionalChinese } from './languages/zh-Hant.js'\n\n// ============================================================================\n// Type Definitions\n// ============================================================================\n//\n// This section defines TypeScript-compatible JSDoc types for:\n// - NumericValue: The input types accepted by all converters\n// - {Language}Options: Optional configuration for languages that support it\n//\n// Keep options typedefs alphabetically sorted for maintainability.\n// ============================================================================\n\n/**\n * Numeric value that can be converted to words.\n * Accepts number, bigint, or numeric string representations.\n * @typedef {number | bigint | string} NumericValue\n */\n\n/**\n * @typedef {Object} ArabicOptions\n * @property {string} [negativeWord] Word for negative numbers\n * @property {('masculine'|'feminine')} [gender='masculine'] Grammatical gender for number forms\n */\n\n/**\n * @typedef {Object} BiblicalHebrewOptions\n * @property {string} [andWord='ו'] Conjunction character (typically 'ו' for and)\n * @property {('masculine'|'feminine')} [gender='masculine'] Grammatical gender for number forms\n */\n\n/**\n * @typedef {Object} CroatianOptions\n * @property {('masculine'|'feminine')} [gender='masculine'] Grammatical gender for number forms\n */\n\n/**\n * @typedef {Object} CzechOptions\n * @property {('masculine'|'feminine')} [gender='masculine'] Grammatical gender for number forms\n */\n\n/**\n * @typedef {Object} DanishOptions\n * @property {boolean} [ordFlag=false] Enable ordinal number conversion\n */\n\n/**\n * @typedef {Object} DutchOptions\n * @property {boolean} [includeOptionalAnd=false] Include optional \"en\" separator\n * @property {boolean} [noHundredPairing=false] Disable hundred-pairing (e.g., \"twelve hundred\" becomes \"one thousand two hundred\")\n * @property {boolean} [accentOne=true] Use accented \"één\" for one\n */\n\n/**\n * @typedef {Object} FrenchOptions\n * @property {boolean} [withHyphenSeparator=false] Use hyphens (true) instead of spaces (false) in compounds\n */\n\n/**\n * @typedef {Object} FrenchBelgiumOptions\n * @property {boolean} [withHyphenSeparator=false] Use hyphens (true) instead of spaces (false) in compounds\n */\n\n/**\n * @typedef {Object} HebrewOptions\n * @property {string} [andWord='ו'] Conjunction character (typically 'ו' for and)\n */\n\n/**\n * @typedef {Object} LatvianOptions\n * @property {('masculine'|'feminine')} [gender='masculine'] Grammatical gender for number forms\n */\n\n/**\n * @typedef {Object} LithuanianOptions\n * @property {('masculine'|'feminine')} [gender='masculine'] Grammatical gender for number forms\n */\n\n/**\n * @typedef {Object} PolishOptions\n * @property {('masculine'|'feminine')} [gender='masculine'] Grammatical gender for number forms\n */\n\n/**\n * @typedef {Object} RomanianOptions\n * @property {('masculine'|'feminine')} [gender='masculine'] Grammatical gender for number forms\n */\n\n/**\n * @typedef {Object} RussianOptions\n * @property {('masculine'|'feminine')} [gender='masculine'] Grammatical gender for number forms\n */\n\n/**\n * @typedef {Object} SerbianCyrillicOptions\n * @property {('masculine'|'feminine')} [gender='masculine'] Grammatical gender for number forms\n */\n\n/**\n * @typedef {Object} SerbianLatinOptions\n * @property {('masculine'|'feminine')} [gender='masculine'] Grammatical gender for number forms\n */\n\n/**\n * @typedef {Object} SimplifiedChineseOptions\n * @property {boolean} [formal=true] Use formal/financial numerals (壹贰叁) vs. common numerals (一二三)\n */\n\n/**\n * @typedef {Object} SpanishOptions\n * @property {('masculine'|'feminine')} [gender='masculine'] Grammatical gender for number forms\n */\n\n/**\n * @typedef {Object} TraditionalChineseOptions\n * @property {boolean} [formal=true] Use formal/financial numerals (壹貳參) vs. common numerals (一二三)\n */\n\n/**\n * @typedef {Object} TurkishOptions\n * @property {boolean} [dropSpaces=false] Remove spaces between words if true\n */\n\n/**\n * @typedef {Object} UkrainianOptions\n * @property {('masculine'|'feminine')} [gender='masculine'] Grammatical gender for number forms\n */\n\n// ============================================================================\n// Converter Factory\n// ============================================================================\n//\n// makeConverter() is a factory function that creates converter functions from\n// language classes. It provides a consistent functional API for all languages:\n//\n// const result = EnglishConverter(42) // \"forty-two\"\n// const result = ArabicConverter(1, {gender: 'feminine'}) // \"واحدة\"\n//\n// This design:\n// - Hides class instantiation details from public API\n// - Ensures each conversion uses a fresh instance\n// - Maintains immutability (no shared state between conversions)\n// ============================================================================\n\n/**\n * Creates a converter function for a language class.\n *\n * This factory handles all input validation and normalization at the public API\n * boundary, then delegates to the language class with pre-processed data.\n *\n * @template {Object} [TOptions={}]\n * @param {new (options?: TOptions) => { toWords: (isNegative: boolean, integerPart: bigint, decimalPart?: string) => string }} LanguageClass - Language class constructor\n * @returns {(value: NumericValue, options?: TOptions) => string} Converter function\n */\nfunction makeConverter (LanguageClass) {\n /**\n * @param {NumericValue} value\n * @param {TOptions} [options]\n * @returns {string}\n */\n return function convertToWords (value, options) {\n if (options !== undefined && !isPlainObject(options)) {\n throw new TypeError('options must be a plain object if provided')\n }\n\n const { isNegative, integerPart, decimalPart } = parseNumericValue(value)\n return new LanguageClass(options).toWords(isNegative, integerPart, decimalPart)\n }\n}\n\n// ============================================================================\n// Input Parsing Utilities\n// ============================================================================\n\n/**\n * @typedef {Object} ParsedNumericValue\n * @property {boolean} isNegative - Whether the value is negative\n * @property {bigint} integerPart - The absolute integer part\n * @property {string} [decimalPart] - The decimal digits (without the point)\n */\n\n/**\n * Parses and validates a numeric value into its components.\n * Handles number, string, and bigint inputs uniformly.\n *\n * @param {NumericValue} value The value to parse\n * @returns {ParsedNumericValue} The parsed components\n * @throws {TypeError} If value is not a valid numeric type\n * @throws {Error} If value is not a valid number format\n */\nfunction parseNumericValue (value) {\n const type = typeof value\n\n // BigInt: simplest case - no decimals, no scientific notation\n if (type === 'bigint') {\n return value < 0n\n ? { isNegative: true, integerPart: -value }\n : { isNegative: false, integerPart: value }\n }\n\n // Reject invalid types early\n if (type !== 'number' && type !== 'string') {\n throw new TypeError(\n `Invalid value type: expected number, string, or bigint, received ${type}`\n )\n }\n\n // Convert to normalized string\n const str = type === 'number'\n ? numberToString(value)\n : stringToNormalizedForm(value)\n\n return parseNumericString(str)\n}\n\n/**\n * Converts a JavaScript number to a decimal string.\n * Handles special cases: Infinity, NaN, and scientific notation.\n *\n * @param {number} value The number to convert\n * @returns {string} Decimal string representation\n * @throws {Error} If value is not finite\n */\nfunction numberToString (value) {\n if (!Number.isFinite(value)) {\n throw new Error('Number must be finite (NaN and Infinity are not supported)')\n }\n\n const str = value.toString()\n\n // Expand scientific notation (used for values >= 1e21 or < 1e-6)\n if (str.includes('e') || str.includes('E')) {\n return expandScientificNotation(str)\n }\n\n return str\n}\n\n/**\n * Validates and normalizes a string numeric input.\n *\n * @param {string} value The string to validate\n * @returns {string} Trimmed and validated string\n * @throws {Error} If string is empty or not a valid number format\n */\nfunction stringToNormalizedForm (value) {\n const trimmed = value.trim()\n\n if (trimmed.length === 0) {\n throw new Error(`Invalid number format: \"${value}\"`)\n }\n\n // Validate by attempting conversion (handles edge cases like \"1e21\", \"-.5\", etc.)\n if (Number.isNaN(Number(trimmed))) {\n throw new Error(`Invalid number format: \"${value}\"`)\n }\n\n // Expand scientific notation if present\n if (trimmed.includes('e') || trimmed.includes('E')) {\n return expandScientificNotation(trimmed)\n }\n\n return trimmed\n}\n\n/**\n * Parses a normalized numeric string into its components.\n *\n * @param {string} str A normalized decimal string (no scientific notation)\n * @returns {ParsedNumericValue} The parsed components\n */\nfunction parseNumericString (str) {\n // Extract sign\n const isNegative = str[0] === '-'\n if (isNegative) {\n str = str.slice(1)\n }\n\n // Split into integer and decimal parts\n const dotIndex = str.indexOf('.')\n if (dotIndex === -1) {\n return { isNegative, integerPart: BigInt(str) }\n }\n\n const integerStr = str.slice(0, dotIndex) || '0'\n const decimalPart = str.slice(dotIndex + 1)\n\n return { isNegative, integerPart: BigInt(integerStr), decimalPart }\n}\n\n/**\n * Expands scientific notation to decimal form.\n * JavaScript uses scientific notation for values >= 1e21 or < 1e-6.\n *\n * @param {string} str String possibly in scientific notation (e.g., \"1e+21\")\n * @returns {string} Decimal form (e.g., \"1000000000000000000000\")\n */\nfunction expandScientificNotation (str) {\n const [mantissa, expStr] = str.toLowerCase().split('e')\n const exp = parseInt(expStr, 10)\n\n // Extract digits and determine original decimal position\n const dotIndex = mantissa.indexOf('.')\n const digits = dotIndex === -1\n ? mantissa\n : mantissa.slice(0, dotIndex) + mantissa.slice(dotIndex + 1)\n const integerLength = dotIndex === -1 ? mantissa.length : dotIndex\n\n // Calculate new decimal position after applying exponent\n const newDotPosition = integerLength + exp\n\n if (newDotPosition >= digits.length) {\n // Pure integer: pad with trailing zeros\n return digits + '0'.repeat(newDotPosition - digits.length)\n }\n\n if (newDotPosition <= 0) {\n // Pure decimal: pad with leading zeros after decimal point\n return '0.' + '0'.repeat(-newDotPosition) + digits\n }\n\n // Mixed: insert decimal point at new position\n return digits.slice(0, newDotPosition) + '.' + digits.slice(newDotPosition)\n}\n\n/**\n * Checks if a value is a plain object (not null, array, or other object types).\n *\n * @param {*} value Value to check\n * @returns {boolean} True if value is a plain object\n */\nfunction isPlainObject (value) {\n if (value === null || typeof value !== 'object') return false\n const proto = Object.getPrototypeOf(value)\n return proto === Object.prototype || proto === null\n}\n\n// ============================================================================\n// Language Converters\n// ============================================================================\n//\n// Each converter is created using makeConverter() with explicit type annotations.\n//\n// Pattern for languages WITHOUT options:\n// const LanguageConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(Language))\n//\n// Pattern for languages WITH options:\n// const LanguageConverter = /** @type {(value: NumericValue, options?: LanguageOptions) => string} */ (makeConverter(Language))\n//\n// IMPORTANT: Keep converters alphabetically sorted by converter name.\n// ============================================================================\n\nconst ArabicConverter = /** @type {(value: NumericValue, options?: ArabicOptions) => string} */ (makeConverter(Arabic))\nconst AzerbaijaniConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(Azerbaijani))\nconst BanglaConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(Bangla))\nconst BiblicalHebrewConverter = /** @type {(value: NumericValue, options?: BiblicalHebrewOptions) => string} */ (makeConverter(BiblicalHebrew))\nconst CroatianConverter = /** @type {(value: NumericValue, options?: CroatianOptions) => string} */ (makeConverter(Croatian))\nconst CzechConverter = /** @type {(value: NumericValue, options?: CzechOptions) => string} */ (makeConverter(Czech))\nconst DanishConverter = /** @type {(value: NumericValue, options?: DanishOptions) => string} */ (makeConverter(Danish))\nconst DutchConverter = /** @type {(value: NumericValue, options?: DutchOptions) => string} */ (makeConverter(Dutch))\nconst EnglishConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(English))\nconst FilipinoConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(Filipino))\nconst FrenchConverter = /** @type {(value: NumericValue, options?: FrenchOptions) => string} */ (makeConverter(French))\nconst FrenchBelgiumConverter = /** @type {(value: NumericValue, options?: FrenchBelgiumOptions) => string} */ (makeConverter(FrenchBelgium))\nconst GermanConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(German))\nconst GreekConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(Greek))\nconst GujaratiConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(Gujarati))\nconst HebrewConverter = /** @type {(value: NumericValue, options?: HebrewOptions) => string} */ (makeConverter(Hebrew))\nconst HindiConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(Hindi))\nconst HungarianConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(Hungarian))\nconst IndonesianConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(Indonesian))\nconst ItalianConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(Italian))\nconst JapaneseConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(Japanese))\nconst KannadaConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(Kannada))\nconst KoreanConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(Korean))\nconst LatvianConverter = /** @type {(value: NumericValue, options?: LatvianOptions) => string} */ (makeConverter(Latvian))\nconst LithuanianConverter = /** @type {(value: NumericValue, options?: LithuanianOptions) => string} */ (makeConverter(Lithuanian))\nconst MalayConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(Malay))\nconst MarathiConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(Marathi))\nconst NorwegianBokmalConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(NorwegianBokmal))\nconst PersianConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(Persian))\nconst PolishConverter = /** @type {(value: NumericValue, options?: PolishOptions) => string} */ (makeConverter(Polish))\nconst PortugueseConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(Portuguese))\nconst PunjabiConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(Punjabi))\nconst RomanianConverter = /** @type {(value: NumericValue, options?: RomanianOptions) => string} */ (makeConverter(Romanian))\nconst RussianConverter = /** @type {(value: NumericValue, options?: RussianOptions) => string} */ (makeConverter(Russian))\nconst SerbianCyrillicConverter = /** @type {(value: NumericValue, options?: SerbianCyrillicOptions) => string} */ (makeConverter(SerbianCyrillic))\nconst SerbianLatinConverter = /** @type {(value: NumericValue, options?: SerbianLatinOptions) => string} */ (makeConverter(SerbianLatin))\nconst SimplifiedChineseConverter = /** @type {(value: NumericValue, options?: SimplifiedChineseOptions) => string} */ (makeConverter(SimplifiedChinese))\nconst SpanishConverter = /** @type {(value: NumericValue, options?: SpanishOptions) => string} */ (makeConverter(Spanish))\nconst SwahiliConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(Swahili))\nconst SwedishConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(Swedish))\nconst TamilConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(Tamil))\nconst TeluguConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(Telugu))\nconst ThaiConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(Thai))\nconst TraditionalChineseConverter = /** @type {(value: NumericValue, options?: TraditionalChineseOptions) => string} */ (makeConverter(TraditionalChinese))\nconst TurkishConverter = /** @type {(value: NumericValue, options?: TurkishOptions) => string} */ (makeConverter(Turkish))\nconst UkrainianConverter = /** @type {(value: NumericValue, options?: UkrainianOptions) => string} */ (makeConverter(Ukrainian))\nconst UrduConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(Urdu))\nconst VietnameseConverter = /** @type {(value: NumericValue) => string} */ (makeConverter(Vietnamese))\n\n// ============================================================================\n// Exports\n// ============================================================================\n//\n// All converter functions are exported for public use.\n//\n// IMPORTANT: Keep exports alphabetically sorted for maintainability.\n// ============================================================================\n\nexport {\n ArabicConverter,\n AzerbaijaniConverter,\n BanglaConverter,\n BiblicalHebrewConverter,\n CroatianConverter,\n CzechConverter,\n DanishConverter,\n DutchConverter,\n EnglishConverter,\n FilipinoConverter,\n FrenchConverter,\n FrenchBelgiumConverter,\n GermanConverter,\n GreekConverter,\n GujaratiConverter,\n HebrewConverter,\n HindiConverter,\n HungarianConverter,\n IndonesianConverter,\n ItalianConverter,\n JapaneseConverter,\n KannadaConverter,\n KoreanConverter,\n LatvianConverter,\n LithuanianConverter,\n MalayConverter,\n MarathiConverter,\n NorwegianBokmalConverter,\n PersianConverter,\n PolishConverter,\n PortugueseConverter,\n PunjabiConverter,\n RomanianConverter,\n RussianConverter,\n SerbianCyrillicConverter,\n SerbianLatinConverter,\n SimplifiedChineseConverter,\n SpanishConverter,\n SwahiliConverter,\n SwedishConverter,\n TamilConverter,\n TeluguConverter,\n ThaiConverter,\n TraditionalChineseConverter,\n TurkishConverter,\n UkrainianConverter,\n UrduConverter,\n VietnameseConverter\n}\n","import { AbstractLanguage } from '../classes/abstract-language.js'\n\n/**\n * Arabic language converter.\n *\n * Supports:\n * - Gender agreement (masculine/feminine forms)\n * - Complex pluralization (singular/dual/plural)\n * - Traditional Arabic number naming conventions\n * - Right-to-left text orientation\n */\nexport class Arabic extends AbstractLanguage {\n negativeWord = 'ناقص'\n decimalSeparatorWord = 'فاصلة'\n zeroWord = 'صفر'\n\n tensWords = ['عشرون', 'ثلاثون', 'أربعون', 'خمسون', 'ستون', 'سبعون', 'ثمانون', 'تسعون']\n hundredsWords = ['', 'مائة', 'مئتان', 'ثلاثمائة', 'أربعمائة', 'خمسمائة', 'ستمائة', 'سبعمائة', 'ثمانمائة', 'تسعمائة']\n\n // Magnitude words with three forms: singular, appended (tanween), plural\n scaleWords = ['مائة', 'ألف', 'مليون', 'مليار', 'تريليون', 'كوادريليون', 'كوينتليون', 'سكستيليون']\n scaleAppendedWords = ['', 'ألفاً', 'مليوناً', 'ملياراً', 'تريليوناً', 'كوادريليوناً', 'كوينتليوناً', 'سكستيليوناً']\n scalePluralWords = ['', 'آلاف', 'ملايين', 'مليارات', 'تريليونات', 'كوادريليونات', 'كوينتليونات', 'سكستيليونات']\n\n // Dual forms (Arabic has singular, dual, plural)\n dualWords = ['مئتان', 'ألفان', 'مليونان', 'ملياران', 'تريليونان', 'كوادريليونان', 'كوينتليونان', 'سكستيليونان']\n dualAppendedWords = ['مئتا', 'ألفا', 'مليونا', 'مليارا', 'تريليونا', 'كوادريليونا', 'كوينتليونا', 'سكستيليونا']\n\n // Gender-specific number words (1-19)\n ones = {\n masculine: [\n 'واحد', 'اثنان', 'ثلاثة', 'أربعة', 'خمسة', 'ستة', 'سبعة', 'ثمانية', 'تسعة', 'عشرة',\n 'أحد عشر', 'اثنا عشر', 'ثلاثة عشر', 'أربعة عشر', 'خمسة عشر', 'ستة عشر', 'سبعة عشر', 'ثمانية عشر', 'تسعة عشر'\n ],\n feminine: [\n 'واحدة', 'اثنتان', 'ثلاث', 'أربع', 'خمس', 'ست', 'سبع', 'ثمان', 'تسع', 'عشر',\n 'إحدى عشرة', 'اثنتا عشرة', 'ثلاث عشرة', 'أربع عشرة', 'خمس عشرة', 'ست عشرة', 'سبع عشرة', 'ثماني عشرة', 'تسع عشرة'\n ]\n }\n\n constructor (options = {}) {\n super()\n\n this.setOptions({\n gender: 'masculine'\n }, options)\n\n // Allow custom negativeWord via options\n if (options.negativeWord !== undefined) {\n this.negativeWord = options.negativeWord\n }\n }\n\n /** Selects masculine or feminine number forms based on options. */\n get selectedOnes () {\n return this.ones[this.options.gender === 'feminine' ? 'feminine' : 'masculine']\n }\n\n /** Converts a 3-digit segment (0-999) to Arabic words with gender/plural rules. */\n segmentToWords (groupNumber, groupLevel, fullNumber) {\n const tens = groupNumber % 100\n const hundredsRaw = groupNumber / 100\n const hundreds = Math.trunc(hundredsRaw)\n let returnValue = ''\n\n // Process hundreds\n if (hundreds > 0) {\n if (tens === 0 && hundreds === 2) {\n returnValue = this.dualWords[0]\n } else {\n const hundredsWord = this.hundredsWords[hundreds]\n if (hundredsWord) {\n returnValue = hundredsWord\n if (tens !== 0) {\n returnValue += ' و'\n }\n }\n }\n }\n\n // Process tens and ones\n if (tens > 0) {\n if (tens < 20) { // 1 -> 19\n if (tens === 2 && hundreds === 0 && groupLevel > 0) {\n // Cache expensive log10 calculation\n const numValue = Number(fullNumber)\n const pow = Math.trunc(Math.log10(numValue))\n if (pow % 3 === 0 && fullNumber === BigInt(2 * Math.pow(10, pow))) {\n returnValue = groupNumber === 2 ? this.dualWords[groupLevel] : this.dualAppendedWords[groupLevel]\n } else {\n returnValue = this.dualWords[groupLevel]\n }\n } else if (tens === 1 && groupLevel > 0) {\n returnValue += this.scaleWords[groupLevel]\n } else {\n returnValue += this.selectedOnes[tens - 1]\n }\n } else { // 20 -> 99\n const ones = tens % 10\n const tensIndex = Math.trunc(tens / 10) - 2\n\n if (ones > 0) {\n returnValue += this.selectedOnes[ones - 1]\n returnValue += ' و'\n }\n returnValue += this.tensWords[tensIndex]\n }\n }\n\n return returnValue\n }\n\n /** Converts integer part to Arabic words by processing 3-digit groups. */\n integerToWords (integerPart) {\n if (integerPart === 0n) {\n return this.zeroWord\n }\n let temp = integerPart\n let group = 0\n let result = ''\n\n // Process each group of 3 digits (right to left)\n while (temp > 0n) {\n const numberToProcess = Number(temp % 1000n)\n temp = temp / 1000n\n\n if (numberToProcess > 0) {\n const groupDescription = this.segmentToWords(numberToProcess, group, integerPart)\n\n if (groupDescription) {\n // Add group name for thousands, millions, etc.\n if (group > 0) {\n if (result) {\n result = ' و' + result\n }\n\n if (numberToProcess > 2) {\n const remainder = numberToProcess % 100\n if (remainder === 1) {\n result = this.scaleWords[group] + ' ' + result\n } else if (numberToProcess >= 3 && numberToProcess <= 10) {\n result = this.scalePluralWords[group] + ' ' + result\n } else {\n result = (result ? this.scaleAppendedWords[group] : this.scaleWords[group]) + ' ' + result\n }\n }\n }\n\n // Add group description (prepend for RTL)\n result = groupDescription + ' ' + result\n }\n }\n\n group++\n }\n\n return result.replace(/\\s+/g, ' ').trim()\n }\n}\n","import { TurkicLanguage } from '../classes/turkic-language.js'\n\n/**\n * Azerbaijani language converter.\n *\n * Supports:\n * - Implicit \"bir\" (one) omission before hundreds and thousands\n * - Turkic language number patterns\n * - Large numbers up to quintillion\n */\nexport class Azerbaijani extends TurkicLanguage {\n negativeWord = 'mənfi'\n decimalSeparatorWord = 'nöqtə'\n zeroWord = 'sıfır'\n\n scaleWords = [[1_000_000_000_000_000_000n, 'kentilyon'],\n [1_000_000_000_000_000n, 'katrilyon'],\n [1_000_000_000_000n, 'trilyon'],\n [1_000_000_000n, 'milyar'],\n [1_000_000n, 'milyon'],\n [1000n, 'min'],\n [100n, 'yüz'],\n [90n, 'doxsan'],\n [80n, 'səksən'],\n [70n, 'yetmiş'],\n [60n, 'altmış'],\n [50n, 'əlli'],\n [40n, 'qırx'],\n [30n, 'otuz'],\n [20n, 'iyirmi'],\n [10n, 'on'],\n [9n, 'doqquz'],\n [8n, 'səkkiz'],\n [7n, 'yeddi'],\n [6n, 'altı'],\n [5n, 'beş'],\n [4n, 'dörd'],\n [3n, 'üç'],\n [2n, 'iki'],\n [1n, 'bir'],\n [0n, 'sıfır']]\n}\n","import { SouthAsianLanguage } from '../classes/south-asian-language.js'\n\n/**\n * Bangla language converter.\n *\n * Supports:\n * - Indian numbering system (হাজার, লাখ, কোটি)\n * - Bangla script (Bengali)\n * - Complete word forms for 0-99\n */\nexport class Bangla extends SouthAsianLanguage {\n negativeWord = 'মাইনাস'\n decimalSeparatorWord = 'দশমিক'\n zeroWord = 'শূন্য'\n hundredWord = 'শত'\n\n belowHundredWords = [\n 'শূন্য',\n 'এক',\n 'দুই',\n 'তিন',\n 'চার',\n 'পাঁচ',\n 'ছয়',\n 'সাত',\n 'আট',\n 'নয়',\n 'দশ',\n 'এগারো',\n 'বারো',\n 'তেরো',\n 'চৌদ্দ',\n 'পনেরো',\n 'ষোল',\n 'সতেরো',\n 'আঠারো',\n 'উনিশ',\n 'বিশ',\n 'একুশ',\n 'বাইশ',\n 'তেইশ',\n 'চব্বিশ',\n 'পঁচিশ',\n 'ছাব্বিশ',\n 'সাতাশ',\n 'আঠাশ',\n 'উনত্রিশ',\n 'ত্রিশ',\n 'একত্রিশ',\n 'বত্রিশ',\n 'তেত্রিশ',\n 'চৌত্রিশ',\n 'পঁয়ত্রিশ',\n 'ছত্রিশ',\n 'সাঁইত্রিশ',\n 'আটত্রিশ',\n 'উনচল্লিশ',\n 'চল্লিশ',\n 'একচল্লিশ',\n 'বেয়াল্লিশ',\n 'তেতাল্লিশ',\n 'চুয়াল্লিশ',\n 'পঁয়তাল্লিশ',\n 'ছেচল্লিশ',\n 'সাতচল্লিশ',\n 'আটচল্লিশ',\n 'উনপঞ্চাশ',\n 'পঞ্চাশ',\n 'একান্ন',\n 'বাহান্ন',\n 'তিপ্পান্ন',\n 'চুয়ান্ন',\n 'পঞ্চান্ন',\n 'ছাপ্পান্ন',\n 'সাতান্ন',\n 'আটান্ন',\n 'উনষাট',\n 'ষাট',\n 'একষট্টি',\n 'বাষট্টি',\n 'তেষট্টি',\n 'চৌষট্টি',\n 'পঁয়ষট্টি',\n 'ছেষট্টি',\n 'সাতষট্টি',\n 'আটষট্টি',\n 'ঊনসত্তর',\n 'সত্তর',\n 'একাত্তর',\n 'বাহাত্তর',\n 'তেহাত্তর',\n 'চুয়াত্তর',\n 'পঁচাত্তর',\n 'ছিয়াত্তর',\n 'সাতাত্তর',\n 'আটাত্তর',\n 'উনআশি',\n 'আশি',\n 'একাশি',\n 'বিরাশি',\n 'তিরাশি',\n 'চুরাশি',\n 'পঁচাশি',\n 'ছিয়াশি',\n 'সাতাশি',\n 'আটাশি',\n 'উননব্বই',\n 'নব্বই',\n 'একানব্বই',\n 'বিরানব্বই',\n 'তিরানব্বই',\n 'চুরানব্বই',\n 'পঁচানব্বই',\n 'ছিয়ানব্বই',\n 'সাতানব্বই',\n 'আটানব্বই',\n 'নিরানব্বই'\n ]\n\n scaleWords = [\n '',\n 'হাজার',\n 'লাখ',\n 'কোটি',\n 'আরব',\n 'খরব',\n 'নীল',\n 'পদ্ম',\n 'শঙ্খ'\n ]\n}\n","import { SlavicLanguage } from '../classes/slavic-language.js'\n\n/**\n * Biblical Hebrew language converter.\n *\n * Supports:\n * - Three-form pluralization (one/few/many)\n * - Gender agreement (masculine/feminine)\n * - Optional \"ו\" (and) conjunction control\n */\nexport class BiblicalHebrew extends SlavicLanguage {\n negativeWord = 'מינוס'\n decimalSeparatorWord = 'נקודה'\n zeroWord = 'אפס'\n usePerDigitDecimals = true\n\n // Biblical Hebrew (masculine forms as default - historically accurate)\n onesWords = {\n 1: 'אחד',\n 2: 'שניים',\n 3: 'שלשה',\n 4: 'ארבעה',\n 5: 'חמשה',\n 6: 'ששה',\n 7: 'שבעה',\n 8: 'שמונה',\n 9: 'תשעה'\n }\n\n teensWords = {\n 0: 'עשרה',\n 1: 'אחד עשר',\n 2: 'שנים עשר',\n 3: 'שלשה עשר',\n 4: 'ארבעה עשר',\n 5: 'חמשה עשר',\n 6: 'ששה עשר',\n 7: 'שבעה עשר',\n 8: 'שמונה עשר',\n 9: 'תשעה עשר'\n }\n\n twentiesWords = {\n 2: 'עשרים',\n 3: 'שלשים',\n 4: 'ארבעים',\n 5: 'חמישים',\n 6: 'ששים',\n 7: 'שבעים',\n 8: 'שמונים',\n 9: 'תשעים'\n }\n\n hundredsWords = {\n 1: 'מאה',\n 2: 'מאתיים',\n 3: 'מאות'\n }\n\n pluralForms = {\n 1: 'אלף',\n 2: 'אלפיים',\n 3: 'שלשה אלפים',\n 4: 'ארבעה אלפים',\n 5: 'חמשה אלפים',\n 6: 'ששה אלפים',\n 7: 'שבעה אלפים',\n 8: 'שמונה אלפים',\n 9: 'תשעה אלפים'\n }\n\n // Feminine forms for thousands (when feminine=true is specified)\n femininePluralForms = {\n 1: 'אלף',\n 2: 'אלפיים',\n 3: 'שלשת אלפים',\n 4: 'ארבעת אלפים',\n 5: 'חמשת אלפים',\n 6: 'ששת אלפים',\n 7: 'שבעת אלפים',\n 8: 'שמונת אלפים',\n 9: 'תשעת אלפים'\n }\n\n scale = {\n 1: 'אלף', // thousand (singular)\n 2: 'מיליון', // million\n 3: 'מיליארד', // billion\n 4: 'טריליון', // trillion\n 5: 'קוודרליון', // quadrillion\n 6: 'קווינטיליון' // quintillion\n }\n\n scalePlural = {\n 1: 'אלפים', // thousands\n 2: 'מיליונים', // millions\n 3: 'מיליארדים', // billions\n 4: 'טריליונים', // trillions\n 5: 'קוודרליונים', // quadrillions\n 6: 'קווינטיליונים' // quintillions\n }\n\n // Feminine forms (for when gender='feminine' is specified)\n onesFeminineWords = {\n 1: 'אחת',\n 2: 'שתים',\n 3: 'שלש',\n 4: 'ארבע',\n 5: 'חמש',\n 6: 'שש',\n 7: 'שבע',\n 8: 'שמונה',\n 9: 'תשע'\n }\n\n teensFeminineWords = {\n 0: 'עשר',\n 1: 'אחת עשרה',\n 2: 'שתים עשרה',\n 3: 'שלש עשרה',\n 4: 'ארבע עשרה',\n 5: 'חמש עשרה',\n 6: 'שש עשרה',\n 7: 'שבע עשרה',\n 8: 'שמונה עשרה',\n 9: 'תשע עשרה'\n }\n\n constructor (options = {}) {\n super(options)\n\n this.setOptions({\n andWord: 'ו',\n gender: 'masculine'\n }, options)\n\n if (this.options.gender === 'feminine') {\n this.onesWords = this.onesFeminineWords\n this.teensWords = this.teensFeminineWords\n this.pluralForms = this.femininePluralForms\n }\n }\n\n /** Converts integer part with Biblical Hebrew three-form pluralization. */\n integerToWords (integerPart) {\n if (integerPart === 0n) {\n return this.zeroWord\n }\n const words = []\n const segments = this.splitToSegments(integerPart.toString(), 3)\n let index = segments.length\n for (const x of segments) {\n index = index - 1\n if (x === 0n) {\n continue\n }\n\n const [n1, n2, n3] = this.extractDigits(x)\n\n if (index > 0) {\n // For thousands and above, handle the full chunk value\n const chunkWords = []\n let hasHundreds = false\n\n // Process hundreds in this chunk\n if (n3 > 0n) {\n hasHundreds = true\n if (n3 <= 2n) {\n chunkWords.push(this.hundredsWords[n3])\n } else {\n chunkWords.push(this.onesWords[n3] + ' ' + this.hundredsWords[3])\n }\n }\n\n // Process tens in this chunk\n if (n2 > 1n) {\n // Add conjunction if there were hundreds before\n const tensWord = this.twentiesWords[n2]\n chunkWords.push(hasHundreds ? this.options.andWord + tensWord : tensWord)\n }\n\n // Process ones in this chunk\n if (n2 === 1n) {\n // Add conjunction if there were hundreds before\n const onesWord = this.teensWords[n1]\n chunkWords.push(hasHundreds ? this.options.andWord + onesWord : onesWord)\n } else if (n1 > 0n) {\n // For \"one million\", \"one billion\", etc., don't add the word \"one\"\n if (x === 1n && index > 1) {\n // Skip adding \"one\" for millions/billions/etc.\n } else if (x <= 9n && chunkWords.length === 0 && index === 1) {\n // Use special forms for 1-9 thousand\n chunkWords.push(this.pluralForms[n1])\n } else {\n const onesWord = this.onesWords[n1]\n // Add conjunction if there were hundreds or tens before\n chunkWords.push((hasHundreds || n2 > 0n) ? this.options.andWord + onesWord : onesWord)\n }\n }\n\n // Add scale word (thousand, million, billion, etc.)\n if (x > 9n || index > 1) {\n // For numbers > 9 or higher scales, use appropriate scale word\n if (x === 1n) {\n // Singular form (e.g., \"one thousand\", \"one million\")\n chunkWords.push(this.scale[index])\n } else if (x === 2n && index === 1) {\n // Special dual form for \"two thousand\" (already in thousands[2])\n return [this.pluralForms[2], ...words].join(' ')\n } else if (x === 2n) {\n // For two million, two billion, etc. - use plural form\n chunkWords.push(this.scalePlural[index])\n } else if (index === 1) {\n // For thousands (10+), always use singular \"אלף\"\n chunkWords.push(this.scale[index])\n } else {\n // For millions/billions/etc. use plural form\n chunkWords.push(this.scalePlural[index])\n }\n }\n\n words.push(chunkWords.join(' '))\n continue\n }\n\n if (n3 > 0n) {\n if (n3 <= 2n) {\n words.push(this.hundredsWords[n3])\n } else {\n words.push(this.onesWords[n3] + ' ' + this.hundredsWords[3])\n }\n }\n\n if (n2 > 1n) {\n words.push(this.twentiesWords[n2])\n }\n\n if (n2 === 1n) {\n words.push(this.teensWords[n1])\n } else if (n1 > 0n) {\n words.push(this.onesWords[n1])\n }\n }\n\n if (words.length > 1) {\n words[words.length - 1] = this.options.andWord + words.at(-1)\n }\n\n return words.join(' ')\n }\n}\n","import { SlavicLanguage } from '../classes/slavic-language.js'\n\n/**\n * Croatian language converter.\n *\n * Supports:\n * - Three-form pluralization (one/few/many)\n * - Gender agreement (jedan/jedna, dva/dvije)\n * - Croatian-specific declension endings\n */\nexport class Croatian extends SlavicLanguage {\n negativeWord = 'minus'\n decimalSeparatorWord = 'zarez'\n zeroWord = 'nula'\n\n onesWords = {\n 1: 'jedan',\n 2: 'dva',\n 3: 'tri',\n 4: 'četiri',\n 5: 'pet',\n 6: 'šest',\n 7: 'sedam',\n 8: 'osam',\n 9: 'devet'\n }\n\n onesFeminineWords = {\n 1: 'jedna',\n 2: 'dvije',\n 3: 'tri',\n 4: 'četiri',\n 5: 'pet',\n 6: 'šest',\n 7: 'sedam',\n 8: 'osam',\n 9: 'devet'\n }\n\n teensWords = {\n 0: 'deset',\n 1: 'jedanaest',\n 2: 'dvanaest',\n 3: 'trinaest',\n 4: 'četrnaest',\n 5: 'petnaest',\n 6: 'šesnaest',\n 7: 'sedamnaest',\n 8: 'osamnaest',\n 9: 'devetnaest'\n }\n\n twentiesWords = {\n 2: 'dvadeset',\n 3: 'trideset',\n 4: 'četrdeset',\n 5: 'pedeset',\n 6: 'šezdeset',\n 7: 'sedamdeset',\n 8: 'osamdeset',\n 9: 'devedeset'\n }\n\n hundredsWords = {\n 1: 'sto',\n 2: 'dvjesto',\n 3: 'tristo',\n 4: 'četiristo',\n 5: 'petsto',\n 6: 'šesto',\n 7: 'sedamsto',\n 8: 'osamsto',\n 9: 'devetsto'\n }\n\n pluralForms = {\n 1: ['tisuća', 'tisuće', 'tisuća'], // 10 ^ 3\n 2: ['milijun', 'milijuna', 'milijuna'], // 10 ^ 6\n 3: ['milijarda', 'milijarde', 'milijarda'], // 10 ^ 9\n 4: ['bilijun', 'bilijuna', 'bilijuna'], // 10 ^ 12\n 5: ['bilijarda', 'bilijarde', 'bilijarda'], // 10 ^ 15\n 6: ['trilijun', 'trilijuna', 'trilijuna'], // 10 ^ 18\n 7: ['trilijarda', 'trilijarde', 'trilijarda'], // 10 ^ 21\n 8: ['kvadrilijun', 'kvadrilijuna', 'kvadrilijuna'], // 10 ^ 24\n 9: ['kvadrilijarda', 'kvadrilijarde', 'kvadrilijarda'], // 10 ^ 27\n 10: ['kvintilijun', 'kvintilijuna', 'kvintilijuna'] // 10 ^ 30\n }\n\n /**\n * Maps segment indices to whether they are grammatically feminine.\n * In Croatian, thousands (index 1) are feminine, others are masculine.\n * @type {Object.<number, boolean>}\n */\n scaleGenders = {\n 1: true // thousands are feminine (others default to false)\n }\n\n /** Selects Croatian plural form: 1 = singular, 2-4 = few, else = many. */\n pluralize (n, forms) {\n const lastDigit = n % 10n\n const lastTwoDigits = n % 100n\n\n if ((lastTwoDigits < 10n || lastTwoDigits > 20n) && lastDigit === 1n) {\n return forms[0]\n }\n\n if ((lastTwoDigits < 10n || lastTwoDigits > 20n) && lastDigit > 1n && lastDigit < 5n) {\n return forms[1]\n }\n\n return forms[2]\n }\n}\n","import { SlavicLanguage } from '../classes/slavic-language.js'\n\n/**\n * Czech language converter.\n *\n * Supports:\n * - Three-form pluralization (one/few/many)\n * - Dynamic decimal separator (celá/celé/celých)\n * - Gender agreement in number words\n */\nexport class Czech extends SlavicLanguage {\n negativeWord = 'mínus'\n zeroWord = 'nula'\n\n onesWords = {\n 1: 'jedna',\n 2: 'dva',\n 3: 'tři',\n 4: 'čtyři',\n 5: 'pět',\n 6: 'šest',\n 7: 'sedm',\n 8: 'osm',\n 9: 'devět'\n }\n\n onesFeminineWords = {\n 1: 'jedna',\n 2: 'dvě',\n 3: 'tři',\n 4: 'čtyři',\n 5: 'pět',\n 6: 'šest',\n 7: 'sedm',\n 8: 'osm',\n 9: 'devět'\n }\n\n teensWords = {\n 0: 'deset',\n 1: 'jedenáct',\n 2: 'dvanáct',\n 3: 'třináct',\n 4: 'čtrnáct',\n 5: 'patnáct',\n 6: 'šestnáct',\n 7: 'sedmnáct',\n 8: 'osmnáct',\n 9: 'devatenáct'\n }\n\n twentiesWords = {\n 2: 'dvacet',\n 3: 'třicet',\n 4: 'čtyřicet',\n 5: 'padesát',\n 6: 'šedesát',\n 7: 'sedmdesát',\n 8: 'osmdesát',\n 9: 'devadesát'\n }\n\n hundredsWords = {\n 1: 'sto',\n 2: 'dvě stě',\n 3: 'tři sta',\n 4: 'čtyři sta',\n 5: 'pět set',\n 6: 'šest set',\n 7: 'sedm set',\n 8: 'osm set',\n 9: 'devět set'\n }\n\n pluralForms = {\n 1: ['tisíc', 'tisíce', 'tisíc'], // 10^ 3\n 2: ['milion', 'miliony', 'milionů'], // 10^ 6\n 3: ['miliarda', 'miliardy', 'miliard'], // 10^ 9\n 4: ['bilion', 'biliony', 'bilionů'], // 10^ 12\n 5: ['biliarda', 'biliardy', 'biliard'], // 10^ 15\n 6: ['trilion', 'triliony', 'trilionů'], // 10^ 18\n 7: ['triliarda', 'triliardy', 'triliard'], // 10^ 21\n 8: ['kvadrilion', 'kvadriliony', 'kvadrilionů'], // 10^ 24\n 9: ['kvadriliarda', 'kvadriliardy', 'kvadriliard'], // 10^ 27\n 10: ['quintillion', 'quintilliony', 'quintillionů'] // 10^ 30\n }\n\n /**\n * Czech omits \"one\" before scale words.\n * e.g., 1000 is \"tisíc\" not \"jedna tisíc\"\n */\n omitOneBeforeScale = true\n\n /**\n * Cached integer part for decimal separator word selection.\n * Set by toWords() before calling super.toWords().\n * @private\n */\n #integerPart = 0n\n\n /** Returns decimal separator word based on integer part (celá/celé/celých). */\n get decimalSeparatorWord () {\n if (this.#integerPart === 0n || this.#integerPart === 1n) {\n return 'celá'\n } else if (this.#integerPart >= 2n && this.#integerPart <= 4n) {\n return 'celé'\n } else {\n return 'celých'\n }\n }\n\n constructor (options = {}) {\n super(options)\n\n // Remove the inherited decimalSeparatorWord property so our getter works\n delete this.decimalSeparatorWord\n }\n\n /**\n * Override toWords to cache integer part before decimal separator is accessed.\n */\n toWords (isNegative, integerPart, decimalPart) {\n this.#integerPart = integerPart\n return super.toWords(isNegative, integerPart, decimalPart)\n }\n\n /** Selects Czech plural form: 1 = singular, 2-4 = few, else = many. */\n pluralize (n, forms) {\n if (n === 1n) {\n return forms[0]\n }\n\n // Check if n is in the \"few\" form range (2-4, 22-24, 32-34, etc., excluding teens)\n const lastDigit = n % 10n\n const lastTwoDigits = n % 100n\n\n if (lastDigit > 1n && lastDigit < 5n && (lastTwoDigits < 10n || lastTwoDigits > 20n)) {\n return forms[1]\n }\n\n return forms[2]\n }\n}\n","import { GreedyScaleLanguage } from '../classes/greedy-scale-language.js'\n\n/**\n * Danish language converter.\n *\n * Supports:\n * - Vigesimal (base-20) number system\n * - Units-before-tens ordering (e.g., \"tre-og-tyve\" = 23)\n * - Optional ordinal numbers via ordFlag option\n */\nexport class Danish extends GreedyScaleLanguage {\n negativeWord = 'minus'\n decimalSeparatorWord = 'komma'\n zeroWord = 'nul'\n\n scaleWords = [\n [1_000_000_000_000_000_000_000_000_000n, 'quadrillarder'],\n [1_000_000_000_000_000_000_000_000n, 'quadrillioner'],\n [1_000_000_000_000_000_000_000n, 'trillarder'],\n [1_000_000_000_000_000_000n, 'trillioner'],\n [1_000_000_000_000_000n, 'billarder'],\n [1_000_000_000_000n, 'billioner'],\n [1_000_000_000n, 'millarder'],\n [1_000_000n, 'millioner'],\n [1000n, 'tusind'],\n [100n, 'hundrede'],\n [90n, 'halvfems'],\n [80n, 'firs'],\n [70n, 'halvfjerds'],\n [60n, 'treds'],\n [50n, 'halvtreds'],\n [40n, 'fyrre'],\n [30n, 'tredive'],\n [20n, 'tyve'],\n [19n, 'nitten'],\n [18n, 'atten'],\n [17n, 'sytten'],\n [16n, 'seksten'],\n [15n, 'femten'],\n [14n, 'fjorten'],\n [13n, 'tretten'],\n [12n, 'tolv'],\n [11n, 'elleve'],\n [10n, 'ti'],\n [9n, 'ni'],\n [8n, 'otte'],\n [7n, 'syv'],\n [6n, 'seks'],\n [5n, 'fem'],\n [4n, 'fire'],\n [3n, 'tre'],\n [2n, 'to'],\n [1n, 'et'],\n [0n, 'nul']\n ]\n\n constructor (options = {}) {\n super()\n\n this.setOptions({\n ordFlag: false\n }, options)\n }\n\n /** Combines two word-sets with Danish vigesimal and reversal rules. */\n combineWordSets (preceding, following) {\n let precedingWord = Object.keys(preceding)[0]\n let followingWord = Object.keys(following)[0]\n const precedingValue = Object.values(preceding)[0] // BigInt (e.g., 1n, 100n, 1000n)\n const followingValue = Object.values(following)[0] // BigInt (e.g., magnitude level like 100n, 1000n)\n\n // Prepend \"et\" to hundreds and thousands (not \"en\") for proper Danish form\n if (followingValue === 100n || followingValue === 1000n) {\n following = { [`et${followingWord}`]: followingValue }\n }\n\n // Implicit '1' handling: omit '1' before most magnitudes (except millions/ordinals)\n if (precedingValue === 1n) {\n if (followingValue < 1_000_000n || this.options.ordFlag) {\n return following // Just the magnitude word (e.g., \"hundrede\" not \"en hundrede\")\n }\n precedingWord = 'en' // Explicit \"en\" (one) for millions and above\n }\n\n // Multiplication across magnitude boundaries\n if (followingValue > precedingValue) {\n // Space for million+ (e.g., \"en million\", \"to millioner\")\n if (followingValue >= 1_000_000n) {\n precedingWord += ' '\n }\n return { [`${precedingWord}${followingWord}`]: precedingValue * followingValue }\n }\n\n // Addition with separator rules:\n // \"og\" (and) for hundreds + smaller numbers\n if (precedingValue >= 100n && precedingValue < 1000n) {\n precedingWord += ' og '\n } else if (precedingValue >= 1000n && precedingValue <= 100_000n) {\n // Special \"e og\" for thousands (e.g., \"tusinde og tyve\")\n precedingWord += 'e og '\n }\n\n // Units-before-tens reversal (Danish vigesimal pattern):\n // For small units (< 10) with tens (10-99), swap order: \"tre og tyve\" (25)\n if (followingValue < 10n && precedingValue > 10n && precedingValue < 100n) {\n if (followingValue === 1n) {\n followingWord = 'en' // Convert 1 to \"en\" for vigesimal context\n }\n // Swap positions: units go after \"og\", tens go before\n const temporary = followingWord\n followingWord = precedingWord\n precedingWord = temporary + 'og'\n } else if (precedingValue >= 1_000_000n) {\n // Space for large magnitudes (millions+)\n precedingWord += ' '\n }\n\n return { [`${precedingWord}${followingWord}`]: precedingValue + followingValue }\n }\n}\n","import { GreedyScaleLanguage } from '../classes/greedy-scale-language.js'\n\n/**\n * Dutch language converter.\n *\n * Supports:\n * - Optional \"en\" (and) separator for tens\n * - Optional comma before hundreds\n * - Compound word formation without hyphenation\n */\nexport class Dutch extends GreedyScaleLanguage {\n negativeWord = 'min'\n decimalSeparatorWord = 'komma'\n zeroWord = 'nul'\n\n scaleWords = [\n [1_000_000_000_000_000_000_000_000_000n, 'quadriljard'],\n [1_000_000_000_000_000_000_000_000n, 'quadriljoen'],\n [1_000_000_000_000_000_000_000n, 'triljard'],\n [1_000_000_000_000_000_000n, 'triljoen'],\n [1_000_000_000_000_000n, 'biljard'],\n [1_000_000_000_000n, 'biljoen'],\n [1_000_000_000n, 'miljard'],\n [1_000_000n, 'miljoen'],\n [1000n, 'duizend'],\n [100n, 'honderd'],\n [90n, 'negentig'],\n [80n, 'tachtig'],\n [70n, 'zeventig'],\n [60n, 'zestig'],\n [50n, 'vijftig'],\n [40n, 'veertig'],\n [30n, 'dertig'],\n [20n, 'twintig'],\n [19n, 'negentien'],\n [18n, 'achttien'],\n [17n, 'zeventien'],\n [16n, 'zestien'],\n [15n, 'vijftien'],\n [14n, 'veertien'],\n [13n, 'dertien'],\n [12n, 'twaalf'],\n [11n, 'elf'],\n [10n, 'tien'],\n [9n, 'negen'],\n [8n, 'acht'],\n [7n, 'zeven'],\n [6n, 'zes'],\n [5n, 'vijf'],\n [4n, 'vier'],\n [3n, 'drie'],\n [2n, 'twee'],\n [1n, 'één'],\n [0n, 'nul']\n ]\n\n constructor (options = {}) {\n super()\n\n this.setOptions({\n includeOptionalAnd: false,\n noHundredPairing: false,\n accentOne: true\n }, options)\n\n if (!this.options.accentOne) {\n this.scaleWords[this.scaleWords.length - 2][1] = 'een'\n }\n }\n\n /** Combines two word-sets according to Dutch grammar rules. */\n combineWordSets (preceding, following) {\n let precedingWord = Object.keys(preceding)[0]\n let followingWord = Object.keys(following)[0]\n const precedingValue = Object.values(preceding)[0] // BigInt\n const followingValue = Object.values(following)[0] // BigInt\n\n // Implicit \"een\": omit before large multipliers (\"miljoen\" not \"een miljoen\")\n if (precedingValue === 1n) {\n if (followingValue < 1_000_000n) {\n return following\n }\n precedingWord = this.options.accentOne ? 'één' : 'een'\n }\n\n // Handle multiplication and spacing\n if (followingValue > precedingValue) {\n let hadSpace = false\n // Large scale words (millions+): add space before multiplier\n if (followingValue >= 1_000_000n) {\n precedingWord += ' '\n hadSpace = true\n } else if (followingValue > 100n) {\n // Hundreds and above: add space after multiplier\n followingWord += ' '\n hadSpace = true\n }\n // Convert 'één' to 'een' in compounds (when no space or accentOne disabled)\n if (!hadSpace || !this.options.accentOne) {\n precedingWord = precedingWord.replace(/één/g, 'een')\n followingWord = followingWord.replace(/één/g, 'een')\n }\n return { [`${precedingWord}${followingWord}`]: precedingValue * followingValue }\n }\n\n // Track if we're adding a space (which keeps words separate)\n let hasSpace = false\n\n if (followingValue < 10n && precedingValue > 10n && precedingValue < 100n) {\n const temporary = followingWord\n followingWord = precedingWord\n const andTxt = temporary.endsWith('e') ? 'ën' : 'en'\n precedingWord = `${temporary}${andTxt}`\n } else if (followingValue < 13n && precedingValue < 1000n && this.options.includeOptionalAnd) {\n precedingWord = `${precedingWord}en`\n } else if (followingValue < 13n && precedingValue >= 1000n && this.options.includeOptionalAnd) {\n followingWord = ` en ${followingWord}`\n hasSpace = true\n } else if (precedingValue >= 1_000_000n) {\n precedingWord += ' '\n hasSpace = true\n } else if (precedingValue === 1000n) {\n precedingWord += ' '\n hasSpace = true\n }\n\n // Convert 'één' to 'een' in direct compounds (no space)\n // Keep 'één' only if there's a space AND accentOne=true\n if (!hasSpace) {\n precedingWord = precedingWord.replace(/één/g, 'een')\n followingWord = followingWord.replace(/één/g, 'een')\n } else if (!this.options.accentOne) {\n precedingWord = precedingWord.replace(/één/g, 'een')\n followingWord = followingWord.replace(/één/g, 'een')\n }\n\n return { [`${precedingWord}${followingWord}`]: precedingValue + followingValue }\n }\n\n integerToWords (integerPart) {\n if (integerPart >= 1100n && integerPart < 10_000n && !this.options.noHundredPairing) {\n const high = integerPart / 100n\n const low = integerPart % 100n\n if (high % 10n !== 0n) {\n let result = super.integerToWords(high) + 'honderd'\n if (low) {\n result +=\n (this.options.includeOptionalAnd ? ' en ' : ' ') + super.integerToWords(low)\n }\n return result\n }\n }\n return super.integerToWords(integerPart)\n }\n}\n","import { GreedyScaleLanguage } from '../classes/greedy-scale-language.js'\n\n/**\n * English language converter.\n *\n * Supports:\n * - Hyphenated compounds (e.g., \"twenty-three\")\n * - \"and\" after hundreds (e.g., \"one hundred and one\")\n * - Numbers up to octillions\n */\nexport class English extends GreedyScaleLanguage {\n negativeWord = 'minus'\n decimalSeparatorWord = 'point'\n zeroWord = 'zero'\n\n scaleWords = [\n [1_000_000_000_000_000_000_000_000_000n, 'octillion'],\n [1_000_000_000_000_000_000_000_000n, 'septillion'],\n [1_000_000_000_000_000_000_000n, 'sextillion'],\n [1_000_000_000_000_000_000n, 'quintillion'],\n [1_000_000_000_000_000n, 'quadrillion'],\n [1_000_000_000_000n, 'trillion'],\n [1_000_000_000n, 'billion'],\n [1_000_000n, 'million'],\n [1000n, 'thousand'],\n [100n, 'hundred'],\n [90n, 'ninety'],\n [80n, 'eighty'],\n [70n, 'seventy'],\n [60n, 'sixty'],\n [50n, 'fifty'],\n [40n, 'forty'],\n [30n, 'thirty'],\n [20n, 'twenty'],\n [19n, 'nineteen'],\n [18n, 'eighteen'],\n [17n, 'seventeen'],\n [16n, 'sixteen'],\n [15n, 'fifteen'],\n [14n, 'fourteen'],\n [13n, 'thirteen'],\n [12n, 'twelve'],\n [11n, 'eleven'],\n [10n, 'ten'],\n [9n, 'nine'],\n [8n, 'eight'],\n [7n, 'seven'],\n [6n, 'six'],\n [5n, 'five'],\n [4n, 'four'],\n [3n, 'three'],\n [2n, 'two'],\n [1n, 'one'],\n [0n, 'zero']\n ]\n\n /** Combines two word-sets with English hyphenation and \"and\" rules. */\n combineWordSets (preceding, following) {\n const precedingWord = Object.keys(preceding)[0]\n const precedingValue = Object.values(preceding)[0]\n const followingWord = Object.keys(following)[0]\n const followingValue = Object.values(following)[0]\n\n // Rule 1: Implicit \"one\" - omit when multiplying (\"one hundred\" → \"hundred\")\n if (precedingValue === 1n && followingValue < 100n) {\n return { [followingWord]: followingValue }\n }\n\n // Rule 2: Hyphenate compounds under 100 (\"twenty-three\")\n if (precedingValue < 100n && precedingValue > followingValue) {\n return { [`${precedingWord}-${followingWord}`]: precedingValue + followingValue }\n }\n\n // Rule 3: Add \"and\" before units after hundreds (\"one hundred and one\")\n if (precedingValue >= 100n && followingValue < 100n) {\n return { [`${precedingWord} and ${followingWord}`]: precedingValue + followingValue }\n }\n\n // Rule 4: Multiply when following > preceding (\"one thousand\")\n if (followingValue > precedingValue) {\n return { [`${precedingWord} ${followingWord}`]: precedingValue * followingValue }\n }\n\n return { [`${precedingWord} ${followingWord}`]: precedingValue + followingValue }\n }\n}\n","import { GreedyScaleLanguage } from '../classes/greedy-scale-language.js'\n\n/**\n * Filipino language converter.\n *\n * Supports:\n * - \"ng\" connectors between words\n * - Implicit \"one\" omission\n * - Special linkers for certain tens (e.g., \"limampung\")\n */\nexport class Filipino extends GreedyScaleLanguage {\n negativeWord = 'negatibo'\n decimalSeparatorWord = 'punto'\n zeroWord = 'zero'\n usePerDigitDecimals = true // Read decimals digit-by-digit\n\n scaleWords = [\n [1000000000000n, 'trilyong'],\n [1000000000n, 'milyong'],\n [1000000n, 'milyong'],\n [1000n, 'libong'],\n [100n, 'daang'],\n\n // Tens\n [90n, 'siyamnapu'],\n [80n, 'walumpu'],\n [70n, 'pitumpu'],\n [60n, 'animnapu'],\n [50n, 'limampu'],\n [40n, 'apatnapu'],\n [30n, 'tatlumpu'],\n [20n, 'dalawampu'],\n\n // Teens (must come before 10 to be matched first)\n [19n, 'labinsiyam'],\n [18n, 'labingwalo'],\n [17n, 'labimpito'],\n [16n, 'labinanum'],\n [15n, 'labinlima'],\n [14n, 'labinapat'],\n [13n, 'labintatlo'],\n [12n, 'labindalawa'],\n [11n, 'labinisa'],\n [10n, 'sampu'],\n\n // Ones\n [9n, 'siyam'],\n [8n, 'walo'],\n [7n, 'pito'],\n [6n, 'anim'],\n [5n, 'lima'],\n [4n, 'apat'],\n [3n, 'tatlo'],\n [2n, 'dalawa'],\n [1n, 'isa'],\n [0n, 'zero']\n ]\n\n /** Converts integer part with explicit zero handling. */\n integerToWords (integerPart) {\n // Handle zero explicitly\n if (integerPart === 0n) {\n return this.zeroWord\n }\n return super.integerToWords(integerPart)\n }\n\n /** Combines two word-sets with Filipino connector and linker rules. */\n combineWordSets (preceding, following) {\n const precedingWord = Object.keys(preceding)[0]\n const followingWord = Object.keys(following)[0]\n const precedingValue = Object.values(preceding)[0]\n const followingValue = Object.values(following)[0]\n\n // Don't merge zero with anything - just return the non-zero value\n if (precedingValue === 0n) {\n return following\n }\n if (followingValue === 0n) {\n return preceding\n }\n\n // Implicit \"one\" - omit when adding with values < 100\n if (precedingValue === 1n && followingValue < 100n) {\n return following\n }\n\n // Multiply when following is a scale word AND following > preceding\n // Use \"ng\" connector for Filipino, but consonant-ending words use \" na \"\n if (followingValue > precedingValue && followingValue >= 100n) {\n // Words ending in consonants (not vowels) use \" na \" instead of \"ng\"\n const vowels = ['a', 'e', 'i', 'o', 'u']\n const lastChar = precedingWord[precedingWord.length - 1]\n if (!vowels.includes(lastChar)) {\n return {\n [`${precedingWord} na ${followingWord}`]: precedingValue * followingValue\n }\n }\n // Vowel-ending words add \"ng\"\n return {\n [`${precedingWord}ng ${followingWord}`]: precedingValue * followingValue\n }\n }\n\n // Special Filipino rule: certain tens words take \"-ng\" linker when followed by ones\n // Only limampu (50) confirmed to use this pattern\n if (precedingValue >= 10n && precedingValue < 100n && followingValue >= 1n && followingValue < 10n) {\n const tensWithNg = ['limampu']\n if (tensWithNg.includes(precedingWord)) {\n return {\n [`${precedingWord}ng ${followingWord}`]: precedingValue + followingValue\n }\n }\n }\n\n // Default: space for addition\n return {\n [`${precedingWord} ${followingWord}`]: precedingValue + followingValue\n }\n }\n}\n","import { French } from './fr.js'\n\n/**\n * French (Belgium) language converter.\n *\n * Supports:\n * - Belgian regional variants: \"septante\" (70) and \"nonante\" (90)\n * - Simplified tens naming (no complex arithmetic)\n * - Inherits all other French grammar rules\n */\nexport class FrenchBelgium extends French {\n constructor (options = {}) {\n super(options)\n\n // Insert 90n ('nonante') after 80n and 70n ('septante') after 60n\n const tuples = [...this.scaleWords]\n // Find index of 80n and insert 90n after it\n const idx80 = tuples.findIndex(tuple => tuple[0] === 80n)\n if (idx80 !== -1) tuples.splice(idx80, 0, [90n, 'nonante'])\n // Find index of 60n and insert 70n after it\n const idx60 = tuples.findIndex(tuple => tuple[0] === 60n)\n if (idx60 !== -1) tuples.splice(idx60, 0, [70n, 'septante'])\n this.scaleWords = tuples\n }\n}\n","import { GreedyScaleLanguage } from '../classes/greedy-scale-language.js'\n\n/**\n * German language converter.\n *\n * Supports:\n * - Compound formation (no separators between words)\n * - Three forms of 1 (eins/ein/eine)\n * - Units-before-tens ordering (einundzwanzig = one and twenty)\n */\nexport class German extends GreedyScaleLanguage {\n negativeWord = 'minus'\n decimalSeparatorWord = 'komma'\n zeroWord = 'null'\n\n scaleWords = [\n [1_000_000_000_000_000_000_000_000_000n, 'Quadrilliarde'],\n [1_000_000_000_000_000_000_000_000n, 'Quadrillion'],\n [1_000_000_000_000_000_000_000n, 'Trilliarde'],\n [1_000_000_000_000_000_000n, 'Trillion'],\n [1_000_000_000_000_000n, 'Billiarde'],\n [1_000_000_000_000n, 'Billion'],\n [1_000_000_000n, 'Milliarde'],\n [1_000_000n, 'Million'],\n [1000n, 'tausend'],\n [100n, 'hundert'],\n [90n, 'neunzig'],\n [80n, 'achtzig'],\n [70n, 'siebzig'],\n [60n, 'sechzig'],\n [50n, 'fünfzig'],\n [40n, 'vierzig'],\n [30n, 'dreißig'],\n [20n, 'zwanzig'],\n [19n, 'neunzehn'],\n [18n, 'achtzehn'],\n [17n, 'siebzehn'],\n [16n, 'sechzehn'],\n [15n, 'fünfzehn'],\n [14n, 'vierzehn'],\n [13n, 'dreizehn'],\n [12n, 'zwölf'],\n [11n, 'elf'],\n [10n, 'zehn'],\n [9n, 'neun'],\n [8n, 'acht'],\n [7n, 'sieben'],\n [6n, 'sechs'],\n [5n, 'fünf'],\n [4n, 'vier'],\n [3n, 'drei'],\n [2n, 'zwei'],\n [1n, 'eins'],\n [0n, 'null']\n ]\n\n /** Combines two word-sets with German compound formation and reversal rules. */\n combineWordSets (preceding, following) {\n let precedingWord = Object.keys(preceding)[0]\n let followingWord = Object.keys(following)[0]\n const precedingValue = Object.values(preceding)[0]\n const followingValue = Object.values(following)[0]\n\n // Handle form of 1: \"eins\" → \"ein(e)\" in certain contexts\n if (precedingValue === 1n) {\n if (followingValue === 100n || followingValue === 1000n) {\n return { [`ein${followingWord}`]: followingValue }\n }\n if (followingValue < 1_000_000n) {\n return following\n }\n precedingWord = 'eine'\n }\n\n if (followingValue > precedingValue) {\n // Multiply: apply pluralization rules for millions\n if (followingValue >= 1_000_000n) {\n if (precedingValue > 1n) {\n followingWord += followingWord.at(-1) === 'e' ? 'n' : 'en'\n }\n precedingWord += ' '\n }\n return { [`${precedingWord}${followingWord}`]: precedingValue * followingValue }\n }\n\n // Add: handle special case of tens + units\n if (followingValue < 10n && precedingValue > 10n && precedingValue < 100n) {\n // German reverses tens and units (einundzwanzig = one and twenty)\n if (followingValue === 1n) {\n followingWord = 'ein'\n }\n const temp = followingWord\n followingWord = precedingWord\n precedingWord = `${temp}und`\n } else if (precedingValue >= 1_000_000n) {\n precedingWord += ' '\n }\n\n return { [`${precedingWord}${followingWord}`]: precedingValue + followingValue }\n }\n}\n","import { GreedyScaleLanguage } from '../classes/greedy-scale-language.js'\n\n/**\n * Greek language converter.\n *\n * Supports:\n * - Space-separated number composition\n * - Implicit \"one\" (ένα) omission before scale words\n * - Digit-by-digit decimal reading\n */\nexport class Greek extends GreedyScaleLanguage {\n negativeWord = 'μείον'\n decimalSeparatorWord = 'κόμμα'\n zeroWord = 'μηδέν'\n usePerDigitDecimals = true\n\n scaleWords = [\n // Large numbers (limited set for now)\n [1_000_000_000n, 'δισεκατομμύριο'],\n [1_000_000n, 'εκατομμύριο'],\n [1000n, 'χίλια'],\n\n // Hundreds\n [900n, 'εννιακόσια'],\n [800n, 'οκτακόσια'],\n [700n, 'επτακόσια'],\n [600n, 'εξακόσια'],\n [500n, 'πεντακόσια'],\n [400n, 'τετρακόσια'],\n [300n, 'τριακόσια'],\n [200n, 'διακόσια'],\n [100n, 'εκατό'],\n\n // Tens\n [90n, 'ενενήντα'],\n [80n, 'ογδόντα'],\n [70n, 'εβδομήντα'],\n [60n, 'εξήντα'],\n [50n, 'πενήντα'],\n [40n, 'σαράντα'],\n [30n, 'τριάντα'],\n [20n, 'είκοσι'],\n [19n, 'δεκαεννέα'],\n [18n, 'δεκαοκτώ'],\n [17n, 'δεκαεπτά'],\n [16n, 'δεκαέξι'],\n [15n, 'δεκαπέντε'],\n [14n, 'δεκατέσσερα'],\n [13n, 'δεκατρία'],\n [12n, 'δώδεκα'],\n [11n, 'έντεκα'],\n [10n, 'δέκα'],\n\n // Singles\n [9n, 'εννέα'],\n [8n, 'οκτώ'],\n [7n, 'επτά'],\n [6n, 'έξι'],\n [5n, 'πέντε'],\n [4n, 'τέσσερα'],\n [3n, 'τρία'],\n [2n, 'δύο'],\n [1n, 'ένα'],\n [0n, 'μηδέν']\n ]\n\n /** Combines two word-sets with Greek space-separation rules. */\n combineWordSets (preceding, following) {\n const precedingWord = Object.keys(preceding)[0]\n const precedingValue = Object.values(preceding)[0]\n const followingWord = Object.keys(following)[0]\n const followingValue = Object.values(following)[0]\n\n // Implicit one: omit \"ένα\" before any following value (> 0)\n if (precedingValue === 1n) {\n return following\n }\n\n // No special handling needed for trailing 'ένα';\n // nested merge will first collapse {1, 'ένα'} -> 'ένα'.\n\n // Multiplication: larger following scale multiplied by preceding number\n if (followingValue > precedingValue) {\n return { [`${precedingWord} ${followingWord}`]: precedingValue * followingValue }\n }\n\n // Addition: smaller numbers added together\n return { [`${precedingWord} ${followingWord}`]: precedingValue + followingValue }\n }\n}\n","import { SouthAsianLanguage } from '../classes/south-asian-language.js'\n\n/**\n * Gujarati language converter.\n *\n * Supports:\n * - Indian numbering system (હજાર, લાખ, કરોડ)\n * - Gujarati script\n * - Complete word forms for 0-99\n */\nexport class Gujarati extends SouthAsianLanguage {\n negativeWord = 'ઋણ'\n decimalSeparatorWord = 'દશાંશ'\n zeroWord = 'શૂન્ય'\n hundredWord = 'સો'\n usePerDigitDecimals = true\n\n belowHundredWords = [\n 'શૂન્ય',\n 'એક',\n 'બે',\n 'ત્રણ',\n 'ચાર',\n 'પાંચ',\n 'છ',\n 'સાત',\n 'આઠ',\n 'નવ',\n 'દસ',\n 'અગિયાર',\n 'બાર',\n 'તેર',\n 'ચૌદ',\n 'પંદર',\n 'સોળ',\n 'સત્તર',\n 'અઢાર',\n 'ઓગણીસ',\n 'વીસ',\n 'એકવીસ',\n 'બાવીસ',\n 'ત્રેવીસ',\n 'ચોવીસ',\n 'પચીસ',\n 'છવ્વીસ',\n 'સત્તાવીસ',\n 'અઠ્ઠાવીસ',\n 'ઓગણત્રીસ',\n 'ત્રીસ',\n 'એકત્રીસ',\n 'બત્રીસ',\n 'તેત્રીસ',\n 'ચોત્રીસ',\n 'પાંત્રીસ',\n 'છત્રીસ',\n 'સાડત્રીસ',\n 'અડત્રીસ',\n 'ઓગણચાલીસ',\n 'ચાલીસ',\n 'એકતાલીસ',\n 'બેતાળીસ',\n 'ત્રેતાળીસ',\n 'ચુંમાલીસ',\n 'પિસ્તાલીસ',\n 'છેતાળીસ',\n 'સુડતાળીસ',\n 'અડતાળીસ',\n 'ઓગણપચાસ',\n 'પચાસ',\n 'એકાવન',\n 'બાવન',\n 'ત્રેપન',\n 'ચોપન',\n 'પંચાવન',\n 'છપ્પન',\n 'સત્તાવન',\n 'અઠ્ઠાવન',\n 'ઓગણસાઠ',\n 'સાઠ',\n 'એકસઠ',\n 'બાસઠ',\n 'ત્રેસઠ',\n 'ચોસઠ',\n 'પાંસઠ',\n 'છાસઠ',\n 'સડસઠ',\n 'અડસઠ',\n 'અગણોસિત્તેર',\n 'સિત્તેર',\n 'એકોતેર',\n 'બોતેર',\n 'તોતેર',\n 'ચુમોતેર',\n 'પંચોતેર',\n 'છોતેર',\n 'સિત્યોતેર',\n 'ઇઠ્યોતેર',\n 'ઓગણાએંસી',\n 'એંસી',\n 'એક્યાસી',\n 'બ્યાસી',\n 'ત્યાસી',\n 'ચોર્યાસી',\n 'પંચાસી',\n 'છ્યાસી',\n 'સિત્યાસી',\n 'અઠ્યાસી',\n 'નેવ્યાસી',\n 'નેવું',\n 'એકાણું',\n 'બાણું',\n 'ત્રાણું',\n 'ચોરાણું',\n 'પંચાણું',\n 'છન્નું',\n 'સત્તાણું',\n 'અઠ્ઠાણું',\n 'નવ્વાણું'\n ]\n\n scaleWords = [\n '',\n 'હજાર',\n 'લાખ',\n 'કરોડ',\n 'અબજ',\n 'ખરબ',\n 'નીલ',\n 'પદ્મ',\n 'શંખ'\n ]\n}\n","import { SlavicLanguage } from '../classes/slavic-language.js'\n\n/**\n * Modern Hebrew language converter.\n *\n * Supports:\n * - Right-to-left text orientation\n * - Feminine grammatical forms (default in Modern Hebrew)\n * - Three-form pluralization (singular/few/many)\n * - Optional \"ve\" (ו) conjunction via options\n */\nexport class Hebrew extends SlavicLanguage {\n negativeWord = 'מינוס'\n decimalSeparatorWord = 'נקודה'\n zeroWord = 'אפס'\n usePerDigitDecimals = true\n\n // Feminine forms (default in Modern Hebrew)\n onesWords = {\n 1: 'אחת',\n 2: 'שתים',\n 3: 'שלש',\n 4: 'ארבע',\n 5: 'חמש',\n 6: 'שש',\n 7: 'שבע',\n 8: 'שמונה',\n 9: 'תשע'\n }\n\n teensWords = {\n 0: 'עשר',\n 1: 'אחת עשרה',\n 2: 'שתים עשרה',\n 3: 'שלש עשרה',\n 4: 'ארבע עשרה',\n 5: 'חמש עשרה',\n 6: 'שש עשרה',\n 7: 'שבע עשרה',\n 8: 'שמונה עשרה',\n 9: 'תשע עשרה'\n }\n\n twentiesWords = {\n 2: 'עשרים',\n 3: 'שלשים',\n 4: 'ארבעים',\n 5: 'חמישים',\n 6: 'ששים',\n 7: 'שבעים',\n 8: 'שמונים',\n 9: 'תשעים'\n }\n\n hundredsWords = {\n 1: 'מאה',\n 2: 'מאתיים',\n 3: 'מאות'\n }\n\n pluralForms = {\n 1: 'אלף',\n 2: 'אלפיים',\n 3: 'שלשת אלפים',\n 4: 'ארבעת אלפים',\n 5: 'חמשת אלפים',\n 6: 'ששת אלפים',\n 7: 'שבעת אלפים',\n 8: 'שמונת אלפים',\n 9: 'תשעת אלפים'\n }\n\n scale = {\n 1: 'אלף', // thousand (singular)\n 2: 'מיליון', // million\n 3: 'מיליארד', // billion\n 4: 'טריליון', // trillion\n 5: 'קוודרליון', // quadrillion\n 6: 'קווינטיליון' // quintillion\n }\n\n scalePlural = {\n 1: 'אלפים', // thousands\n 2: 'מיליונים', // millions\n 3: 'מיליארדים', // billions\n 4: 'טריליונים', // trillions\n 5: 'קוודרליונים', // quadrillions\n 6: 'קווינטיליונים' // quintillions\n }\n\n constructor (options = {}) {\n super(options)\n\n this.setOptions({\n andWord: 'ו'\n }, options)\n }\n\n /** Converts integer part to Hebrew words with special handling for thousands. */\n integerToWords (integerPart) {\n if (integerPart === 0n) {\n return this.zeroWord\n }\n const words = []\n const segments = this.splitToSegments(integerPart.toString(), 3)\n let index = segments.length\n for (const x of segments) {\n index = index - 1\n if (x === 0n) {\n continue\n }\n\n const [n1, n2, n3] = this.extractDigits(x)\n\n if (index > 0) {\n // For thousands and above, handle the full chunk value\n const chunkWords = []\n let hasHundreds = false\n\n // Process hundreds in this chunk\n if (n3 > 0n) {\n hasHundreds = true\n if (n3 <= 2n) {\n chunkWords.push(this.hundredsWords[n3])\n } else {\n chunkWords.push(this.onesWords[n3] + ' ' + this.hundredsWords[3])\n }\n }\n\n // Process tens in this chunk\n if (n2 > 1n) {\n // Add conjunction if there were hundreds before\n const tensWord = this.twentiesWords[n2]\n chunkWords.push(hasHundreds ? this.options.andWord + tensWord : tensWord)\n }\n\n // Process ones in this chunk\n if (n2 === 1n) {\n // Add conjunction if there were hundreds before\n const onesWord = this.teensWords[n1]\n chunkWords.push(hasHundreds ? this.options.andWord + onesWord : onesWord)\n } else if (n1 > 0n) {\n // For \"one million\", \"one billion\", etc., don't add the word \"one\"\n if (x === 1n && index > 1) {\n // Skip adding \"one\" for millions/billions/etc.\n } else if (x <= 9n && chunkWords.length === 0 && index === 1) {\n // Use special forms for 1-9 thousand\n chunkWords.push(this.pluralForms[n1])\n } else {\n const onesWord = this.onesWords[n1]\n // Add conjunction if there were hundreds or tens before\n chunkWords.push((hasHundreds || n2 > 0n) ? this.options.andWord + onesWord : onesWord)\n }\n }\n\n // Add scale word (thousand, million, billion, etc.)\n if (x > 9n || index > 1) {\n // For numbers > 9 or higher scales, use appropriate scale word\n if (x === 1n) {\n // Singular form (e.g., \"one thousand\", \"one million\")\n chunkWords.push(this.scale[index])\n } else if (x === 2n && index === 1) {\n // Special dual form for \"two thousand\" (already in thousands[2])\n return [this.pluralForms[2], ...words].join(' ')\n } else if (x === 2n) {\n // For two million, two billion, etc. - use plural form\n chunkWords.push(this.scalePlural[index])\n } else if (index === 1) {\n // For thousands (10+), always use singular \"אלף\"\n chunkWords.push(this.scale[index])\n } else {\n // For millions/billions/etc. use plural form\n chunkWords.push(this.scalePlural[index])\n }\n }\n\n words.push(chunkWords.join(' '))\n continue\n }\n\n if (n3 > 0n) {\n if (n3 <= 2n) {\n words.push(this.hundredsWords[n3])\n } else {\n words.push(this.onesWords[n3] + ' ' + this.hundredsWords[3])\n }\n }\n\n if (n2 > 1n) {\n words.push(this.twentiesWords[n2])\n }\n\n if (n2 === 1n) {\n words.push(this.teensWords[n1])\n } else if (n1 > 0n) {\n words.push(this.onesWords[n1])\n }\n }\n\n if (words.length > 1) {\n words[words.length - 1] = this.options.andWord + words.at(-1)\n }\n\n return words.join(' ')\n }\n}\n","import { SouthAsianLanguage } from '../classes/south-asian-language.js'\n\n/**\n * Hindi language converter.\n *\n * Supports:\n * - Indian numbering system (हज़ार, लाख, करोड़)\n * - Devanagari script\n * - Complete word forms for 0-99\n */\nexport class Hindi extends SouthAsianLanguage {\n negativeWord = 'माइनस'\n decimalSeparatorWord = 'दशमलव'\n zeroWord = 'शून्य'\n hundredWord = 'सौ'\n\n belowHundredWords = [\n 'शून्य',\n 'एक',\n 'दो',\n 'तीन',\n 'चार',\n 'पाँच',\n 'छह',\n 'सात',\n 'आठ',\n 'नौ',\n 'दस',\n 'ग्यारह',\n 'बारह',\n 'तेरह',\n 'चौदह',\n 'पंद्रह',\n 'सोलह',\n 'सत्रह',\n 'अठारह',\n 'उन्नीस',\n 'बीस',\n 'इक्कीस',\n 'बाईस',\n 'तेईस',\n 'चौबीस',\n 'पच्चीस',\n 'छब्बीस',\n 'सत्ताईस',\n 'अट्ठाईस',\n 'उनतीस',\n 'तीस',\n 'इकतीस',\n 'बत्तीस',\n 'तैंतीस',\n 'चौंतीस',\n 'पैंतीस',\n 'छत्तीस',\n 'सैंतीस',\n 'अड़तीस',\n 'उनतालीस',\n 'चालीस',\n 'इकतालीस',\n 'बयालीस',\n 'तेतालीस',\n 'चवालीस',\n 'पैंतालीस',\n 'छियालीस',\n 'सैंतालीस',\n 'अड़तालीस',\n 'उनचास',\n 'पचास',\n 'इक्यावन',\n 'बावन',\n 'तिरपन',\n 'चौवन',\n 'पचपन',\n 'छप्पन',\n 'सत्तावन',\n 'अट्ठावन',\n 'उनसठ',\n 'साठ',\n 'इकसठ',\n 'बासठ',\n 'तिरसठ',\n 'चौंसठ',\n 'पैंसठ',\n 'छियासठ',\n 'सड़सठ',\n 'अड़सठ',\n 'उनहत्तर',\n 'सत्तर',\n 'इकहत्तर',\n 'बहत्तर',\n 'तिहत्तर',\n 'चौहत्तर',\n 'पचहत्तर',\n 'छिहत्तर',\n 'सतहत्तर',\n 'अठहत्तर',\n 'उन्यासी',\n 'अस्सी',\n 'इक्यासी',\n 'बयासी',\n 'तिरासी',\n 'चौरासी',\n 'पचासी',\n 'छियासी',\n 'सत्तासी',\n 'अट्ठासी',\n 'नवासी',\n 'नब्बे',\n 'इक्यानवे',\n 'बानवे',\n 'तिरानवे',\n 'चौरानवे',\n 'पचानवे',\n 'छियानवे',\n 'सत्तानवे',\n 'अट्ठानवे',\n 'निन्यानवे'\n ]\n\n scaleWords = [\n '',\n 'हज़ार',\n 'लाख',\n 'करोड़',\n 'अरब',\n 'खरब',\n 'नील',\n 'पद्म',\n 'शंख'\n ]\n}\n","import { GreedyScaleLanguage } from '../classes/greedy-scale-language.js'\n\n/**\n * Hungarian language converter.\n *\n * Supports:\n * - Agglutinative structure (no spaces between compound parts)\n * - Special handling for \"egy\" (one) omission\n * - Pre-composed twenties (huszonegy through huszonkilenc)\n */\nexport class Hungarian extends GreedyScaleLanguage {\n negativeWord = 'mínusz'\n decimalSeparatorWord = 'egész'\n zeroWord = 'nulla'\n\n scaleWords = [\n [1_000_000_000_000_000_000_000_000_000n, 'quadrilliárd'],\n [1_000_000_000_000_000_000_000_000n, 'quadrillió'],\n [1_000_000_000_000_000_000_000n, 'trilliárd'],\n [1_000_000_000_000_000_000n, 'trillió'],\n [1_000_000_000_000_000n, 'billiárd'],\n [1_000_000_000_000n, 'billió'],\n [1_000_000_000n, 'milliárd'],\n [1_000_000n, 'millió'],\n [1000n, 'ezer'],\n [100n, 'száz'],\n [90n, 'kilencven'],\n [80n, 'nyolcvan'],\n [70n, 'hetven'],\n [60n, 'hatvan'],\n [50n, 'ötven'],\n [40n, 'negyven'],\n [30n, 'harminc'],\n [29n, 'huszonkilenc'],\n [28n, 'huszonnyolc'],\n [27n, 'huszonhét'],\n [26n, 'huszonhat'],\n [25n, 'huszonöt'],\n [24n, 'huszonnégy'],\n [23n, 'huszonhárom'],\n [22n, 'huszonkettő'],\n [21n, 'huszonegy'],\n [20n, 'húsz'],\n [19n, 'tizenkilenc'],\n [18n, 'tizennyolc'],\n [17n, 'tizenhét'],\n [16n, 'tizenhat'],\n [15n, 'tizenöt'],\n [14n, 'tizennégy'],\n [13n, 'tizenhárom'],\n [12n, 'tizenkettő'],\n [11n, 'tizenegy'],\n [10n, 'tíz'],\n [9n, 'kilenc'],\n [8n, 'nyolc'],\n [7n, 'hét'],\n [6n, 'hat'],\n [5n, 'öt'],\n [4n, 'négy'],\n [3n, 'három'],\n [2n, 'kettő'],\n [1n, 'egy'],\n [0n, 'nulla']\n ]\n\n /** Converts tens (30-99) with agglutinative composition. */\n tensToCardinal (number) {\n // Expecting `number` as bigint when called from integerToWords\n if (this.wordForScale(number)) {\n return this.wordForScale(number)\n } else {\n const tens = number / 10n\n const units = number % 10n\n return this.wordForScale(tens * 10n) + this.integerToWords(units)\n }\n }\n\n /** Converts hundreds (100-999) with \"száz\" composition. */\n hundredsToCardinal (number) {\n const hundreds = number / 100n\n let prefix = 'száz'\n if (hundreds !== 1n) {\n prefix = this.integerToWords(hundreds, '') + prefix\n }\n const postfix = this.integerToWords(number % 100n, '')\n return prefix + postfix\n }\n\n /** Converts thousands (1000-999999) with \"ezer\" composition. */\n thousandsToCardinal (number) {\n const thousands = number / 1000n\n let prefix = 'ezer'\n if (thousands !== 1n) {\n prefix = this.integerToWords(thousands, '') + prefix\n }\n const postfix = this.integerToWords(number % 1000n, '')\n const middle = (number <= 2000n || postfix === '') ? '' : '-'\n return prefix + middle + postfix\n }\n\n /** Converts large numbers (millions and above) with scale words. */\n bigNumberToCardinal (number) {\n const numberLength = number.toString().length\n const digits = (numberLength % 3 === 0) ? numberLength - 2 : numberLength\n const exp = 10 ** (Math.floor(digits / 3) * 3)\n const prefix = this.integerToWords(number / BigInt(exp), '')\n const rest = this.integerToWords(number % BigInt(exp), '')\n const postfix = (rest === '') ? '' : ('-' + rest)\n return prefix + this.wordForScale(BigInt(exp)) + postfix\n }\n\n /** Converts integer part using Hungarian agglutinative rules. */\n integerToWords (integerPart, zeroWord = this.zeroWord) {\n let words = ''\n\n // Normalize to BigInt for consistent comparisons\n if (typeof integerPart !== 'bigint') integerPart = BigInt(integerPart)\n\n if (integerPart === 0n) {\n words = zeroWord\n } else if (zeroWord === '' && integerPart === 2n) {\n words = 'két'\n } else if (integerPart < 30n) {\n words = this.wordForScale(integerPart)\n } else if (integerPart < 100n) {\n words = this.tensToCardinal(integerPart)\n } else if (integerPart < 1000n) {\n words = this.hundredsToCardinal(integerPart)\n } else if (integerPart < 1_000_000n) {\n words = this.thousandsToCardinal(integerPart)\n } else {\n words = this.bigNumberToCardinal(integerPart)\n }\n\n return words\n }\n}\n","import { AbstractLanguage } from '../classes/abstract-language.js'\n\n/**\n * Indonesian language converter.\n *\n * Supports:\n * - \"Se-\" prefix for one (seratus, seribu, sejuta)\n * - Regular patterns (puluh for tens, ratus for hundreds)\n * - Space-separated number components\n */\nexport class Indonesian extends AbstractLanguage {\n negativeWord = 'min'\n decimalSeparatorWord = 'koma'\n zeroWord = 'nol'\n\n /**\n * Word forms for digits 0-9.\n * @type {Object.<number, string[]>}\n */\n digitWords = {\n 0: [],\n 1: ['satu'],\n 2: ['dua'],\n 3: ['tiga'],\n 4: ['empat'],\n 5: ['lima'],\n 6: ['enam'],\n 7: ['tujuh'],\n 8: ['delapan'],\n 9: ['sembilan']\n }\n\n /**\n * Scale magnitude words keyed by exponent (10^n).\n * @type {Object.<number, string>}\n */\n scaleWords = {\n 3: 'ribu', // 10^3\n 6: 'juta', // 10^6\n 9: 'miliar', // 10^9\n 12: 'triliun',\n 15: 'kuadriliun',\n 18: 'kuantiliun',\n 21: 'sekstiliun',\n 24: 'septiliun',\n 27: 'oktiliun',\n 30: 'noniliun',\n 33: 'desiliun'\n }\n\n /** Splits number into groups of 3 digits. */\n splitBy3 (number) {\n // Split to groups of 3 numbers: 1234567 -> [['1'], ['234'], ['567']]\n const blocks = []\n const stringNumber = number.toString()\n const length = stringNumber.length\n let firstBlock\n\n if (length < 3) {\n blocks.push([stringNumber])\n } else {\n const firstBlockLength = length % 3\n\n if (firstBlockLength > 0) {\n firstBlock = [stringNumber.slice(0, firstBlockLength)]\n blocks.push(firstBlock)\n }\n\n for (let index = firstBlockLength; index < length; index += 3) {\n const nextBlock = [stringNumber.slice(index, index + 3)]\n blocks.push(nextBlock)\n }\n }\n return blocks\n }\n\n /** Converts digit blocks to Indonesian words. */\n spell (blocks) {\n let wordBlocks = []\n let spelling\n const firstBlock = blocks[0]\n if (firstBlock[0].length === 1) {\n spelling = firstBlock[0] === '0' ? ['nol'] : this.digitWords[Math.trunc(firstBlock[0])]\n } else if (firstBlock[0].length === 2) {\n spelling = this.getTens(firstBlock[0])\n } else {\n spelling = [...this.getHundreds(firstBlock[0][0]), ...this.getTens(firstBlock[0].slice(1, 3))]\n }\n wordBlocks = [...wordBlocks, [firstBlock[0], spelling]]\n for (let index = 1; index < blocks.length; index++) {\n let block = blocks[index]\n spelling = [...this.getHundreds(block[0][0]), ...this.getTens(block[0].slice(1, 3))]\n block = [...block, spelling]\n wordBlocks = [...wordBlocks, block]\n }\n return wordBlocks\n }\n\n /** Converts hundreds digit with \"seratus\" or \"ratus\" suffix. */\n getHundreds (number) {\n if (number === '1') {\n return ['seratus']\n } else if (number === '0') {\n return []\n } else {\n return [...this.digitWords[Math.trunc(number)], 'ratus']\n }\n }\n\n /** Converts tens and units digits with \"puluh\" or \"belas\" suffix. */\n getTens (number) {\n if (number[0] === '1') {\n if (number[1] === '0') {\n return ['sepuluh']\n } else if (number[1] === '1') {\n return ['sebelas']\n }\n return [...this.digitWords[Math.trunc(number[1])], 'belas']\n }\n\n if (number[0] === '0') {\n return this.digitWords[Math.trunc(number[1])]\n }\n\n return [...this.digitWords[Math.trunc(number[0])], 'puluh', ...this.digitWords[Math.trunc(number[1])]]\n }\n\n /** Joins word blocks with magnitude scale words. */\n join (wordBlocks) {\n let wordList = []\n const length = wordBlocks.length - 1\n const firstBlock = [wordBlocks[0]]\n let start = 0\n if (length === 1 && firstBlock[0][0] === '1') {\n wordList.push('seribu')\n start = 1\n }\n for (let index = start; index < length + 1; index++) {\n wordList = [...wordList, ...wordBlocks[index][1]]\n if (wordBlocks[index][1].length === 0) {\n continue\n }\n if (index === length) {\n break\n }\n wordList = [...wordList, this.scaleWords[(length - index) * 3]]\n }\n return wordList.join(' ')\n }\n\n /** Converts integer part using Indonesian group-based conversion. */\n integerToWords (integerPart) {\n return this.join(\n this.spell(\n this.splitBy3(integerPart)\n )\n ).trim()\n }\n}\n","import { AbstractLanguage } from '../classes/abstract-language.js'\n\n/**\n * Italian language converter.\n *\n * Supports:\n * - Phonetic contractions (vowel elision: \"ventotto\" not \"ventiotto\")\n * - Accentuation rules for \"tre\" in compounds (\"ventitré\")\n * - Custom word construction for irregular patterns\n */\nexport class Italian extends AbstractLanguage {\n negativeWord = 'meno'\n decimalSeparatorWord = 'virgola'\n zeroWord = 'zero'\n\n onesWords = [\n this.zeroWord, 'uno', 'due', 'tre', 'quattro', 'cinque', 'sei', 'sette', 'otto',\n 'nove', 'dieci', 'undici', 'dodici', 'tredici', 'quattordici', 'quindici',\n 'sedici', 'diciassette', 'diciotto', 'diciannove'\n ]\n\n tensWords = { 2: 'venti', 3: 'trenta', 4: 'quaranta', 6: 'sessanta' }\n\n exponentPrefixes = [this.zeroWord, 'm', 'b', 'tr', 'quadr', 'quint', 'sest', 'sett', 'ott', 'nov', 'dec']\n\n /** Adds accent to final \"tre\" in compound words (ventitré). */\n accentuate (string) {\n const splittedString = string.split(' ')\n\n const result = splittedString.map(word => {\n return word.slice(-3) === 'tre' && word.length > 3 ? word.replaceAll('tré', 'tre').slice(0, -3) + 'tré' : word.replaceAll('tré', 'tre')\n })\n return result.join(' ')\n }\n\n /** Omits word if it represents zero. */\n omitIfZero (numberToString) {\n return numberToString === this.zeroWord ? '' : numberToString\n }\n\n /** Removes duplicate vowels for phonetic contractions. */\n phoneticContraction (string) {\n return string.replaceAll('oo', 'o').replaceAll('ao', 'o').replaceAll('io', 'o').replaceAll('au', 'u').replaceAll('iu', 'u')\n }\n\n /** Converts tens (20-99) with phonetic contractions. */\n tensToCardinal (number) {\n const tens = Math.floor(number / 10)\n const units = number % 10\n const prefix = Object.prototype.hasOwnProperty.call(this.tensWords, tens) ? this.tensWords[tens] : this.onesWords[tens].slice(0, -1) + 'anta'\n const postfix = this.omitIfZero(this.onesWords[units])\n return this.phoneticContraction(prefix + postfix)\n }\n\n /** Converts hundreds (100-999) with \"cento\" composition. */\n hundredsToCardinal (number) {\n const hundreds = Math.floor(number / 100)\n let prefix = 'cento'\n if (hundreds !== 1) {\n prefix = this.onesWords[hundreds] + prefix\n }\n const postfix = this.omitIfZero(this.integerToWords(number % 100))\n return this.phoneticContraction(prefix + postfix)\n }\n\n /** Converts thousands (1000-999999) with \"mille/mila\" composition. */\n thousandsToCardinal (number) {\n const thousands = Math.floor(number / 1000)\n const prefix = thousands === 1 ? 'mille' : this.integerToWords(thousands) + 'mila'\n const postfix = this.omitIfZero(this.integerToWords(number % 1000))\n return prefix + postfix\n }\n\n /** Converts exponent length to Italian scale word (milione, miliardo, etc.). */\n exponentLengthToString (exponentLength) {\n const prefix = this.exponentPrefixes[Math.floor(exponentLength / 6)]\n return exponentLength % 6 === 0 ? prefix + 'ilione' : prefix + 'iliardo'\n }\n\n /** Converts large numbers (millions and above) with exponent-based naming. */\n bigNumberToCardinal (number) {\n const digits = [...number.toString()]\n\n let preDigits = digits.length % 3\n if (preDigits === 0) {\n preDigits = 3\n }\n\n const multiplier = digits.slice(0, preDigits) // first `preDigits` elements\n const exponent = digits.slice(preDigits) // without the first `preDigits` elements\n\n let prefix, postfix\n let infix = this.exponentLengthToString(exponent.length)\n\n if (multiplier.join('') === '1') {\n prefix = 'un '\n } else {\n prefix = this.integerToWords(Math.trunc(Number(multiplier.join(''))))\n infix = ' ' + infix.slice(0, -1) + 'i' // without last element\n }\n\n const isSetsEqual = (a, b) => a.size === b.size && [...a].every(value => b.has(value))\n if (isSetsEqual(new Set(exponent), new Set(['0']))) {\n postfix = ''\n } else {\n postfix = this.integerToWords(Math.trunc(exponent.join('')))\n\n infix += (postfix.includes(' e ') ? ', ' : ' e ')\n }\n\n return prefix + infix + postfix\n }\n\n /** Converts integer part using Italian custom algorithm with accentuation. */\n integerToWords (integerPart) {\n let words = ''\n\n if (integerPart < 20) {\n words = this.onesWords[integerPart]\n } else if (integerPart < 100) {\n words = this.tensToCardinal(Number(integerPart))\n } else if (integerPart < 1000) {\n words = this.hundredsToCardinal(Number(integerPart))\n } else if (integerPart < 1_000_000) {\n words = this.thousandsToCardinal(Number(integerPart))\n } else {\n words = this.bigNumberToCardinal(integerPart)\n }\n\n return this.accentuate(words)\n }\n}\n","import { AbstractLanguage } from '../classes/abstract-language.js'\n\n/**\n * Japanese language converter.\n *\n * Supports:\n * - Kanji numerals (一, 二, 三, etc.)\n * - Grouping by 万 (10,000) instead of 1,000\n * - Special 一 (one) omission rules (十, 百, 千 but 一万, 一億)\n */\nexport class Japanese extends AbstractLanguage {\n negativeWord = 'マイナス'\n decimalSeparatorWord = '点'\n zeroWord = '零'\n wordSeparator = '' // Japanese doesn't use spaces between characters\n usePerDigitDecimals = true // Enable digit-by-digit decimal conversion\n\n // Ones words used for group conversion (1-9)\n onesWords = ['一', '二', '三', '四', '五', '六', '七', '八', '九']\n\n // Scale words for grouping by 10^4\n scaleWords = [\n '', // 10^0 (ones)\n '万', // 10^4 (man)\n '億', // 10^8 (oku)\n '兆', // 10^12 (chō)\n '京', // 10^16 (kei)\n '垓', // 10^20 (gai)\n '秭', // 10^24 (jo/shi)\n '穣', // 10^28 (jō)\n '溝', // 10^32 (kō)\n '澗', // 10^36 (kan)\n '正', // 10^40 (sei)\n '載', // 10^44 (sai)\n '極', // 10^48 (goku)\n '恒河沙', // 10^52 (gōgasha)\n '阿僧祇', // 10^56 (asōgi)\n '那由他', // 10^60 (nayuta)\n '不可思議', // 10^64 (fukashigi)\n '無量大数' // 10^68 (muryōtaisū)\n ]\n\n /** Converts a segment of up to 4 digits to Japanese kanji with 一 omission rules. */\n segmentToWords (num) {\n if (num === 0n) return ''\n\n const thousands = num / 1000n\n const hundreds = (num % 1000n) / 100n\n const tens = (num % 100n) / 10n\n const ones = num % 10n\n\n let result = ''\n\n // Thousands (千)\n if (thousands > 0n) {\n // Always omit 一 before 千 when thousands === 1\n if (thousands === 1n) {\n result += '千'\n } else {\n result += this.onesWords[Number(thousands) - 1] + '千'\n }\n }\n\n // Hundreds (百)\n if (hundreds > 0n) {\n // Always omit 一 before 百 when hundreds === 1\n if (hundreds === 1n) {\n result += '百'\n } else {\n result += this.onesWords[Number(hundreds) - 1] + '百'\n }\n }\n\n // Tens (十)\n if (tens > 0n) {\n // Always omit 一 before 十 when tens === 1\n if (tens === 1n) {\n result += '十'\n } else {\n result += this.onesWords[Number(tens) - 1] + '十'\n }\n }\n\n // Ones\n if (ones > 0n) {\n result += this.onesWords[Number(ones) - 1]\n }\n\n return result\n }\n\n /** Converts integer part using Japanese 万-based grouping system. */\n integerToWords (integerPart) {\n if (integerPart === 0n) {\n return this.zeroWord\n }\n\n let temp = integerPart\n let scaleIndex = 0\n const groups = []\n\n // Split into groups of 4 digits (万-based system)\n while (temp > 0n) {\n const group = temp % 10000n\n if (group > 0n) {\n groups.push({ value: group, scale: scaleIndex })\n }\n temp = temp / 10000n\n scaleIndex++\n }\n\n // Reverse to process from highest to lowest\n groups.reverse()\n\n let result = ''\n\n for (let i = 0; i < groups.length; i++) {\n const { value, scale } = groups[i]\n\n const groupStr = this.segmentToWords(value)\n\n // For scales >= 1 (万 and above), always add the scale word\n if (scale >= 1) {\n // Special case: if group is 1 and scale >= 1, we need 一 before the scale\n if (value === 1n) {\n result += '一' + this.scaleWords[scale]\n } else {\n result += groupStr + this.scaleWords[scale]\n }\n } else {\n result += groupStr\n }\n }\n\n return result\n }\n}\n","import { SouthAsianLanguage } from '../classes/south-asian-language.js'\n\n/**\n * Kannada language converter.\n *\n * Supports:\n * - Indian numbering system (ಸಾವಿರ, ಲಕ್ಷ, ಕೋಟಿ)\n * - Kannada script\n * - Complete word forms for 0-99\n */\nexport class Kannada extends SouthAsianLanguage {\n negativeWord = 'ಋಣಾತ್ಮಕ'\n decimalSeparatorWord = 'ದಶಮಾಂಶ'\n zeroWord = 'ಸೊನ್ನೆ'\n hundredWord = 'ನೂರು'\n usePerDigitDecimals = true\n\n belowHundredWords = [\n 'ಸೊನ್ನೆ', 'ಒಂದು', 'ಎರಡು', 'ಮೂರು', 'ನಾಲ್ಕು', 'ಐದು', 'ಆರು', 'ಏಳು', 'ಎಂಟು', 'ಒಂಬತ್ತು',\n 'ಹತ್ತು', 'ಹನ್ನೊಂದು', 'ಹನ್ನೆರಡು', 'ಹದಿಮೂರು', 'ಹದಿನಾಲ್ಕು', 'ಹದಿನೈದು', 'ಹದಿನಾರು', 'ಹದಿನೇಳು', 'ಹದಿನೆಂಟು', 'ಹತ್ತೊಂಬತ್ತು',\n 'ಇಪ್ಪತ್ತು', 'ಇಪ್ಪತ್ತೊಂದು', 'ಇಪ್ಪತ್ತೆರಡು', 'ಇಪ್ಪತ್ತಮೂರು', 'ಇಪ್ಪತ್ತನಾಲ್ಕು', 'ಇಪ್ಪತ್ತೈದು', 'ಇಪ್ಪತ್ತಾರು', 'ಇಪ್ಪತ್ತೇಳು', 'ಇಪ್ಪತ್ತೆಂಟು', 'ಇಪ್ಪತ್ತೊಂಬತ್ತು',\n 'ಮೂವತ್ತು', 'ಮೂವತ್ತೊಂದು', 'ಮೂವತ್ತೆರಡು', 'ಮೂವತ್ತಮೂರು', 'ಮೂವತ್ತನಾಲ್ಕು', 'ಮೂವತ್ತೈದು', 'ಮೂವತ್ತಾರು', 'ಮೂವತ್ತೇಳು', 'ಮೂವತ್ತೆಂಟು', 'ಮೂವತ್ತೊಂಬತ್ತು',\n 'ನಲವತ್ತು', 'ನಲವತ್ತೊಂದು', 'ನಲವತ್ತೆರಡು', 'ನಲವತ್ತಮೂರು', 'ನಲವತ್ತನಾಲ್ಕು', 'ನಲವತ್ತೈದು', 'ನಲವತ್ತಾರು', 'ನಲವತ್ತೇಳು', 'ನಲವತ್ತೆಂಟು', 'ನಲವತ್ತೊಂಬತ್ತು',\n 'ಐವತ್ತು', 'ಐವತ್ತೊಂದು', 'ಐವತ್ತೆರಡು', 'ಐವತ್ತಮೂರು', 'ಐವತ್ತನಾಲ್ಕು', 'ಐವತ್ತೈದು', 'ಐವತ್ತಾರು', 'ಐವತ್ತೇಳು', 'ಐವತ್ತೆಂಟು', 'ಐವತ್ತೊಂಬತ್ತು',\n 'ಅರವತ್ತು', 'ಅರವತ್ತೊಂದು', 'ಅರವತ್ತೆರಡು', 'ಅರವತ್ತಮೂರು', 'ಅರವತ್ತನಾಲ್ಕು', 'ಅರವತ್ತೈದು', 'ಅರವತ್ತಾರು', 'ಅರವತ್ತೇಳು', 'ಅರವತ್ತೆಂಟು', 'ಅರವತ್ತೊಂಬತ್ತು',\n 'ಎಪ್ಪತ್ತು', 'ಎಪ್ಪತ್ತೊಂದು', 'ಎಪ್ಪತ್ತೆರಡು', 'ಎಪ್ಪತ್ತಮೂರು', 'ಎಪ್ಪತ್ತನಾಲ್ಕು', 'ಎಪ್ಪತ್ತೈದು', 'ಎಪ್ಪತ್ತಾರು', 'ಎಪ್ಪತ್ತೇಳು', 'ಎಪ್ಪತ್ತೆಂಟು', 'ಎಪ್ಪತ್ತೊಂಬತ್ತು',\n 'ಎಂಬತ್ತು', 'ಎಂಬತ್ತೊಂದು', 'ಎಂಬತ್ತೆರಡು', 'ಎಂಬತ್ತಮೂರು', 'ಎಂಬತ್ತನಾಲ್ಕು', 'ಎಂಬತ್ತೈದು', 'ಎಂಬತ್ತಾರು', 'ಎಂಬತ್ತೇಳು', 'ಎಂಬತ್ತೆಂಟು', 'ಎಂಬತ್ತೊಂಬತ್ತು',\n 'ತೊಂಬತ್ತು', 'ತೊಂಬತ್ತೊಂದು', 'ತೊಂಬತ್ತೆರಡು', 'ತೊಂಬತ್ತಮೂರು', 'ತೊಂಬತ್ತನಾಲ್ಕು', 'ತೊಂಬತ್ತೈದು', 'ತೊಂಬತ್ತಾರು', 'ತೊಂಬತ್ತೇಳು', 'ತೊಂಬತ್ತೆಂಟು', 'ತೊಂಬತ್ತೊಂಬತ್ತು'\n ]\n\n scaleWords = [\n '', // units\n 'ಸಾವಿರ', // thousand (1,000)\n 'ಲಕ್ಷ', // lakh (100,000)\n 'ಕೋಟಿ', // crore (10,000,000)\n 'ಅಬ್ಜ', // arab (1,000,000,000)\n 'ಖರ್ವ', // kharab (100,000,000,000)\n 'ನೀಲ', // neel (10,000,000,000,000)\n 'ಪದ್ಮ', // padma (1,000,000,000,000,000)\n 'ಶಂಖ' // shankh (100,000,000,000,000,000)\n ]\n}\n","import { GreedyScaleLanguage } from '../classes/greedy-scale-language.js'\n\n/**\n * Korean language converter.\n *\n * Supports:\n * - Hangul numerals (일, 이, 삼, etc.)\n * - Grouping by 만 (10,000) system\n * - Implicit '일' (one) omission before multipliers\n */\nexport class Korean extends GreedyScaleLanguage {\n negativeWord = '마이너스'\n decimalSeparatorWord = '점'\n zeroWord = '영'\n\n scaleWords = [\n [10_000_000_000_000_000_000_000_000_000n, '양'],\n [1_000_000_000_000_000_000_000_000n, '자'],\n [100_000_000_000_000_000_000n, '해'],\n [10_000_000_000_000_000n, '경'],\n [1_000_000_000_000n, '조'],\n [100_000_000n, '억'],\n [10_000n, '만'],\n [1000n, '천'],\n [100n, '백'],\n [10n, '십'],\n [9n, '구'],\n [8n, '팔'],\n [7n, '칠'],\n [6n, '육'],\n [5n, '오'],\n [4n, '사'],\n [3n, '삼'],\n [2n, '이'],\n [1n, '일'],\n [0n, '영']\n ]\n\n /** Combines two word-sets according to Korean grammar rules. */\n combineWordSets (preceding, following) {\n const precedingWord = Object.keys(preceding)[0]\n const followingWord = Object.keys(following)[0]\n const precedingValue = Object.values(preceding)[0] // BigInt\n const followingValue = Object.values(following)[0] // BigInt\n\n // Implicit \"일\": omit 1 before multipliers up to 만 (10,000)\n if (precedingValue === 1n && followingValue <= 10_000n) return following\n // Concatenate (no space) for small numbers less than 만\n if (precedingValue < 10_000n && precedingValue > followingValue) return { [`${precedingWord}${followingWord}`]: precedingValue + followingValue }\n // Space-separate for large numbers (>= 만) when adding\n if (precedingValue >= 10_000n && precedingValue > followingValue) return { [`${precedingWord} ${followingWord}`]: precedingValue + followingValue }\n // Multiply for all scale combinations\n return { [`${precedingWord}${followingWord}`]: precedingValue * followingValue }\n }\n}\n","import { SlavicLanguage } from '../classes/slavic-language.js'\n\n/**\n * Latvian language converter.\n *\n * Supports:\n * - Three-form pluralization (one/few/many)\n * - Latvian diacritical marks (ī, ā, ē, ū)\n * - Compound number formation (divdesmit, trīsdesmit)\n */\nexport class Latvian extends SlavicLanguage {\n negativeWord = 'mīnus'\n decimalSeparatorWord = 'komats'\n zeroWord = 'nulle'\n\n onesWords = {\n 1: 'viens',\n 2: 'divi',\n 3: 'trīs',\n 4: 'četri',\n 5: 'pieci',\n 6: 'seši',\n 7: 'septiņi',\n 8: 'astoņi',\n 9: 'deviņi'\n }\n\n onesFeminineWords = {\n 1: 'viena',\n 2: 'divas',\n 3: 'trīs',\n 4: 'četras',\n 5: 'piecas',\n 6: 'sešas',\n 7: 'septiņas',\n 8: 'astoņas',\n 9: 'deviņas'\n }\n\n teensWords = {\n 0: 'desmit',\n 1: 'vienpadsmit',\n 2: 'divpadsmit',\n 3: 'trīspadsmit',\n 4: 'četrpadsmit',\n 5: 'piecpadsmit',\n 6: 'sešpadsmit',\n 7: 'septiņpadsmit',\n 8: 'astoņpadsmit',\n 9: 'deviņpadsmit'\n }\n\n twentiesWords = {\n 2: 'divdesmit',\n 3: 'trīsdesmit',\n 4: 'četrdesmit',\n 5: 'piecdesmit',\n 6: 'sešdesmit',\n 7: 'septiņdesmit',\n 8: 'astoņdesmit',\n 9: 'deviņdesmit'\n }\n\n hundredsWords = ['simts', 'simti', 'simtu']\n\n pluralForms = {\n 1: ['tūkstotis', 'tūkstoši', 'tūkstošu'],\n 2: ['miljons', 'miljoni', 'miljonu'],\n 3: ['miljards', 'miljardi', 'miljardu'],\n 4: ['triljons', 'triljoni', 'triljonu'],\n 5: ['kvadriljons', 'kvadriljoni', 'kvadriljonu'],\n 6: ['kvintiljons', 'kvintiljoni', 'kvintiljonu'],\n 7: ['sikstiljons', 'sikstiljoni', 'sikstiljonu'],\n 8: ['septiljons', 'septiljoni', 'septiljonu'],\n 9: ['oktiljons', 'oktiljoni', 'oktiljonu'],\n 10: ['nontiljons', 'nontiljoni', 'nontiljonu']\n }\n\n pluralize (n, forms) {\n if (n === 0n) {\n return forms[2]\n }\n\n const lastDigit = n % 10n\n const lastTwoDigits = n % 100n\n\n if (lastDigit === 1n && lastTwoDigits !== 11n) {\n return forms[0]\n }\n\n return forms[1]\n }\n\n integerToWords (integerPart) {\n if (integerPart === 0n) {\n return this.zeroWord\n }\n const words = []\n const segments = this.splitToSegments(integerPart.toString(), 3)\n let index = segments.length\n for (const x of segments) {\n index = index - 1\n if (x === 0n) {\n continue\n }\n const [n1, n2, n3] = this.extractDigits(x)\n if (n3 > 0n) {\n if (n3 === 1n && n2 === 0n && n1 > 0n) {\n words.push(this.hundredsWords[2])\n } else if (n3 > 1n) {\n words.push(this.onesWords[n3], this.hundredsWords[1])\n } else {\n words.push(this.hundredsWords[0])\n }\n }\n if (n2 > 1n) {\n words.push(this.twentiesWords[n2])\n }\n if (n2 === 1n) {\n words.push(this.teensWords[n1])\n } else if (n1 > 0n && !(index > 0 && x === 1n)) {\n words.push(this.onesWords[n1])\n }\n if (index > 0) {\n words.push(this.pluralize(x, this.pluralForms[index]))\n }\n }\n return words.join(' ')\n }\n}\n","import { SlavicLanguage } from '../classes/slavic-language.js'\n\n/**\n * Lithuanian language converter.\n *\n * Supports:\n * - Three-form pluralization (one/few/many)\n * - Gender agreement (vienas/viena, du/dvi)\n * - Baltic declension patterns\n */\nexport class Lithuanian extends SlavicLanguage {\n negativeWord = 'minus'\n decimalSeparatorWord = 'kablelis'\n zeroWord = 'nulis'\n\n onesWords = {\n 1: 'vienas',\n 2: 'du',\n 3: 'trys',\n 4: 'keturi',\n 5: 'penki',\n 6: 'šeši',\n 7: 'septyni',\n 8: 'aštuoni',\n 9: 'devyni'\n }\n\n onesFeminineWords = {\n 1: 'viena',\n 2: 'dvi',\n 3: 'trys',\n 4: 'keturios',\n 5: 'penkios',\n 6: 'šešios',\n 7: 'septynios',\n 8: 'aštuonios',\n 9: 'devynios'\n }\n\n teensWords = {\n 0: 'dešimt',\n 1: 'vienuolika',\n 2: 'dvylika',\n 3: 'trylika',\n 4: 'keturiolika',\n 5: 'penkiolika',\n 6: 'šešiolika',\n 7: 'septyniolika',\n 8: 'aštuoniolika',\n 9: 'devyniolika'\n }\n\n twentiesWords = {\n 2: 'dvidešimt',\n 3: 'trisdešimt',\n 4: 'keturiasdešimt',\n 5: 'penkiasdešimt',\n 6: 'šešiasdešimt',\n 7: 'septyniasdešimt',\n 8: 'aštuoniasdešimt',\n 9: 'devyniasdešimt'\n }\n\n hundredsWords = ['šimtas', 'šimtai']\n\n pluralForms = {\n 1: ['tūkstantis', 'tūkstančiai', 'tūkstančių'],\n 2: ['milijonas', 'milijonai', 'milijonų'],\n 3: ['milijardas', 'milijardai', 'milijardų'],\n 4: ['trilijonas', 'trilijonai', 'trilijonų'],\n 5: ['kvadrilijonas', 'kvadrilijonai', 'kvadrilijonų'],\n 6: ['kvintilijonas', 'kvintilijonai', 'kvintilijonų'],\n 7: ['sikstilijonas', 'sikstilijonai', 'sikstilijonų'],\n 8: ['septilijonas', 'septilijonai', 'septilijonų'],\n 9: ['oktilijonas', 'oktilijonai', 'oktilijonų'],\n 10: ['naintilijonas', 'naintilijonai', 'naintilijonų']\n }\n\n pluralize (n, forms) {\n if (n === 0n) {\n return forms[2]\n }\n\n const [n1, n2] = this.extractDigits(n)\n\n if (n2 === 1n || n1 === 0n) {\n return forms[2]\n }\n\n if (n1 === 1n) {\n return forms[0]\n }\n\n return forms[1]\n }\n\n integerToWords (integerPart) {\n if (integerPart === 0n) {\n return this.zeroWord\n }\n const words = []\n const segments = this.splitToSegments(integerPart.toString(), 3)\n let index = segments.length\n for (const x of segments) {\n index = index - 1\n if (x === 0n) {\n continue\n }\n const [n1, n2, n3] = this.extractDigits(x)\n if (n3 > 0n) {\n words.push(this.onesWords[n3])\n if (n3 > 1n) {\n words.push(this.hundredsWords[1])\n } else {\n words.push(this.hundredsWords[0])\n }\n }\n if (n2 > 1n) {\n words.push(this.twentiesWords[n2])\n }\n if (n2 === 1n) {\n words.push(this.teensWords[n1])\n } else if (n1 > 0n) {\n if ((index === 1 || (this.options.gender === 'feminine' && index === 0)) && integerPart < 1000n) {\n words.push(this.onesFeminineWords[n1])\n } else {\n words.push(this.onesWords[n1])\n }\n }\n if (index > 0) {\n words.push(this.pluralize(x, this.pluralForms[index]))\n }\n }\n return words.join(' ')\n }\n}\n","import { AbstractLanguage } from '../classes/abstract-language.js'\n\n/**\n * Malay (Bahasa Melayu) language converter.\n *\n * Supports:\n * - \"Se-\" prefix for singular units (seratus, seribu, sejuta)\n * - Regular patterns (puluh for tens, ratus for hundreds)\n * - Space-separated number components\n */\nexport class Malay extends AbstractLanguage {\n negativeWord = 'minus'\n decimalSeparatorWord = 'perpuluhan'\n zeroWord = 'sifar'\n\n /**\n * Word forms for digits 0-9.\n * @type {Object.<number, string[]>}\n */\n digitWords = {\n 0: [],\n 1: ['satu'],\n 2: ['dua'],\n 3: ['tiga'],\n 4: ['empat'],\n 5: ['lima'],\n 6: ['enam'],\n 7: ['tujuh'],\n 8: ['lapan'],\n 9: ['sembilan']\n }\n\n /**\n * Scale magnitude words keyed by exponent (10^n).\n * @type {Object.<number, string>}\n */\n scaleWords = {\n 3: 'ribu',\n 6: 'juta',\n 9: 'bilion',\n 12: 'trilion'\n }\n\n splitBy3 (number) {\n const blocks = []\n const stringNumber = number.toString()\n const length = stringNumber.length\n let firstBlock\n\n if (length < 3) {\n blocks.push([stringNumber])\n } else {\n const firstBlockLength = length % 3\n\n if (firstBlockLength > 0) {\n firstBlock = [stringNumber.slice(0, firstBlockLength)]\n blocks.push(firstBlock)\n }\n\n for (let index = firstBlockLength; index < length; index += 3) {\n const nextBlock = [stringNumber.slice(index, index + 3)]\n blocks.push(nextBlock)\n }\n }\n return blocks\n }\n\n spell (blocks) {\n let wordBlocks = []\n let spelling\n const firstBlock = blocks[0]\n if (firstBlock[0].length === 1) {\n spelling = firstBlock[0] === '0' ? ['sifar'] : this.digitWords[Math.trunc(firstBlock[0])]\n } else if (firstBlock[0].length === 2) {\n spelling = this.getTens(firstBlock[0])\n } else {\n spelling = [...this.getHundreds(firstBlock[0][0]), ...this.getTens(firstBlock[0].slice(1, 3))]\n }\n wordBlocks = [...wordBlocks, [firstBlock[0], spelling]]\n for (let index = 1; index < blocks.length; index++) {\n let block = blocks[index]\n spelling = [...this.getHundreds(block[0][0]), ...this.getTens(block[0].slice(1, 3))]\n block = [...block, spelling]\n wordBlocks = [...wordBlocks, block]\n }\n return wordBlocks\n }\n\n getHundreds (number) { // 'ratus'\n if (number === '1') {\n return ['seratus']\n } else if (number === '0') {\n return []\n } else {\n return [...this.digitWords[Math.trunc(number)], 'ratus']\n }\n }\n\n getTens (number) { // 'puluh' and 'belas'\n if (number[0] === '1') {\n if (number[1] === '0') {\n return ['sepuluh']\n } else if (number[1] === '1') {\n return ['sebelas']\n }\n return [...this.digitWords[Math.trunc(number[1])], 'belas']\n }\n\n if (number[0] === '0') {\n return this.digitWords[Math.trunc(number[1])]\n }\n\n return [...this.digitWords[Math.trunc(number[0])], 'puluh', ...this.digitWords[Math.trunc(number[1])]]\n }\n\n join (wordBlocks) {\n const wordList = []\n const length = wordBlocks.length - 1\n\n for (let index = 0; index <= length; index++) {\n const words = wordBlocks[index][1]\n const isLast = index === length\n const scaleWord = isLast ? null : this.scaleWords[(length - index) * 3]\n\n if (!isLast && words.length === 1 && words[0] === 'satu') {\n // Use se- prefix for singular scale units: seribu, sejuta, sebilion, setrilion\n wordList.push('se' + scaleWord)\n continue\n }\n\n // Add current block words\n for (const w of words) wordList.push(w)\n\n // Append scale word if applicable and current block contributed words\n if (!isLast && words.length > 0) {\n wordList.push(scaleWord)\n }\n }\n\n return wordList.join(' ')\n }\n\n integerToWords (integerPart) {\n return this.join(\n this.spell(\n this.splitBy3(integerPart)\n )\n ).trim()\n }\n}\n","import { SouthAsianLanguage } from '../classes/south-asian-language.js'\n\n/**\n * Marathi language converter.\n *\n * Supports:\n * - Indian numbering system (हजार, लाख, कोटी)\n * - Devanagari script\n * - Complete word forms for 0-99\n */\nexport class Marathi extends SouthAsianLanguage {\n negativeWord = 'उणे'\n decimalSeparatorWord = 'दशांश'\n zeroWord = 'शून्य'\n hundredWord = 'शंभर'\n usePerDigitDecimals = true\n\n belowHundredWords = [\n 'शून्य',\n 'एक',\n 'दोन',\n 'तीन',\n 'चार',\n 'पाच',\n 'सहा',\n 'सात',\n 'आठ',\n 'नऊ',\n 'दहा',\n 'अकरा',\n 'बारा',\n 'तेरा',\n 'चौदा',\n 'पंधरा',\n 'सोळा',\n 'सतरा',\n 'अठरा',\n 'एकोणीस',\n 'वीस',\n 'एकवीस',\n 'बावीस',\n 'तेवीस',\n 'चोवीस',\n 'पंचवीस',\n 'सव्वीस',\n 'सत्तावीस',\n 'अठ्ठावीस',\n 'एकोणतीस',\n 'तीस',\n 'एकतीस',\n 'बत्तीस',\n 'तेहेतीस',\n 'चौतीस',\n 'पस्तीस',\n 'छत्तीस',\n 'सदतीस',\n 'अडतीस',\n 'एकोणचाळीस',\n 'चाळीस',\n 'एकेचाळीस',\n 'बेचाळीस',\n 'त्रेचाळीस',\n 'चव्वेचाळीस',\n 'पंचेचाळीस',\n 'सेहेचाळीस',\n 'सत्तेचाळीस',\n 'अठ्ठेचाळीस',\n 'एकोणपन्नास',\n 'पन्नास',\n 'एक्काव्वन',\n 'बावन्न',\n 'त्रेपन्न',\n 'चोपन्न',\n 'पंचाव्वन',\n 'छप्पन्न',\n 'सत्तावन्न',\n 'अठ्ठावन्न',\n 'एकोणसाठ',\n 'साठ',\n 'एकसष्ठ',\n 'बासष्ठ',\n 'त्रेसष्ठ',\n 'चौसष्ठ',\n 'पासष्ठ',\n 'सहासष्ठ',\n 'सदुसष्ठ',\n 'अडुसष्ठ',\n 'एकोणसत्तर',\n 'सत्तर',\n 'एकाहत्तर',\n 'बाहत्तर',\n 'त्र्याहत्तर',\n 'चौऱ्याहत्तर',\n 'पंच्याहत्तर',\n 'शहात्तर',\n 'सत्याहत्तर',\n 'अठ्ठ्याहत्तर',\n 'एकोणऐंशी',\n 'ऐंशी',\n 'एक्याऐंशी',\n 'ब्याऐंशी',\n 'त्र्याऐंशी',\n 'चौऱ्याऐंशी',\n 'पंच्याऐंशी',\n 'शहाऐंशी',\n 'सत्याऐंशी',\n 'अठ्ठ्याऐंशी',\n 'एकोणनव्वद',\n 'नव्वद',\n 'एक्याण्णव',\n 'ब्याण्णव',\n 'त्र्याण्णव',\n 'चौऱ्याण्णव',\n 'पंच्याण्णव',\n 'शहाण्णव',\n 'सत्याण्णव',\n 'अठ्ठ्याण्णव',\n 'नव्याण्णव'\n ]\n\n scaleWords = [\n '',\n 'हजार',\n 'लाख',\n 'कोटी',\n 'अब्ज',\n 'खर्व',\n 'निखर्व',\n 'महापद्म',\n 'शंकू'\n ]\n}\n","import { GreedyScaleLanguage } from '../classes/greedy-scale-language.js'\n\n/**\n * Norwegian Bokmål language converter.\n *\n * Supports:\n * - Hyphenation for compound numbers (tjue-en)\n * - \"og\" (and) for hundreds combinations\n * - Implicit '1' omission before tens and magnitudes\n */\nexport class NorwegianBokmal extends GreedyScaleLanguage {\n negativeWord = 'minus'\n decimalSeparatorWord = 'komma'\n zeroWord = 'null'\n\n scaleWords = [\n [1_000_000_000_000_000_000_000_000_000n, 'oktillion'],\n [1_000_000_000_000_000_000_000_000n, 'septillion'],\n [1_000_000_000_000_000_000_000n, 'sekstillion'],\n [1_000_000_000_000_000_000n, 'kvintillion'],\n [1_000_000_000_000_000n, 'kvadrillion'],\n [1_000_000_000_000n, 'billion'],\n [1_000_000_000n, 'milliard'],\n [1_000_000n, 'million'],\n [1000n, 'tusen'],\n [100n, 'hundre'],\n [90n, 'nitti'],\n [80n, 'åtti'],\n [70n, 'sytti'],\n [60n, 'seksti'],\n [50n, 'femti'],\n [40n, 'førti'],\n [30n, 'tretti'],\n [20n, 'tjue'],\n [19n, 'nitten'],\n [18n, 'atten'],\n [17n, 'sytten'],\n [16n, 'seksten'],\n [15n, 'femten'],\n [14n, 'fjorten'],\n [13n, 'tretten'],\n [12n, 'tolv'],\n [11n, 'elleve'],\n [10n, 'ti'],\n [9n, 'ni'],\n [8n, 'åtte'],\n [7n, 'syv'],\n [6n, 'seks'],\n [5n, 'fem'],\n [4n, 'fire'],\n [3n, 'tre'],\n [2n, 'to'],\n [1n, 'en'],\n [0n, 'null']\n ]\n\n /**\n * Merges two adjacent word-sets according to Norwegian grammar rules.\n *\n * Norwegian-specific rules:\n * - Implicit \"en\": `combineWordSets({ 'en': 1n }, { 'hundre': 100n })` → `{ 'hundre': 100n }`\n * - Hyphenation for compound tens: `combineWordSets({ 'tjue': 20n }, { 'en': 1n })` → `{ 'tjue-en': 21n }`\n * - \"og\" (and) after hundreds: `combineWordSets({ 'hundre': 100n }, { 'en': 1n })` → `{ 'hundre og en': 101n }`\n * - Space-separated for large numbers (thousands+)\n * - Comma separator for non-magnitude additions (e.g., \\\"tusen, en\\\")\n *\n * @param {Object} preceding The preceding word-set as `{ word: BigInt }`.\n * @param {Object} following The following word-set as `{ word: BigInt }`.\n * @returns {Object} Merged pair with combined word and resulting numeric value.\n *\n * @example\n * combineWordSets({ 'en': 1n }, { 'hundre': 100n }); // { 'hundre': 100n }\n * combineWordSets({ 'tjue': 20n }, { 'tre': 3n }); // { 'tjue-tre': 23n }\n */\n // Norwegian merge rules mirror the former Scandinavian base logic\n combineWordSets (preceding, following) {\n const precedingWord = Object.keys(preceding)[0]\n const followingWord = Object.keys(following)[0]\n const precedingValue = Object.values(preceding)[0]\n const followingValue = Object.values(following)[0]\n\n if (precedingValue === 1n && followingValue < 100n) {\n return following\n }\n\n if (precedingValue < 100n && precedingValue > followingValue) {\n return { [`${precedingWord}-${followingWord}`]: precedingValue + followingValue }\n }\n\n if (precedingValue >= 100n && followingValue < 100n) {\n return { [`${precedingWord} og ${followingWord}`]: precedingValue + followingValue }\n }\n\n if (followingValue > precedingValue) {\n return { [`${precedingWord} ${followingWord}`]: precedingValue * followingValue }\n }\n\n return { [`${precedingWord}, ${followingWord}`]: precedingValue + followingValue }\n }\n}\n","import { AbstractLanguage } from '../classes/abstract-language.js'\n\n/**\n * Persian language converter.\n *\n * Supports:\n * - \"و\" (and) conjunction for compound numbers\n * - Recursive conversion for larger numbers\n */\nexport class Persian extends AbstractLanguage {\n negativeWord = 'منفى'\n decimalSeparatorWord = 'ممیّز'\n zeroWord = 'صفر'\n\n /**\n * Words for digits 1-9.\n * @type {Object.<number, string>}\n */\n onesWords = {\n 1: 'یک',\n 2: 'دو',\n 3: 'سه',\n 4: 'چهار',\n 5: 'پنج',\n 6: 'شش',\n 7: 'هفت',\n 8: 'هشت',\n 9: 'نه'\n }\n\n /**\n * Words for teen numbers (10-19).\n * @type {Object.<number, string>}\n */\n teensWords = {\n 10: 'ده',\n 11: 'یازده',\n 12: 'دوازده',\n 13: 'سیزده',\n 14: 'چهارده',\n 15: 'پانزده',\n 16: 'شانزده',\n 17: 'هفده',\n 18: 'هجده',\n 19: 'نوزده'\n }\n\n /**\n * Words for multiples of ten (20-90).\n * @type {Object.<number, string>}\n */\n tensWords = {\n 20: 'بیست',\n 30: 'سی',\n 40: 'چهل',\n 50: 'پنجاه',\n 60: 'شصت',\n 70: 'هفتاد',\n 80: 'هشتاد',\n 90: 'نود'\n }\n\n /**\n * Words for hundreds (100-900).\n * @type {Object.<number, string>}\n */\n hundredsWords = {\n 100: 'صد',\n 200: 'دویست',\n 300: 'سيصد',\n 400: 'چهار صد',\n 500: 'پانصد',\n 600: 'ششصد',\n 700: 'هفتصد',\n 800: 'هشتصد',\n 900: 'نهصد'\n }\n\n /**\n * Scale magnitude words.\n * @type {Object.<number, string>}\n */\n scaleWords = {\n 1000: 'هزار',\n 1_000_000: 'میلیون'\n }\n\n /** Converts integer part using categorized word tables. */\n integerToWords (integerPart) {\n // Zero\n if (integerPart === 0n) {\n return this.zeroWord\n }\n\n // 1-9\n if (integerPart <= 9n) {\n return this.onesWords[integerPart]\n }\n\n // 10-19\n if (integerPart <= 19n) {\n return this.teensWords[integerPart]\n }\n\n // 20-99\n if (integerPart < 100n) {\n const ones = integerPart % 10n\n const tens = integerPart - ones\n if (ones === 0n) {\n return this.tensWords[tens]\n }\n return `${this.tensWords[tens]} و ${this.onesWords[ones]}`\n }\n\n // 100-999\n if (integerPart < 1000n) {\n const hundreds = 100n * (integerPart / 100n)\n const remainder = integerPart - hundreds\n if (remainder === 0n) {\n return this.hundredsWords[hundreds]\n }\n return `${this.hundredsWords[hundreds]} و ${this.integerToWords(remainder)}`\n }\n\n // 1000-999999\n if (integerPart < 1_000_000n) {\n const thousandMultiplier = integerPart / 1000n\n // Persian omits \"one\" before thousand: 1000 is just \"هزار\", not \"یک هزار\"\n const thousandPrefix = thousandMultiplier === 1n\n ? ''\n : this.integerToWords(thousandMultiplier) + ' '\n const remainder = integerPart % 1000n\n const suffix = remainder === 0n ? '' : ' ' + this.integerToWords(remainder)\n return `${thousandPrefix}${this.scaleWords[1000]}${suffix}`\n }\n\n // 1000000+\n const millionMultiplier = integerPart / 1_000_000n\n const millionPrefix = this.integerToWords(millionMultiplier) + ' ' + this.scaleWords[1_000_000]\n const remainder = integerPart % 1_000_000n\n const suffix = remainder === 0n ? '' : ' و ' + this.integerToWords(remainder)\n return `${millionPrefix}${suffix}`\n }\n}\n","import { SlavicLanguage } from '../classes/slavic-language.js'\n\n/**\n * Polish language converter.\n *\n * Supports:\n * - Three-form pluralization (one/few/many)\n * - Polish-specific declension patterns\n * - Distinctive Polish phonology and orthography\n */\nexport class Polish extends SlavicLanguage {\n negativeWord = 'minus'\n decimalSeparatorWord = 'przecinek'\n zeroWord = 'zero'\n\n onesWords = {\n 1: 'jeden',\n 2: 'dwa',\n 3: 'trzy',\n 4: 'cztery',\n 5: 'pięć',\n 6: 'sześć',\n 7: 'siedem',\n 8: 'osiem',\n 9: 'dziewięć'\n }\n\n onesFeminineWords = {\n 1: 'jedna',\n 2: 'dwie',\n 3: 'trzy',\n 4: 'cztery',\n 5: 'pięć',\n 6: 'sześć',\n 7: 'siedem',\n 8: 'osiem',\n 9: 'dziewięć'\n }\n\n teensWords = {\n 0: 'dziesięć',\n 1: 'jedenaście',\n 2: 'dwanaście',\n 3: 'trzynaście',\n 4: 'czternaście',\n 5: 'piętnaście',\n 6: 'szesnaście',\n 7: 'siedemnaście',\n 8: 'osiemnaście',\n 9: 'dziewiętnaście'\n }\n\n twentiesWords = {\n 2: 'dwadzieścia',\n 3: 'trzydzieści',\n 4: 'czterdzieści',\n 5: 'pięćdziesiąt',\n 6: 'sześćdziesiąt',\n 7: 'siedemdziesiąt',\n 8: 'osiemdziesiąt',\n 9: 'dziewięćdziesiąt'\n }\n\n hundredsWords = {\n 1: 'sto',\n 2: 'dwieście',\n 3: 'trzysta',\n 4: 'czterysta',\n 5: 'pięćset',\n 6: 'sześćset',\n 7: 'siedemset',\n 8: 'osiemset',\n 9: 'dziewięćset'\n }\n\n pluralForms = {\n 1: ['tysiąc', 'tysiące', 'tysięcy'], // 10^ 3\n 2: ['milion', 'miliony', 'milionów'], // 10^ 6\n 3: ['miliard', 'miliardy', 'miliardów'], // 10^ 9\n 4: ['bilion', 'biliony', 'bilionów'], // 10^ 12\n 5: ['biliard', 'biliardy', 'biliardów'], // 10^ 15\n 6: ['trylion', 'tryliony', 'trylionów'], // 10^ 18\n 7: ['tryliard', 'tryliardy', 'tryliardów'], // 10^ 21\n 8: ['kwadrylion', 'kwadryliony', 'kwadrylionów'], // 10^ 24\n 9: ['kwaryliard', 'kwadryliardy', 'kwadryliardów'], // 10^ 27\n 10: ['kwintylion', 'kwintyliony', 'kwintylionów'] // 10^ 30\n }\n\n /**\n * Polish omits \"one\" before scale words.\n * e.g., 1000 is \"tysiąc\" not \"jeden tysiąc\"\n */\n omitOneBeforeScale = true\n\n /** Implements Polish-specific three-form pluralization rules. */\n pluralize (n, forms) {\n if (n === 1n) {\n return forms[0]\n }\n\n const lastDigit = n % 10n\n const lastTwoDigits = n % 100n\n\n if (lastDigit < 5n && lastDigit > 1n && (lastTwoDigits < 10n || lastTwoDigits > 20n)) {\n return forms[1]\n }\n\n return forms[2]\n }\n}\n","import { SouthAsianLanguage } from '../classes/south-asian-language.js'\n\n/**\n * Punjabi language converter.\n *\n * Supports:\n * - Indian numbering system (ਹਜ਼ਾਰ, ਲੱਖ, ਕਰੋੜ)\n * - Gurmukhi script\n * - Complete word forms for 0-99\n */\nexport class Punjabi extends SouthAsianLanguage {\n negativeWord = 'ਮਾਇਨਸ'\n decimalSeparatorWord = 'ਦਸ਼ਮਲਵ'\n zeroWord = 'ਸਿਫ਼ਰ'\n hundredWord = 'ਸੌ'\n\n belowHundredWords = [\n 'ਸਿਫ਼ਰ',\n 'ਇੱਕ',\n 'ਦੋ',\n 'ਤਿੰਨ',\n 'ਚਾਰ',\n 'ਪੰਜ',\n 'ਛੇ',\n 'ਸੱਤ',\n 'ਅੱਠ',\n 'ਨੌਂ',\n 'ਦੱਸ',\n 'ਗਿਆਰਾਂ',\n 'ਬਾਰਾਂ',\n 'ਤੇਰਾਂ',\n 'ਚੌਦਾਂ',\n 'ਪੰਦਰਾਂ',\n 'ਸੋਲਾਂ',\n 'ਸਤਾਰਾਂ',\n 'ਅਠਾਰਾਂ',\n 'ਉੱਨੀ',\n 'ਵੀਹ',\n 'ਇੱਕੀ',\n 'ਬਾਈ',\n 'ਤੇਈ',\n 'ਚੌਬੀ',\n 'ਪੱਚੀ',\n 'ਛੱਬੀ',\n 'ਸਤਾਈ',\n 'ਅਠਾਈ',\n 'ਉਨੱਤੀ',\n 'ਤੀਹ',\n 'ਇਕੱਤੀ',\n 'ਬੱਤੀ',\n 'ਤੇਤੀ',\n 'ਚੌਂਤੀ',\n 'ਪੈਂਤੀ',\n 'ਛੱਤੀ',\n 'ਸੈਂਤੀ',\n 'ਅਠੱਤੀ',\n 'ਉਨਤਾਲੀ',\n 'ਚਾਲੀ',\n 'ਇਕਤਾਲੀ',\n 'ਬਿਆਲੀ',\n 'ਤਿਰਤਾਲੀ',\n 'ਚੁਵਾਲੀ',\n 'ਪੰਤਾਲੀ',\n 'ਛਿਆਲੀ',\n 'ਸੈਂਤਾਲੀ',\n 'ਅਠਤਾਲੀ',\n 'ਉਨੰਜਾ',\n 'ਪੰਜਾਹ',\n 'ਇਕਵੰਜਾ',\n 'ਬਵੰਜਾ',\n 'ਤਰਵੰਜਾ',\n 'ਚੁਰਵੰਜਾ',\n 'ਪੰਜਵੰਜਾ',\n 'ਛਪੰਜਾ',\n 'ਸੱਤਵੰਜਾ',\n 'ਅਠਵੰਜਾ',\n 'ਉਨਾਹਠ',\n 'ਸੱਠ',\n 'ਇਕਾਹਠ',\n 'ਬਾਹਠ',\n 'ਤਰਸਠ',\n 'ਚੌਂਸਠ',\n 'ਪੈਂਸਠ',\n 'ਛਿਆਸਠ',\n 'ਸੜਸਠ',\n 'ਅੜਸਠ',\n 'ਉਣਹੱਤਰ',\n 'ਸਤੱਰ',\n 'ਇਕਹੱਤਰ',\n 'ਬਹੱਤਰ',\n 'ਤਹੱਤਰ',\n 'ਚੌਹੱਤਰ',\n 'ਪੰਝਹੱਤਰ',\n 'ਛਿਹੱਤਰ',\n 'ਸਤੱਤਰ',\n 'ਅਠੱਤਰ',\n 'ਉਨਾਸੀ',\n 'ਅੱਸੀ',\n 'ਇਕਿਆਸੀ',\n 'ਬਿਆਸੀ',\n 'ਤਰਿਆਸੀ',\n 'ਚੌਰਿਆਸੀ',\n 'ਪਚਾਸੀ',\n 'ਛਿਆਸੀ',\n 'ਸੱਤਾਸੀ',\n 'ਅਠਾਸੀ',\n 'ਨਵਾਸੀ',\n 'ਨੱਬੇ',\n 'ਇਕਾਨਵੇਂ',\n 'ਬਾਨਵੇਂ',\n 'ਤਰਾਨਵੇਂ',\n 'ਚੁਰਾਨਵੇਂ',\n 'ਪੰਚਾਨਵੇਂ',\n 'ਛਿਆਨਵੇਂ',\n 'ਸਤਾਨਵੇਂ',\n 'ਅਠਾਨਵੇਂ',\n 'ਨਿਨਾਨਵੇਂ'\n ]\n\n scaleWords = [\n '',\n 'ਹਜ਼ਾਰ',\n 'ਲੱਖ',\n 'ਕਰੋੜ',\n 'ਅਰਬ',\n 'ਖਰਬ',\n 'ਨੀਲ',\n 'ਪਦਮ',\n 'ਸ਼ੰਖ'\n ]\n}\n","import { AbstractLanguage } from '../classes/abstract-language.js'\n\n/**\n * Romanian language converter.\n *\n * Supports:\n * - Gender agreement (unu/una, doi/două)\n * - Complex pluralization (singular/plural forms)\n * - \"De\" preposition insertion for groups >= 20\n */\nexport class Romanian extends AbstractLanguage {\n negativeWord = 'minus'\n decimalSeparatorWord = 'virgulă'\n zeroWord = 'zero'\n\n onesWords = {\n 1: 'unu',\n 2: 'doi',\n 3: 'trei',\n 4: 'patru',\n 5: 'cinci',\n 6: 'șase',\n 7: 'șapte',\n 8: 'opt',\n 9: 'nouă'\n }\n\n onesFeminineWords = {\n 1: 'una',\n 2: 'două',\n 3: 'trei',\n 4: 'patru',\n 5: 'cinci',\n 6: 'șase',\n 7: 'șapte',\n 8: 'opt',\n 9: 'nouă'\n }\n\n teensWords = {\n 0: 'zece',\n 1: 'unsprezece',\n 2: 'douăsprezece',\n 3: 'treisprezece',\n 4: 'paisprezece',\n 5: 'cincisprezece',\n 6: 'șaisprezece',\n 7: 'șaptesprezece',\n 8: 'optsprezece',\n 9: 'nouăsprezece'\n }\n\n teensMasculineWords = {\n 0: 'zece',\n 1: 'unsprezece',\n 2: 'doisprezece',\n 3: 'treisprezece',\n 4: 'paisprezece',\n 5: 'cincisprezece',\n 6: 'șaisprezece',\n 7: 'șaptesprezece',\n 8: 'optsprezece',\n 9: 'nouăsprezece'\n }\n\n twentiesWords = {\n 2: 'douăzeci',\n 3: 'treizeci',\n 4: 'patruzeci',\n 5: 'cincizeci',\n 6: 'șaizeci',\n 7: 'șaptezeci',\n 8: 'optzeci',\n 9: 'nouăzeci'\n }\n\n hundredsWords = {\n 1: 'o sută',\n 2: 'două sute',\n 3: 'trei sute',\n 4: 'patru sute',\n 5: 'cinci sute',\n 6: 'șase sute',\n 7: 'șapte sute',\n 8: 'opt sute',\n 9: 'nouă sute'\n }\n\n /**\n * Romanian big units.\n * For each power group we keep: singular, plural, feminineUnits?, needsDe?\n * - 10^3: mie/mii (feminine units in segment; \"de\" for segment >= 20)\n * - 10^6: milion/milioane (\"de\" for segment >= 20)\n * - 10^9: miliard/miliarde (\"de\" for segment >= 20)\n */\n scaleMetadata = {\n 1: { singular: 'mie', plural: 'mii', feminine: true, needsDe: true }, // 10^3\n 2: { singular: 'milion', plural: 'milioane', feminine: false, needsDe: true }, // 10^6\n 3: { singular: 'miliard', plural: 'miliarde', feminine: false, needsDe: true }, // 10^9\n 4: { singular: 'trilion', plural: 'trilioane', feminine: false, needsDe: true }, // 10^12\n 5: { singular: 'cvadrilion', plural: 'cvadrilioane', feminine: false, needsDe: true }, // 10^15\n 6: { singular: 'cvintilion', plural: 'cvintilioane', feminine: false, needsDe: true }, // 10^18\n 7: { singular: 'sextilion', plural: 'sextilioane', feminine: false, needsDe: true }, // 10^21\n 8: { singular: 'septilion', plural: 'septilioane', feminine: false, needsDe: true }, // 10^24\n 9: { singular: 'octilion', plural: 'octilioane', feminine: false, needsDe: true }, // 10^27\n 10: { singular: 'decilion', plural: 'decilioane', feminine: false, needsDe: true } // 10^33\n }\n\n constructor (options = {}) {\n super()\n\n this.setOptions({\n gender: 'masculine'\n }, options)\n }\n\n /** Split numeric string into BigInt segments of specified size from left to right. */\n splitToSegments (n, x) {\n const results = []\n const l = n.length\n let result\n\n if (l > x) {\n const start = l % x\n if (start > 0) {\n result = n.slice(0, start)\n results.push(BigInt(result))\n }\n for (let index = start; index < l; index += x) {\n result = n.slice(index, index + x)\n results.push(BigInt(result))\n }\n } else {\n results.push(BigInt(n))\n }\n return results\n }\n\n extractDigits (value) {\n const stringValue = value.toString().padStart(3, '0').slice(-3)\n const a = [...stringValue].toReversed()\n return a.map(BigInt)\n }\n\n /** Romanian pluralization & \"de\" rule for big units. */\n romanianPluralize (segment, form) {\n const n = Number(segment)\n\n if (n === 1) {\n // article differs for feminine \"mie\" (o mie) vs the rest (un milion/miliard…)\n const article = form.feminine ? 'o' : 'un'\n return `${article} ${form.singular}`\n }\n\n // For 21 with big units, use feminine \"una\" with plural nouns\n if (n === 21 && form.needsDe) {\n return `douăzeci și una de ${form.plural}`\n }\n\n // spell the segment itself (use feminine units for big numbers)\n const words = this.spellUnder1000(n, true)\n\n // \"de\" after >= 20 (covers 20, 21, 100, 101, 999, etc.)\n const needsDe = form.needsDe && n >= 20\n const de = needsDe ? ' de ' : ' '\n\n return `${words}${de}${form.plural}`\n }\n\n spellUnder100 (n, feminineUnits = false, masculineTeens = false) {\n if (n < 10) {\n return (feminineUnits ? this.onesFeminineWords : this.onesWords)[n]\n }\n if (n < 20) {\n return (masculineTeens ? this.teensMasculineWords : this.teensWords)[n - 10]\n }\n const t = Math.floor(n / 10)\n const u = n % 10\n return u\n ? `${this.twentiesWords[t]} și ${(feminineUnits ? this.onesFeminineWords : this.onesWords)[u]}`\n : this.twentiesWords[t]\n }\n\n spellUnder1000 (n, feminineUnits = false, masculineTeens = false) {\n if (n < 100) return this.spellUnder100(n, feminineUnits, masculineTeens)\n const h = Math.floor(n / 100)\n const r = n % 100\n const hundredWords = this.hundredsWords[h]\n if (!r) return hundredWords\n // Standard readable form: \"o sută unu\" (for units) or \"o sută cincizeci\" (for tens)\n const separator = ' '\n return `${hundredWords}${separator}${this.spellUnder100(r, feminineUnits, masculineTeens)}`\n }\n\n /** Decimals always use masculine forms regardless of gender option. */\n decimalIntegerToWords (integerPart) {\n if (integerPart === 0n) return this.zeroWord\n // Use spellUnder1000 with masculine forms (feminineUnits=false, masculineTeens=true)\n if (integerPart < 1000n) return this.spellUnder1000(Number(integerPart), false, true)\n // For larger decimals, process segments with masculine forms\n const words = []\n const segments = this.splitToSegments(integerPart.toString(), 3)\n let index = segments.length\n for (const x of segments) {\n index = index - 1\n if (x === 0n) continue\n const [n1, n2, n3] = this.extractDigits(x)\n if (n3 > 0n) words.push(this.hundredsWords[Number(n3)])\n if (n2 > 1n) words.push(this.twentiesWords[Number(n2)])\n if (n2 === 1n) {\n words.push(this.teensMasculineWords[Number(n1)])\n } else if (n1 > 0n) {\n if (n2 > 1n) words.push('și')\n words.push(this.onesWords[Number(n1)])\n }\n if (index > 0) {\n const form = this.scaleMetadata[index]\n if (form) {\n words.push(this.romanianPluralize(x, form))\n } else {\n words.push(this.spellUnder1000(Number(x), false))\n }\n }\n }\n return words.join(' ').replaceAll(/\\s+/g, ' ').trim()\n }\n\n integerToWords (integerPart) {\n if (integerPart === 0n) {\n return this.zeroWord\n }\n const words = []\n const segments = this.splitToSegments(integerPart.toString(), 3)\n let index = segments.length\n for (const x of segments) {\n let onesMap = []\n index = index - 1\n if (x === 0n) continue\n const [n1, n2, n3] = this.extractDigits(x) // units, tens, hundreds (as BigInt)\n // hundreds (only for the last group, not for thousands)\n if (n3 > 0n && index === 0) {\n words.push(this.hundredsWords[Number(n3)])\n }\n // tens & teens (only for the last group, not for thousands)\n if (index === 0) {\n if (n2 > 1n) {\n words.push(this.twentiesWords[Number(n2)])\n }\n if (n2 === 1n) {\n words.push(this.teensWords[Number(n1)])\n } else if (n1 > 0n) {\n // pick masculine/feminine units (only for the last group, not for thousands)\n const feminineUnits = this.options.gender === 'feminine' && index === 0\n onesMap = feminineUnits ? this.onesFeminineWords : this.onesWords\n // if there is a twenty/treizeci/etc AND ones > 0 → add \"și\"\n if (n2 > 1n) words.push('și')\n words.push(onesMap[Number(n1)])\n }\n }\n // big unit name (mie/mii, milion/milioane, …)\n if (index > 0) {\n const form = this.scaleMetadata[index]\n if (form) {\n words.push(this.romanianPluralize(x, form))\n } else {\n // For very large numbers beyond our defined units, just spell out the number\n words.push(this.spellUnder1000(Number(x), true))\n }\n }\n }\n return words.join(' ').replaceAll(/\\s+/g, ' ').trim()\n }\n}\n","import { SlavicLanguage } from '../classes/slavic-language.js'\n\n/**\n * Russian language converter.\n *\n * Supports:\n * - Gender agreement (masculine/feminine forms)\n * - Three-form pluralization (one/few/many)\n * - Large numbers up to nonillions\n */\nexport class Russian extends SlavicLanguage {\n negativeWord = 'минус'\n decimalSeparatorWord = 'запятая'\n zeroWord = 'ноль'\n\n onesWords = {\n 1: 'один',\n 2: 'два',\n 3: 'три',\n 4: 'четыре',\n 5: 'пять',\n 6: 'шесть',\n 7: 'семь',\n 8: 'восемь',\n 9: 'девять'\n }\n\n onesFeminineWords = {\n 1: 'одна',\n 2: 'две',\n 3: 'три',\n 4: 'четыре',\n 5: 'пять',\n 6: 'шесть',\n 7: 'семь',\n 8: 'восемь',\n 9: 'девять'\n }\n\n teensWords = {\n 0: 'десять',\n 1: 'одиннадцать',\n 2: 'двенадцать',\n 3: 'тринадцать',\n 4: 'четырнадцать',\n 5: 'пятнадцать',\n 6: 'шестнадцать',\n 7: 'семнадцать',\n 8: 'восемнадцать',\n 9: 'девятнадцать'\n }\n\n twentiesWords = {\n 2: 'двадцать',\n 3: 'тридцать',\n 4: 'сорок',\n 5: 'пятьдесят',\n 6: 'шестьдесят',\n 7: 'семьдесят',\n 8: 'восемьдесят',\n 9: 'девяносто'\n }\n\n hundredsWords = {\n 1: 'сто',\n 2: 'двести',\n 3: 'триста',\n 4: 'четыреста',\n 5: 'пятьсот',\n 6: 'шестьсот',\n 7: 'семьсот',\n 8: 'восемьсот',\n 9: 'девятьсот'\n }\n\n pluralForms = {\n 1: ['тысяча', 'тысячи', 'тысяч'], // 10^ 3\n 2: ['миллион', 'миллиона', 'миллионов'], // 10^ 6\n 3: ['миллиард', 'миллиарда', 'миллиардов'], // 10^ 9\n 4: ['триллион', 'триллиона', 'триллионов'], // 10^ 12\n 5: ['квадриллион', 'квадриллиона', 'квадриллионов'], // 10^ 15\n 6: ['квинтиллион', 'квинтиллиона', 'квинтиллионов'], // 10^ 18\n 7: ['секстиллион', 'секстиллиона', 'секстиллионов'], // 10^ 21\n 8: ['септиллион', 'септиллиона', 'септиллионов'], // 10^ 24\n 9: ['октиллион', 'октиллиона', 'октиллионов'], // 10^ 27\n 10: ['нониллион', 'нониллиона', 'нониллионов'] // 10^ 30\n }\n\n /**\n * Russian thousands (тысяча) are feminine, requiring одна/две forms.\n * Other scales (million, billion, etc.) are masculine.\n */\n scaleGenders = {\n 1: true // thousands are feminine\n }\n}\n","import { SlavicLanguage } from '../classes/slavic-language.js'\n\n/**\n * Serbian language converter (Cyrillic script).\n *\n * Supports:\n * - Three-form pluralization (one/few/many)\n * - Gender agreement (један/једна, два/две)\n * - Cyrillic script representation\n */\nexport class SerbianCyrillic extends SlavicLanguage {\n negativeWord = 'минус'\n decimalSeparatorWord = 'запета'\n zeroWord = 'нула'\n\n onesWords = {\n 1: 'један',\n 2: 'два',\n 3: 'три',\n 4: 'четири',\n 5: 'пет',\n 6: 'шест',\n 7: 'седам',\n 8: 'осам',\n 9: 'девет'\n }\n\n onesFeminineWords = {\n 1: 'једна',\n 2: 'две',\n 3: 'три',\n 4: 'четири',\n 5: 'пет',\n 6: 'шест',\n 7: 'седам',\n 8: 'осам',\n 9: 'девет'\n }\n\n teensWords = {\n 0: 'десет',\n 1: 'једанаест',\n 2: 'дванаест',\n 3: 'тринаест',\n 4: 'четрнаест',\n 5: 'петнаест',\n 6: 'шеснаест',\n 7: 'седамнаест',\n 8: 'осамнаест',\n 9: 'деветнаест'\n }\n\n twentiesWords = {\n 2: 'двадесет',\n 3: 'тридесет',\n 4: 'четрдесет',\n 5: 'педесет',\n 6: 'шездесет',\n 7: 'седамдесет',\n 8: 'осамдесет',\n 9: 'деведесет'\n }\n\n hundredsWords = {\n 1: 'сто',\n 2: 'двеста',\n 3: 'триста',\n 4: 'четиристо',\n 5: 'петсто',\n 6: 'шесто',\n 7: 'седамсто',\n 8: 'осамсто',\n 9: 'девестo'\n }\n\n pluralForms = {\n 1: ['хиљада', 'хиљаде', 'хиљада'], // 10 ^ 3\n 2: ['милион', 'милиона', 'милиона'], // 10 ^ 6\n 3: ['милијарда', 'милијарде', 'милијарда'], // 10 ^ 9\n 4: ['билион', 'билиона', 'билиона'], // 10 ^ 12\n 5: ['билијарда', 'билијарде', 'билијарда'], // 10 ^ 15\n 6: ['трилион', 'трилиона', 'трилиона'], // 10 ^ 18\n 7: ['трилијарда', 'трилијарде', 'трилијарда'], // 10 ^ 21\n 8: ['квадрилион', 'квадрилиона', 'квадрилиона'], // 10 ^ 24\n 9: ['квадрилијарда', 'квадрилијарде', 'квадрилијарда'], // 10 ^ 27\n 10: ['квинтилион', 'квинтилиона', 'квинтилиона'] // 10 ^ 30\n }\n\n /**\n * Maps segment indices to whether they are grammatically feminine.\n * In Serbian, thousands (index 1) are feminine, others are masculine.\n * @type {Object.<number, boolean>}\n */\n scaleGenders = {\n 1: true // thousands are feminine (others default to false)\n }\n\n /** Selects Serbian plural form: 1 = singular, 2-4 = few, else = many. */\n pluralize (n, forms) {\n const lastDigit = n % 10n\n const lastTwoDigits = n % 100n\n\n if ((lastTwoDigits < 10n || lastTwoDigits > 20n) && lastDigit === 1n) {\n return forms[0]\n }\n\n if ((lastTwoDigits < 10n || lastTwoDigits > 20n) && lastDigit > 1n && lastDigit < 5n) {\n return forms[1]\n }\n\n return forms[2]\n }\n}\n","import { SlavicLanguage } from '../classes/slavic-language.js'\n\n/**\n * Serbian Latin language converter.\n *\n * Supports:\n * - Three-form pluralization (one/few/many)\n * - Gender agreement (jedan/jedna, dva/dve)\n * - Latin script representation\n */\nexport class SerbianLatin extends SlavicLanguage {\n negativeWord = 'minus'\n decimalSeparatorWord = 'zapeta'\n zeroWord = 'nula'\n\n onesWords = {\n 1: 'jedan',\n 2: 'dva',\n 3: 'tri',\n 4: 'četiri',\n 5: 'pet',\n 6: 'šest',\n 7: 'sedam',\n 8: 'osam',\n 9: 'devet'\n }\n\n onesFeminineWords = {\n 1: 'jedna',\n 2: 'dve',\n 3: 'tri',\n 4: 'četiri',\n 5: 'pet',\n 6: 'šest',\n 7: 'sedam',\n 8: 'osam',\n 9: 'devet'\n }\n\n teensWords = {\n 0: 'deset',\n 1: 'jedanaest',\n 2: 'dvanaest',\n 3: 'trinaest',\n 4: 'četrnaest',\n 5: 'petnaest',\n 6: 'šesnaest',\n 7: 'sedamnaest',\n 8: 'osamnaest',\n 9: 'devetnaest'\n }\n\n twentiesWords = {\n 2: 'dvadeset',\n 3: 'trideset',\n 4: 'četrdeset',\n 5: 'pedeset',\n 6: 'šezdeset',\n 7: 'sedamdeset',\n 8: 'osamdeset',\n 9: 'devedeset'\n }\n\n hundredsWords = {\n 1: 'sto',\n 2: 'dvesta',\n 3: 'trista',\n 4: 'četiristo',\n 5: 'petsto',\n 6: 'šesto',\n 7: 'sedamsto',\n 8: 'osamsto',\n 9: 'devetsto'\n }\n\n pluralForms = {\n 1: ['hiljada', 'hiljade', 'hiljada'], // 10 ^ 3\n 2: ['milion', 'miliona', 'miliona'], // 10 ^ 6\n 3: ['milijarda', 'milijarde', 'milijarda'], // 10 ^ 9\n 4: ['bilion', 'biliona', 'biliona'], // 10 ^ 12\n 5: ['bilijarda', 'bilijarde', 'bilijarda'], // 10 ^ 15\n 6: ['trilion', 'triliona', 'triliona'], // 10 ^ 18\n 7: ['trilijarda', 'trilijarde', 'trilijarda'], // 10 ^ 21\n 8: ['kvadrilion', 'kvadriliona', 'kvadriliona'], // 10 ^ 24\n 9: ['kvadrilijarda', 'kvadrilijarde', 'kvadrilijarda'], // 10 ^ 27\n 10: ['kvintilion', 'kvintiliona', 'kvintiliona'] // 10 ^ 30\n }\n\n /**\n * Maps segment indices to whether they are grammatically feminine.\n * In Serbian, thousands (index 1) are feminine, others are masculine.\n * @type {Object.<number, boolean>}\n */\n scaleGenders = {\n 1: true // thousands are feminine (others default to false)\n }\n\n /** Selects Serbian plural form: 1 = singular, 2-4 = few, else = many. */\n pluralize (n, forms) {\n const lastDigit = n % 10n\n const lastTwoDigits = n % 100n\n\n if ((lastTwoDigits < 10n || lastTwoDigits > 20n) && lastDigit === 1n) {\n return forms[0]\n }\n\n if ((lastTwoDigits < 10n || lastTwoDigits > 20n) && lastDigit > 1n && lastDigit < 5n) {\n return forms[1]\n }\n\n return forms[2]\n }\n}\n","import { GreedyScaleLanguage } from '../classes/greedy-scale-language.js'\n\n/**\n * Simplified Chinese language converter.\n *\n * Supports:\n * - Simplified Chinese characters (简体中文)\n * - No word separators (concatenated format)\n * - Optional formal (financial) vs common numerals\n */\nexport class SimplifiedChinese extends GreedyScaleLanguage {\n negativeWord = '负'\n decimalSeparatorWord = '点'\n zeroWord = '零'\n wordSeparator = ''\n\n constructor (options = {}) {\n super()\n\n this.setOptions({\n formal: true\n }, options)\n\n if (this.options.formal) {\n this.scaleWords = [\n [1_000_000_000_000n, '万'],\n [100_000_000n, '亿'],\n [10_000n, '万'],\n [1000n, '仟'],\n [100n, '佰'],\n [10n, '拾'],\n [9n, '玖'],\n [8n, '捌'],\n [7n, '柒'],\n [6n, '陆'],\n [5n, '伍'],\n [4n, '肆'],\n [3n, '叁'],\n [2n, '贰'],\n [1n, '壹'],\n [0n, '零']\n ]\n } else {\n this.scaleWords = [\n [1_000_000_000_000n, '万'],\n [100_000_000n, '亿'],\n [10_000n, '万'],\n [1000n, '千'],\n [100n, '百'],\n [10n, '十'],\n [9n, '九'],\n [8n, '八'],\n [7n, '七'],\n [6n, '六'],\n [5n, '五'],\n [4n, '四'],\n [3n, '三'],\n [2n, '二'],\n [1n, '一'],\n [0n, '零']\n ]\n }\n }\n\n /** Combines two word-sets according to Chinese grammar rules. */\n combineWordSets (preceding, following) {\n const precedingWord = Object.keys(preceding)[0]\n const precedingValue = Object.values(preceding)[0]\n const followingWord = Object.keys(following)[0]\n const followingValue = Object.values(following)[0]\n\n // Implicit one: omit 1 before single digits (< 10)\n if (precedingValue === 1n && followingValue < 10n) {\n return following\n }\n\n // Multiply when following > preceding (scale words like 仁, 万, 亿)\n if (followingValue > precedingValue) {\n return { [`${precedingWord}${followingWord}`]: precedingValue * followingValue }\n }\n\n // Insert \"零\" (zero) when position skip levels (e.g., 1003 = 千零三)\n // zeroDigit() checks if gap exists between preceding and following magnitude\n if (this.zeroDigit(precedingValue) > this.digit(followingValue)) {\n return { [`${precedingWord}${this.zeroWord}${followingWord}`]: precedingValue + followingValue }\n }\n\n // Default: concatenate without zero insertion\n return { [`${precedingWord}${followingWord}`]: precedingValue + followingValue }\n }\n\n /** Returns the number of digits in a number. */\n digit (number_) {\n return number_.toString().length\n }\n\n /** Counts the number of zero digits in a number. */\n zeroDigit (number_) {\n return [...number_.toString()].filter(c => c === '0').length\n }\n\n /** Converts decimal digits to words by reading each digit individually. */\n decimalDigitsToWords (decimalString) {\n const words = []\n for (let i = 0; i < decimalString.length; i++) {\n const digitValue = BigInt(decimalString[i])\n words.push(this.integerToWords(digitValue))\n }\n return words\n }\n}\n","import { GreedyScaleLanguage } from '../classes/greedy-scale-language.js'\n\n/**\n * Spanish language converter.\n *\n * Supports:\n * - Gender agreement (masculine/feminine via genderStem option)\n * - \"y\" conjunction between tens and units\n * - Special hundred forms (cien/ciento)\n */\nexport class Spanish extends GreedyScaleLanguage {\n negativeWord = 'menos'\n decimalSeparatorWord = 'punto'\n zeroWord = 'cero'\n\n scaleWords = [\n [1_000_000_000_000_000_000_000_000n, 'cuatrillón'],\n [1_000_000_000_000_000_000n, 'trillón'],\n [1_000_000_000_000n, 'billón'],\n [1_000_000n, 'millón'],\n [1000n, 'mil'],\n [100n, 'cien'],\n [90n, 'noventa'],\n [80n, 'ochenta'],\n [70n, 'setenta'],\n [60n, 'sesenta'],\n [50n, 'cincuenta'],\n [40n, 'cuarenta'],\n [30n, 'treinta'],\n [29n, 'veintinueve'],\n [28n, 'veintiocho'],\n [27n, 'veintisiete'],\n [26n, 'veintiséis'],\n [25n, 'veinticinco'],\n [24n, 'veinticuatro'],\n [23n, 'veintitrés'],\n [22n, 'veintidós'],\n [21n, 'veintiuno'],\n [20n, 'veinte'],\n [19n, 'diecinueve'],\n [18n, 'dieciocho'],\n [17n, 'diecisiete'],\n [16n, 'dieciseis'],\n [15n, 'quince'],\n [14n, 'catorce'],\n [13n, 'trece'],\n [12n, 'doce'],\n [11n, 'once'],\n [10n, 'diez'],\n [9n, 'nueve'],\n [8n, 'ocho'],\n [7n, 'siete'],\n [6n, 'seis'],\n [5n, 'cinco'],\n [4n, 'cuatro'],\n [3n, 'tres'],\n [2n, 'dos'],\n [1n, 'uno'],\n [0n, 'cero']\n ]\n\n constructor (options = {}) {\n super()\n\n this.setOptions({\n gender: 'masculine'\n }, options)\n\n // Apply gender agreement to scale words if feminine\n if (this.options.gender === 'feminine') {\n this.scaleWords = this.scaleWords.map(([value, word]) => {\n if (word === 'veintiuno') return [value, 'veintiuna']\n if (word === 'uno') return [value, 'una']\n return [value, word]\n })\n }\n }\n\n /** Combines two word-sets with Spanish gender and conjunction rules. */\n combineWordSets (preceding, following) {\n let precedingWord = Object.keys(preceding)[0]\n let followingWord = Object.keys(following)[0]\n const precedingValue = Object.values(preceding)[0]\n const followingValue = Object.values(following)[0]\n const genderStem = this.options.gender === 'feminine' ? 'a' : 'o'\n\n if (precedingValue === 1n) {\n if (followingValue < 1_000_000n) return following\n precedingWord = 'un'\n } else if (precedingValue === 100n && followingValue % 1000n !== 0n) {\n precedingWord += 't' + genderStem\n }\n\n if (followingValue < precedingValue) {\n if (precedingValue < 100n) {\n return { [`${precedingWord} y ${followingWord}`]: precedingValue + followingValue }\n }\n return { [`${precedingWord} ${followingWord}`]: precedingValue + followingValue }\n }\n\n if (followingValue % 1_000_000n === 0n && precedingValue > 1n) {\n followingWord = followingWord.slice(0, -3) + 'lones'\n }\n\n if (followingValue === 100n) {\n if (precedingValue === 5n) {\n precedingWord = 'quinien'\n followingWord = ''\n } else if (precedingValue === 7n) {\n precedingWord = 'sete'\n } else if (precedingValue === 9n) {\n precedingWord = 'nove'\n }\n followingWord += 't' + genderStem + 's'\n } else {\n followingWord = ' ' + followingWord\n }\n\n return { [`${precedingWord}${followingWord}`]: precedingValue * followingValue }\n }\n}\n","import { AbstractLanguage } from '../classes/abstract-language.js'\n\n/**\n * Swahili language converter.\n *\n * Supports:\n * - Swahili number words (moja, mbili, tatu)\n * - Space-separated components\n * - Simple decimal point notation\n */\nexport class Swahili extends AbstractLanguage {\n negativeWord = 'minus'\n decimalSeparatorWord = 'nukta'\n zeroWord = 'sifuri'\n\n onesWords = {\n 0: 'sifuri',\n 1: 'moja',\n 2: 'mbili',\n 3: 'tatu',\n 4: 'nne',\n 5: 'tano',\n 6: 'sita',\n 7: 'saba',\n 8: 'nane',\n 9: 'tisa'\n }\n\n tensWords = {\n 10: 'kumi',\n 20: 'ishirini',\n 30: 'thelathini',\n 40: 'arobaini',\n 50: 'hamsini',\n 60: 'sitini',\n 70: 'sabini',\n 80: 'themanini',\n 90: 'tisini'\n }\n\n scaleWords = [\n '',\n 'elfu',\n 'milioni',\n 'bilioni',\n 'trilioni'\n ]\n\n wordsUnder100 (n) {\n if (n < 10) return this.onesWords[n]\n if (n === 10) return this.tensWords[10]\n if (n < 20) {\n // 11-19: 'kumi na <digit>'\n return this.tensWords[10] + ' na ' + this.onesWords[n - 10]\n }\n const tens = Math.trunc(n / 10) * 10\n const ones = n % 10\n if (ones === 0) return this.tensWords[tens]\n return this.tensWords[tens] + ' na ' + this.onesWords[ones]\n }\n\n wordsUnder1000 (n) {\n if (n < 100) return this.wordsUnder100(n)\n if (n === 100) return 'mia moja'\n const hundreds = Math.trunc(n / 100)\n const rest = n % 100\n const parts = []\n\n // Hundreds: 'mia <digit>'\n parts.push('mia ' + this.onesWords[hundreds])\n if (rest > 0) {\n if (rest < 10) {\n parts.push('na ' + this.onesWords[rest])\n } else {\n parts.push(this.wordsUnder100(rest))\n }\n }\n\n return parts.join(' ')\n }\n\n splitBy3 (number) {\n const s = number.toString()\n if (s.length <= 3) return [Number(s)]\n const groups = []\n const last3 = s.slice(-3)\n groups.unshift(Number(last3))\n let remaining = s.slice(0, -3)\n while (remaining.length > 0) {\n const group = remaining.slice(-3)\n groups.unshift(Number(group))\n remaining = remaining.slice(0, -3)\n }\n return groups\n }\n\n integerToWords (integerPart) {\n if (integerPart === 0n) return this.zeroWord\n\n const groups = this.splitBy3(integerPart)\n const parts = []\n\n for (let i = 0; i < groups.length; i++) {\n const val = groups[i]\n if (val === 0) continue\n const scaleIndex = groups.length - i - 1\n // scale word\n if (scaleIndex === 0) {\n if (val < 10 && parts.length > 0) {\n parts.push('na ' + this.onesWords[val])\n } else if (val === 100 && parts.length > 0) {\n // In compound numbers (e.g., 1100 -> 'elfu moja mia'), use 'mia' not 'mia moja'\n parts.push('mia')\n } else {\n parts.push(this.wordsUnder1000(val))\n }\n } else {\n // e.g., 'elfu moja', 'milioni mbili'\n const unit = (val === 1) ? 'moja' : this.wordsUnder1000(val)\n parts.push(this.scaleWords[scaleIndex] + ' ' + unit)\n }\n }\n\n return parts.join(' ').trim()\n }\n}\n","import { GreedyScaleLanguage } from '../classes/greedy-scale-language.js'\n\n/**\n * Swedish language converter.\n *\n * Supports:\n * - Hyphenation for compound tens (tjugo-tre)\n * - \"och\" (and) after hundreds\n * - Space-separated larger composites\n */\nexport class Swedish extends GreedyScaleLanguage {\n negativeWord = 'minus'\n decimalSeparatorWord = 'komma'\n zeroWord = 'noll'\n wordSeparator = ' '\n\n scaleWords = [\n [1_000_000_000_000_000_000_000_000_000n, 'kvadriljon'],\n [1_000_000_000_000_000_000_000_000n, 'triljon'],\n [1_000_000_000_000_000_000_000n, 'biljon'],\n [1_000_000_000_000_000_000n, 'miljard'],\n [1_000_000_000_000n, 'biljon'],\n [1_000_000_000n, 'miljard'],\n [1_000_000n, 'miljon'],\n [1000n, 'tusen'],\n [100n, 'hundra'],\n [90n, 'nittio'],\n [80n, 'åttio'],\n [70n, 'sjuttio'],\n [60n, 'sextio'],\n [50n, 'femtio'],\n [40n, 'fyrtio'],\n [30n, 'trettio'],\n [20n, 'tjugo'],\n [19n, 'nitton'],\n [18n, 'arton'],\n [17n, 'sjutton'],\n [16n, 'sexton'],\n [15n, 'femton'],\n [14n, 'fjorton'],\n [13n, 'tretton'],\n [12n, 'tolv'],\n [11n, 'elva'],\n [10n, 'tio'],\n [9n, 'nio'],\n [8n, 'åtta'],\n [7n, 'sju'],\n [6n, 'sex'],\n [5n, 'fem'],\n [4n, 'fyra'],\n [3n, 'tre'],\n [2n, 'två'],\n [1n, 'ett'],\n [0n, 'noll']\n ]\n\n /** Combines two word-sets according to Swedish grammar rules. */\n combineWordSets (preceding, following) {\n const precedingWord = Object.keys(preceding)[0]\n const followingWord = Object.keys(following)[0]\n const precedingValue = Object.values(preceding)[0]\n const followingValue = Object.values(following)[0]\n\n if (precedingValue === 1n && followingValue < 100n) {\n return following\n }\n\n // Omit 'ett' before 'hundra' and 'tusen'\n if (precedingValue === 1n && (followingValue === 100n || followingValue === 1000n)) {\n return following\n }\n\n if (precedingValue < 100n && precedingValue > followingValue) {\n return { [`${precedingWord}-${followingWord}`]: precedingValue + followingValue }\n }\n\n if (precedingValue >= 100n && followingValue < 100n) {\n return { [`${precedingWord} och ${followingWord}`]: precedingValue + followingValue }\n }\n\n if (followingValue > precedingValue) {\n if (precedingValue === 1n && followingValue >= 1_000_000n) {\n return { [`en ${followingWord}`]: precedingValue * followingValue }\n }\n return { [`${precedingWord} ${followingWord}`]: precedingValue * followingValue }\n }\n\n return { [`${precedingWord} ${followingWord}`]: precedingValue + followingValue }\n }\n}\n","import { AbstractLanguage } from '../classes/abstract-language.js'\n\n/**\n * Tamil language converter.\n *\n * Supports:\n * - Tamil numbering system\n * - Tamil script\n * - Complete word forms for 0-99\n */\nexport class Tamil extends AbstractLanguage {\n negativeWord = 'மைனஸ்'\n decimalSeparatorWord = 'புள்ளி'\n zeroWord = 'பூஜ்ஜியம்'\n usePerDigitDecimals = true // Enable digit-by-digit decimal conversion\n\n belowHundredWords = [\n 'பூஜ்ஜியம்',\n 'ஒன்று',\n 'இரண்டு',\n 'மூன்று',\n 'நான்கு',\n 'ஐந்து',\n 'ஆறு',\n 'ஏழு',\n 'எட்டு',\n 'ஒன்பது',\n 'பத்து',\n 'பதினொன்று',\n 'பன்னிரண்டு',\n 'பதிமூன்று',\n 'பதினான்கு',\n 'பதினைந்து',\n 'பதினாறு',\n 'பதினேழு',\n 'பதினெட்டு',\n 'பத்தொன்பது',\n 'இருபது',\n 'இருபத்தொன்று',\n 'இருபத்திரண்டு',\n 'இருபத்திமூன்று',\n 'இருபத்திநான்கு',\n 'இருபத்தைந்து',\n 'இருபத்தாறு',\n 'இருபத்தேழு',\n 'இருபத்தெட்டு',\n 'இருபத்தொன்பது',\n 'முப்பது',\n 'முப்பத்தொன்று',\n 'முப்பத்திரண்டு',\n 'முப்பத்திமூன்று',\n 'முப்பத்திநான்கு',\n 'முப்பத்தைந்து',\n 'முப்பத்தாறு',\n 'முப்பத்தேழு',\n 'முப்பத்தெட்டு',\n 'முப்பத்தொன்பது',\n 'நாற்பது',\n 'நாற்பத்தொன்று',\n 'நாற்பத்திரண்டு',\n 'நாற்பத்திமூன்று',\n 'நாற்பத்திநான்கு',\n 'நாற்பத்தைந்து',\n 'நாற்பத்தாறு',\n 'நாற்பத்தேழு',\n 'நாற்பத்தெட்டு',\n 'நாற்பத்தொன்பது',\n 'ஐம்பது',\n 'ஐம்பத்தொன்று',\n 'ஐம்பத்திரண்டு',\n 'ஐம்பத்திமூன்று',\n 'ஐம்பத்திநான்கு',\n 'ஐம்பத்தைந்து',\n 'ஐம்பத்தாறு',\n 'ஐம்பத்தேழு',\n 'ஐம்பத்தெட்டு',\n 'ஐம்பத்தொன்பது',\n 'அறுபது',\n 'அறுபத்தொன்று',\n 'அறுபத்திரண்டு',\n 'அறுபத்திமூன்று',\n 'அறுபத்திநான்கு',\n 'அறுபத்தைந்து',\n 'அறுபத்தாறு',\n 'அறுபத்தேழு',\n 'அறுபத்தெட்டு',\n 'அறுபத்தொன்பது',\n 'எழுபது',\n 'எழுபத்தொன்று',\n 'எழுபத்திரண்டு',\n 'எழுபத்திமூன்று',\n 'எழுபத்திநான்கு',\n 'எழுபத்தைந்து',\n 'எழுபத்தாறு',\n 'எழுபத்தேழு',\n 'எழுபத்தெட்டு',\n 'எழுபத்தொன்பது',\n 'எண்பது',\n 'எண்பத்தொன்று',\n 'எண்பத்திரண்டு',\n 'எண்பத்திமூன்று',\n 'எண்பத்திநான்கு',\n 'எண்பத்தைந்து',\n 'எண்பத்தாறு',\n 'எண்பத்தேழு',\n 'எண்பத்தெட்டு',\n 'எண்பத்தொன்பது',\n 'தொண்ணூறு',\n 'தொண்ணூற்று ஒன்று',\n 'தொண்ணூற்று இரண்டு',\n 'தொண்ணூற்று மூன்று',\n 'தொண்ணூற்று நான்கு',\n 'தொண்ணூற்று ஐந்து',\n 'தொண்ணூற்று ஆறு',\n 'தொண்ணூற்று ஏழு',\n 'தொண்ணூற்று எட்டு',\n 'தொண்ணூற்று ஒன்பது'\n ]\n\n hundredsWords = [\n '',\n 'நூறு',\n 'இருநூறு',\n 'முன்னூறு',\n 'நானூறு',\n 'ஐநூறு',\n 'அறுநூறு',\n 'எழுநூறு',\n 'எண்நூறு',\n 'தொள்ளாயிரம்'\n ]\n\n // Ones words map 1–9 for decimal reading\n onesWords = [\n 'ஒன்று',\n 'இரண்டு',\n 'மூன்று',\n 'நான்கு',\n 'ஐந்து',\n 'ஆறு',\n 'ஏழு',\n 'எட்டு',\n 'ஒன்பது'\n ]\n\n scaleWords = [\n '',\n 'ஆயிரம்',\n 'லட்சம்',\n 'கோடி',\n 'அரபு',\n 'கராபு',\n 'நீல்',\n 'பத்ம',\n 'சங்கு'\n ]\n\n /** Convert numbers below 100 to Tamil words. */\n convertBelowHundred (number) {\n return this.belowHundredWords[number]\n }\n\n convertBelowThousand (number) {\n if (number === 0) return ''\n if (number < 100) return this.convertBelowHundred(number)\n\n const hundreds = Math.trunc(number / 100)\n const remainder = number % 100\n let hundredPart = this.hundredsWords[hundreds]\n\n if (remainder > 0) {\n if (hundredPart.endsWith('ம்')) {\n hundredPart = hundredPart.replace(/ம்$/, 'த்து')\n } else if (hundredPart.endsWith('று')) {\n hundredPart = hundredPart.slice(0, -2) + 'ற்று'\n }\n }\n\n const parts = [hundredPart]\n if (remainder > 0) {\n parts.push(this.convertBelowHundred(remainder))\n }\n\n return parts.join(' ').trim()\n }\n\n splitIndian (number) {\n const numStr = number.toString()\n if (numStr.length <= 3) return [Number(numStr)]\n\n const groups = []\n const last3 = numStr.slice(-3)\n groups.unshift(Number(last3))\n\n let remaining = numStr.slice(0, -3)\n while (remaining.length > 0) {\n const group = remaining.slice(-2)\n groups.unshift(Number(group))\n remaining = remaining.slice(0, -2)\n }\n\n return groups\n }\n\n integerToWords (integerPart) {\n if (integerPart === 0n) return this.zeroWord\n\n const groups = this.splitIndian(integerPart)\n const groupCount = groups.length\n const words = []\n\n for (let i = 0; i < groupCount; i++) {\n const groupValue = groups[i]\n if (groupValue === 0) continue\n\n const scaleIndex = groupCount - i - 1\n const groupWords = (groupValue === 1 && scaleIndex > 0) ? 'ஒரு' : this.convertBelowThousand(groupValue)\n words.push(groupWords)\n if (scaleIndex > 0 && this.scaleWords[scaleIndex]) {\n words.push(this.scaleWords[scaleIndex])\n }\n }\n\n return words.join(' ').trim()\n }\n}\n","import { AbstractLanguage } from '../classes/abstract-language.js'\n\n/**\n * Telugu language converter.\n *\n * Supports:\n * - Telugu numbering system\n * - Telugu script\n * - Complete word forms for 0-99\n */\nexport class Telugu extends AbstractLanguage {\n negativeWord = 'మైనస్'\n decimalSeparatorWord = 'పాయింట్'\n zeroWord = 'సున్నా'\n usePerDigitDecimals = true // Enable digit-by-digit decimal conversion\n\n belowHundredWords = [\n 'సున్నా',\n 'ఒకటి',\n 'రెండు',\n 'మూడు',\n 'నాలుగు',\n 'ఐదు',\n 'ఆరు',\n 'ఏడు',\n 'ఎనిమిది',\n 'తొమ్మిది',\n 'పది',\n 'పదకొండు',\n 'పన్నెండు',\n 'పదమూడు',\n 'పద్నాలుగు',\n 'పదిహేను',\n 'పదహారు',\n 'పదిహేడు',\n 'పద్దెనిమిది',\n 'పంతొమ్మిది',\n 'ఇరవై',\n 'ఇరవై ఒక్కటి',\n 'ఇరవై రెండు',\n 'ఇరవై మూడు',\n 'ఇరవై నాలుగు',\n 'ఇరవై ఐదు',\n 'ఇరవై ఆరు',\n 'ఇరవై ఏడు',\n 'ఇరవై ఎనిమిది',\n 'ఇరవై తొమ్మిది',\n 'ముప్పై',\n 'ముప్పై ఒకటి',\n 'ముప్పై రెండు',\n 'ముప్పై మూడు',\n 'ముప్పై నాలుగు',\n 'ముప్పై ఐదు',\n 'ముప్పై ఆరు',\n 'ముప్పై ఏడు',\n 'ముప్పై ఎనిమిది',\n 'ముప్పై తొమ్మిది',\n 'నలభై',\n 'నలభై ఒకటి',\n 'నలభై రెండు',\n 'నలభై మూడు',\n 'నలభై నాలుగు',\n 'నలభై ఐదు',\n 'నలభై ఆరు',\n 'నలభై ఏడు',\n 'నలభై ఎనిమిది',\n 'నలభై తొమ్మిది',\n 'యాభై',\n 'యాభై ఒకటి',\n 'యాభై రెండు',\n 'యాభై మూడు',\n 'యాభై నాలుగు',\n 'యాభై ఐదు',\n 'యాభై ఆరు',\n 'యాభై ఏడు',\n 'యాభై ఎనిమిది',\n 'యాభై తొమ్మిది',\n 'అరవై',\n 'అరవై ఒకటి',\n 'అరవై రెండు',\n 'అరవై మూడు',\n 'అరవై నాలుగు',\n 'అరవై ఐదు',\n 'అరవై ఆరు',\n 'అరవై ఏడు',\n 'అరవై ఎనిమిది',\n 'అరవై తొమ్మిది',\n 'డెబ్బై',\n 'డెబ్బై ఒకటి',\n 'డెబ్బై రెండు',\n 'డెబ్బై మూడు',\n 'డెబ్బై నాలుగు',\n 'డెబ్బై ఐదు',\n 'డెబ్బై ఆరు',\n 'డెబ్బై ఏడు',\n 'డెబ్బై ఎనిమిది',\n 'డెబ్బై తొమ్మిది',\n 'ఎనభై',\n 'ఎనభై ఒకటి',\n 'ఎనభై రెండు',\n 'ఎనభై మూడు',\n 'ఎనభై నాలుగు',\n 'ఎనభై ఐదు',\n 'ఎనభై ఆరు',\n 'ఎనభై ఏడు',\n 'ఎనభై ఎనిమిది',\n 'ఎనభై తొమ్మిది',\n 'తొంభై',\n 'తొంభై ఒకటి',\n 'తొంభై రెండు',\n 'తొంభై మూడు',\n 'తొంభై నాలుగు',\n 'తొంభై ఐదు',\n 'తొంభై ఆరు',\n 'తొంభై ఏడు',\n 'తొంభై ఎనిమిది',\n 'తొంభై తొమ్మిది'\n ]\n\n hundredsWords = [\n '',\n 'వంద',\n 'రెండు వందలు',\n 'మూడు వందలు',\n 'నాలుగు వందలు',\n 'ఐదు వందలు',\n 'ఆరు వందలు',\n 'ఏడు వందలు',\n 'ఎనిమిది వందలు',\n 'తొమ్మిది వందలు'\n ]\n\n // Ones words map 1–9 for decimal reading\n onesWords = [\n 'ఒకటి',\n 'రెండు',\n 'మూడు',\n 'నాలుగు',\n 'ఐదు',\n 'ఆరు',\n 'ఏడు',\n 'ఎనిమిది',\n 'తొమ్మిది'\n ]\n\n scaleWords = [\n '',\n 'వెయ్యి',\n 'లక్ష',\n 'కోటి',\n 'అరబ్',\n 'ఖరబ్',\n 'నిల్',\n 'పడ్మ',\n 'శంకు'\n ]\n\n /** Convert numbers below 100 to Telugu words. */\n convertBelowHundred (number) {\n return this.belowHundredWords[number]\n }\n\n /** Convert numbers below 1000 to Telugu words. */\n convertBelowThousand (number) {\n if (number === 0) return ''\n if (number < 100) return this.convertBelowHundred(number)\n\n const hundreds = Math.trunc(number / 100)\n const remainder = number % 100\n const parts = [this.hundredsWords[hundreds]]\n\n if (remainder > 0) {\n parts.push(this.convertBelowHundred(remainder))\n }\n\n return parts.join(' ').trim()\n }\n\n /** Split a number using Indian-style grouping (3-2-2 digits from right). */\n splitIndian (number) {\n const numStr = number.toString()\n if (numStr.length <= 3) return [Number(numStr)]\n\n const groups = []\n const last3 = numStr.slice(-3)\n groups.unshift(Number(last3))\n\n let remaining = numStr.slice(0, -3)\n while (remaining.length > 0) {\n const group = remaining.slice(-2)\n groups.unshift(Number(group))\n remaining = remaining.slice(0, -2)\n }\n\n return groups\n }\n\n integerToWords (integerPart) {\n if (integerPart === 0n) return this.zeroWord\n\n const groups = this.splitIndian(integerPart)\n const groupCount = groups.length\n const words = []\n\n for (let i = 0; i < groupCount; i++) {\n const groupValue = groups[i]\n if (groupValue === 0) continue\n\n const scaleIndex = groupCount - i - 1\n const groupWords = (groupValue === 1 && scaleIndex > 0) ? 'ఒక' : this.convertBelowThousand(groupValue)\n words.push(groupWords)\n if (scaleIndex > 0 && this.scaleWords[scaleIndex]) {\n words.push(this.scaleWords[scaleIndex])\n }\n }\n\n return words.join(' ').trim()\n }\n}\n","import { AbstractLanguage } from '../classes/abstract-language.js'\n\n/**\n * Thai language converter.\n *\n * Supports:\n * - Thai numerals (ศูนย์, หนึ่ง, สอง, สาม)\n * - No word separators (continuous Thai script)\n * - Digit-by-digit decimal reading\n */\nexport class Thai extends AbstractLanguage {\n negativeWord = 'ลบ'\n decimalSeparatorWord = 'จุด'\n zeroWord = 'ศูนย์'\n wordSeparator = ''\n usePerDigitDecimals = true // Enable digit-by-digit decimal conversion\n\n // Ones words map 1–9\n onesWords = ['หนึ่ง', 'สอง', 'สาม', 'สี่', 'ห้า', 'หก', 'เจ็ด', 'แปด', 'เก้า']\n\n /** Converts numbers below one million to Thai words. */\n convertBelowMillion (number) {\n if (number === 0) return ''\n\n let value = number\n const parts = []\n\n const hundredThousands = Math.trunc(value / 100000)\n value %= 100000\n const tenThousands = Math.trunc(value / 10000)\n value %= 10000\n const thousands = Math.trunc(value / 1000)\n value %= 1000\n const hundreds = Math.trunc(value / 100)\n value %= 100\n const tens = Math.trunc(value / 10)\n const ones = value % 10\n\n if (hundredThousands > 0) {\n parts.push(this.onesWords[hundredThousands - 1] + 'แสน')\n }\n\n if (tenThousands > 0) {\n if (tenThousands === 1) {\n parts.push('หนึ่งหมื่น')\n } else {\n parts.push(this.onesWords[tenThousands - 1] + 'หมื่น')\n }\n }\n\n if (thousands > 0) {\n parts.push(this.onesWords[thousands - 1] + 'พัน')\n }\n\n if (hundreds > 0) {\n parts.push(this.onesWords[hundreds - 1] + 'ร้อย')\n }\n\n if (tens > 0) {\n if (tens === 1) {\n parts.push('สิบ')\n } else if (tens === 2) {\n parts.push('ยี่สิบ')\n } else {\n parts.push(this.onesWords[tens - 1] + 'สิบ')\n }\n }\n\n if (ones > 0) {\n const hasHigher = hundredThousands > 0 || tenThousands > 0 || thousands > 0 || hundreds > 0 || tens > 0\n if (ones === 1 && (tens > 0 || hasHigher)) {\n parts.push('เอ็ด')\n } else {\n parts.push(this.onesWords[ones - 1])\n }\n }\n\n return parts.join('')\n }\n\n /** Split a number into million-sized groups for processing. */\n splitMillionGroups (number) {\n const groups = []\n let remaining = number\n\n const million = 1_000_000n\n while (remaining > 0n) {\n const chunk = Number(remaining % million)\n groups.unshift(chunk)\n remaining = remaining / million\n }\n\n return groups\n }\n\n integerToWords (integerPart) {\n if (integerPart === 0n) {\n return this.zeroWord\n }\n\n const groups = this.splitMillionGroups(integerPart)\n const parts = []\n\n for (let i = 0; i < groups.length; i++) {\n const groupValue = groups[i]\n if (groupValue === 0) continue\n\n parts.push(this.convertBelowMillion(groupValue))\n const remaining = groups.length - i - 1\n if (remaining > 0) {\n parts.push('ล้าน'.repeat(remaining))\n }\n }\n\n return parts.join('')\n }\n}\n","import { GreedyScaleLanguage } from '../classes/greedy-scale-language.js'\n\n/**\n * Traditional Chinese language converter.\n *\n * Supports:\n * - Traditional Chinese characters (繁體中文)\n * - No word separators (concatenated format)\n * - Optional formal (financial) vs common numerals\n */\nexport class TraditionalChinese extends GreedyScaleLanguage {\n negativeWord = '負'\n decimalSeparatorWord = '點'\n zeroWord = '零'\n wordSeparator = ''\n\n constructor (options = {}) {\n super()\n\n this.setOptions({\n formal: true\n }, options)\n\n if (this.options.formal) {\n this.scaleWords = [\n [1_000_000_000_000n, '萬'],\n [100_000_000n, '億'],\n [10_000n, '萬'],\n [1000n, '仟'],\n [100n, '佰'],\n [10n, '拾'],\n [9n, '玖'],\n [8n, '捌'],\n [7n, '柒'],\n [6n, '陸'],\n [5n, '伍'],\n [4n, '肆'],\n [3n, '參'],\n [2n, '貳'],\n [1n, '壹'],\n [0n, '零']\n ]\n } else {\n this.scaleWords = [\n [1_000_000_000_000n, '萬'],\n [100_000_000n, '億'],\n [10_000n, '萬'],\n [1000n, '千'],\n [100n, '百'],\n [10n, '十'],\n [9n, '九'],\n [8n, '八'],\n [7n, '七'],\n [6n, '六'],\n [5n, '五'],\n [4n, '四'],\n [3n, '三'],\n [2n, '二'],\n [1n, '一'],\n [0n, '零']\n ]\n }\n }\n\n /** Combines two word-sets with Traditional Chinese grammar rules and zero insertion. */\n combineWordSets (preceding, following) {\n const precedingWord = Object.keys(preceding)[0]\n const precedingValue = Object.values(preceding)[0]\n const followingWord = Object.keys(following)[0]\n const followingValue = Object.values(following)[0]\n\n // Implicit one: omit 1 before single digits (< 10)\n if (precedingValue === 1n && followingValue < 10n) {\n return following\n }\n\n // Multiply when following > preceding (scale words like 千, 萬, 億)\n if (followingValue > precedingValue) {\n return { [`${precedingWord}${followingWord}`]: precedingValue * followingValue }\n }\n\n // Insert \"零\" (zero) when position skip levels (e.g., 1003 = 千零三)\n // zeroDigit() checks if gap exists between preceding and following magnitude\n if (this.zeroDigit(precedingValue) > this.digit(followingValue)) {\n return { [`${precedingWord}${this.zeroWord}${followingWord}`]: precedingValue + followingValue }\n }\n\n // Default: concatenate without zero insertion\n return { [`${precedingWord}${followingWord}`]: precedingValue + followingValue }\n }\n\n /** Returns the number of digits in a number. */\n digit (number_) {\n return number_.toString().length\n }\n\n /** Counts the number of zero digits in a number. */\n zeroDigit (number_) {\n return [...number_.toString()].filter(c => c === '0').length\n }\n\n /** Converts decimal digits to words by reading each digit individually. */\n decimalDigitsToWords (decimalString) {\n const words = []\n for (let i = 0; i < decimalString.length; i++) {\n const digitValue = BigInt(decimalString[i])\n words.push(this.integerToWords(digitValue))\n }\n return words\n }\n}\n","import { TurkicLanguage } from '../classes/turkic-language.js'\n\n/**\n * Turkish language converter.\n *\n * Supports:\n * - Omits 'bir' (one) before hundreds and thousands\n * - Optional space removal via dropSpaces option\n */\nexport class Turkish extends TurkicLanguage {\n negativeWord = 'eksi'\n decimalSeparatorWord = 'virgül'\n zeroWord = 'sıfır'\n wordSeparator = ' '\n\n scaleWords = [\n [1_000_000_000_000_000_000n, 'kentilyon'],\n [1_000_000_000_000_000n, 'katrilyon'],\n [1_000_000_000_000n, 'trilyon'],\n [1_000_000_000n, 'milyar'],\n [1_000_000n, 'milyon'],\n [1000n, 'bin'],\n [100n, 'yüz'],\n [90n, 'doksan'],\n [80n, 'seksen'],\n [70n, 'yetmiş'],\n [60n, 'altmış'],\n [50n, 'elli'],\n [40n, 'kırk'],\n [30n, 'otuz'],\n [20n, 'yirmi'],\n [10n, 'on'],\n [9n, 'dokuz'],\n [8n, 'sekiz'],\n [7n, 'yedi'],\n [6n, 'altı'],\n [5n, 'beş'],\n [4n, 'dört'],\n [3n, 'üç'],\n [2n, 'iki'],\n [1n, 'bir'],\n [0n, 'sıfır']\n ]\n\n constructor (options = {}) {\n super()\n\n this.setOptions({\n dropSpaces: false\n }, options)\n\n if (this.options.dropSpaces) {\n this.wordSeparator = ''\n }\n }\n}\n","import { SlavicLanguage } from '../classes/slavic-language.js'\n\n/**\n * Ukrainian language converter.\n *\n * Supports:\n * - Three-form pluralization (one/few/many)\n * - Gender agreement (один/одна, два/дві)\n * - Ukrainian orthography and phonology\n */\nexport class Ukrainian extends SlavicLanguage {\n negativeWord = 'мiнус'\n decimalSeparatorWord = 'кома'\n zeroWord = 'нуль'\n\n onesWords = {\n 1: 'один',\n 2: 'два',\n 3: 'три',\n 4: 'чотири',\n 5: 'п\\'ять',\n 6: 'шiсть',\n 7: 'сiм',\n 8: 'вiсiм',\n 9: 'дев\\'ять'\n }\n\n onesFeminineWords = {\n 1: 'одна',\n 2: 'двi',\n 3: 'три',\n 4: 'чотири',\n 5: 'п\\'ять',\n 6: 'шiсть',\n 7: 'сiм',\n 8: 'вiсiм',\n 9: 'дев\\'ять'\n }\n\n teensWords = {\n 0: 'десять',\n 1: 'одинадцять',\n 2: 'дванадцять',\n 3: 'тринадцять',\n 4: 'чотирнадцять',\n 5: 'п\\'ятнадцять',\n 6: 'шiстнадцять',\n 7: 'сiмнадцять',\n 8: 'вiсiмнадцять',\n 9: 'дев\\'ятнадцять'\n }\n\n twentiesWords = {\n 2: 'двадцять',\n 3: 'тридцять',\n 4: 'сорок',\n 5: 'п\\'ятдесят',\n 6: 'шiстдесят',\n 7: 'сiмдесят',\n 8: 'вiсiмдесят',\n 9: 'дев\\'яносто'\n }\n\n hundredsWords = {\n 1: 'сто',\n 2: 'двiстi',\n 3: 'триста',\n 4: 'чотириста',\n 5: 'п\\'ятсот',\n 6: 'шiстсот',\n 7: 'сiмсот',\n 8: 'вiсiмсот',\n 9: 'дев\\'ятсот'\n }\n\n pluralForms = {\n 1: ['тисяча', 'тисячi', 'тисяч'], // 10^ 3\n 2: ['мiльйон', 'мiльйони', 'мiльйонiв'], // 10^ 6\n 3: ['мiльярд', 'мiльярди', 'мiльярдiв'], // 10^ 9\n 4: ['трильйон', 'трильйони', 'трильйонiв'], // 10^ 12\n 5: ['квадрильйон', 'квадрильйони', 'квадрильйонiв'], // 10^ 15\n 6: ['квiнтильйон', 'квiнтильйони', 'квiнтильйонiв'], // 10^ 18\n 7: ['секстильйон', 'секстильйони', 'секстильйонiв'], // 10^ 21\n 8: ['септильйон', 'септильйони', 'септильйонiв'], // 10^ 24\n 9: ['октильйон', 'октильйони', 'октильйонiв'], // 10^ 27\n 10: ['нонiльйон', 'нонiльйони', 'нонiльйонiв'] // 10^ 30\n }\n\n /**\n * Ukrainian thousands (тисяча) are feminine, requiring одна/двi forms.\n * Other scales (million, billion, etc.) are masculine.\n */\n scaleGenders = {\n 1: true // thousands are feminine\n }\n}\n","import { SouthAsianLanguage } from '../classes/south-asian-language.js'\n\n/**\n * Urdu language converter.\n *\n * Supports:\n * - Indian numbering system (ہزار, لاکھ, کروڑ)\n * - Urdu script (right-to-left)\n * - Complete word forms for 0-99\n */\nexport class Urdu extends SouthAsianLanguage {\n negativeWord = 'منفی'\n decimalSeparatorWord = 'اعشاریہ'\n zeroWord = 'صفر'\n hundredWord = 'سو'\n\n belowHundredWords = [\n 'صفر',\n 'ایک',\n 'دو',\n 'تین',\n 'چار',\n 'پانچ',\n 'چھ',\n 'سات',\n 'آٹھ',\n 'نو',\n 'دس',\n 'گیارہ',\n 'بارہ',\n 'تیرہ',\n 'چودہ',\n 'پندرہ',\n 'سولہ',\n 'سترہ',\n 'اٹھارہ',\n 'انیس',\n 'بیس',\n 'اکیس',\n 'بائیس',\n 'تیئیس',\n 'چوبیس',\n 'پچیس',\n 'چھبیس',\n 'ستائیس',\n 'اٹھائیس',\n 'انتیس',\n 'تیس',\n 'اکتیس',\n 'بتیس',\n 'تینتیس',\n 'چونتیس',\n 'پینتیس',\n 'چھتیس',\n 'سینتیس',\n 'اڑتیس',\n 'انتالیس',\n 'چالیس',\n 'اکتالیس',\n 'بیالیس',\n 'تینتالیس',\n 'چوالیس',\n 'پینتالیس',\n 'چھالیس',\n 'سینتالیس',\n 'اڑتالیس',\n 'انچاس',\n 'پچاس',\n 'اکاون',\n 'باون',\n 'ترپن',\n 'چون',\n 'پچپن',\n 'چھپن',\n 'ستاون',\n 'اٹھاون',\n 'انسٹھ',\n 'ساٹھ',\n 'اکسٹھ',\n 'باسٹھ',\n 'ترسٹھ',\n 'چونسٹھ',\n 'پینسٹھ',\n 'چھیاسٹھ',\n 'سڑسٹھ',\n 'اڑسٹھ',\n 'انہتر',\n 'ستر',\n 'اکہتر',\n 'بہتر',\n 'تہتر',\n 'چوہتر',\n 'پچھتر',\n 'چھہتر',\n 'ستتر',\n 'اٹھہتر',\n 'اناسی',\n 'اسی',\n 'اکیاسی',\n 'بیاسی',\n 'تریاسی',\n 'چوراسی',\n 'پچاسی',\n 'چھیاسی',\n 'ستاسی',\n 'اٹھاسی',\n 'نواسی',\n 'نوے',\n 'اکانوے',\n 'بانوے',\n 'ترانوے',\n 'چورانوے',\n 'پچانوے',\n 'چھیانوے',\n 'ستانوے',\n 'اٹھانوے',\n 'ننانوے'\n ]\n\n scaleWords = [\n '',\n 'ہزار',\n 'لاکھ',\n 'کروڑ',\n 'ارب',\n 'کھرب',\n 'نیل',\n 'پدم',\n 'شنکھ'\n ]\n}\n","import { AbstractLanguage } from '../classes/abstract-language.js'\n\n/**\n * Vietnamese language converter.\n *\n * Supports:\n * - Special pronunciation rules (lăm for 5, mốt for final 1)\n * - \"Lẻ\" (odd/extra) when tens place is zero\n * - Vietnamese diacritical marks\n */\nexport class Vietnamese extends AbstractLanguage {\n negativeWord = 'âm'\n decimalSeparatorWord = 'phẩy'\n zeroWord = 'không'\n\n belowTwentyWords = {\n 0: 'không',\n 1: 'một',\n 2: 'hai',\n 3: 'ba',\n 4: 'bốn',\n 5: 'năm',\n 6: 'sáu',\n 7: 'bảy',\n 8: 'tám',\n 9: 'chín',\n 10: 'mười',\n 11: 'mười một',\n 12: 'mười hai',\n 13: 'mười ba',\n 14: 'mười bốn',\n 15: 'mười lăm',\n 16: 'mười sáu',\n 17: 'mười bảy',\n 18: 'mười tám',\n 19: 'mười chín'\n }\n\n twentiesWords = {\n 20: 'hai mươi',\n 30: 'ba mươi',\n 40: 'bốn mươi',\n 50: 'năm mươi',\n 60: 'sáu mươi',\n 70: 'bảy mươi',\n 80: 'tám mươi',\n 90: 'chín mươi'\n }\n\n scaleWords = {\n 1: 'nghìn', // 10^1\n 2: 'triệu', // 10^2\n 3: 'tỷ', // 10^3\n 4: 'nghìn tỷ',\n 5: 'trăm nghìn tỷ',\n 6: 'Quintillion',\n 7: 'Sextillion',\n 8: 'Septillion',\n 9: 'Octillion',\n 10: 'Nonillion',\n 11: 'Decillion',\n 12: 'Undecillion',\n 13: 'Duodecillion',\n 14: 'Tredecillion',\n 15: 'Quattuordecillion',\n 16: 'Sexdecillion',\n 17: 'Septendecillion',\n 18: 'Octodecillion',\n 19: 'Novemdecillion',\n 20: 'Vigintillion'\n }\n\n /** Convert numbers less than 100 to Vietnamese words. */\n convertLess100 (number) {\n const unitsPart = number % 10\n const tensPart = number - unitsPart\n const tensPartText = this.twentiesWords[tensPart]\n if (unitsPart === 0) {\n return tensPartText\n }\n const unitsPartText = this.belowTwentyWords[unitsPart]\n let suffix = unitsPartText\n if (unitsPart === 1) {\n suffix = 'mốt'\n }\n if (unitsPart === 5) {\n suffix = 'lăm'\n }\n return tensPartText + ' ' + suffix\n }\n\n /** Convert numbers less than 1000 to Vietnamese words. */\n convertLess1000 (number) {\n const words = []\n const tensUnitsPart = number % 100\n const hundredsPart = number - tensUnitsPart\n if (hundredsPart > 0) {\n words.push(this.belowTwentyWords[hundredsPart / 100], 'trăm')\n }\n if (tensUnitsPart > 0 && tensUnitsPart < 10) {\n if (words.length > 0) {\n words.push('lẻ')\n }\n if (tensUnitsPart === 5) {\n words.push('năm')\n } else {\n words.push(this.belowTwentyWords[tensUnitsPart])\n }\n }\n if (tensUnitsPart >= 10) {\n words.push(this.integerToWords(tensUnitsPart))\n }\n return words.join(' ')\n }\n\n /** Convert numbers greater than 1000 to Vietnamese words. */\n convertMore1000 (number) {\n const words = []\n let division = number / 1000n\n let power = 1\n while (division >= 1000n) {\n division = division / 1000n\n power = power + 1\n }\n const r = number - (division * BigInt(Math.pow(1000, power)))\n words.push(this.integerToWords(division), this.scaleWords[power])\n if (r > 0n) {\n if (r <= 99n) {\n words.push('lẻ')\n }\n words.push(this.integerToWords(r))\n }\n return words.join(' ')\n }\n\n integerToWords (integerPart) {\n if (integerPart < 20n) {\n return this.belowTwentyWords[Number(integerPart)]\n } else {\n if (integerPart < 100n) {\n return this.convertLess100(Number(integerPart))\n } else {\n return (integerPart < 1000n ? this.convertLess1000(Number(integerPart)) : this.convertMore1000(integerPart))\n }\n }\n }\n}\n"],"names":["AbstractLanguage","options","negativeWord","decimalSeparatorWord","zeroWord","wordSeparator","usePerDigitDecimals","this","toWords","isNegative","integerPart","decimalPart","words","push","integerToWords","decimalDigitsToWords","join","Error","setOptions","defaults","userOptions","decimalIntegerToWords","i","length","remainder","slice","char","BigInt","GreedyScaleLanguage","scaleWords","wordForScale","scale","match","find","pair","decomposeInteger","wordSets","remaining","multiplier","reduceWordSets","first","second","rest","Array","isArray","combined","combineWordSets","normalized","map","element","preceding","following","finalizeWords","output","trimEnd","reduced","result","Object","keys","TurkicLanguage","precedingWord","precedingValue","entries","followingWord","followingValue","resultNumber","SouthAsianLanguage","belowHundredWords","hundredWord","splitToSegments","numStr","toString","Number","segments","last3","unshift","segment","segmentToWords","segmentValue","hundreds","Math","trunc","parts","segmentCount","scaleIndex","trim","SlavicLanguage","onesWords","onesFeminineWords","teensWords","twentiesWords","hundredsWords","pluralForms","scaleGenders","omitOneBeforeScale","constructor","super","gender","segmentIndex","onesDigit","tensDigit","hundredsDigit","extractDigits","onesArray","pluralize","numberString","segmentSize","stringLength","remainderLength","value","number","remainder100","remainder10","French","withHyphenSeparator","values","at","Portuguese","static","replaceAll","POSTCLEAN_REGEX","replace","makeConverter","LanguageClass","undefined","proto","getPrototypeOf","prototype","isPlainObject","TypeError","type","str","isFinite","includes","expandScientificNotation","numberToString","trimmed","isNaN","stringToNormalizedForm","dotIndex","indexOf","integerStr","parseNumericString","parseNumericValue","mantissa","expStr","toLowerCase","split","exp","parseInt","digits","newDotPosition","repeat","ArabicConverter","tensWords","scaleAppendedWords","scalePluralWords","dualWords","dualAppendedWords","ones","masculine","feminine","selectedOnes","groupNumber","groupLevel","fullNumber","tens","hundredsRaw","returnValue","hundredsWord","numValue","pow","log10","tensIndex","temp","group","numberToProcess","groupDescription","AzerbaijaniConverter","BanglaConverter","BiblicalHebrewConverter","femininePluralForms","scalePlural","teensFeminineWords","andWord","index","x","n1","n2","n3","chunkWords","hasHundreds","tensWord","onesWord","CroatianConverter","n","forms","lastDigit","lastTwoDigits","CzechConverter","DanishConverter","ordFlag","temporary","DutchConverter","includeOptionalAnd","noHundredPairing","accentOne","hadSpace","hasSpace","andTxt","endsWith","high","low","EnglishConverter","FilipinoConverter","vowels","lastChar","FrenchConverter","FrenchBelgiumConverter","tuples","idx80","findIndex","tuple","splice","idx60","GermanConverter","GreekConverter","GujaratiConverter","HebrewConverter","HindiConverter","HungarianConverter","tensToCardinal","units","hundredsToCardinal","prefix","thousandsToCardinal","thousands","postfix","bigNumberToCardinal","numberLength","floor","IndonesianConverter","digitWords","splitBy3","blocks","stringNumber","firstBlock","firstBlockLength","nextBlock","spell","spelling","wordBlocks","getTens","getHundreds","block","wordList","start","ItalianConverter","exponentPrefixes","accentuate","string","word","omitIfZero","phoneticContraction","hasOwnProperty","call","exponentLengthToString","exponentLength","preDigits","exponent","infix","isSetsEqual","a","b","Set","size","every","has","JapaneseConverter","num","groups","reverse","groupStr","KannadaConverter","KoreanConverter","LatvianConverter","LithuanianConverter","MalayConverter","isLast","scaleWord","w","MarathiConverter","NorwegianBokmalConverter","PersianConverter","thousandMultiplier","thousandPrefix","suffix","millionMultiplier","PolishConverter","PortugueseConverter","PunjabiConverter","RomanianConverter","teensMasculineWords","scaleMetadata","singular","plural","needsDe","results","l","padStart","toReversed","romanianPluralize","form","spellUnder1000","spellUnder100","feminineUnits","masculineTeens","t","u","h","r","hundredWords","onesMap","RussianConverter","SerbianCyrillicConverter","SerbianLatinConverter","SimplifiedChineseConverter","formal","zeroDigit","digit","number_","filter","c","decimalString","digitValue","SpanishConverter","genderStem","SwahiliConverter","wordsUnder100","wordsUnder1000","s","val","unit","SwedishConverter","TamilConverter","convertBelowHundred","convertBelowThousand","hundredPart","splitIndian","groupCount","groupValue","groupWords","TeluguConverter","ThaiConverter","convertBelowMillion","hundredThousands","tenThousands","splitMillionGroups","million","chunk","TraditionalChineseConverter","TurkishConverter","dropSpaces","UkrainianConverter","UrduConverter","VietnameseConverter","belowTwentyWords","convertLess100","unitsPart","tensPart","tensPartText","convertLess1000","tensUnitsPart","hundredsPart","convertMore1000","division","power"],"mappings":";8OAqCO,MAAMA,EASXC,GAAW,CAAA,EAUXC,aAAe,GAMfC,qBAAuB,GAOvBC,SAAW,GAcXC,cAAgB,IAehBC,qBAAsB,EAUtB,WAAIL,GACF,OAAOM,MAAKN,CACd,CAiCAO,OAAAA,CAASC,EAAYC,EAAaC,GAChC,MAAMC,EAAQ,GAWd,OATIH,GAAYG,EAAMC,KAAKN,KAAKL,cAEhCU,EAAMC,KAAKN,KAAKO,eAAeJ,IAE3BC,IACFC,EAAMC,KAAKN,KAAKJ,sBAChBS,EAAMC,QAAQN,KAAKQ,qBAAqBJ,KAGnCC,EAAMI,KAAKT,KAAKF,cACzB,CAiBAS,cAAAA,CAAgBJ,GACd,MAAM,IAAIO,MAAM,mDAClB,CAuBAC,UAAAA,CAAYC,EAAW,GAAIC,EAAc,CAAA,GACvCb,MAAKN,EAAW,IACXkB,KACAC,EAEP,CAoBAC,qBAAAA,CAAuBX,GACrB,OAAOH,KAAKO,eAAeJ,EAC7B,CAkBAK,oBAAAA,CAAsBJ,GACpB,MAAMC,EAAQ,GAGd,IAAIU,EAAI,EACR,KAAOA,EAAIX,EAAYY,QAA6B,MAAnBZ,EAAYW,IAC3CV,EAAMC,KAAKN,KAAKH,UAChBkB,IAGF,MAAME,EAAYb,EAAYc,MAAMH,GACpC,IAAKE,EAAW,OAAOZ,EAGvB,GAAIL,KAAKD,oBACP,IAAK,MAAMoB,KAAQF,EACjBZ,EAAMC,KAAKN,KAAKc,sBAAsBM,OAAOD,UAG/Cd,EAAMC,KAAKN,KAAKc,sBAAsBM,OAAOH,KAG/C,OAAOZ,CACT,EC3OK,MAAMgB,UAA4B5B,EAiBvC6B,WAYAC,YAAAA,CAAcC,GACZ,MAAMC,EAAQzB,KAAKsB,WAAWI,KAAMC,GAASA,EAAK,KAAOH,GACzD,OAAOC,IAAQ,EACjB,CAoBAG,gBAAAA,CAAkBzB,GAChB,MAAM0B,EAAW,GACjB,IAAIC,EAAY3B,EAEhB,EAAG,CACD,MAAMsB,EAAQzB,KAAKsB,WAAWI,KAAMC,GAASG,GAAaH,EAAK,IAC/D,IAAKF,EAAO,MAEZ,MAAMM,EAA2B,KAAdD,EAAmB,GAAKA,EAAYL,EAAM,GAE1C,KAAfM,EACFF,EAASvB,KAAK,CAAE,CAACN,KAAKuB,aAAa,KAAM,KAEzCM,EAASvB,KAAKN,KAAK4B,iBAAiBG,IAGtCF,EAASvB,KAAK,CAAE,CAACmB,EAAM,IAAKA,EAAM,KAElCK,EAA0B,KAAdA,EAAmB,GAAKA,EAAYL,EAAM,EACxD,OAASK,EAAY,IAErB,OAAOD,CACT,CAaAG,cAAAA,CAAgBH,GACd,KAAOA,EAASb,OAAS,GAAG,CAC1B,MAAOiB,EAAOC,KAAWC,GAAQN,EAEjC,IAAKO,MAAMC,QAAQJ,KAAWG,MAAMC,QAAQH,GAAS,CACnD,MAAMI,EAAWtC,KAAKuC,gBAAgBN,EAAOC,GAC7CL,EAAWM,EAAKnB,OAAS,EAAI,CAACsB,EAAUH,GAAQ,CAACG,GACjD,QACF,CAEA,MAAME,EAAaX,EAASY,IAAKC,GAC1BN,MAAMC,QAAQK,GACO,IAAnBA,EAAQ1B,OAAe0B,EAAQ,GAAK1C,KAAKgC,eAAeU,GAD3BA,GAItCb,EAAWW,CACb,CAEA,OAAOX,EAAS,EAClB,CAyBAU,eAAAA,CAAiBI,EAAWC,GAC1B,MAAM,IAAIlC,MAAM,oDAClB,CAgBAmC,aAAAA,CAAeC,GACb,OAAOA,EAAOC,SAChB,CAYAxC,cAAAA,CAAgBJ,GACd,MAAM0B,EAAW7B,KAAK4B,iBAAiBzB,GACjC6C,EAAUhD,KAAKgC,eAAeH,GAC9BoB,EAASC,OAAOC,KAAKH,GAAS,GACpC,OAAOhD,KAAK6C,cAAcI,EAC5B,EC9KK,MAAMG,UAAuB/B,EAkBlCkB,eAAAA,CAAiBI,EAAWC,GAC1B,OAAQS,EAAeC,IAAmBJ,OAAOK,QAAQZ,KACjDa,EAAeC,IAAmBP,OAAOK,QAAQX,GAIzD,GAAuB,KAAnBU,IAA0BG,GAAkB,MAA2B,QAAnBA,GACtD,OAAOb,EAKT,MAAMc,EAAeD,EAAiBH,EAAiBA,EAAiBG,EAAiBH,EAAiBG,EAC1G,MAAO,CAAE,CAAC,GAAGJ,IAAgBrD,KAAKF,gBAAgB0D,KAAkBE,EACtE,ECnCK,MAAMC,UAA2BlE,EAUtCmE,kBAOAC,YAQAvC,WAyBAwC,eAAAA,CAAiB3D,GACf,MAAM4D,EAAS5D,EAAY6D,WAE3B,GAAID,EAAO/C,QAAU,EACnB,MAAO,CAACiD,OAAOF,IAGjB,MAAMG,EAAW,GACXC,EAAQJ,EAAO7C,UACrBgD,EAASE,QAAQH,OAAOE,IAExB,IAAIrC,EAAYiC,EAAO7C,MAAM,GAAG,GAChC,KAAOY,EAAUd,OAAS,GAAG,CAC3B,MAAMqD,EAAUvC,EAAUZ,UAC1BgD,EAASE,QAAQH,OAAOI,IACxBvC,EAAYA,EAAUZ,MAAM,GAAG,EACjC,CAEA,OAAOgD,CACT,CASAI,cAAAA,CAAgBC,GACd,GAAqB,IAAjBA,EAAoB,MAAO,GAC/B,GAAIA,EAAe,IAAK,OAAOvE,KAAK4D,kBAAkBW,GAEtD,MAAMC,EAAWC,KAAKC,MAAMH,EAAe,KACrCtD,EAAYsD,EAAe,IAC3BI,EAAQ,GAYd,OAViB,IAAbH,EACFG,EAAMrE,KAAKN,KAAK4D,kBAAkB,GAAK,IAAM5D,KAAK6D,aAElDc,EAAMrE,KAAKN,KAAK4D,kBAAkBY,GAAY,IAAMxE,KAAK6D,aAGvD5C,EAAY,GACd0D,EAAMrE,KAAKN,KAAK4D,kBAAkB3C,IAG7B0D,EAAMlE,KAAK,IACpB,CAYAF,cAAAA,CAAgBJ,GACd,GAAoB,KAAhBA,EACF,OAAOH,KAAKH,SAGd,MAAMqE,EAAWlE,KAAK8D,gBAAgB3D,GAChCyE,EAAeV,EAASlD,OACxBX,EAAQ,GAEd,IAAK,IAAIU,EAAI,EAAGA,EAAI6D,EAAc7D,IAAK,CACrC,MAAMwD,EAAeL,EAASnD,GAC9B,GAAqB,IAAjBwD,EAAoB,SAExB,MAAMM,EAAaD,EAAe7D,EAAI,EACtCV,EAAMC,KAAKN,KAAKsE,eAAeC,IAC3BM,EAAa,GAAK7E,KAAKsB,WAAWuD,IACpCxE,EAAMC,KAAKN,KAAKsB,WAAWuD,GAE/B,CAEA,OAAOxE,EAAMI,KAAK,KAAKqE,MACzB,ECzHK,MAAMC,UAAuBtF,EAUlCuF,UAAY,CAAA,EAOZC,kBAAoB,CAAA,EAOpBC,WAAa,CAAA,EAObC,cAAgB,CAAA,EAOhBC,cAAgB,CAAA,EAQhBC,YAAc,CAAA,EAcdC,aAAe,CAAA,EASfC,oBAAqB,EAYrBC,WAAAA,CAAa9F,EAAU,IACrB+F,QAEAzF,KAAKW,WAAW,CACd+E,OAAQ,aACPhG,EACL,CAmBAa,cAAAA,CAAgBJ,GACd,GAAoB,KAAhBA,EACF,OAAOH,KAAKH,SAGd,MAAMQ,EAAQ,GACR6D,EAAWlE,KAAK8D,gBAAgB3D,EAAY6D,WAAY,GAC9D,IAAI2B,EAAezB,EAASlD,OAE5B,IAAK,MAAMuD,KAAgBL,EAAU,CAGnC,GAFAyB,GAA8B,EAET,KAAjBpB,EACF,SAGF,MAAOqB,EAAWC,EAAWC,GAAiB9F,KAAK+F,cAAcxB,GAWjE,GATIuB,EAAgB,IAClBzF,EAAMC,KAAKN,KAAKoF,cAAcU,IAG5BD,EAAY,IACdxF,EAAMC,KAAKN,KAAKmF,cAAcU,IAId,KAAdA,EAEFxF,EAAMC,KAAKN,KAAKkF,WAAWU,SACtB,GAAIA,EAAY,MAGC5F,KAAKuF,oBAAsBI,EAAe,GAAsB,KAAjBpB,GAEjD,CAIlB,MAEMyB,GAFsD,IAApChG,KAAKsF,aAAaK,IACqB,aAAxB3F,KAAKN,QAAQgG,QAA0C,IAAjBC,EAC9C3F,KAAKiF,kBAAoBjF,KAAKgF,UAC7D3E,EAAMC,KAAK0F,EAAUJ,GACvB,CAIED,EAAe,GACjBtF,EAAMC,KAAKN,KAAKiG,UAAU1B,EAAcvE,KAAKqF,YAAYM,IAE7D,CAEA,OAAOtF,EAAMI,KAAK,IACpB,CAgBAqD,eAAAA,CAAiBoC,EAAcC,GAC7B,MAAMjC,EAAW,GACXkC,EAAeF,EAAalF,OAElC,GAAIoF,EAAeD,EAAa,CAC9B,MAAME,EAAkBD,EAAeD,EAEnCE,EAAkB,GACpBnC,EAAS5D,KAAKc,OAAO8E,EAAahF,MAAM,EAAGmF,KAG7C,IAAK,IAAItF,EAAIsF,EAAiBtF,EAAIqF,EAAcrF,GAAKoF,EACnDjC,EAAS5D,KAAKc,OAAO8E,EAAahF,MAAMH,EAAGA,EAAIoF,IAEnD,MACEjC,EAAS5D,KAAKc,OAAO8E,IAGvB,OAAOhC,CACT,CAWA6B,aAAAA,CAAeO,GAKb,MAAO,CAHWA,EAAQ,IACPA,EAAQ,IAAO,IACZA,EAAQ,KAEhC,CAmBAL,SAAAA,CAAWM,EAAQlB,GACjB,MAAMmB,EAAeD,EAAS,KACxBE,EAAcF,EAAS,IAG7B,OAAIC,GAAgB,KAAOA,GAAgB,IAClCnB,EAAY,GAGD,KAAhBoB,EACKpB,EAAY,GAGjBoB,GAAe,IAAMA,GAAe,GAC/BpB,EAAY,GAGdA,EAAY,EACrB,EC7QK,MAAMqB,UAAerF,EAC1B1B,aAAe,QACfC,qBAAuB,UACvBC,SAAW,OAEXyB,WAAa,CACX,CAAC,8BAAwC,gBACzC,CAAC,2BAAoC,eACrC,CAAC,wBAAgC,aACjC,CAAC,qBAA4B,YAC7B,CAAC,kBAAwB,YACzB,CAAC,eAAoB,WACrB,CAAC,YAAgB,YACjB,CAAC,SAAY,WACb,CAAC,MAAO,SACR,CAAC,KAAM,QACP,CAAC,IAAK,iBACN,CAAC,IAAK,YACN,CAAC,IAAK,aACN,CAAC,IAAK,YACN,CAAC,IAAK,UACN,CAAC,IAAK,SACN,CAAC,IAAK,YACN,CAAC,IAAK,YACN,CAAC,IAAK,YACN,CAAC,IAAK,SACN,CAAC,IAAK,UACN,CAAC,IAAK,YACN,CAAC,IAAK,UACN,CAAC,IAAK,SACN,CAAC,IAAK,QACN,CAAC,IAAK,OACN,CAAC,GAAI,QACL,CAAC,GAAI,QACL,CAAC,GAAI,QACL,CAAC,GAAI,OACL,CAAC,GAAI,QACL,CAAC,GAAI,UACL,CAAC,GAAI,SACL,CAAC,GAAI,QACL,CAAC,GAAI,MACL,CAAC,GAAI,SAGPkE,WAAAA,CAAa9F,EAAU,IACrB+F,QAEAzF,KAAKW,WAAW,CACdgG,qBAAqB,GACpBjH,GAECA,EAAQiH,sBACV3G,KAAKF,cAAgB,IAEzB,CAGAyC,eAAAA,CAAiBI,EAAWC,GAC1B,IAAIS,EAAgBH,OAAOC,KAAKR,GAAW,GACvCa,EAAgBN,OAAOC,KAAKP,GAAW,GAC3C,MAAMU,EAAiBJ,OAAO0D,OAAOjE,GAAW,GAC1Cc,EAAiBP,OAAO0D,OAAOhE,GAAW,GAEhD,GAAuB,KAAnBU,GACF,GAAIG,EAAiB,SACnB,OAAOb,QAILU,EAAiB,KAAO,MAAS,IAAOA,EAAiB,MAAS,IAAMA,EAAiB,QAC3FG,EAAiB,UACQ,MAAzBJ,EAAcwD,IAAG,KAEjBxD,EAAgBA,EAAcnC,MAAM,GAAG,IAIvCoC,EAAiB,OAA4B,QAAnBG,GACD,MAAzBD,EAAcqD,IAAG,IACjBpD,EAAiB,MAAS,KAE1BD,GAAiB,KAIrB,OAAIC,EAAiBH,GAAkBA,EAAiB,KAClDG,EAAiB,KAAQ,IAAyB,MAAnBH,EAC1B,CAAE,CAAC,GAAGD,IAAgBrD,KAAKF,kBAAkBE,KAAKF,gBAAgB0D,KAAkBF,EAAiBG,GAEvG,CAAE,CAAC,GAAGJ,KAAiBG,KAAkBF,EAAiBG,GAG/DA,EAAiBH,EAAuB,CAAE,CAAC,GAAGD,IAAgBrD,KAAKF,gBAAgB0D,KAAkBF,EAAiBG,GACnH,CAAE,CAAC,GAAGJ,IAAgBrD,KAAKF,gBAAgB0D,KAAkBF,EAAiBG,EACvF,EC9FK,MAAMqD,UAAmBzF,EAC9B1B,aAAe,QACfC,qBAAuB,UACvBC,SAAW,OAEXyB,WAAa,CACX,CAAC,2BAAoC,cACrC,CAAC,qBAA4B,WAC7B,CAAC,eAAoB,UACrB,CAAC,SAAY,UACb,CAAC,MAAO,OACR,CAAC,KAAM,OACP,CAAC,IAAK,WACN,CAAC,IAAK,WACN,CAAC,IAAK,WACN,CAAC,IAAK,YACN,CAAC,IAAK,aACN,CAAC,IAAK,YACN,CAAC,IAAK,UACN,CAAC,IAAK,SACN,CAAC,IAAK,YACN,CAAC,IAAK,WACN,CAAC,IAAK,aACN,CAAC,IAAK,aACN,CAAC,IAAK,UACN,CAAC,IAAK,WACN,CAAC,IAAK,SACN,CAAC,IAAK,QACN,CAAC,IAAK,QACN,CAAC,IAAK,OACN,CAAC,GAAI,QACL,CAAC,GAAI,QACL,CAAC,GAAI,QACL,CAAC,GAAI,QACL,CAAC,GAAI,SACL,CAAC,GAAI,UACL,CAAC,GAAI,QACL,CAAC,GAAI,QACL,CAAC,GAAI,MACL,CAAC,GAAI,SAGP8D,cAAgB,CACd,EAAG,QACH,EAAG,WACH,EAAG,YACH,EAAG,eACH,EAAG,aACH,EAAG,aACH,EAAG,aACH,EAAG,aACH,EAAG,cAIL2B,uBAAyB,yBAEzBlE,aAAAA,CAAexC,GACb,OAAOA,EAAM2G,WAAWF,EAAWG,gBAAiB,OACtD,CAGA1E,eAAAA,CAAiBI,EAAWC,GAE1B,IAAIS,EAAgBH,OAAOC,KAAKR,GAAW,GACvCa,EAAgBN,OAAOC,KAAKP,GAAW,GAC3C,MAAMU,EAAiBJ,OAAO0D,OAAOjE,GAAW,GAC1Cc,EAAiBP,OAAO0D,OAAOhE,GAAW,GAGhD,GAAuB,KAAnBU,EAAuB,CACzB,GAAIG,EAAiB,SAAY,MAAO,CAAED,CAACA,GAAgBC,GAC3DJ,EAAgB,IAClB,MAA8B,OAAnBC,GAA2BG,EAAiB,OAAU,KAE/DJ,EAAgB,SAGlB,OAAII,EAAiBH,EACZ,CAAE,CAAC,GAAGD,OAAmBG,KAAkBF,EAAiBG,IAI/C,WAAlBD,IAA4BA,EAAgB,UAG5CF,EAAiB,KACfG,EAAiB,aAAmB,GACtCD,EAAgBA,EAAc0D,QAAQ,SAAU,WACvCzD,EAAiB,UAAe,KACzCD,EAAgBA,EAAc0D,QAAQ,SAAU,aAI7B,OAAnBzD,GACFJ,EAAgBrD,KAAKoF,cAAc9B,GAC5B,CAAE,CAAC,GAAGD,KAAkBC,EAAiBG,IAG3C,CAAE,CAAC,GAAGJ,KAAiBG,KAAkBF,EAAiBG,GACnE,EC6HF,SAAS0D,EAAeC,GAMtB,OAAO,SAAyBd,EAAO5G,GACrC,QAAgB2H,IAAZ3H,IA0KR,SAAwB4G,GACtB,GAAc,OAAVA,GAAmC,iBAAVA,EAAoB,OAAO,EACxD,MAAMgB,EAAQpE,OAAOqE,eAAejB,GACpC,OAAOgB,IAAUpE,OAAOsE,WAAuB,OAAVF,CACvC,CA9KkCG,CAAc/H,GAC1C,MAAM,IAAIgI,UAAU,8CAGtB,MAAMxH,WAAEA,EAAUC,YAAEA,EAAWC,YAAEA,GAyBrC,SAA4BkG,GAC1B,MAAMqB,SAAcrB,EAGpB,GAAa,WAATqB,EACF,OAAOrB,EAAQ,GACX,CAAEpG,YAAY,EAAMC,aAAcmG,GAClC,CAAEpG,YAAY,EAAOC,YAAamG,GAIxC,GAAa,WAATqB,GAA8B,WAATA,EACvB,MAAM,IAAID,UACR,oEAAoEC,KAKxE,MAAMC,EAAe,WAATD,EAed,SAAyBrB,GACvB,IAAKrC,OAAO4D,SAASvB,GACnB,MAAM,IAAI5F,MAAM,8DAGlB,MAAMkH,EAAMtB,EAAMtC,WAGlB,OAAI4D,EAAIE,SAAS,MAAQF,EAAIE,SAAS,KAC7BC,EAAyBH,GAG3BA,CACT,CA3BMI,CAAe1B,GAoCrB,SAAiCA,GAC/B,MAAM2B,EAAU3B,EAAMxB,OAEtB,GAAuB,IAAnBmD,EAAQjH,OACV,MAAM,IAAIN,MAAM,2BAA2B4F,MAI7C,GAAIrC,OAAOiE,MAAMjE,OAAOgE,IACtB,MAAM,IAAIvH,MAAM,2BAA2B4F,MAI7C,OAAI2B,EAAQH,SAAS,MAAQG,EAAQH,SAAS,KACrCC,EAAyBE,GAG3BA,CACT,CArDME,CAAuB7B,GAE3B,OA2DF,SAA6BsB,GAE3B,MAAM1H,EAAwB,MAAX0H,EAAI,GACnB1H,IACF0H,EAAMA,EAAI1G,MAAM,IAIlB,MAAMkH,EAAWR,EAAIS,QAAQ,KAC7B,IAAiB,IAAbD,EACF,MAAO,CAAElI,aAAYC,YAAaiB,OAAOwG,IAG3C,MAAMU,EAAaV,EAAI1G,MAAM,EAAGkH,IAAa,IACvChI,EAAcwH,EAAI1G,MAAMkH,EAAW,GAEzC,MAAO,CAAElI,aAAYC,YAAaiB,OAAOkH,GAAalI,cACxD,CA5ESmI,CAAmBX,EAC5B,CAhDqDY,CAAkBlC,GACnE,OAAO,IAAIc,EAAc1H,GAASO,QAAQC,EAAYC,EAAaC,EACrE,CACF,CAiIA,SAAS2H,EAA0BH,GACjC,MAAOa,EAAUC,GAAUd,EAAIe,cAAcC,MAAM,KAC7CC,EAAMC,SAASJ,EAAQ,IAGvBN,EAAWK,EAASJ,QAAQ,KAC5BU,OAASX,EACXK,EACAA,EAASvH,MAAM,EAAGkH,GAAYK,EAASvH,MAAMkH,EAAW,GAItDY,IAH6B,IAAbZ,EAAkBK,EAASzH,OAASoH,GAGnBS,EAEvC,OAAIG,GAAkBD,EAAO/H,OAEpB+H,EAAS,IAAIE,OAAOD,EAAiBD,EAAO/H,QAGjDgI,GAAkB,EAEb,KAAO,IAAIC,QAAQD,GAAkBD,EAIvCA,EAAO7H,MAAM,EAAG8H,GAAkB,IAAMD,EAAO7H,MAAM8H,EAC9D,CA6BA,MAAME,EAA2F/B,ECta1F,cAAqB1H,EAC1BE,aAAe,OACfC,qBAAuB,QACvBC,SAAW,MAEXsJ,UAAY,CAAC,QAAS,SAAU,SAAU,QAAS,OAAQ,QAAS,SAAU,SAC9E/D,cAAgB,CAAC,GAAI,OAAQ,QAAS,WAAY,WAAY,UAAW,SAAU,UAAW,WAAY,WAG1G9D,WAAa,CAAC,OAAQ,MAAO,QAAS,QAAS,UAAW,aAAc,YAAa,aACrF8H,mBAAqB,CAAC,GAAI,QAAS,UAAW,UAAW,YAAa,eAAgB,cAAe,eACrGC,iBAAmB,CAAC,GAAI,OAAQ,SAAU,UAAW,YAAa,eAAgB,cAAe,eAGjGC,UAAY,CAAC,QAAS,QAAS,UAAW,UAAW,YAAa,eAAgB,cAAe,eACjGC,kBAAoB,CAAC,OAAQ,OAAQ,SAAU,SAAU,WAAY,cAAe,aAAc,cAGlGC,KAAO,CACLC,UAAW,CACT,OAAQ,QAAS,QAAS,QAAS,OAAQ,MAAO,OAAQ,SAAU,OAAQ,OAC5E,UAAW,WAAY,YAAa,YAAa,WAAY,UAAW,WAAY,aAAc,YAEpGC,SAAU,CACR,QAAS,SAAU,OAAQ,OAAQ,MAAO,KAAM,MAAO,OAAQ,MAAO,MACtE,YAAa,aAAc,YAAa,YAAa,WAAY,UAAW,WAAY,aAAc,aAI1GlE,WAAAA,CAAa9F,EAAU,IACrB+F,QAEAzF,KAAKW,WAAW,CACd+E,OAAQ,aACPhG,QAG0B2H,IAAzB3H,EAAQC,eACVK,KAAKL,aAAeD,EAAQC,aAEhC,CAGA,gBAAIgK,GACF,OAAO3J,KAAKwJ,KAA6B,aAAxBxJ,KAAKN,QAAQgG,OAAwB,WAAa,YACrE,CAGApB,cAAAA,CAAgBsF,EAAaC,EAAYC,GACvC,MAAMC,EAAOH,EAAc,IACrBI,EAAcJ,EAAc,IAC5BpF,EAAWC,KAAKC,MAAMsF,GAC5B,IAAIC,EAAc,GAGlB,GAAIzF,EAAW,EACb,GAAa,IAATuF,GAA2B,IAAbvF,EAChByF,EAAcjK,KAAKsJ,UAAU,OACxB,CACL,MAAMY,EAAelK,KAAKoF,cAAcZ,GACpC0F,IACFD,EAAcC,EACD,IAATH,IACFE,GAAe,MAGrB,CAIF,GAAIF,EAAO,EACT,GAAIA,EAAO,GACT,GAAa,IAATA,GAA2B,IAAbvF,GAAkBqF,EAAa,EAAG,CAElD,MAAMM,EAAWlG,OAAO6F,GAClBM,EAAM3F,KAAKC,MAAMD,KAAK4F,MAAMF,IAEhCF,EADEG,EAAM,GAAM,GAAKN,IAAe1I,OAAO,EAAIqD,KAAK2F,IAAI,GAAIA,IAC5B,IAAhBR,EAAoB5J,KAAKsJ,UAAUO,GAAc7J,KAAKuJ,kBAAkBM,GAExE7J,KAAKsJ,UAAUO,EAEjC,MACEI,GADkB,IAATF,GAAcF,EAAa,EACrB7J,KAAKsB,WAAWuI,GAEhB7J,KAAK2J,aAAaI,EAAO,OAErC,CACL,MAAMP,EAAOO,EAAO,GACdO,EAAY7F,KAAKC,MAAMqF,EAAO,IAAM,EAEtCP,EAAO,IACTS,GAAejK,KAAK2J,aAAaH,EAAO,GACxCS,GAAe,MAEjBA,GAAejK,KAAKmJ,UAAUmB,EAChC,CAGF,OAAOL,CACT,CAGA1J,cAAAA,CAAgBJ,GACd,GAAoB,KAAhBA,EACF,OAAOH,KAAKH,SAEd,IAAI0K,EAAOpK,EACPqK,EAAQ,EACRvH,EAAS,GAGb,KAAOsH,EAAO,IAAI,CAChB,MAAME,EAAkBxG,OAAOsG,EAAO,OAGtC,GAFAA,GAAc,MAEVE,EAAkB,EAAG,CACvB,MAAMC,EAAmB1K,KAAKsE,eAAemG,EAAiBD,EAAOrK,GAEjEuK,IAEEF,EAAQ,IACNvH,IACFA,EAAS,KAAOA,GAGdwH,EAAkB,KAGlBxH,EADgB,GADAwH,EAAkB,IAEzBzK,KAAKsB,WAAWkJ,GAAS,IAAMvH,EAC/BwH,GAAmB,GAAKA,GAAmB,GAC3CzK,KAAKqJ,iBAAiBmB,GAAS,IAAMvH,GAEpCA,EAASjD,KAAKoJ,mBAAmBoB,GAASxK,KAAKsB,WAAWkJ,IAAU,IAAMvH,GAM1FA,EAASyH,EAAmB,IAAMzH,EAEtC,CAEAuH,GACF,CAEA,OAAOvH,EAAOiE,QAAQ,OAAQ,KAAKpC,MACrC,IDqRI6F,EAAuExD,EExatE,cAA0B/D,EAC/BzD,aAAe,QACfC,qBAAuB,QACvBC,SAAW,QAEXyB,WAAa,CAAC,CAAC,qBAA4B,aACzC,CAAC,kBAAwB,aACzB,CAAC,eAAoB,WACrB,CAAC,YAAgB,UACjB,CAAC,SAAY,UACb,CAAC,MAAO,OACR,CAAC,KAAM,OACP,CAAC,IAAK,UACN,CAAC,IAAK,UACN,CAAC,IAAK,UACN,CAAC,IAAK,UACN,CAAC,IAAK,QACN,CAAC,IAAK,QACN,CAAC,IAAK,QACN,CAAC,IAAK,UACN,CAAC,IAAK,MACN,CAAC,GAAI,UACL,CAAC,GAAI,UACL,CAAC,GAAI,SACL,CAAC,GAAI,QACL,CAAC,GAAI,OACL,CAAC,GAAI,QACL,CAAC,GAAI,MACL,CAAC,GAAI,OACL,CAAC,GAAI,OACL,CAAC,GAAI,YF2YHsJ,EAAkEzD,EGzajE,cAAqBxD,EAC1BhE,aAAe,SACfC,qBAAuB,QACvBC,SAAW,QACXgE,YAAc,KAEdD,kBAAoB,CAClB,QACA,KACA,MACA,MACA,MACA,OACA,MACA,MACA,KACA,MACA,KACA,QACA,OACA,OACA,QACA,QACA,MACA,QACA,QACA,OACA,MACA,OACA,OACA,OACA,SACA,QACA,UACA,QACA,OACA,UACA,QACA,UACA,SACA,UACA,UACA,YACA,SACA,YACA,UACA,WACA,SACA,WACA,aACA,YACA,aACA,cACA,WACA,YACA,WACA,WACA,SACA,SACA,UACA,YACA,WACA,WACA,YACA,UACA,SACA,QACA,MACA,UACA,UACA,UACA,UACA,YACA,UACA,WACA,UACA,UACA,QACA,UACA,WACA,WACA,YACA,WACA,YACA,WACA,UACA,QACA,MACA,QACA,SACA,SACA,SACA,SACA,UACA,SACA,QACA,UACA,QACA,WACA,YACA,YACA,YACA,YACA,aACA,YACA,WACA,aAGFtC,WAAa,CACX,GACA,QACA,MACA,OACA,MACA,MACA,MACA,OACA,UHoTEuJ,EAA2G1D,EI1a1G,cAA6BpC,EAClCpF,aAAe,QACfC,qBAAuB,QACvBC,SAAW,MACXE,qBAAsB,EAGtBiF,UAAY,CACV,EAAG,MACH,EAAG,QACH,EAAG,OACH,EAAG,QACH,EAAG,OACH,EAAG,MACH,EAAG,OACH,EAAG,QACH,EAAG,QAGLE,WAAa,CACX,EAAG,OACH,EAAG,UACH,EAAG,WACH,EAAG,WACH,EAAG,YACH,EAAG,WACH,EAAG,UACH,EAAG,WACH,EAAG,YACH,EAAG,YAGLC,cAAgB,CACd,EAAG,QACH,E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,OACL,CAAC,GAAI,SACL,CAAC,GAAI,WACL,CAAC,GAAI,QACL,CAAC,GAAI,OACL,CAAC,GAAI,OACL,CAAC,GAAI,UAIPiB,eAAAA,CAAiBI,EAAWC,GAC1B,MAAMS,EAAgBH,OAAOC,KAAKR,GAAW,GACvCW,EAAiBJ,OAAO0D,OAAOjE,GAAW,GAC1Ca,EAAgBN,OAAOC,KAAKP,GAAW,GACvCa,EAAiBP,OAAO0D,OAAOhE,GAAW,GAGhD,OAAuB,KAAnBU,EACKV,EAOLa,EAAiBH,EACZ,CAAE,CAAC,GAAGD,KAAiBG,KAAkBF,EAAiBG,GAI5D,CAAE,CAAC,GAAGJ,KAAiBG,KAAkBF,EAAiBG,EACnE,IbuWImK,EAAoEzG,EcrbnE,cAAuBxD,EAC5BhE,aAAe,KACfC,qBAAuB,QACvBC,SAAW,QACXgE,YAAc,KACd9D,qBAAsB,EAEtB6D,kBAAoB,CAClB,QACA,KACA,KACA,OACA,MACA,OACA,IACA,MACA,KACA,KACA,KACA,SACA,MACA,MACA,MACA,OACA,MACA,QACA,OACA,QACA,MACA,QACA,QACA,UACA,QACA,OACA,SACA,WACA,WACA,WACA,QACA,UACA,SACA,UACA,UACA,WACA,SACA,WACA,UACA,WACA,QACA,UACA,UACA,YACA,WACA,YACA,UACA,WACA,UACA,UACA,OACA,QACA,OACA,SACA,OACA,SACA,QACA,UACA,UACA,SACA,MACA,OACA,OACA,SACA,OACA,QACA,OACA,OACA,OACA,cACA,UACA,SACA,QACA,QACA,UACA,UACA,QACA,YACA,WACA,WACA,OACA,UACA,SACA,SACA,WACA,SACA,SACA,WACA,UACA,WACA,QACA,SACA,QACA,UACA,UACA,UACA,SACA,WACA,WACA,YAGFtC,WAAa,CACX,GACA,OACA,MACA,OACA,MACA,MACA,MACA,OACA,Sd+TEuM,EAA2F1G,Eerb1F,cAAqBpC,EAC1BpF,aAAe,QACfC,qBAAuB,QACvBC,SAAW,MACXE,qBAAsB,EAGtBiF,UAAY,CACV,EAAG,MACH,EAAG,OACH,EAAG,MACH,EAAG,OACH,EAAG,MACH,EAA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,QACA,SACA,SACA,UACA,UACA,QACA,MACA,QACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,UACA,QACA,UACA,SACA,UACA,SACA,WACA,UACA,WACA,WACA,QACA,OACA,UACA,OACA,QACA,OACA,OACA,QACA,UACA,UACA,OACA,MACA,OACA,OACA,QACA,QACA,QACA,SACA,QACA,QACA,UACA,QACA,UACA,SACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,QACA,UACA,QACA,SACA,SACA,QACA,SACA,UACA,UACA,QACA,QACA,WACA,QACA,UACA,UACA,SACA,UACA,WACA,WACA,aAGFtC,WAAa,CACX,GACA,QACA,MACA,QACA,MACA,MACA,MACA,OACA,ShBkUEyM,EAAqE5G,EiBxbpE,cAAwB9F,EAC7B1B,aAAe,SACfC,qBAAuB,QACvBC,SAAW,QAEXyB,WAAa,CACX,CAAC,8BAAwC,gBACzC,CAAC,2BAAoC,cACrC,CAAC,wBAAgC,aACjC,CAAC,qBAA4B,WAC7B,CAAC,kBAAwB,YACzB,CAAC,eAAoB,UACrB,CAAC,YAAgB,YACjB,CAAC,SAAY,UACb,CAAC,MAAO,QACR,CAAC,KAAM,QACP,CAAC,IAAK,aACN,CAAC,IAAK,YACN,CAAC,IAAK,UACN,CAAC,IAAK,UACN,CAAC,IAAK,SACN,CAAC,IAAK,WACN,CAAC,IAAK,WACN,CAAC,IAAK,gBACN,CAAC,IAAK,eACN,CAAC,IAAK,aACN,CAAC,IAAK,aACN,CAAC,IAAK,YACN,CAAC,IAAK,cACN,CAAC,IAAK,eACN,CAAC,IAAK,eACN,CAAC,IAAK,aACN,CAAC,IAAK,QACN,CAAC,IAAK,eACN,CAAC,IAAK,cACN,CAAC,IAAK,YACN,CAAC,IAAK,YACN,CAAC,IAAK,WACN,CAAC,IAAK,aACN,CAAC,IAAK,cACN,CAAC,IAAK,cACN,CAAC,IAAK,YACN,CAAC,IAAK,OACN,CAAC,GAAI,UACL,CAAC,GAAI,SACL,CAAC,GAAI,OACL,CAAC,GAAI,OACL,CAAC,GAAI,MACL,CAAC,GAAI,QACL,CAAC,GAAI,SAC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Gf,MAAMC,EAAYF,EAAI,IAChBG,EAAgBH,EAAI,KAE1B,OAAIE,EAAY,IAAMA,EAAY,KAAOC,EAAgB,KAAOA,EAAgB,KACvEF,EAAM,GAGRA,EAAM,EACf,I7BmWIuG,EAAsEjL,EAAcL,GACpFuL,EAAmElL,E8BtclE,cAAsBxD,EAC3BhE,aAAe,QACfC,qBAAuB,SACvBC,SAAW,QACXgE,YAAc,KAEdD,kBAAoB,CAClB,QACA,MACA,KACA,OACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,SACA,QACA,QACA,QACA,SACA,QACA,SACA,SACA,OACA,MACA,OACA,MACA,MACA,OACA,OACA,OACA,OACA,OACA,QACA,MACA,QACA,OACA,OACA,QACA,QACA,OACA,QACA,QACA,SACA,OACA,SACA,QACA,UACA,SACA,SACA,QACA,UACA,SACA,QACA,QACA,SACA,QACA,SACA,UACA,UACA,QACA,UACA,SACA,QACA,MACA,QACA,OACA,OACA,QACA,QACA,QACA,OACA,OACA,SACA,OACA,SACA,QACA,QACA,SACA,UACA,SACA,QACA,QACA,QACA,OACA,SACA,QACA,SACA,UACA,QACA,QACA,SACA,QACA,QACA,OACA,UACA,SACA,UACA,WACA,WACA,UACA,UACA,UACA,YAGFtC,WAAa,CACX,GACA,QACA,MACA,OACA,MACA,MACA,MACA,MACA,U9BiVEgR,EAA+FnL,E+Bvc9F,cAAuB1H,EAC5BE,aAAe,QACfC,qBAAuB,UACvBC,SAAW,OAEXmF,UAAY,CACV,EAAG,MACH,EAAG,MACH,EAAG,OACH,EAAG,QACH,EAAG,QACH,EAAG,OACH,EAAG,QACH,EAAG,MACH,EAAG,QAGLC,kBAAoB,CAClB,EAAG,MACH,EAAG,OACH,EAAG,OACH,EAAG,QACH,EAAG,QACH,EAAG,OACH,EAAG,QACH,EAAG,MACH,EAAG,QAGLC,WAAa,CACX,EAAG,OACH,EAAG,aACH,EAAG,eACH,EAAG,eACH,EAAG,cACH,EAAG,gBACH,EAAG,cACH,EAAG,gBACH,EAAG,cACH,EAAG,gBAGLqN,oBAAsB,C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A,SACA,SACA,SACA,QACA,MACA,MACA,QACA,SACA,QACA,YACA,aACA,YACA,YACA,YACA,UACA,UACA,YACA,aACA,SACA,eACA,gBACA,iBACA,iBACA,eACA,aACA,aACA,eACA,gBACA,UACA,gBACA,iBACA,kBACA,kBACA,gBACA,cACA,cACA,gBACA,iBACA,UACA,gBACA,iBACA,kBACA,kBACA,gBACA,cACA,cACA,gBACA,iBACA,SACA,eACA,gBACA,iBACA,iBACA,eACA,aACA,aACA,eACA,gBACA,SACA,eACA,gBACA,iBACA,iBACA,eACA,aACA,aACA,eACA,gBACA,SACA,eACA,gBACA,iBACA,iBACA,eACA,aACA,aACA,eACA,gBACA,SACA,eACA,gBACA,iBACA,iBACA,eACA,aACA,aACA,eACA,gBACA,WACA,mBACA,oBACA,oBACA,oBACA,mBACA,iBACA,iBACA,mBACA,qBAGFwB,cAAgB,CACd,GACA,OACA,UACA,WACA,SACA,QACA,UACA,UACA,UACA,eAIFJ,UAAY,CACV,QACA,SACA,SACA,SACA,QACA,MACA,MACA,QACA,UAGF1D,WAAa,CACX,GACA,SACA,SACA,OACA,OACA,QACA,OACA,OACA,SAIF4T,mBAAAA,CAAqB3O,GACnB,OAAOvG,KAAK4D,kBAAkB2C,EAChC,CAEA4O,oBAAAA,CAAsB5O,GACpB,GAAe,IAAXA,EAAc,MAAO,GACzB,GAAIA,EAAS,IAAK,OAAOvG,KAAKkV,oBAAoB3O,GAElD,MAAM/B,EAAWC,KAAKC,MAAM6B,EAAS,KAC/BtF,EAAYsF,EAAS,IAC3B,IAAI6O,EAAcpV,KAAKoF,cAAcZ,GAEjCvD,EAAY,IACVmU,EAAYzI,SAAS,MACvByI,EAAcA,EAAYlO,QAAQ,MAAO,QAChCkO,EAAYzI,SAAS,QAC9ByI,EAAcA,EAAYlU,MAAM,GAAG,GAAM,SAI7C,MAAMyD,EAAQ,CAACyQ,GAKf,OAJInU,EAAY,GACd0D,EAAMrE,KAAKN,KAAKkV,oBAAoBjU,IAG/B0D,EAAMlE,KAAK,KAAKqE,MACzB,CAEAuQ,WAAAA,CAAa9O,GAC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Ae,OACfC,qBAAuB,UACvBC,SAAW,MACXgE,YAAc,KAEdD,kBAAoB,CAClB,MACA,MACA,KACA,MACA,MACA,OACA,KACA,MACA,MACA,KACA,KACA,QACA,OACA,OACA,OACA,QACA,OACA,OACA,SACA,OACA,MACA,OACA,QACA,QACA,QACA,OACA,QACA,SACA,UACA,QACA,MACA,QACA,OACA,SACA,SACA,SACA,QACA,SACA,QACA,UACA,QACA,UACA,SACA,WACA,SACA,WACA,SACA,WACA,UACA,QACA,OACA,QACA,OACA,OACA,MACA,OACA,OACA,QACA,SACA,QACA,OACA,QACA,QACA,QACA,SACA,SACA,UACA,QACA,QACA,QACA,MACA,QACA,OACA,OACA,QACA,QACA,QACA,OACA,SACA,QACA,MACA,SACA,QACA,SACA,SACA,QACA,SACA,QACA,SACA,QACA,MACA,SACA,QACA,SACA,UACA,SACA,UACA,SACA,UACA,UAGFtC,WAAa,CACX,GACA,OACA,OACA,OACA,MACA,OACA,MACA,MACA,U7CgWEgV,GAAsEnP,E8CtdrE,cAAyB1H,EAC9BE,aAAe,KACfC,qBAAuB,OACvBC,SAAW,QAEX0W,iBAAmB,CACjB,EAAG,QACH,EAAG,MACH,EAAG,MACH,EAAG,KACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,OACH,GAAI,OACJ,GAAI,WACJ,GAAI,WACJ,GAAI,UACJ,GAAI,WACJ,GAAI,WACJ,GAAI,WACJ,GAAI,WACJ,GAAI,WACJ,GAAI,aAGNpR,cAAgB,CACd,GAAI,WACJ,GAAI,UACJ,GAAI,WACJ,GAAI,WACJ,GAAI,WACJ,GAAI,WACJ,GAAI,WACJ,GAAI,aAGN7D,WAAa,CACX,EAAG,QACH,EAAG,QACH,EAAG,KACH,EAAG,WACH,EAAG,gBACH,EAAG,cACH,EAAG,aACH,EAAG,aACH,EAAG,YACH,GAAI,YACJ,GAAI,YACJ,GAAI,cACJ,GAAI,eACJ,GAAI,eACJ,GAAI,oBACJ,GAAI,eACJ,GAAI,kBACJ,GAAI,gBACJ,GAAI,iBACJ,GAAI,gBAINkV,cAAAA,CAAgBjQ,GACd,MAAMkQ,EAAYlQ,EAAS,GACrBmQ,EAAWnQ,EAASkQ,EACpBE,EAAe3W,KAAKmF,cAAcuR,GACxC,GAAkB,IAAdD,EACF,OAAOE,EAGT,IAAI1E,EADkBjS,KAAKuW,iBAAiBE,GAQ5C,OANkB,IAAdA,IACFxE,EAAS,OAEO,IAAdwE,IACFxE,EAAS,OAEJ0E,EAAe,IAAM1E,CAC9B,CAGA2E,eAAAA,CAAiBrQ,GACf,MAAMlG,EAAQ,GACRwW,EAAgBtQ,EAAS,IACzBuQ,EAAevQ,EAASsQ,EAiB9B,OAhBIC,EAAe,GACjBzW,EAAMC,KAAKN,KAAKuW,iBAAiBO,EAAe,KAAM,QAEpDD,EAAgB,GAAKA,EAAgB,KACnCxW,EAAMW,OAAS,GACjBX,EAAMC,KAAK,MAES,IAAlBuW,EACFxW,EAAMC,KAAK,OAEXD,EAAMC,KAAKN,KAAKuW,iBAAiBM,KAGjCA,GAAiB,IACnBxW,EAAMC,KAAKN,KAAKO,eAAesW,IAE1BxW,EAAMI,KAAK,IACpB,CAGAsW,eAAAA,CAAiBxQ,GACf,MAAMlG,EAAQ,GACd,IAAI2W,EAAWzQ,EAAS,MACpB0Q,EAAQ,EACZ,KAAOD,GAAY,OACjBA,GAAsB,MACtBC,GAAgB,EAElB,MAAMxD,EAAIlN,EAAUyQ,EAAW5V,OAAOqD,KAAK2F,IAAI,IAAM6M,IAQrD,OAPA5W,EAAMC,KAAKN,KAAKO,eAAeyW,GAAWhX,KAAKsB,WAAW2V,IACtDxD,EAAI,KACFA,GAAK,KACPpT,EAAMC,KAAK,MAEbD,EAAMC,KAAKN,KAAKO,eAAekT,KAE1BpT,EAAMI,KAAK,IACpB,CAEAF,cAAAA,CAAgBJ,GACd,OAAIA,EAAc,IACTH,KAAKuW,iBAAiBtS,OAAO9D,IAEhCA,EAAc,KACTH,KAAKwW,eAAevS,OAAO9D,IAE1BA,EAAc,MAAQH,KAAK4W,gBAAgB3S,OAAO9D,IAAgBH,KAAK+W,gBAAgB5W,EAGrG"}