indickit 0.6.0 → 0.9.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.
- package/README.md +245 -29
- package/dist/deromanize.js +1 -0
- package/dist/normalize.js +1 -204
- package/dist/phonetic-search.js +1 -0
- package/dist/phonetic.js +1 -836
- package/dist/romanize.js +1 -743
- package/dist/segment.js +1 -175
- package/dist/stem.js +1 -48
- package/dist/types/js/deromanize.d.ts +57 -0
- package/dist/types/js/phonetic-search.d.ts +104 -0
- package/dist/types/js/phonetic.d.ts +14 -0
- package/dist/types/js/stem.d.ts +1 -0
- package/dist/types/js/unidata.d.ts +36 -0
- package/dist/types/js/wellformed.d.ts +31 -0
- package/dist/wellformed.js +1 -0
- package/package.json +14 -2
package/README.md
CHANGED
|
@@ -3,14 +3,20 @@
|
|
|
3
3
|
Small, exact utilities for text in the languages of India, in Go and
|
|
4
4
|
TypeScript. They fix the places where ordinary string code goes wrong on
|
|
5
5
|
Indian text: a search that misses a word because it is spelled, encoded or
|
|
6
|
-
inflected another way, a letter count that cuts a letter in two,
|
|
7
|
-
that must be written in Latin letters
|
|
6
|
+
inflected another way, a letter count that cuts a letter in two, a name
|
|
7
|
+
that must be written in Latin letters, and Latin typing that must be written
|
|
8
|
+
in an Indian script.
|
|
9
|
+
|
|
10
|
+
Try each utility in your browser, in all 22 languages:
|
|
11
|
+
https://micahchoo.github.io/indickit/docs/demo/
|
|
8
12
|
|
|
9
13
|
```
|
|
10
14
|
stem किताब किताबें किताबों → किताब
|
|
11
15
|
phonetic राम ರಾಮ രാമ ராம رام Ram → rn
|
|
12
16
|
segment ಲಕ್ಷ್ಮಿ → ಲ ಕ್ಷ್ಮಿ
|
|
13
17
|
romanize लक्ष्मी ലക്ഷ്മി லக்ஷ்மி → lakshmi
|
|
18
|
+
deromanize namaste → नमस्ते
|
|
19
|
+
wellformed िहन्दी हिन्दी → broken whole
|
|
14
20
|
```
|
|
15
21
|
|
|
16
22
|
Each utility gives the same output in Go and in TypeScript, and each was
|
|
@@ -24,8 +30,49 @@ measured on data that its rules were never built on.
|
|
|
24
30
|
| let a search for किताब also find किताबों | `normalize`, then `stem` |
|
|
25
31
|
| let a search for हिन्दी also find हिंदी, and keep words whole | `fold` |
|
|
26
32
|
| find a person's name typed in another script | `phonetic` |
|
|
33
|
+
| find a name in a long list, as people write it (titles, initials), or in running text | `phonetic-search` |
|
|
27
34
|
| count letters, cut at a length, or move a cursor | `segment` |
|
|
28
35
|
| write a name or a text in Latin letters (लक्ष्मी → lakshmi) | `romanize` |
|
|
36
|
+
| let a search for "modi" find मोदी | `romanize` the index; see the recipe |
|
|
37
|
+
| write Latin typing in an Indian script (namaste → नमस्ते) | `deromanize` |
|
|
38
|
+
| reject or flag text that no font can draw whole (a PDF text layer) | `wellformed` |
|
|
39
|
+
|
|
40
|
+
## Languages
|
|
41
|
+
|
|
42
|
+
The 22 languages of the Eighth Schedule. `normalize`, `fold`, `segment` and
|
|
43
|
+
`phonetic` read every script below, so they serve every language; the
|
|
44
|
+
others hold tables for some languages only.
|
|
45
|
+
|
|
46
|
+
| Language | Code | Script | `stem` | `phonetic-search` | `romanize` | `deromanize` |
|
|
47
|
+
|---|---|---|---|---|---|---|
|
|
48
|
+
| Assamese | `as` | Bengali-Assamese | ✓ | ✓ | words, names | words, names |
|
|
49
|
+
| Bengali | `bn` | Bengali-Assamese | ✓ | ✓ | words, names | words, names |
|
|
50
|
+
| Bodo | `brx` | Devanagari | – | ✓ | words | words |
|
|
51
|
+
| Dogri | `doi` | Devanagari | – | ✓ | words | words |
|
|
52
|
+
| Gujarati | `gu` | Gujarati | ✓ | ✓ | words, names | words, names |
|
|
53
|
+
| Hindi | `hi` | Devanagari | ✓ | ✓ | words, names | words, names |
|
|
54
|
+
| Kannada | `kn` | Kannada | ✓ | ✓ | words, names | words, names |
|
|
55
|
+
| Kashmiri | `ks` | Perso-Arabic | – | ✓ | words, names | words, names |
|
|
56
|
+
| Konkani | `gom` | Devanagari | – | ✓ | words, names | words, names |
|
|
57
|
+
| Maithili | `mai` | Devanagari | – | ✓ | words, names | words, names |
|
|
58
|
+
| Malayalam | `ml` | Malayalam | ✓ | ✓ | words, names | words, names |
|
|
59
|
+
| Manipuri | `mni` | Meetei Mayek, Bengali-Assamese | – | ✓ | words, names | words, names |
|
|
60
|
+
| Marathi | `mr` | Devanagari | ✓ | ✓ | words, names | words, names |
|
|
61
|
+
| Nepali | `ne` | Devanagari | ✓ | ✓ | words, names | words, names |
|
|
62
|
+
| Odia | `or` | Odia | – | ✓ | words, names | words, names |
|
|
63
|
+
| Punjabi | `pa` | Gurmukhi | ✓ | ✓ | words, names | words, names |
|
|
64
|
+
| Sanskrit | `sa` | Devanagari | ✓ | ✓ | words, names | words, names |
|
|
65
|
+
| Santali | `sat` | Ol Chiki | – | keys only | names | names |
|
|
66
|
+
| Sindhi | `sd` | Perso-Arabic | – | ✓ | words, names | words, names |
|
|
67
|
+
| Tamil | `ta` | Tamil | ✓ | ✓ | words, names | words, names |
|
|
68
|
+
| Telugu | `te` | Telugu | ✓ | ✓ | words, names | words, names |
|
|
69
|
+
| Urdu | `ur` | Perso-Arabic | ✓ | ✓ | words, names | words, names |
|
|
70
|
+
|
|
71
|
+
"words" and "names" are the two modes of `romanize` and `deromanize`. In
|
|
72
|
+
`deromanize`, the names mode of Bodo and Dogri uses their words tables.
|
|
73
|
+
Santali has no words tables: no dataset of Santali words in Latin letters
|
|
74
|
+
was found. `phonetic-search` in Santali ranks by the keys alone. Measured
|
|
75
|
+
quality differs by language; see `docs/` for each utility.
|
|
29
76
|
|
|
30
77
|
## Install
|
|
31
78
|
|
|
@@ -45,25 +92,29 @@ deno add npm:indickit
|
|
|
45
92
|
|
|
46
93
|
The package is ES modules only; `require()` works from Node 20.19. In
|
|
47
94
|
TypeScript, set `moduleResolution` to `nodenext` or `bundler`; the old
|
|
48
|
-
`node10` cannot find the
|
|
95
|
+
`node10` cannot find the utilities.
|
|
49
96
|
|
|
50
97
|
In a browser, with no build step:
|
|
51
98
|
|
|
52
99
|
```js
|
|
53
|
-
import { normalize } from "https://cdn.jsdelivr.net/gh/micahchoo/indickit@v0.
|
|
54
|
-
import { stem } from "https://cdn.jsdelivr.net/gh/micahchoo/indickit@v0.
|
|
55
|
-
import { match } from "https://cdn.jsdelivr.net/gh/micahchoo/indickit@v0.
|
|
56
|
-
import { segment } from "https://cdn.jsdelivr.net/gh/micahchoo/indickit@v0.
|
|
57
|
-
import { load } from "https://cdn.jsdelivr.net/gh/micahchoo/indickit@v0.
|
|
100
|
+
import { normalize } from "https://cdn.jsdelivr.net/gh/micahchoo/indickit@v0.9.0/dist/normalize.js";
|
|
101
|
+
import { stem } from "https://cdn.jsdelivr.net/gh/micahchoo/indickit@v0.9.0/dist/stem.js";
|
|
102
|
+
import { match } from "https://cdn.jsdelivr.net/gh/micahchoo/indickit@v0.9.0/dist/phonetic.js";
|
|
103
|
+
import { segment } from "https://cdn.jsdelivr.net/gh/micahchoo/indickit@v0.9.0/dist/segment.js";
|
|
104
|
+
import { load } from "https://cdn.jsdelivr.net/gh/micahchoo/indickit@v0.9.0/dist/romanize.js";
|
|
105
|
+
import { loadSearch } from "https://cdn.jsdelivr.net/gh/micahchoo/indickit@v0.9.0/dist/phonetic-search.js";
|
|
106
|
+
import { load as loadDeromanize } from "https://cdn.jsdelivr.net/gh/micahchoo/indickit@v0.9.0/dist/deromanize.js";
|
|
107
|
+
import { isWellFormed } from "https://cdn.jsdelivr.net/gh/micahchoo/indickit@v0.9.0/dist/wellformed.js";
|
|
58
108
|
```
|
|
59
109
|
|
|
60
110
|
Each utility is its own file, so a page loads only the rules it uses.
|
|
61
111
|
`romanize` also loads one language's tables when you ask for them (0.2–1.8
|
|
62
|
-
MB)
|
|
112
|
+
MB), `deromanize` one language's tables and word list (0.3–3.1 MB), and
|
|
113
|
+
`phonetic-search` one language's table (2–6 KB). The npm package carries no tables: `load()` reads them beside the
|
|
63
114
|
module (a jsDelivr or GitHub-tag install), else from jsDelivr at the same
|
|
64
115
|
version. Offline, pass your own `fetch`. In Go, `go get` downloads the
|
|
65
|
-
tables of every language once (14 MB); a
|
|
66
|
-
it imports.
|
|
116
|
+
tables of every language once (`romanize` 14 MB, `deromanize` 52 MB); a
|
|
117
|
+
program carries only the languages it imports.
|
|
67
118
|
|
|
68
119
|
## Recipes
|
|
69
120
|
|
|
@@ -82,6 +133,22 @@ normalize("അവന്\u200d", "ml"); // "അവൻ": the old chillu becomes th
|
|
|
82
133
|
normalize("र्\u200dय", "mr"); // "र्\u200dय": eyelash ra; this ZWJ is visible, so it stays
|
|
83
134
|
```
|
|
84
135
|
|
|
136
|
+
### Reject text no font can draw
|
|
137
|
+
|
|
138
|
+
A PDF text layer or an OCR run gives words that no font can draw whole: a
|
|
139
|
+
vowel sign typed before its letter, a conjunct with a member dropped. A
|
|
140
|
+
renderer shows a dotted circle (◌) there. `normalize` cannot repair such a
|
|
141
|
+
word, because it never moves a sign. `wellformed` finds it before you store
|
|
142
|
+
it: 10.8% of the words in PDF text layers are broken, 0.012% in clean text.
|
|
143
|
+
|
|
144
|
+
```ts
|
|
145
|
+
import { isWellFormed, brokenAt } from "indickit/wellformed";
|
|
146
|
+
|
|
147
|
+
isWellFormed("\u093fहन्दी"); // false: the vowel sign ि has no letter before it
|
|
148
|
+
isWellFormed("हिन्दी"); // true
|
|
149
|
+
brokenAt("क्ि"); // 2: a vowel sign after a virama
|
|
150
|
+
```
|
|
151
|
+
|
|
85
152
|
### Search words in their other forms
|
|
86
153
|
|
|
87
154
|
Give every word of a document a key, and give the query the same key. The
|
|
@@ -117,6 +184,12 @@ fold("हिन्दी", "hi"); // "हिंदी"
|
|
|
117
184
|
fold("गाँव", "hi"); // "गांव"
|
|
118
185
|
```
|
|
119
186
|
|
|
187
|
+
Urdu and Sindhi often write two words as one (ہو گیا and ہوگیا). `fold`
|
|
188
|
+
does not join them: joining the stored text glues 39% of Urdu words to the
|
|
189
|
+
word before. Instead, search a phrase twice, as typed and with its spaces
|
|
190
|
+
removed. On new Wikipedia text that finds 3–4% more of a phrase's hits in
|
|
191
|
+
Urdu and 6–14% in Sindhi, with 0.6% and 1.3% wrong hits.
|
|
192
|
+
|
|
120
193
|
### Find a name in any script
|
|
121
194
|
|
|
122
195
|
One person's name is typed in Devanagari on one form, in Malayalam on a
|
|
@@ -147,6 +220,26 @@ Equal keys mean "sounds alike", not "the same person". Before you merge two
|
|
|
147
220
|
records, weigh the evidence: a shared rare name says more than a shared
|
|
148
221
|
common one.
|
|
149
222
|
|
|
223
|
+
### Search a list of names
|
|
224
|
+
|
|
225
|
+
`phonetic-search` uses the keys to find candidates, and a scorer learned
|
|
226
|
+
from data to rank them from 0 to 100. It finds names as people write them,
|
|
227
|
+
with titles, initials and joined words, and names in running text.
|
|
228
|
+
|
|
229
|
+
```ts
|
|
230
|
+
import { loadSearch, THRESHOLDS } from "indickit/phonetic-search";
|
|
231
|
+
|
|
232
|
+
const s = await loadSearch("hi"); // fetches the Hindi table (3 KB)
|
|
233
|
+
const ix = s.index(["नरेश मोदी", "नरेंद्र मोदी", "मनमोहन सिंह"]);
|
|
234
|
+
ix.search("Narendra Modi", THRESHOLDS.names); // [{ name: 1, score: 100 }]
|
|
235
|
+
ix.search("Manmohan Singh", THRESHOLDS.names); // [{ name: 2, score: 96 }]
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
Use the threshold for your task: `THRESHOLDS.names` (74) for a list of
|
|
239
|
+
people, `THRESHOLDS.villages` (72) for place names, `THRESHOLDS.text_10`
|
|
240
|
+
(80) or `text_20` (70) with `s.index(words, "text")` for a name among the
|
|
241
|
+
words of a text. A score is relative to the other candidates of its search.
|
|
242
|
+
|
|
150
243
|
### Count and cut letters
|
|
151
244
|
|
|
152
245
|
A cursor, a backspace, a letter count and a cut at a length limit must
|
|
@@ -189,6 +282,70 @@ import (
|
|
|
189
282
|
romanize.Word("लक्ष्मी", "hi", romanize.Words, 2) // [lakshmi laxmi]
|
|
190
283
|
```
|
|
191
284
|
|
|
285
|
+
### Find native text with a Latin query
|
|
286
|
+
|
|
287
|
+
A user types "modi" in a search box; the store holds मोदी. When you build
|
|
288
|
+
the index, romanize each stored word in the `"words"` mode and store its
|
|
289
|
+
four most likely spellings in a Latin field beside it:
|
|
290
|
+
|
|
291
|
+
```ts
|
|
292
|
+
import { load } from "indickit/romanize";
|
|
293
|
+
|
|
294
|
+
const hi = await load("hi"); // the "words" mode
|
|
295
|
+
hi.word("मोदी", 4); // ["modi","modee","moudi","mody"]
|
|
296
|
+
hi.word("दिल्ली", 4); // ["dilli","dili","dilly","dilley"]
|
|
297
|
+
hi.word("सरकार", 4); // ["sarkar","sarkaar","sarakar","sarakaar"]
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
At query time, lower-case the query and fuzzy-match it against that field:
|
|
301
|
+
a hit is a word with a stored spelling one or two edits from the query
|
|
302
|
+
(Elasticsearch: `fuzziness: AUTO`). The browser needs no model, and the
|
|
303
|
+
index needs no download beyond the tables it was romanized with.
|
|
304
|
+
|
|
305
|
+
On Wikipedia sentences typed in Latin letters by native speakers (Dakshina,
|
|
306
|
+
11 languages, held out), the first hit is the right word 81.4% of the time,
|
|
307
|
+
and one of the first four is 91.3%. IndicXlit, a 119 MB neural model that
|
|
308
|
+
writes the query in the native script, gives 81.8% and 87.6%. The index
|
|
309
|
+
leads in Bengali, Hindi, Kannada, Malayalam, Marathi, Tamil and Telugu, is
|
|
310
|
+
level in Gujarati and Punjabi, and trails in Sindhi and Urdu. Its cost is a
|
|
311
|
+
long list: 24 hits a search, and more than half of the first ten are other
|
|
312
|
+
words. See [docs/romanize.md](docs/romanize.md#a-latin-query-on-a-romanized-index).
|
|
313
|
+
|
|
314
|
+
Two other ways were measured. Do not put the `phonetic` key on both sides:
|
|
315
|
+
it finds the right word first 38.0% of the time and floods the list; it is
|
|
316
|
+
for names, not words. Do not write the query in the native script
|
|
317
|
+
(`deromanize`, the next recipe) for a ranked list: that is the right way
|
|
318
|
+
for a strict filter, where every hit must be the word itself, but for a
|
|
319
|
+
ranked list the romanized index is as good and needs no second download.
|
|
320
|
+
|
|
321
|
+
### Write Latin typing in an Indian script
|
|
322
|
+
|
|
323
|
+
`deromanize` is the reverse: it gives a ranked list of native spellings for
|
|
324
|
+
a Latin-typed word, most likely first. It writes every word it is given in
|
|
325
|
+
the Indian script, English words too: in mixed text, find each word's
|
|
326
|
+
language first.
|
|
327
|
+
|
|
328
|
+
```ts
|
|
329
|
+
import { load } from "indickit/deromanize";
|
|
330
|
+
|
|
331
|
+
const hi = await load("hi"); // fetches the Hindi tables and word list
|
|
332
|
+
hi.word("namaste", 1); // ["नमस्ते"]
|
|
333
|
+
hi.text("bharat ke pradhanmantri"); // "भारत के प्रधानमंत्री"
|
|
334
|
+
const ur = await load("ur", "names");
|
|
335
|
+
ur.word("ahmad", 1); // ["احمد"]
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
In Go:
|
|
339
|
+
|
|
340
|
+
```go
|
|
341
|
+
import (
|
|
342
|
+
"github.com/micahchoo/indickit/deromanize"
|
|
343
|
+
_ "github.com/micahchoo/indickit/deromanize/lang/hi"
|
|
344
|
+
)
|
|
345
|
+
|
|
346
|
+
deromanize.Word("namaste", "hi", deromanize.Words, 1) // [नमस्ते]
|
|
347
|
+
```
|
|
348
|
+
|
|
192
349
|
### The same in Go
|
|
193
350
|
|
|
194
351
|
```go
|
|
@@ -197,11 +354,14 @@ import (
|
|
|
197
354
|
"github.com/micahchoo/indickit/phonetic"
|
|
198
355
|
"github.com/micahchoo/indickit/segment"
|
|
199
356
|
"github.com/micahchoo/indickit/stem"
|
|
357
|
+
"github.com/micahchoo/indickit/wellformed"
|
|
200
358
|
)
|
|
201
359
|
|
|
202
360
|
normalize.Text("അവന്\u200d", "ml") // "അവൻ"
|
|
361
|
+
wellformed.Check("\u093fहन्दी") // false
|
|
203
362
|
stem.Stem(normalize.Text("किताबों", "hi"), "hi") // किताब
|
|
204
363
|
phonetic.Match("Mohanlal", "മോഹൻലാൽ") // true
|
|
364
|
+
phonetic.NewIndex(names, "hi", phonetic.ProfileNames).Search("Narendra Modi", phonetic.Thresholds["names"])
|
|
205
365
|
segment.Segment("ಲಕ್ಷ್ಮಿ") // [ಲ ಕ್ಷ್ಮಿ]
|
|
206
366
|
```
|
|
207
367
|
|
|
@@ -217,11 +377,20 @@ segment.Segment("ಲಕ್ಷ್ಮಿ") // [ಲ ಕ್ಷ
|
|
|
217
377
|
| `phonetic.NameKeys(name)` | `nameKeys(name)` | the keys of a whole name; index these |
|
|
218
378
|
| `phonetic.Match(a, b)` | `match(a, b)` | same word count, and each pair of words shares a key |
|
|
219
379
|
| `phonetic.Words(name)` | `words(name)` | the words, split as the others split them |
|
|
380
|
+
| `phonetic.JoinedKeys(name)` | `joinedKeys(name)` | the keys of the name with its words joined (8+ classes) |
|
|
381
|
+
| `phonetic.NewIndex(names, lang, profile)` | `(await loadSearch(lang)).index(names, profile?)` | names keyed once for searching |
|
|
382
|
+
| `ix.Search(query, threshold)` | `ix.search(query, threshold?)` | the names scoring at least threshold, best first |
|
|
383
|
+
| `phonetic.Score(query, names, lang, profile)` | `(await loadSearch(lang)).score(query, names, profile?)` | one score (0..100) per candidate |
|
|
220
384
|
| `segment.Segment(s)` | `segment(text)` | the letters, in order; joined, they give the text back |
|
|
221
385
|
| `segment.Count(s)` | `count(text)` | how many letters a reader sees |
|
|
222
386
|
| `romanize.Word(w, lang, mode, n)` | `(await load(lang, mode)).word(w, n?)` | up to n spellings, most likely first |
|
|
223
387
|
| `romanize.Text(s, lang, mode)` | `(await load(lang, mode)).text(text)` | each word of the language's script in Latin letters |
|
|
224
388
|
| `romanize.Languages(mode)` | `languages(mode)` | the languages with tables (Go: those imported) |
|
|
389
|
+
| `deromanize.Word(latin, lang, mode, n)` | `(await load(lang, mode)).word(latin, n?)` | up to n native spellings, most likely first |
|
|
390
|
+
| `deromanize.Text(s, lang, mode)` | `(await load(lang, mode)).text(text)` | each run of Latin letters in the language's script |
|
|
391
|
+
| `deromanize.Languages(mode)` | `languages(mode)` | the languages with tables (Go: those imported) |
|
|
392
|
+
| `wellformed.Check(s)` | `isWellFormed(text)` | true when a font draws the text with no dotted circle |
|
|
393
|
+
| `wellformed.BrokenAt(s)` | `brokenAt(text)` | where the first dotted circle would be (Go: byte index; TypeScript: UTF-16 index), or -1 |
|
|
225
394
|
|
|
226
395
|
Three things hold for all of them:
|
|
227
396
|
|
|
@@ -244,21 +413,33 @@ other tools tried and each weak spot are in `docs/`.
|
|
|
244
413
|
|
|
245
414
|
| Utility | Result | Best other tool | Browser file | Details |
|
|
246
415
|
|---|---|---|---|---|
|
|
247
|
-
| `normalize` | makes 88.1% of look-alike spellings equal, and changes the look of no word | Indic NLP Library: 82.4%, and changes 0.68% of words |
|
|
416
|
+
| `normalize` | makes 88.1% of look-alike spellings equal, and changes the look of no word | Indic NLP Library: 82.4%, and changes 0.68% of words | 16 KB | [docs/normalize.md](docs/normalize.md) |
|
|
248
417
|
| `stem` | finds 6–15 points more of the right sentences than exact search, in 13 languages | ahead in 5 languages, level in 2, a trade in 4, behind in Nepali | 3 KB | [docs/stem.md](docs/stem.md) |
|
|
249
|
-
| `phonetic` | finds the right person 84% of the time, in 21 languages, on clean names; 42% on a real roster as written (70% with titles and initials removed) | romanize + Soundex: 23% in Tamil, 70% in Hindi; cannot read Urdu |
|
|
250
|
-
| `segment` | cuts 0.05% of Kannada words wrongly | `Intl.Segmenter`: 50.3% |
|
|
251
|
-
| `romanize` | writes 48.9% of the words of running text as people typed them, in 11 languages; 71.3% of names (tables: 0.2–1.8 MB a language) | IndicXlit (Python, a 119 MB model): 37.9% and 49.0% |
|
|
418
|
+
| `phonetic` | finds the right person 84% of the time, in 21 languages, on clean names; 42% on a real roster as written (70% with titles and initials removed); with `phonetic-search`, 86% of a real roster as written and 85% of villages | romanize + Soundex: 23% in Tamil, 70% in Hindi; cannot read Urdu; ICU + fuzzy match: 78% and 65% | 7 KB | [docs/phonetic.md](docs/phonetic.md) |
|
|
419
|
+
| `segment` | cuts 0.05% of Kannada words wrongly | `Intl.Segmenter`: 50.3% | 8 KB | [docs/segment.md](docs/segment.md) |
|
|
420
|
+
| `romanize` | writes 48.9% of the words of running text as people typed them, in 11 languages; 71.3% of names (tables: 0.2–1.8 MB a language) | IndicXlit (Python, a 119 MB model): 37.9% and 49.0% | 7 KB | [docs/romanize.md](docs/romanize.md) |
|
|
421
|
+
| `deromanize` | writes the right word first for 87.1% of the words of Hindi news typed in Latin, and in four for 97.4%; 69.7% of names in 19 languages (tables: 0.3–3.1 MB a language) | IndicXlit: 86.1%, 89.7% and 66.4%; behind on rare words out of context | 21 KB | [docs/deromanize.md](docs/deromanize.md) |
|
|
422
|
+
| `wellformed` | agrees with HarfBuzz on 100% of 135,944 held-out PDF words (9,594 of them broken) and 2,146,974 new Wikipedia words | a check that the word starts with a combining sign: finds 84% of the broken words, with 4,667 false alarms | 6 KB | [docs/wellformed.md](docs/wellformed.md) |
|
|
252
423
|
|
|
253
424
|
(Browser files are gzipped.)
|
|
254
425
|
|
|
426
|
+
`romanize` is also ahead of every tool tried that runs without a neural model. The
|
|
427
|
+
best of them, indic-trans (about 200 MB), gives 34.7% on running text against
|
|
428
|
+
51.2%, on the development data; it is ahead only in Urdu. See
|
|
429
|
+
[docs/romanize.md](docs/romanize.md).
|
|
430
|
+
|
|
255
431
|
## Limits
|
|
256
432
|
|
|
433
|
+
- **`deromanize` writes English words in the Indian script too.** About 8%
|
|
434
|
+
of the words of romanized Hinglish are English; find each word's language
|
|
435
|
+
first. On rare words out of context it is 10 points behind IndicXlit. See
|
|
436
|
+
[docs/deromanize.md](docs/deromanize.md).
|
|
257
437
|
- **Only HarfBuzz was tested** for "looks the same" (`normalize`,
|
|
258
438
|
`segment`). Windows and Apple draw text with their own engines.
|
|
259
|
-
-
|
|
260
|
-
initials before you key a name
|
|
261
|
-
wrong matches. See
|
|
439
|
+
- **The `phonetic` key expects clean names.** Remove titles (Shri, Smt.)
|
|
440
|
+
and initials before you key a name, or use `phonetic-search`. On one-word
|
|
441
|
+
place names the key alone returns many wrong matches. See
|
|
442
|
+
[docs/phonetic.md](docs/phonetic.md).
|
|
262
443
|
- **Tamil is the weakest language** for `phonetic` (76%), and `stem` is
|
|
263
444
|
behind Snowball's recall in Tamil.
|
|
264
445
|
- **`stem` does not help passage search in Hindi or Punjabi.** Short
|
|
@@ -274,14 +455,38 @@ other tools tried and each weak spot are in `docs/`.
|
|
|
274
455
|
are not among them.
|
|
275
456
|
- **`romanize` is behind IndicXlit on places and on rare single words**
|
|
276
457
|
(by 7–13 and 5.5 points). Santali has names only; Bodo and Dogri have
|
|
277
|
-
text only.
|
|
458
|
+
text only. Manipuri in Bengali script loses syllables in the words mode;
|
|
459
|
+
its tables were trained on Meetei Mayek. See [docs/romanize.md](docs/romanize.md).
|
|
460
|
+
- **`normalize` keeps the direction marks LRM and RLM** (U+200E, U+200F).
|
|
461
|
+
Text copied from the web carries them, and they hide a match on 0.04% of
|
|
462
|
+
Wikipedia redirect titles. Next to right-to-left text or digits, deleting
|
|
463
|
+
one can change the order a reader sees, and the glyph oracle cannot see
|
|
464
|
+
that. Strip them yourself before `normalize` when the text has no
|
|
465
|
+
right-to-left part.
|
|
466
|
+
- **`wellformed` gives HarfBuzz's verdict only.** DirectWrite (Windows) and
|
|
467
|
+
CoreText (Apple) insert dotted circles by their own grammars. Arabic and
|
|
468
|
+
Ol Chiki text is always whole. A verdict that needs more than three
|
|
469
|
+
characters of context (three or more invisible characters in a row) can
|
|
470
|
+
be wrong. See [docs/wellformed.md](docs/wellformed.md).
|
|
471
|
+
- **Cap user input before `phonetic-search`.** Its cost grows with (query
|
|
472
|
+
words) x (candidate words): a 4,096-character query takes seconds. See
|
|
473
|
+
[docs/phonetic.md](docs/phonetic.md#search-phonetic-search).
|
|
474
|
+
- **A word of more than 256 letters gets one spelling** from `romanize`
|
|
475
|
+
and `deromanize`: each 256-letter piece is spelled alone and the pieces
|
|
476
|
+
are joined. A run that long is not a word; the cap keeps the time linear.
|
|
278
477
|
- **Go reads invalid UTF-8 as U+FFFD**, so for such input the output does
|
|
279
478
|
not join back into the original bytes.
|
|
280
|
-
- **"The same output" holds inside the blocks indickit reads.**
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
479
|
+
- **"The same output" holds inside the blocks indickit reads.** There,
|
|
480
|
+
both ports read one pinned table of Unicode 15.0 data
|
|
481
|
+
(`internal/unidata/unicode15.json`), whatever Unicode version the host
|
|
482
|
+
ships; a letter added since 15.0 is not a letter to indickit. Outside the
|
|
483
|
+
blocks (Latin accents, symbols), Go reads x/text's Unicode 15.0 and
|
|
484
|
+
TypeScript reads its host (node 24: 17.0), so a newer mark there can give
|
|
485
|
+
another output: "Ram" plus U+0897 has the key `rn` in TypeScript and none
|
|
486
|
+
in Go. Tests pin the table (`unicode_test.go`, `js/unidata.test.ts`).
|
|
487
|
+
The table costs about 2.8 KB gzipped in each browser file that reads it
|
|
488
|
+
(`normalize`, `phonetic`, `phonetic-search`, `romanize`, `deromanize`);
|
|
489
|
+
without it, those files would follow each browser's Unicode version.
|
|
285
490
|
- **Two promises have a scope.** `normalize` twice gives what `normalize`
|
|
286
491
|
once gives for text with at most 8 invisible characters; 9 BOMs before
|
|
287
492
|
૰ need a second call. `normalize` changes no `phonetic` key of a word
|
|
@@ -293,22 +498,33 @@ Each utility's own weak spots are at the end of its file in `docs/`.
|
|
|
293
498
|
|
|
294
499
|
Every table and switch of a utility is in its rules file
|
|
295
500
|
(`normalize/rules.json`, `stem/rules.json`, `phonetic/rules.json`,
|
|
296
|
-
`segment/rules.json`; `romanize/rules.json` and its tables in
|
|
297
|
-
`romanize/lang
|
|
501
|
+
`segment/rules.json`, `wellformed/rules.json`; `romanize/rules.json` and its tables in
|
|
502
|
+
`romanize/lang/`; `deromanize/rules.json` and its tables and word lists in
|
|
503
|
+
`deromanize/lang/`; `phonetic-search`'s tables in `phonetic/scorer/`); the
|
|
504
|
+
Go and TypeScript code is a short loop over it.
|
|
298
505
|
Both are checked against a conformance file of inputs with the outputs that
|
|
299
506
|
a reference implementation gave them: 345,276 inputs for `normalize`,
|
|
300
507
|
418,665 for `stem`, 195,994 for `phonetic`, 858,654 for `segment`, 2,397
|
|
301
|
-
for `romanize`
|
|
302
|
-
(`*/testdata
|
|
508
|
+
for `romanize`, 2,990 for `deromanize`, 32,279 for `wellformed`, and 1,021 search rows for
|
|
509
|
+
`phonetic-search` (`*/testdata/*conformance.jsonl.gz`). A change that makes any one disagree
|
|
303
510
|
on any input fails the build.
|
|
304
511
|
|
|
305
512
|
## Credits and licence
|
|
306
513
|
|
|
307
514
|
MIT. The test words are Wikidata labels (CC0). The rules were tuned on
|
|
308
515
|
Wikidata and PIB Parallel (Press Information Bureau releases), and checked
|
|
309
|
-
on AI4Bharat's Aksharantar and on Wikipedia text
|
|
516
|
+
on AI4Bharat's Aksharantar and on Wikipedia text. No text of theirs ships
|
|
517
|
+
here, except `deromanize`'s word counts (below).
|
|
310
518
|
`normalize` and `segment` were checked in fonts by Google (Noto), Ek Type
|
|
311
519
|
(Anek), SIL, SMC and others. `stem`'s endings were mined from PIB text;
|
|
312
520
|
Wiktionary's inflection tables (CC BY-SA), Universal Dependencies
|
|
313
521
|
treebanks and FLORES+ (CC BY-SA) were used only to measure them. It was
|
|
314
522
|
compared with Snowball, Lucene and the Indic NLP Library.
|
|
523
|
+
|
|
524
|
+
`romanize` and `deromanize` learned from AI4Bharat's Aksharantar (CC BY for
|
|
525
|
+
its hand-collected pairs, CC0 for its mined pairs), Wikidata labels (CC0),
|
|
526
|
+
and IndicXlit's romanizations (MIT) of frequent Wikipedia words.
|
|
527
|
+
`deromanize`'s tables hold word lists: counts of the words of Wikipedia
|
|
528
|
+
(text CC BY-SA 4.0) and, for Bodo and Dogri, of IndicCorp v2 (CC0). Both
|
|
529
|
+
were measured against IndicXlit, on Google's Dakshina (CC BY-SA 4.0) and,
|
|
530
|
+
for `deromanize`, on COMI-LINGUA (CC BY 4.0), used only to measure.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var x={alpha:{names:0.5,words:1},beam:40,blocks:{as:2432,bn:2432,gu:2688,kn:3200,ml:3328,mni:2432,or:2816,pa:2560,ta:2944,te:3072},bos:"<s>",cut_modes:["names"],eos:"</s>",families:{names:{as:{file:"as.names.bin",group:"brahmic",pooled:"names-brahmic.bin",tag:"as"},bn:{file:"bn.names.bin",group:"brahmic",pooled:"names-brahmic.bin",tag:"bn"},gom:{file:"gom.names.bin",group:"brahmic",pooled:"names-brahmic.bin",tag:"gom"},gu:{file:"gu.names.bin",group:"brahmic",pooled:"names-brahmic.bin",tag:"gu"},hi:{file:"hi.names.bin",group:"brahmic",pooled:"names-brahmic.bin",tag:"hi"},kn:{file:"kn.names.bin",group:"brahmic",pooled:"names-brahmic.bin",tag:"kn"},ks:{file:"ks.names.bin",group:"arabic",pooled:"names-arabic.bin",tag:"ks"},mai:{file:"mai.names.bin",group:"brahmic",pooled:"names-brahmic.bin",tag:"mai"},ml:{file:"ml.names.bin",group:"brahmic",pooled:"names-brahmic.bin",tag:"ml"},mni:{file:"mni.names.bin",group:"meetei",pooled:"names-meetei.bin",tag:"mni"},mr:{file:"mr.names.bin",group:"brahmic",pooled:"names-brahmic.bin",tag:"mr"},ne:{file:"ne.names.bin",group:"brahmic",pooled:"names-brahmic.bin",tag:"ne"},or:{file:"or.names.bin",group:"brahmic",pooled:"names-brahmic.bin",tag:"or"},pa:{file:"pa.names.bin",group:"brahmic",pooled:"names-brahmic.bin",tag:"pa"},sa:{file:"sa.names.bin",group:"brahmic",pooled:"names-brahmic.bin",tag:"sa"},sat:{file:"sat.names.bin",group:"olchiki",pooled:"names-olchiki.bin",tag:"sat"},sd:{file:"sd.names.bin",group:"arabic",pooled:"names-arabic.bin",tag:"sd"},ta:{file:"ta.names.bin",group:"brahmic",pooled:"names-brahmic.bin",tag:"ta"},te:{file:"te.names.bin",group:"brahmic",pooled:"names-brahmic.bin",tag:"te"},ur:{file:"ur.names.bin",group:"arabic",pooled:"names-arabic.bin",tag:"ur"}},words:{as:{file:"as.words.bin",group:"brahmic",pooled:"words-brahmic.bin",tag:"as:w"},bn:{file:"bn.words.bin",group:"brahmic",pooled:"words-brahmic.bin",tag:"bn:w"},brx:{file:"brx.words.bin",group:"brahmic",pooled:"words-brahmic.bin",tag:"brx:w"},doi:{file:"doi.words.bin",group:"brahmic",pooled:"words-brahmic.bin",tag:"doi:w"},gom:{file:"gom.words.bin",group:"brahmic",pooled:"words-brahmic.bin",tag:"gom:w"},gu:{file:"gu.words.bin",group:"brahmic",pooled:"words-brahmic.bin",tag:"gu:w"},hi:{file:"hi.words.bin",group:"brahmic",pooled:"words-brahmic.bin",tag:"hi:w"},kn:{file:"kn.words.bin",group:"brahmic",pooled:"words-brahmic.bin",tag:"kn:w"},ks:{file:"ks.words.bin",group:"arabic",pooled:"words-arabic.bin",tag:"ks:w"},mai:{file:"mai.words.bin",group:"brahmic",pooled:"words-brahmic.bin",tag:"mai:w"},ml:{file:"ml.words.bin",group:"brahmic",pooled:"words-brahmic.bin",tag:"ml:w"},mni:{file:"mni.words.bin",group:"meetei",pooled:"words-meetei.bin",tag:"mni:w"},mr:{file:"mr.words.bin",group:"brahmic",pooled:"words-brahmic.bin",tag:"mr:w"},ne:{file:"ne.words.bin",group:"brahmic",pooled:"words-brahmic.bin",tag:"ne:w"},or:{file:"or.words.bin",group:"brahmic",pooled:"words-brahmic.bin",tag:"or:w"},pa:{file:"pa.words.bin",group:"brahmic",pooled:"words-brahmic.bin",tag:"pa:w"},sa:{file:"sa.words.bin",group:"brahmic",pooled:"words-brahmic.bin",tag:"sa:w"},sd:{file:"sd.words.bin",group:"arabic",pooled:"words-arabic.bin",tag:"sd:w"},ta:{file:"ta.words.bin",group:"brahmic",pooled:"words-brahmic.bin",tag:"ta:w"},te:{file:"te.words.bin",group:"brahmic",pooled:"words-brahmic.bin",tag:"te:w"},ur:{file:"ur.words.bin",group:"arabic",pooled:"words-arabic.bin",tag:"ur:w"}}},files:{"as.list.bin":968637,"as.names-list.bin":36290,"as.names.bin":56650,"as.words.bin":176986,"bn.list.bin":3079000,"bn.names-list.bin":80018,"bn.names.bin":93290,"bn.words.bin":274214,"brx.list.bin":1380902,"brx.words.bin":178898,"doi.list.bin":130906,"doi.words.bin":31566,"gom.list.bin":539579,"gom.names-list.bin":2161,"gom.names.bin":8019,"gom.words.bin":213860,"gu.list.bin":1340814,"gu.names-list.bin":14290,"gu.names.bin":28406,"gu.words.bin":269838,"hi.list.bin":2135004,"hi.names-list.bin":67117,"hi.names.bin":95894,"hi.words.bin":346268,"kn.list.bin":5503072,"kn.names-list.bin":31357,"kn.names.bin":49035,"kn.words.bin":180882,"ks.list.bin":79144,"ks.names-list.bin":9689,"ks.names.bin":25155,"ks.words.bin":282541,"mai.list.bin":300299,"mai.names-list.bin":15030,"mai.names.bin":30010,"mai.words.bin":265014,"ml.list.bin":7515032,"ml.names-list.bin":54838,"ml.names.bin":77706,"ml.words.bin":216480,"mni.list.bin":143844,"mni.names-list.bin":5010,"mni.names.bin":5929,"mni.words.bin":124789,"mr.list.bin":2490422,"mr.names-list.bin":52737,"mr.names.bin":73778,"mr.words.bin":227461,"names-arabic.bin":150824,"names-brahmic.bin":453871,"names-meetei.bin":47333,"names-olchiki.bin":108903,"ne.list.bin":1360103,"ne.names-list.bin":13305,"ne.names.bin":28449,"ne.words.bin":218450,"or.list.bin":875046,"or.names-list.bin":33026,"or.names.bin":49200,"or.words.bin":198961,"pa.list.bin":1194784,"pa.names-list.bin":59690,"pa.names.bin":75324,"pa.words.bin":289107,"sa.list.bin":1837666,"sa.names-list.bin":6983,"sa.names.bin":20106,"sa.words.bin":169505,"sat.list.bin":484539,"sat.names-list.bin":34457,"sat.names.bin":65022,"sd.list.bin":402905,"sd.names-list.bin":2602,"sd.names.bin":8121,"sd.words.bin":327439,"ta.list.bin":5456850,"ta.names-list.bin":115847,"ta.names.bin":118779,"ta.words.bin":178395,"te.list.bin":2904372,"te.names-list.bin":114224,"te.names.bin":119410,"te.words.bin":199661,"ur.list.bin":1546931,"ur.names-list.bin":61255,"ur.names.bin":99309,"ur.words.bin":380888,"words-arabic.bin":858744,"words-brahmic.bin":1682820,"words-meetei.bin":204368,"words-olchiki.bin":70815},groups:{arabic:[[1536,1791],[1872,1919],[64336,65023]],brahmic:[[2304,3455]],meetei:[[43744,44031]],olchiki:[[7248,7295]]},lists:{as:{names:"as.names-list.bin",words:"as.list.bin"},bn:{names:"bn.names-list.bin",words:"bn.list.bin"},brx:{words:"brx.list.bin"},doi:{words:"doi.list.bin"},gom:{names:"gom.names-list.bin",words:"gom.list.bin"},gu:{names:"gu.names-list.bin",words:"gu.list.bin"},hi:{names:"hi.names-list.bin",words:"hi.list.bin"},kn:{names:"kn.names-list.bin",words:"kn.list.bin"},ks:{names:"ks.names-list.bin",words:"ks.list.bin"},mai:{names:"mai.names-list.bin",words:"mai.list.bin"},ml:{names:"ml.names-list.bin",words:"ml.list.bin"},mni:{names:"mni.names-list.bin",words:"mni.list.bin"},mr:{names:"mr.names-list.bin",words:"mr.list.bin"},ne:{names:"ne.names-list.bin",words:"ne.list.bin"},or:{names:"or.names-list.bin",words:"or.list.bin"},pa:{names:"pa.names-list.bin",words:"pa.list.bin"},sa:{names:"sa.names-list.bin",words:"sa.list.bin"},sat:{names:"sat.names-list.bin",words:"sat.list.bin"},sd:{names:"sd.names-list.bin",words:"sd.list.bin"},ta:{names:"ta.names-list.bin",words:"ta.list.bin"},te:{names:"te.names-list.bin",words:"te.list.bin"},ur:{names:"ur.names-list.bin",words:"ur.list.bin"}},max_letters:256,max_n:3,nbest:16,order:3,rules_version:"2026-10-09.2",silent:"aeiouhwy",unify:{from:[2432,3455],mask:127,to_block:2304},unknown_penalty:20,version:1};var p="0.9.0";function Z(n){let j=(n??"").toLowerCase().split(/[-_]/)[0],s=j.length===3?"asm as ben bn guj gu hin hi kan kn kas ks mal ml mar mr nep ne ori or pan pa san sa snd sd tam ta tel te urd ur ".indexOf(j+" "):-1;return s>=0&&s%7===0?"asm as ben bn guj gu hin hi kan kn kas ks mal ml mar mr nep ne ori or pan pa san sa snd sd tam ta tel te urd ur ".slice(s+4,s+6):j}var J={version:"2026-10-07",max_passes:8,chillu:{map:{ണ:"ൺ",ന:"ൻ",ര:"ർ",ല:"ൽ",ള:"ൾ",ക:"ൿ"},virama:"്",joiner:"",not_before:"റ"},ra:{virama:"্",assamese:"ৰ",bengali:"র",assamese_langs:["as"]},khanda_ta:{from:"ত্",to:"ৎ",not_before:[[2433,2435],[2492,2519],[2530,2531]]},invisible:{"":"n","":"j","":"s","":"w","\uFEFF":"f","":"h"},width:[3,3],scripts:[["Devanagari",[[2304,2431],[43232,43263]]],["Bengali",[[2432,2559]]],["Gurmukhi",[[2560,2687]]],["Gujarati",[[2688,2815]]],["Oriya",[[2816,2943]]],["Tamil",[[2944,3071]]],["Telugu",[[3072,3199]]],["Kannada",[[3200,3327]]],["Malayalam",[[3328,3455]]],["MeeteiMayek",[[43744,43775],[43968,44031]]],["OlChiki",[[7248,7295]]],["Arabic",[[1536,1791],[1872,1919],[64336,65023],[65136,65279]]]],classes:[[1536,1541,"U"],[1544,1544,"U"],[1547,1547,"U"],[1552,1562,"M"],[1568,1568,"A"],[1569,1569,"U"],[1570,1573,"R"],[1574,1574,"A"],[1575,1575,"R"],[1576,1576,"A"],[1577,1577,"R"],[1578,1582,"A"],[1583,1586,"R"],[1587,1599,"A"],[1600,1600,"K"],[1601,1607,"A"],[1608,1608,"R"],[1609,1610,"A"],[1611,1631,"M"],[1646,1647,"A"],[1648,1648,"M"],[1649,1651,"R"],[1652,1652,"U"],[1653,1655,"R"],[1656,1671,"A"],[1672,1689,"R"],[1690,1727,"A"],[1728,1728,"R"],[1729,1730,"A"],[1731,1739,"R"],[1740,1740,"A"],[1741,1741,"R"],[1742,1742,"A"],[1743,1743,"R"],[1744,1745,"A"],[1746,1747,"R"],[1749,1749,"R"],[1750,1756,"M"],[1757,1757,"U"],[1759,1764,"M"],[1767,1768,"M"],[1770,1773,"M"],[1774,1775,"R"],[1786,1788,"A"],[1791,1791,"A"],[1872,1880,"A"],[1881,1883,"R"],[1884,1898,"A"],[1899,1900,"R"],[1901,1904,"A"],[1905,1905,"R"],[1906,1906,"A"],[1907,1908,"R"],[1909,1911,"A"],[1912,1913,"R"],[1914,1919,"A"],[2304,2307,"B"],[2308,2324,"I"],[2325,2361,"C"],[2362,2363,"M"],[2364,2364,"N"],[2366,2380,"M"],[2381,2381,"V"],[2382,2383,"M"],[2389,2391,"M"],[2392,2399,"C"],[2400,2401,"I"],[2402,2403,"M"],[2418,2423,"I"],[2424,2431,"C"],[2433,2435,"B"],[2437,2444,"I"],[2447,2448,"I"],[2451,2452,"I"],[2453,2472,"C"],[2474,2480,"C"],[2482,2482,"C"],[2486,2489,"C"],[2492,2492,"N"],[2494,2500,"M"],[2503,2504,"M"],[2507,2508,"M"],[2509,2509,"V"],[2510,2510,"D"],[2519,2519,"M"],[2524,2525,"C"],[2527,2527,"C"],[2528,2529,"I"],[2530,2531,"M"],[2544,2545,"C"],[2556,2556,"B"],[2561,2563,"B"],[2565,2570,"I"],[2575,2576,"I"],[2579,2580,"I"],[2581,2600,"C"],[2602,2608,"C"],[2610,2611,"C"],[2613,2614,"C"],[2616,2617,"C"],[2620,2620,"N"],[2622,2626,"M"],[2631,2632,"M"],[2635,2636,"M"],[2637,2637,"V"],[2649,2652,"C"],[2654,2654,"C"],[2672,2672,"B"],[2689,2691,"B"],[2693,2701,"I"],[2703,2705,"I"],[2707,2708,"I"],[2709,2728,"C"],[2730,2736,"C"],[2738,2739,"C"],[2741,2745,"C"],[2748,2748,"N"],[2750,2757,"M"],[2759,2761,"M"],[2763,2764,"M"],[2765,2765,"V"],[2784,2785,"I"],[2786,2787,"M"],[2809,2809,"C"],[2813,2815,"N"],[2817,2819,"B"],[2821,2828,"I"],[2831,2832,"I"],[2835,2836,"I"],[2837,2856,"C"],[2858,2864,"C"],[2866,2867,"C"],[2869,2873,"C"],[2876,2876,"N"],[2878,2884,"M"],[2887,2888,"M"],[2891,2892,"M"],[2893,2893,"V"],[2901,2903,"M"],[2908,2909,"C"],[2911,2911,"C"],[2912,2913,"I"],[2914,2915,"M"],[2929,2929,"C"],[2946,2946,"B"],[2949,2954,"I"],[2958,2960,"I"],[2962,2964,"I"],[2965,2965,"C"],[2969,2970,"C"],[2972,2972,"C"],[2974,2975,"C"],[2979,2980,"C"],[2984,2986,"C"],[2990,3001,"C"],[3006,3010,"M"],[3014,3016,"M"],[3018,3020,"M"],[3021,3021,"V"],[3031,3031,"M"],[3072,3076,"B"],[3077,3084,"I"],[3086,3088,"I"],[3090,3092,"I"],[3093,3112,"C"],[3114,3129,"C"],[3132,3132,"N"],[3134,3140,"M"],[3142,3144,"M"],[3146,3148,"M"],[3149,3149,"V"],[3157,3158,"M"],[3160,3162,"C"],[3165,3165,"D"],[3168,3169,"I"],[3170,3171,"M"],[3200,3203,"B"],[3205,3212,"I"],[3214,3216,"I"],[3218,3220,"I"],[3221,3240,"C"],[3242,3251,"C"],[3253,3257,"C"],[3260,3260,"N"],[3262,3268,"M"],[3270,3272,"M"],[3274,3276,"M"],[3277,3277,"V"],[3285,3286,"M"],[3293,3293,"D"],[3294,3294,"C"],[3296,3297,"I"],[3298,3299,"M"],[3315,3315,"B"],[3328,3332,"B"],[3333,3340,"I"],[3342,3344,"I"],[3346,3348,"I"],[3349,3386,"C"],[3387,3388,"V"],[3390,3396,"M"],[3398,3400,"M"],[3402,3404,"M"],[3405,3405,"V"],[3412,3414,"D"],[3415,3415,"M"],[3423,3425,"I"],[3426,3427,"M"],[3450,3455,"D"],[7258,7287,"C"],[7288,7293,"B"],[43250,43251,"B"],[43262,43262,"I"],[43263,43263,"M"],[43744,43745,"I"],[43746,43754,"C"],[43755,43759,"M"],[43765,43765,"B"],[43766,43766,"V"],[43968,43981,"C"],[43982,43983,"I"],[43984,43984,"C"],[43985,43985,"I"],[43986,43994,"C"],[44003,44010,"M"],[44013,44013,"V"],[64336,64433,"U"],[64467,64829,"U"],[64848,64911,"U"],[64914,64967,"U"],[65008,65019,"U"],[65136,65140,"U"],[65142,65276,"U"]],features:["script","char","left1","left2","left3","right1","right2","right3"],tree:[0,{b:[7,{$:[6,{$:[2,{"?":[5,{"$?KUjns":1}],A:[1,{fw:[5,{$:[3,{AKU:1}],"?AKRUjns":1}],h:[5,{$:[3,{AKU:1}],"?AKUjns":1,R:[4,{"?AMR^s":1}]}],j:[5,{Kj:1}],n:[5,{$:[3,{AKU:1}],"?Uns":1,M:[4,{"MR^":1}]}],s:[5,{$:[3,{AKU:1}],"?AKRUjns":1,M:[4,{"MR^":1}]}]}],K:[5,{$Ujns:1,AR:[1,{fhsw:1}]}],U:[5,{"$?jns":1,AR:[1,{fhnsw:1}],M:[1,{ns:1}]}],j:[1,{fhjsw:1,n:[5,{$:[4,{"?AKMRUjn":1}],"?MUjns":1,K:[3,{A:1}]}]}],n:[1,{fhw:[5,{"$?AKRUjns":1}],j:[5,{$:[4,{"?AKMRUjn":1}],"?KUjns":1}],ns:1}],s:[1,{fhw:[5,{"$?AKRUjns":1}],j:[5,{$:[3,{"?KUjn":1}],"?":[3,{"?R":1}],Kj:1,U:[3,{R:1}]}],n:[5,{"$?Uns":1,A:[3,{RU:1}],M:[3,{AUn:1}],R:[3,{R:1}]}],s:1}],M:[3,{A:[1,{fhsw:[5,{"$?ARjns":1}],j:[5,{j:1}],n:[5,{"$?ns":1}]}],M:[4,{A:[1,{fhsw:1}],M:[5,{$jns:1}],R:[1,{fhnsw:1}],"U^":1}],R:[5,{"$?Ujns":1,AR:[1,{fhnsw:1}]}],U:[5,{"$?jns":1}],n:1,"^":[5,{$hjns:1}]}],R:[5,{$s:[3,{AKMRUn:1}],AR:[1,{fhnsw:1}],"?KUjn":1,M:[1,{n:[3,{A:1}],s:1}]}],h:1,"^":[1,{fhnsw:1}]}],"?":[2,{"?^":1,j:[1,{fhjsw:1,n:[5,{"?M":1}]}],n:[1,{fhw:[5,{"?AR":1}],j:[5,{"?":1}],ns:1}],s:[1,{fhw:[5,{"?AR":1}],j:[3,{"?":1}],n:[3,{"?R":1,A:[5,{M:1}]}],s:1}],A:[1,{fhw:[5,{ARjns:1}],j:[5,{R:[3,{A:1}],j:1}],n:[5,{Mns:1}],s:1}],M:[3,{A:[1,{fhsw:[5,{jns:1}],j:[5,{j:1}],n:[5,{ns:1}]}],M:[1,{fhsw:1}],R:[5,{jns:1}],U:1}],R:[5,{AR:[1,{fhnsw:1}],Ujns:1,M:[1,{ns:1}]}],U:[5,{jns:1}]}],A:[5,{"?":1,j:[1,{fhjsw:1,n:[2,{KRUn:1,M:[3,{R:1}]}]}],n:[1,{fhnsw:1,j:[2,{KRUjn:1,M:[3,{R:1}]}]}],s:[1,{fhsw:1,n:[2,{RUn:1,M:[3,{R:1}]}]}],R:[1,{fsw:1,h:[3,{"?KMRU^fjn":1,A:[2,{KMRjn:1}]}],j:[2,{j:1}],n:[2,{Rn:1,Ms:[3,{R:1}]}]}],A:[1,{fhsw:1,j:[2,{A:[3,{U:1}],j:1}],n:[2,{RUn:1,s:[3,{Rn:1}],M:[3,{R:1}]}]}],K:[1,{fhsw:1,jn:[2,{jn:1}]}],M:[1,{s:[2,{ARjns:1}],n:[2,{Rn:1}],fhjw:[2,{j:1}]}],U:[1,{fhnsw:1,j:[2,{Rjn:1,s:[3,{R:1}]}]}]}],U:[1,{fhw:[5,{"?AKRjns":1}],j:[2,{"?K^j":1,s:[5,{K:1}],A:[5,{j:1}],R:[5,{jns:1}],M:[4,{A:1}]}],n:[2,{"?KR^n":1,j:[5,{K:1}],Ms:[3,{R:1}],A:[5,{ns:1}]}],s:1}],K:[1,{fhsw:1,j:[5,{"?Kjs":1,n:[3,{"?":1}],A:[2,{Aj:1}]}],n:[2,{"?^n":1,A:[5,{n:1}]}]}],R:[1,{fw:[5,{AKRUjns:1,M:[2,{j:1}]}],h:[5,{AKUjn:1,s:[4,{"?KMR^n":1,A:[3,{AKM:1}]}],M:[2,{j:1}],R:[3,{"AMR^jn":1,K:[4,{K:1}]}]}],n:[2,{"U^n":1,A:[5,{n:1}],M:[5,{n:1,ARjs:[3,{R:1}]}],R:[5,{ARjns:1,M:[3,{MR:1}]}],s:[3,{R:[5,{AR:1}],"U^n":1}],K:[5,{jn:1}],j:[5,{KU:1}]}],s:[5,{AKRUjns:1,M:[2,{Ajns:1,R:[3,{AMR:1}]}]}],j:[2,{A:[5,{j:1}],M:[5,{j:1,n:[3,{R:1}]}],j:1,KRU:[5,{jn:1}],n:[5,{KU:1}]}]}],M:[1,{fw:[5,{ARUj:1,Mn:[2,{j:1}]}],h:[5,{AUj:1,R:[2,{A:[4,{"MR^":1}],KMRjn:1,s:[3,{KMR:1}]}],Mn:[2,{j:1}]}],j:[5,{A:[2,{A:[3,{A:1}],j:1}],j:1,MRn:[2,{j:1}],U:[2,{Rjn:1,Ms:[3,{R:1}]}]}],s:[5,{ARUjns:1,M:[2,{ARjns:1}]}],n:[5,{M:[2,{Ajn:1,Rs:[3,{A:1}]}],Un:1,s:[2,{A:[4,{"MR^":1}],Un:1}],AR:[2,{Rn:1,Ms:[3,{R:1}]}],j:[2,{RUn:1,M:[3,{R:1}]}]}]}],j:[1,{fhsw:1,j:[5,{A:[2,{Aj:1}],js:1}],n:[2,{A:[5,{n:1}],Rn:1}]}],n:[1,{fw:[5,{AKRjns:1,M:[2,{j:1}]}],h:[5,{AKjns:1,R:[2,{Ajn:1}],M:[2,{j:1}]}],j:[5,{Kj:1,AMR:[2,{j:1}],ns:[2,{R:1}]}],n:[2,{AM:[5,{ns:1}],KRn:1,j:[3,{j:1}],s:[3,{R:1}]}],s:1}],s:[1,{fhsw:1,j:[2,{A:[5,{j:1}],R:[5,{jns:1}],j:1}],n:[2,{A:[5,{ns:1}],Rn:1}]}],h:1}],R:[1,{fw:[5,{"?ARUhj":1,n:[6,{"?AKRUjn":1}],s:[6,{"?AKRUjns":1}],K:[6,{AKR:1}],M:[2,{j:1}]}],h:[5,{"?AUhj":1,n:[6,{"?AKRUjn":1}],s:[6,{"?AKUjns":1,R:[4,{"?AKMR^n":1}]}],R:[3,{A:[4,{"?AKMUhjs":1,R:[2,{ARjns:1}],"^":[2,{AMRjn:1}],n:[6,{A:1}]}],"?KMRUjns":1,"^":[2,{"R^jns":1}]}],K:[6,{AKR:1}],M:[2,{j:1}]}],j:[5,{"?":[3,{"?R^":1}],U:[2,{Rjn:1,s:[3,{R:1}]}],j:1,n:[2,{"?^j":1,U:[6,{A:1}],R:[6,{"?ARU":1}],K:[6,{AKR:1}],n:[6,{AR:1}],M:[3,{K:1,R:[6,{AR:1}]}],s:[3,{"^s":1}]}],R:[2,{A:[3,{K:1}],j:1}],s:[2,{A:[3,{A:[4,{K:1}]}],R:[6,{"?U":1}],j:1}],AM:[2,{j:1}],K:[2,{A:[3,{A:1}],j:1,n:[6,{AKR:1}],s:[3,{A:[4,{K:1}]}]}]}],n:[5,{"?Un":1,j:[2,{"?KRU^jn":1,M:[3,{KR:1}],s:[4,{"^":1}]}],s:[2,{"?U^ns":1,R:[6,{"?ARU":1,M:[3,{M:1}]}],A:[6,{"?n":1}],M:[6,{n:1,AR:[3,{R:1}]}]}],A:[2,{"?RUn":1,s:[3,{"?RUns":1,M:[4,{R:1}]}],M:[3,{R:1}]}],R:[2,{"?R^n":1,s:[3,{"?R^ns":1,M:[4,{R:1}]}],M:[3,{R:1}]}],M:[2,{A:[6,{n:1}],R:[3,{"A^":1,M:[4,{R:1}],R:[4,{"^":1}]}],j:[6,{Kn:1}],n:1,s:[6,{n:1,MR:[3,{R:1}]}]}],K:[2,{jn:1}]}],s:[5,{"?AKRUhjns":1,M:[2,{AKjns:1,R:[4,{"AR^":1}]}]}]}],A:[1,{fw:[5,{"?ARUfj":1,ns:[6,{"?AKRUjns":1}],K:[6,{AKR:1,M:[2,{j:1}]}],M:[2,{"^j":1,ns:[3,{"^":1}]}]}],h:[5,{"?AUfj":1,n:[6,{"?AKRUjns":1}],s:[6,{"?AKUjns":1,R:[3,{"?AKMU^jns":1,R:[4,{"AM^":1}]}]}],R:[3,{A:[2,{A:[6,{ARU:1}],KRjn:1,s:[4,{"AMR^":1}],M:[4,{"AM^":1}]}],"?KMRU^fjns":1}],K:[6,{AKR:1,M:[2,{j:1}]}],M:[2,{"^j":1,ns:[3,{"^":1}]}]}],j:[5,{"?":[2,{"?Rjn":1,s:[3,{"?":1}]}],U:[3,{"?MR^":1,A:[2,{Rj:1}]}],j:1,n:[2,{"?j":1,U:[6,{A:1}],R:[6,{"?ARUn":1}],K:[6,{AKR:1}],n:[6,{AR:1}],M:[3,{K:[4,{K:1}],R:[6,{AR:1}],U:1}],s:[3,{"^s":1}]}],s:[2,{"?":[3,{"?":1}],A:[3,{U:[6,{A:1}],j:1}],M:[3,{K:[4,{K:1}]}],R:[6,{"?Un":1}],j:1}],A:[2,{j:1,s:[3,{K:[4,{M:1}],j:1}],A:[3,{U:1}]}],R:[2,{A:[3,{A:[4,{M:1}]}],j:1}],K:[2,{A:[3,{A:[6,{R:1}]}],j:1,n:[6,{AKR:1}]}],M:[2,{j:1}]}],n:[5,{"?Un":1,A:[2,{"?U^n":1,s:[3,{"?U^ns":1,R:[4,{"AKMR^":1}],M:[4,{R:1}]}],R:[3,{"AKMR^":1,n:[6,{R:1}]}],M:[3,{R:1}]}],j:[2,{"?KRUjn":1,M:[3,{"KRU^":1}],s:[3,{"R^s":1}]}],s:[2,{"?U^n":1,R:[6,{"?RUn":1,A:[3,{AKMRn:1}]}],A:[6,{"?Un":1}],M:[6,{n:1,AR:[3,{R:1}]}],s:[3,{"^s":1}]}],R:[2,{"?R^n":1,s:[3,{"?R^ns":1,M:[4,{R:1}]}],M:[3,{R:1}]}],M:[2,{A:[6,{n:1}],"U^n":1,j:[6,{Kn:1}],s:[3,{A:[6,{n:1}],R:[4,{AR:1}],"U^":1}],R:[4,{R:[3,{A:1}],"^":1}]}],K:[2,{jn:1}]}],s:[5,{"?AKRUfjns":1,M:[2,{A:[4,{"AR^":1,M:[6,{AR:1}]}],"KU^jns":1,R:[3,{"AM^":1,R:[6,{R:1}]}]}]}]}],"?":[1,{fhw:[5,{"?ARUj":1,ns:[6,{"?AR":1}],M:[2,{j:1}]}],j:[2,{"?j":1,n:[5,{"?":1}],s:[3,{"?":1}],A:[5,{R:[3,{A:[4,{"A^":1}]}],j:1}],M:[5,{j:1}],R:[5,{"?Uj":1,n:[6,{"?AR":1}],s:[6,{"?":1}]}],"^":[6,{"?":1}]}],n:[2,{"?RU^n":1,j:[5,{"?":1}],s:[3,{"?R^":1,M:[4,{R:1}]}],A:[5,{n:1,s:[6,{"?M":1}]}],M:[3,{A:[5,{n:1}],R:1}]}],s:1}],U:[1,{f:[5,{"?AKRj":1,ns:[6,{AR:1}],M:[2,{j:1}]}],h:[5,{"?AKj":1,n:[6,{AR:1}],s:[6,{AKR:1}],R:[6,{AR:1,M:[2,{jn:1}]}],M:[2,{j:1}]}],j:[5,{"?j":1,n:[2,{R:[6,{AR:1}],K:1,M:[3,{R:1}]}],AM:[2,{j:1}],R:[2,{A:[3,{A:[4,{"^":1}]}],j:1,s:[3,{A:[4,{A:1}]}]}],K:[2,{jn:1}]}],n:[2,{"?^n":1,j:[5,{K:1}],s:[3,{"R^":1}],A:[5,{n:1,s:[6,{M:1}]}],R:[3,{"AKR^":1,M:[6,{AR:1}]}],K:[5,{jn:1}],M:[3,{R:1,A:[5,{n:1}]}]}],s:1,w:[5,{"?AKRj":1,n:[6,{AKR:1}],s:[6,{AR:1}],M:[2,{j:1}]}]}],M:[5,{j:[1,{fhjsw:1,n:[2,{K:[6,{AR:1}],"R^n":1,M:[3,{R:1,M:[4,{R:1}]}]}]}],n:[1,{fhw:[6,{ARU:1}],ns:1,j:[2,{K:[6,{AR:1}],R:[6,{ARU:1}],"^jn":1,M:[3,{R:[6,{ARU:1}]}]}]}],s:[1,{fw:[6,{ARU:1}],h:[6,{AU:1,R:[2,{AKR:1,M:[3,{MR:1}]}]}],j:[2,{M:[3,{R:[6,{U:1}]}],R:[6,{U:1}]}],s:1,n:[6,{M:[2,{R:[4,{"^":1}]}],Un:1,A:[2,{Rn:1,M:[3,{R:1}]}],R:[2,{R:1,M:[3,{R:1}]}]}]}],A:[1,{f:[6,{AKRUn:1,M:[2,{A:[3,{A:1}],MRjn:1,s:[4,{"AR^":1}]}]}],hw:[6,{AKRU:1,M:[2,{A:[3,{A:1}],MRjn:1,s:[4,{"AR^":1}]}],n:[2,{jn:1}]}],j:[2,{j:1,s:[3,{A:[6,{K:1}]}],A:[3,{A:[4,{M:1}]}]}],s:1,n:[2,{"R^n":1,M:[3,{R:1}],s:[3,{"R^":1,M:[4,{R:1}]}]}]}],K:[2,{AK:[1,{s:1}],Ms:[1,{fhw:[6,{AR:1}],s:1}],j:1,n:[6,{AR:1,K:[1,{ns:1}]}]}],R:[1,{fsw:1,h:[2,{A:[6,{ARU:1}],M:[3,{AR:1}],"R^jn":1,s:[3,{A:[4,{AR:1}],"MR^":1}]}],j:[2,{A:[3,{A:[6,{U:1}],M:[4,{A:1}]}],j:1}],n:[2,{"R^n":1,M:[3,{R:1}],s:[3,{"R^":1,M:[4,{R:1}]}]}]}],M:[1,{s:[2,{ARjns:1}],n:[2,{R:[3,{A:[4,{A:1}],M:[6,{A:1}],R:[4,{"^":1}],"^":1}],j:[6,{Un:1,M:[3,{M:1}]}],n:1,s:[6,{n:1,R:[3,{R:1}]}]}],fhjw:[2,{j:1}]}],U:[1,{fhnsw:1}],"?":1,f:[1,{fhsw:1}]}],n:[1,{fw:[5,{"?ARUj":1,ns:[6,{AR:1}],M:[2,{j:1}]}],h:[5,{"?AUj":1,R:[2,{A:[6,{A:1}],Rjns:1}],ns:[6,{AR:1}],M:[2,{j:1}]}],j:[5,{"?Uj":1,n:[2,{Rj:1}],AMR:[2,{j:1}]}],n:[5,{"?Un":1,s:[2,{A:[6,{M:1}],R:[6,{AR:1}]}],A:[2,{Rn:1,Ms:[3,{R:1}]}],R:[2,{Rn:1,s:[3,{R:1}]}],j:[2,{Rn:1}],M:[6,{M:1}]}],s:1}],K:[1,{fhw:[5,{"?ARUj":1,K:[6,{K:[3,{A:[4,{"AK^":1}],"KM^":1}],A:1,M:[2,{j:1}]}],ns:[6,{A:1,K:[4,{A:[2,{A:1}],K:1,"^":[2,{K:1}]}]}],M:[2,{j:1}]}],j:[5,{A:[2,{A:[3,{A:1}],K:[4,{K:1}],Mj:1}],K:[2,{A:[3,{A:[6,{K:1}]}],Mj:1,n:[6,{A:1,K:[4,{"K^":1}]}],s:[3,{M:1}]}],MR:[2,{j:1}],"?Uj":1,s:[2,{K:[3,{M:1}]}],n:[2,{K:[6,{A:1,K:[4,{"K^":1}]}],"R^":1}]}],n:[2,{A:[5,{n:1}],K:[5,{j:[3,{AKM:1}],n:1}],"?RU^n":1,j:[3,{AM:[5,{K:1}],K:[6,{M:1}]}],M:[3,{R:1}],s:[3,{"R^":1}]}],s:1}],s:[1,{fw:[6,{ARs:1,M:[5,{R:1}]}],h:[3,{ARs:1,"^":[2,{"^jns":1}]}],j:[5,{AR:[2,{j:1}],j:1,n:[6,{s:1}]}],n:[2,{A:[5,{n:1}],"R^n":1,s:[3,{"R^s":1}]}],s:1}],j:[1,{fw:[6,{ARUjn:1,M:[5,{A:1}]}],h:[2,{A:[6,{ARjn:1}],"R^jn":1,s:[4,{A:[5,{A:1}],"R^":1}]}],j:[5,{j:1,s:[6,{A:[2,{A:1}],j:1}],n:[2,{"R^":1}],AR:[2,{j:1}]}],n:[2,{A:[5,{n:1}],"R^n":1,s:[3,{"R^":1}],j:[5,{jns:1}]}],s:1}],h:1}],"1":[2,{"?":[5,{"$?Ihs":1,C:[6,{$BCDNV:1,M:[7,{$:[4,{"?^":1}],"?":1,C:[3,{"?CI^":1}],I:[3,{"?C":1}],B:[4,{"C^":1}]}]}],jn:[6,{"$?CIhjn":1}],B:[1,{jn:1}]}],B:[3,{"?^":1,C:[4,{"?":1,BINn:[1,{fhjsw:[5,{Cjs:1}],n:[5,{n:1}]}],C:[1,{fhjsw:[5,{CIjs:1}],n:[5,{n:1}]}],D:[1,{fhjsw:[5,{js:1}],n:[5,{n:1}]}],M:[6,{"?":1,C:[1,{fhjsw:[5,{CIjs:1}],n:[5,{n:1}]}],M:[1,{fhjsw:[5,{C:1}]}]}],V:[6,{"?":1,C:[1,{fhjsw:[5,{Cjs:1}],n:[5,{n:1}]}],M:[1,{fhjsw:1}]}],"^":[1,{fhjsw:[5,{CIs:1,j:[6,{C:1}]}],n:[5,{n:[6,{C:1}]}]}]}],I:[4,{"?":1,CI:[1,{fhjsw:[5,{Cjs:1}],n:[5,{n:1}]}],M:[1,{fhjsw:[5,{Cs:1,j:[6,{C:1}]}],n:[5,{n:[6,{C:1}]}]}],"^":[1,{fhjsw:[5,{CIjs:1}],n:[5,{n:1}]}],n:[1,{fhjsw:[5,{js:1}],n:[5,{n:1}]}]}],M:[1,{fhjsw:[5,{$CIs:1,j:[6,{$CIn:1}]}],n:[4,{C:[5,{n:[6,{CIn:1}]}],N:[5,{n:1}]}]}],BV:[1,{fhjsw:[5,{Cjs:1}],n:[5,{n:1}]}],N:[6,{"?V":1,C:[1,{fjsw:[5,{Cjs:1}],h:[7,{CIMV:1}],n:[5,{n:1}]}],I:[5,{I:1}],M:[1,{fhjsw:1}]}],j:[7,{C:[1,{j:[4,{M:1}]}],B:1}],n:[4,{M:[1,{fhjsw:[5,{Cs:1,j:[6,{C:1}]}],n:[5,{n:[6,{C:1}]}]}],V:1}]}],C:[4,{"?":[5,{"$?CIs":1,j:[6,{"$?CI":1,B:[1,{j:1}],M:[1,{jn:1}]}],n:[6,{"$?CIN":1,B:[1,{j:1}],M:[1,{jn:1}]}],B:[1,{jn:1}],M:[1,{jn:[3,{"?":[7,{C:1}],CI:1}]}]}],B:[5,{"$?CIs":1,j:[6,{"$?CIn":1}],n:[6,{"$?CINn":1}]}],C:[1,{fhsw:[5,{"$?CDIhs":1,j:[3,{BDNjn:[6,{C:1}],C:[6,{CDI:1}],I:[6,{CI:1}],M:[6,{"?CDI":1}]}],n:[6,{"$?CDINhs":1,j:[7,{$CIV:1}],n:[7,{$CIVn:1}]}]}],j:[3,{"?":[7,{$BI:1,C:[6,{C:1}]}],B:[5,{Cs:1,j:[6,{C:1}],n:[6,{CNj:1}]}],C:[5,{CDIs:1,j:[6,{CDI:1}],n:[6,{CDIN:1}]}],D:[5,{Cs:1,jn:[6,{C:1}]}],I:[5,{CIs:1,j:[6,{CI:1}],n:[6,{CIN:1}]}],M:[5,{"?CDIs":1,M:[6,{"?":1}],j:[6,{"?CDI":1}],n:[6,{"?CDIN":1}]}],Njn:[5,{Cs:1,j:[6,{C:1}],n:[6,{CN:1}]}],V:[5,{M:[7,{"?":1}],j:[6,{"?CIs":1}]}],h:[6,{$:1}]}],n:[5,{"$?CDIhs":1,M:[3,{"?":[7,{$:1}],M:[6,{"?":1}],V:[7,{"?":1}]}],j:[3,{BDNjn:[6,{C:1}],C:[6,{CDI:1}],I:[6,{CI:1}],M:[6,{"?CDI":1}]}],n:[6,{"$?CDINhs":1,M:[7,{"?":1}],j:[7,{$CIV:1}],n:[7,{$CIVn:1}]}]}]}],D:[5,{"$?CIs":1,jn:[6,{"$?CI":1}]}],I:[5,{"$?CDIs":1,j:[6,{"$?CDI":1,n:[7,{$I:1}],j:[7,{CI:1}]}],n:[6,{"$?CDINjn":1}]}],M:[5,{"$?CDIhs":1,j:[6,{"$?CDIhs":1,M:[1,{jn:[7,{"?":1}]}],j:[7,{$CI:1}],n:[7,{$CIn:1}]}],n:[6,{"$?CDINhjs":1,M:[1,{jn:[7,{"?":1}]}],n:[7,{$CIVjn:1}]}],M:[1,{jn:[6,{C:[3,{"?":1}],"?":1}]}]}],N:[5,{"$?CDIs":1,j:[6,{"$?CDI":1,n:[7,{$C:1}],j:[7,{C:1}]}],n:[6,{"$?CDINj":1,n:[7,{$C:1}]}]}],V:[5,{C:[3,{BCDn:1,j:[1,{fhnsw:1}]}],j:[6,{"$?CDIh":1,j:[7,{C:1}],n:[7,{$CIn:1}]}],n:[6,{"$?CDINhj":1,n:[7,{$CIVjn:1}]}],"$?DIhs":1}],"^":[5,{"$?CDIs":1,j:[6,{"$?CDIs":1,M:[1,{jn:[3,{"?":1}]}],j:[7,{"$?CIj":1}],n:[7,{$CDIn:1}]}],n:[6,{"$?CDINs":1,M:[1,{jn:[3,{"?":1}]}],j:[7,{"$?BCIVj":1}],n:[7,{$BCDIVjn:1}]}],B:[1,{jn:[3,{"?":1}]}],M:[1,{jn:[3,{"?":[7,{$C:1}],C:[7,{"?":1}],"^":[6,{"?":1}]}]}]}],h:[5,{Cs:1,jn:[6,{C:1}]}],j:[5,{$CIs:1,j:[6,{$CIjn:1}],n:[6,{$CINjn:1}]}],n:[5,{$CIs:1,j:[6,{$CIn:1}],n:[6,{$CINn:1}]}],s:[5,{$CIs:1,j:[6,{$CI:1}],n:[6,{$CIN:1}]}],w:1}],I:[5,{"$?DI":1,Cs:[3,{"?BCDIMN^jnsw":1,V:[1,{fhnsw:1}]}],j:[6,{$:[3,{"?BCDIMN^jns":1}],"?DINjn":1,C:[3,{"?BCDIMN^jnsw":1,V:[4,{C:[1,{j:1}],"M^":1}]}]}],n:[6,{$:[3,{"?BCDIMN^jns":1}],"?DINjn":1,C:[3,{"?BCDIMN^jnsw":1,V:[1,{fhnsw:1,j:[7,{$:1}]}]}]}]}],V:[3,{"?M":1,C:[1,{fhsw:[5,{n:[4,{"?BDINjn":1,CM:[6,{CIj:1}],"^":[6,{Cn:1}]}],$s:1}],j:[4,{"?":[5,{j:1}],BNn:[5,{j:[7,{$:1}]}],C:[5,{j:[7,{$j:1}]}],I:[5,{j:[7,{$C:1}]}],M:[5,{j:[7,{$n:1}]}],"V^":[5,{j:[6,{n:1}]}]}],n:[5,{$:1,n:[6,{$CDIj:1,n:[7,{$CDIjn:1}]}],s:[4,{"?BCDIMN^jn":1}]}]}],D:[5,{jns:1}],I:[5,{n:[6,{CIn:1}],s:1,j:[7,{C:[6,{Cn:1}],BI:1}]}],N:[1,{fhnsw:[5,{ns:1}],j:[4,{C:[5,{j:[6,{n:1}]}]}]}],j:[5,{j:[7,{$CIVjn:1}],ns:1}],n:[5,{j:[7,{$BCIn:1}],ns:1}],"^":[5,{Ins:1,j:[7,{C:1}]}]}],h:[4,{"?CIM^":1,V:[1,{fhsw:1,j:[6,{$:1}],n:[6,{$M:1}]}]}],j:[5,{"$?DIfhsw":1,C:[3,{"?BCDIMN^fhjns":1,V:[6,{$BCDIfhs:1,"?":[7,{$I:1}],N:[7,{$CVn:1,M:[4,{M:1}]}],V:[7,{$jn:1,C:[4,{M:1}]}],j:[7,{CIV:1}],n:[7,{$BCIn:1}],M:[4,{M:1}]}]}],jn:[6,{"$?CDIjns":1,B:[3,{IM:1}],V:[3,{"IV^j":1}]}],B:[1,{j:[3,{C:[4,{"?":1}],n:[4,{M:1}]}],n:[3,{C:[4,{"?":1}]}]}],M:[1,{j:[3,{C:[4,{"?":[6,{I:1}],"CMV^":[6,{"?":1}]}],"B^":1,Mn:[4,{N:1}]}],n:[3,{C:[4,{"?":[6,{I:1}],"CM^":[6,{"?":1}],V:[7,{"?":1}]}],"B^":1,Mn:[4,{N:1}]}]}],V:[1,{j:[3,{DMn:1}],n:[3,{D:1}]}],N:[3,{IM:1,N:[4,{N:1}]}]}],n:[5,{"$?CDINfhsw":1,j:[6,{"$?CDIVjns":1,B:[3,{CIM:1}]}],n:[6,{"$?CDIVjn":1,B:[3,{CIM:1}]}],M:[1,{j:[3,{C:[4,{"?":[6,{I:1}],"CMV^":[6,{"?":1}]}]}],n:[3,{C:[4,{"?":[6,{I:1}],"CMV^":[6,{"?":1}]}],Mn:[4,{N:1}],"^":1}]}],V:[1,{fhw:[3,{Mn:1}],ns:[3,{"M^n":1}]}],B:[1,{fhnsw:[3,{n:[4,{M:1}]}]}]}],s:[5,{"$?CDINfhjsw":1,B:[1,{fhnsw:1,j:[4,{"?":1,"^":[3,{"?":1}]}]}],V:[1,{fhnsw:1}],n:[6,{"$?BCDIVjns":1,M:[1,{fhnsw:1}]}],M:[1,{fhsw:1,j:[3,{C:[4,{"?":[6,{I:1}],"CMV^":[6,{"?":1}]}]}],n:[7,{"$?BCDIhjns":1,N:[4,{"C^":1}],V:[3,{C:1}],M:[6,{M:1}]}]}]}],D:[5,{$CIs:1,jn:[6,{$CIjns:1,V:[1,{j:1}]}],V:[1,{jn:1}]}],M:[5,{"$?DIhs":1,C:[3,{CDINVjn:1,M:[1,{fhjsw:1,n:[6,{$CN:1}]}],"^":[6,{$CV:1}]}],jn:[6,{"$?CDINVhjns":1}],B:[1,{jn:[4,{"?":1}]}]}],N:[5,{"$?DI":1,C:[4,{"?BCDIMN^jn":1,V:[1,{fhnsw:1,j:[7,{C:1}]}]}],j:[6,{"$?DI":1,C:[4,{"?BCDIMN^jn":1,V:[7,{$BMNV:1}]}],j:[7,{$:1}],n:[7,{"$?Cn":1}],N:[3,{N:1}]}],n:[6,{"$?DIN":1,C:[4,{"?BCDIMN^jn":1,V:[1,{fhnsw:1}]}],M:[1,{n:[4,{j:1}]}],j:[7,{$V:1}],n:[7,{"$?CVn":1,M:[1,{n:1}]}]}],s:[4,{"?BCDIMN^jns":1,V:[1,{fhnsw:1,j:[7,{$:1}]}]}],M:[1,{jn:[6,{"?":1}]}]}],fw:1,"^":[6,{"$?BDfhsw":1,C:[5,{"?CDIfhjns":1,V:[1,{n:1}]}],I:[5,{"?CIjnsw":1}],V:[7,{$BIjn:1,C:[5,{Ijns:1}]}],j:[7,{"$?BCDIVj":1}],n:[7,{"$?BCIVjn":1}],M:[5,{C:[7,{"?":1}],s:1}],N:[7,{BCV:1}]}]}],"0":[2,{"?":[3,{"?":[5,{"$?CIsw":1,jn:[6,{"$?CIjnsw":1}]}],"BCIMNV^fjns":1}],B:[3,{"?NV^n":1,C:[5,{$CIfjsw:1,"?":[6,{"?C":1}],n:[6,{$BCIVfjnsw:1,"?":[7,{"?C":1}],M:[1,{fhnsw:1}]}],M:[1,{fhnsw:1}]}],I:[1,{fhjsw:[5,{$Cjs:1}],n:[5,{n:1}]}],M:[1,{fhsw:[5,{$CIMjs:1}],j:[5,{$CIjs:1}],n:[5,{n:1}]}],B:[4,{C:1,M:[1,{fhjsw:[5,{Cjs:1}],n:[5,{n:1}]}]}],j:[4,{Cn:1}]}],C:[5,{$CIfhsw:1,"?":[6,{$:[3,{"?BCIMVs":1}],"?I":1,C:[7,{M:[3,{"?":[4,{C:1}],"I^":1}],"$?":1}]}],j:[6,{$CIfhsw:1,"?":[3,{"?":[4,{"?CI":1,M:[7,{$:1}]}],BIs:1,C:[4,{CMVj:1}],MV:[7,{"$?":1}],"^":[7,{"?C":1}]}],B:[1,{j:[3,{"?":1}]}],M:[1,{j:1,n:[4,{"?":1,"M^":[3,{"?":1}],h:[3,{M:1}]}]}],V:[1,{j:[3,{"?":1,C:[4,{"?":1}]}]}],j:[7,{$CIn:1,M:[1,{j:1}],j:[3,{BCIM:1}]}],n:[7,{"$?CI":1,M:[1,{jn:1}],n:[3,{"BCIM^":1}],j:[3,{"I^":1}]}]}],n:[6,{$CINfhsw:1,"?":[7,{"$?I":1,C:[3,{"?IV^":1,C:[4,{C:1}]}]}],B:[1,{j:[3,{"?":1}]}],M:[1,{j:[3,{"?BCIMN^fhjns":1,V:[4,{C:1}]}],n:1}],V:[7,{C:[1,{j:[3,{"?":1}]}],"?":[1,{j:1}],N:1}],j:[7,{"$?BCIVn":1,M:[1,{jn:1}],j:[3,{BCIM:1}]}],n:[7,{"$?BCIV":1,M:[1,{jn:1}],n:[3,{"BCIM^":1}],j:[3,{"BI^":1}]}]}],B:[1,{j:[4,{"?BCIMV^js":1,N:[3,{M:1}]}],n:1}],M:[1,{j:[3,{"?":[4,{"?":[7,{C:1}],"CM^":1}],C:[4,{"?":[7,{$:1}],"C^":[6,{"?":1}]}],"IV^":[6,{"?":1}],M:[7,{"?":1}],N:[7,{M:1}]}],n:[3,{"?":[7,{$:[6,{$B:1}],CMV:1}],C:[4,{"?":[7,{$:1}],"C^":[6,{"?":1}]}],IV:[6,{"?":1}],M:[7,{"?":1}]}]}],V:[1,{jn:[6,{"?":1}]}]}],I:[4,{"?N":[5,{$Cs:1,jn:[6,{$C:1}]}],Bjn:1,C:[3,{"?Nns":1,B:[5,{$Cs:1,jn:[6,{$C:1}]}],C:[5,{$CIs:1,jn:[6,{$CI:1}]}],I:[7,{$BIVj:1,C:[6,{B:[5,{Cs:1}],CIMV:1}],M:[5,{CIjns:1}]}],M:[5,{"$?CIfs":1,j:[6,{"$?CIfn":1,j:[7,{$C:1}],M:[1,{jn:1}]}],n:[6,{"$?CIfn":1,j:[7,{$Cn:1}],M:[1,{jn:1}]}]}],V:[5,{$:1,CIs:[1,{fhnsw:1}],j:[1,{j:[6,{C:1}]}],n:[7,{$I:1,C:[6,{CI:1}]}]}],j:[7,{$MV:1,C:[5,{Cs:1,jn:[6,{C:1}]}]}]}],IMs:[5,{$CIs:1,jn:[6,{$CI:1}]}],V:[5,{$CIs:1,jn:[6,{$CINn:1}]}],"^":[5,{$CIhs:1,j:[6,{"$?CIh":1,M:[1,{j:1}],j:[7,{$CI:1}],n:[7,{$BCn:1}]}],n:[6,{"$?CIh":1,j:[7,{$CI:1}],n:[7,{$BCn:1}],M:[1,{jn:1}]}],"?":[7,{"$?MV":1}],V:[1,{jn:1}]}]}],M:[5,{"?":[7,{$BMV:1,"?":[4,{"?IM^":1,C:[6,{"?":1}]}],C:[4,{"CMV^":1}]}],j:[6,{"?":[7,{"$?CI":1}],$CINVfhns:1,j:[7,{"$?BCIjn":1}],M:[1,{j:1,n:[3,{h:1}]}]}],n:[6,{"?":[7,{"$?CI":1}],$CINVfhns:1,j:[7,{"$?BCIjn":1}],M:[1,{j:[3,{C:1}],n:1}]}],$Ifhs:1,C:[6,{"$?BCIMNfhjns":1,V:[4,{"?BCINV^hjns":1,M:[1,{fhjns:1}]}]}],B:[1,{j:[3,{C:[4,{M:[6,{n:1}]}]}],n:[6,{n:1}]}]}],j:[5,{$Ifhsw:1,"?":[3,{"?BINV^fjns":1,C:[6,{$:[4,{"?BCIMVs":1}],C:[7,{"$?":1,M:[4,{"I^":1}]}],"?I":1}],M:[6,{"$?CI":1}]}],C:[3,{"?BCIMN^fhjnsw":1,V:[4,{B:[6,{C:1}],I:[7,{Mn:1}],MV:1,N:[6,{$BCs:1}],j:[6,{$:1}]}]}],j:[6,{"$?CIn":1,j:[7,{"$?CIjn":1}],M:[1,{j:1,n:[3,{I:[7,{C:1}]}]}],B:[3,{Mn:1}],V:[3,{V:1}]}],n:[6,{"$?CI":1,j:[7,{"$?BCIjn":1,M:[1,{jn:1}]}],n:[4,{"?BI^jn":1,C:[7,{$CIVn:1,j:[3,{M:1}]}],M:[7,{$jn:1}],V:[7,{$C:1}]}],M:[1,{j:[3,{CIn:1}],n:1}],B:[3,{IMn:1}],V:[3,{Vn:1}]}],M:[1,{j:[3,{"BCIMN^hjn":1}],n:[3,{C:[4,{"?":[6,{C:1}],CIV:[6,{"?":1}],M:[7,{"?":1}]}],I:[4,{"^":[7,{C:1}]}],"B^hn":1,M:[4,{h:1}],j:[4,{V:1}]}]}],B:[1,{j:[3,{C:[4,{"?":1}],"BV^":1,n:[4,{C:1}]}],n:[3,{C:[4,{"?":1}]}]}],V:[1,{j:[3,{C:[4,{"?":1}],"BM^":1}],n:[4,{"?":1}]}],N:[3,{"IM^":1}]}],n:[5,{$CINfhsw:1,"?":[3,{"?INV^fjns":1,B:[6,{"?C":1,$:[4,{M:1}]}],C:[7,{"$?BM":1,C:[4,{IM:1}]}],M:[6,{"$?CI":1}]}],j:[6,{"$?CIV":1,j:[7,{"$?BCIjn":1,M:[1,{jn:1}]}],n:[7,{n:[4,{"?CIM^jn":1}],"$?CIV":1,j:[4,{"BM^jn":1,C:[3,{M:1}]}]}],M:[1,{jn:1}],B:[3,{CIMn:1}]}],n:[6,{"$?CIV":1,n:[7,{"$?CIV":1,j:[4,{"BM^j":1,C:[3,{M:1}]}],n:[4,{"CIM^n":1}]}],j:[7,{"$?BCIjn":1,M:[1,{jn:1}]}],M:[1,{j:[4,{BC:[3,{C:1}],"M^":1}],n:1}],B:[3,{CIM:1}]}],M:[1,{j:[4,{"?Nfjs":1,Bhn:[3,{C:1}],C:[3,{CIMNjn:1}],I:[3,{Cj:1}],"M^":[3,{CI:1}],V:[6,{"?":1}]}],n:1,fhsw:[3,{"B^h":1,j:[4,{V:1}]}]}],B:[1,{fhsw:[3,{"B^":1,n:[4,{C:1}]}],n:[3,{"BV^":1,n:[4,{C:1}]}],j:[3,{V:1}]}],V:[6,{C:[1,{fhnsw:[3,{M:1}]}],N:1}]}],s:[1,{fnsw:1,h:[4,{"?BCIMNV^fhnsw":1,j:[6,{"$?BCIMNjn":1}]}],j:[5,{"$?CINfhjsw":1,n:[6,{"$?BCIVjs":1,n:[7,{$Cjn:1}]}],M:[3,{C:[4,{I:[6,{"?":1}]}]}]}]}],fw:1,V:[3,{C:[1,{fhsw:[5,{"$?hs":1,n:[6,{"$?CIh":1,j:[7,{$CIj:1}],n:[7,{$CIjn:1}]}],M:[4,{V:1}]}],j:[4,{B:[5,{j:[7,{C:1}]}],CIV:[5,{j:[6,{jn:1}]}],"M^":[5,{j:[6,{Ij:1}]}]}],n:[5,{"$?BMhs":1,n:[6,{"$?BCIMh":1,j:[7,{$CIMj:1}],n:[7,{$CIjn:1}]}]}]}],B:[5,{ns:1,j:[7,{C:1}]}],M:1,N:[4,{C:[1,{fhnsw:[5,{ns:1}],j:[5,{j:[7,{$:1}]}]}],I:[5,{ns:1}],M:1}],V:[5,{Mns:1,j:[6,{C:1}]}],j:[5,{j:[7,{$C:1}],ns:1}],n:[5,{ns:1}],I:[5,{ns:1,j:[7,{CV:1}]}],"^":[5,{$ns:1,j:[7,{$V:1}]}]}],N:[5,{$I:1,C:[3,{"CM^":1}],j:[6,{"$?Ins":1,C:[3,{"CM^":1}],M:[1,{j:1}],V:[3,{M:1}]}],n:[6,{"$?Ins":1,C:[3,{"CM^":1}],M:[1,{jn:1}],V:[3,{M:1,C:[7,{N:1}]}]}],s:[3,{"CIM^":1,V:[4,{N:1}]}],B:[1,{jn:1}]}],h:[1,{fhnsw:1,j:[5,{$Cjs:1,n:[6,{$C:1}]}]}],"^":[1,{fhnsw:1,j:[5,{"?CIfjs":1,n:[6,{"?CIfjns":1}]}]}]}],"3":[6,{$:[5,{$s:[2,{"?CMNhjns":1,B:[1,{fhjsw:1}],I:[3,{"?BCIM^jn":1}],V:[1,{fhnsw:1}]}],"?h":1,C:[2,{"?CIMN^ns":1,j:[3,{"?BCIMN^jn":1,V:[4,{MN:1}]}],B:[1,{fhjsw:1}],V:[3,{M:1}]}],I:[2,{"?CIM^jns":1,B:[1,{fhjsw:1}]}],j:[2,{"?CMNhjns":1,B:[1,{fhjsw:1}],I:[3,{"?BCIM^jn":1}],V:[1,{j:1}]}],n:[2,{"?CIMNhjns":1,B:[1,{n:1}],V:[1,{fhnsw:1}]}],M:[1,{j:[2,{C:[3,{"?":1}],jn:[3,{CI:1}]}],n:[2,{C:[3,{"?":1}],j:[3,{I:1}],ns:1}],fhsw:[2,{s:1}]}],B:[1,{j:[2,{C:1,j:[3,{C:1}]}],fhnsw:[2,{s:1}]}],V:[1,{j:[2,{j:1}],n:[2,{j:[3,{C:1}],s:1}],fhsw:[2,{s:1}]}],N:[2,{ns:1}]}],"?":[5,{"?I":1,j:[2,{"?CIM^jns":1,B:[4,{"^":1}]}],ns:[2,{"?CIM^j":1,B:[4,{"^":1}]}],M:[1,{j:[2,{jn:1,s:[7,{$:1}],C:[4,{C:1}]}],n:[2,{jns:1,C:[3,{C:1}]}],fhsw:[2,{s:1}]}],C:[2,{"?CIM^jns":1}]}],C:[5,{"?":[2,{"?CIM^jns":1,B:[4,{"^":1}]}],C:[2,{"?CIMN^hns":1,j:[3,{"?BCIMN^hjns":1,V:[4,{M:1}]}],B:[1,{fhjsw:1}],V:[3,{M:1}]}],j:[2,{"?CMN^hjns":1,I:[3,{"?BCIMN^jns":1,V:[1,{jw:1}]}],V:[3,{C:[1,{j:[7,{"?":1}]}],IM:1}],B:[1,{fhjsw:1}]}],n:[2,{"?CMN^hjns":1,I:[3,{"?BCIMN^jns":1,V:[1,{fhnsw:1}]}],V:[1,{fhnsw:1,j:[3,{M:1}]}],B:[1,{n:1}]}],s:[1,{fhsw:1,j:[2,{"?BCMN^jns":1,I:[3,{"?BCIM^jns":1}],V:[3,{M:1}]}],n:[2,{"?CIMNV^jns":1}]}],M:[1,{j:[2,{C:[3,{"?":1}],j:[3,{"CIMN^j":1}],n:[4,{"?BINjns":1,C:[3,{CMNj:1}],M:[3,{C:1}],"^":[3,{CI:1}]}]}],n:[2,{C:[7,{C:[3,{"?":1}],"?":1}],j:[3,{C:[7,{"?":1}],"IV^":1}],"V^ns":1}],fhsw:[2,{"^s":1,V:[4,{V:1}],n:[3,{"^":1}]}]}],I:[2,{"?CIMN^jns":1,B:[1,{fhjsw:1}]}],B:[1,{j:[2,{C:1,j:[3,{BC:1}]}],fhnsw:[2,{s:1,n:[3,{B:1}]}]}],V:[1,{j:[2,{j:[3,{CM:1}]}],n:[2,{j:[4,{"?MNVj":1,"I^":[3,{C:1}]}],s:1,n:[3,{M:1}]}],fhsw:[2,{s:1,n:[3,{M:1}]}]}],N:[2,{ns:1,j:[3,{IM:1}]}],h:1}],I:[2,{"?I":1,C:[5,{"?CIjns":1,B:[1,{j:1}]}],j:[5,{"?Ijns":1,C:[3,{"?BCIM^j":1}],B:[1,{j:[3,{C:1}]}],M:[1,{j:1}],V:[1,{jn:1}]}],n:[5,{"?CINjns":1,M:[1,{j:[4,{"BCIM^j":1}],n:1}]}],s:[1,{fhnsw:1,j:[5,{"?CIjns":1}]}],B:[3,{CM:[1,{fhjsw:[5,{Cjs:1}],n:[5,{n:1}]}],"^":1}],"M^":[5,{"?CIjns":1}],V:[1,{fhnsw:[5,{ns:1}],j:[5,{j:1}]}],N:[4,{I:1}]}],n:[3,{"?Bn":1,C:[5,{C:[2,{CMjns:1}],j:[2,{CMn:1,V:[1,{j:1}]}],ns:[1,{fhnsw:1,j:[2,{CM:1}]}],M:[1,{j:[2,{j:1,n:[4,{"C^":1}]}],n:[2,{ns:1}],fhsw:[2,{s:1}]}],V:[1,{j:[2,{j:1}],n:[2,{js:1}],fhsw:[2,{s:1}]}],B:[1,{jn:1}],I:1}],M:[5,{js:[1,{fhjsw:1,n:[2,{Cn:1}]}],n:[2,{CIjns:1}],CI:1}],V:[5,{C:[2,{Cns:1}],jns:1}],"^":[5,{"?CIjns":1}],I:[5,{C:1}]}],B:[2,{"?":[5,{"?Cs":1}],C:[5,{CIs:1,M:[1,{jn:[3,{"?":1}]}],jn:[1,{j:1}]}],j:[3,{"?B^ns":1,C:[5,{CI:1,M:[1,{j:1,n:[4,{"?":1}]}],V:[1,{j:1}]}],IM:[5,{CI:1}],j:[5,{C:1}]}],n:[5,{"?CI":1,M:[1,{j:[4,{"?BCIM^":1}],n:1}]}],s:[1,{fhnsw:1,j:[5,{CI:1,M:[4,{"?":1}]}]}],IM:[5,{CIs:1}],B:[1,{fhjsw:[5,{CIjs:1}],n:[5,{n:1}]}],V:[1,{fhsw:[5,{s:1}],j:[3,{C:[5,{jn:1}]}],n:[5,{n:[3,{C:1}],s:1}]}],"^":1}],M:[5,{C:[2,{"?CMN^hns":1,j:[3,{"?BCIMN^hjns":1,V:[4,{C:[7,{"?":1}],M:1,N:[1,{jw:1}]}]}],B:[1,{fhjsw:1}],I:[3,{"BCIM^jns":1,V:[7,{$:1}]}],V:[3,{M:1}]}],s:[2,{"?CIMN^j":1,V:[1,{fhnsw:1}]}],j:[2,{"?In":[1,{jn:1}],C:[1,{j:1,n:[4,{"?":1}]}],MNj:[1,{j:1}],"^s":1}],n:[1,{j:[2,{"?CI":1,M:[4,{"C^":1}],j:[3,{C:1}],N:[4,{CM:1}]}],n:1}],"?":1,M:[1,{j:[2,{j:[3,{C:1}],n:[4,{"C^":1}]}],n:[2,{ns:1}],fhsw:[2,{s:1}]}],V:[1,{j:[2,{j:1}],n:[2,{js:1}],fhsw:[2,{s:1}]}],N:[2,{ns:1}],I:[2,{"IM^jns":1}]}],j:[2,{"?I^":1,j:[3,{"?BI^j":1,C:[1,{j:1,n:[5,{CV:1}],fhsw:[5,{C:1}]}],M:[5,{C:1}],V:[5,{jns:1}]}],n:[5,{CIjns:1,M:[1,{j:[7,{$:1}],n:1}]}],s:[1,{fhnsw:1,j:[5,{C:1}]}],V:[1,{fhsw:[5,{n:[7,{$C:1}],s:1}],j:[5,{j:1}],n:[5,{ns:1}]}],B:[1,{fhjsw:[5,{js:1}],n:[5,{n:1}]}],C:[5,{j:[7,{$C:1,M:[1,{j:1}]}],n:[7,{$C:1,M:[1,{jn:1}]}],Cs:1,B:[1,{j:1}]}],M:[5,{Cjns:1}]}],V:[5,{C:[2,{"?CIMN^ns":1,j:[3,{"?BCIMN^jns":1,V:[4,{M:1}]}],B:[1,{fhjsw:1}],V:[3,{M:1}]}],Is:1,j:[2,{C:[1,{j:1}],"M^":1}],n:[2,{C:[1,{j:[4,{"BCIMV^jns":1}]}],"M^":1}],M:[1,{j:[2,{j:1,n:[4,{M:1}]}],n:[2,{ns:1}],fhsw:[2,{s:1}]}],N:[2,{ns:1}]}],N:[5,{C:[2,{"CIMN^ns":1,j:[3,{"CIMN^":1,V:[7,{C:1}]}]}],Ins:1,j:[2,{IM:1}]}],s:[5,{jns:1,C:[2,{j:[3,{CM:1}],CMns:1}]}],h:1}],"2":[2,{"?":[5,{$:[1,{fhjsw:1,n:[3,{"?":1}]}],"?":[6,{$I:1,"?":[4,{"?CM":1,"^":[3,{"?^":1}]}],C:[3,{"?":1}]}],C:[1,{fhjsw:1,n:[3,{M:[4,{"?^":1}],"^":1}]}],I:[1,{fhjsw:1,n:[3,{M:[7,{$:1}]}]}],j:[6,{$:[1,{fhjsw:1,n:[3,{"?":1}]}],"?":[7,{$I:1,"?":[1,{fhjsw:1,n:[4,{C:1}]}],C:[3,{"?":1,C:[1,{fhjsw:1}]}]}],C:[1,{fhjsw:1,n:[3,{M:[4,{"^":1}],"^":1}]}],I:[1,{fhjsw:1}],M:[1,{j:[7,{I:1,C:[4,{C:1}]}],n:[7,{I:1}]}],V:1}],n:[6,{$:[3,{"?^":1,C:[4,{B:1}]}],"?":[7,{$I:1,"?":[4,{"?CM":1,"^":[3,{"?^":1}]}],C:[3,{"?":1,C:[1,{n:1}]}]}],C:[1,{fhjsw:[3,{M:[4,{"^":1}],"^":1}],n:1}],I:[1,{n:1}],M:[1,{j:[7,{I:1}],n:[7,{I:1,C:[4,{C:1}]}]}],V:1}],s:[1,{fhjsw:1,n:[3,{"?":[4,{"?":1,"^":[6,{"?":1}]}],M:[6,{C:[4,{"^":1}],M:1}],I:[6,{M:1}],"^":1}]}],M:[1,{fhsw:[6,{BI:1,C:[7,{CN:1}]}],jn:[6,{M:1}]}],V:1}],C:[5,{$CIfhs:1,j:[6,{$CIfhs:1,"?":[7,{"?":[4,{B:1}],M:[3,{C:[4,{C:1}],B:1}],B:1}],j:[7,{$CIj:1}],n:[7,{$CIn:1}]}],n:[6,{$CINfhs:1,"?":[7,{"?":[4,{B:1}],M:[3,{C:[4,{C:1}],B:1}],$:[3,{B:1}],B:1}],j:[7,{$CIj:1}],n:[7,{$CIn:1}]}],M:[1,{jn:[3,{"?":[4,{"?":[6,{B:1}],C:[6,{I:1}],N:[7,{$:1}]}]}]}],"?":[6,{"?":[4,{B:1}],M:[7,{$I:1}],B:1}]}],I:[5,{$CIs:1,jn:[6,{$CINns:1,M:[1,{jn:[4,{"?":1}]}],"?":[7,{M:1}]}],"?":[6,{M:1}]}],M:[5,{$CIfs:1,jn:[6,{$CINVfjns:1,"?":[7,{BM:1,I:[3,{M:1}],"?":[3,{"N^":1}],C:[3,{B:1,M:[4,{N:1}]}],$:[4,{"^":1}]}],M:[1,{jn:[3,{"?":1}]}]}],"?":[6,{BM:1,"?":[3,{C:[7,{"?":1}],"N^":1}],C:[3,{M:[4,{C:[7,{N:1}],N:1}],B:1,"^":[7,{CMV:1}]}],I:[3,{M:1}],$:[4,{"^":1}]}],BM:[1,{jn:[3,{"?":1}]}]}],j:[5,{$Ifhs:1,"?":[3,{"?":[4,{"?BCIM":1,"^":[6,{"$?":1}]}],C:[6,{M:[7,{$I:1}],"?":[7,{"$?":1}],B:1}],M:[6,{C:[4,{B:1,M:[7,{N:1}],"^":[7,{CMV:1}]}],"?":[4,{C:[7,{"?":1}],"N^":1}],BM:1,I:[4,{M:1}]}],I:[6,{M:1}],"B^":1}],C:[3,{"?":[1,{fhjsw:1,n:[4,{"?BCMNV^":1,I:[6,{CIN:1}]}]}],"BCIMN^fhjns":1,V:[6,{"$?BCIV":1,N:[7,{$CV:1,M:[4,{M:1}]}],M:[4,{M:1}]}]}],M:[3,{"?":[4,{"?V":1,C:[7,{C:1,M:[6,{C:1}]}],M:[1,{jn:[6,{C:1}]}]}],"B^h":1,M:[1,{jn:[4,{"?":1}]}],N:[1,{jn:[7,{"?":1}]}]}],jn:[6,{$CIjn:1}],B:[3,{"B^":1,"?":[4,{I:1}]}],N:[3,{"BIMN^":1}],V:[3,{"?BM^":1}]}],n:[5,{$CINfhs:1,"?":[3,{"?":[4,{"?BCIM":1,"^":[6,{"$?":1}]}],C:[6,{$:[4,{B:1}],M:[7,{$I:1}],"?":[7,{"$?":1}],B:1}],M:[6,{C:[4,{B:1,M:[7,{N:1}],"^":[7,{CMV:1}]}],"?":[4,{C:[7,{"?":1}],"N^":1}],BM:1,I:[4,{M:1}]}],I:[6,{M:1}],"B^":1}],M:[3,{"?":[4,{"?V":1,C:[7,{C:1,M:[6,{C:1}]}],M:[1,{jn:[6,{C:1}]}]}],"B^h":1,M:[1,{jn:[4,{"?":1}]}],N:[1,{jn:[7,{"?":1}]}]}],j:[6,{$CIjn:1}],n:[6,{$CIn:1}],B:[3,{"B^":1,"?":[4,{I:1}]}],V:[3,{"?BM^":1}]}],s:[3,{"?":[1,{fhjsw:1,n:[4,{"?BCMNV^":1,I:[6,{$CIN:1}]}]}],"BCIMNV^fhjns":1}],B:[1,{fhjsw:[5,{$CIjs:1,n:[3,{M:[4,{"?":1}],"^":1}]}],n:[5,{n:1,Cjs:[3,{M:[4,{"?":1}],"^":1}]}]}],N:[5,{$CIs:1,jn:[6,{$CINjns:1}],M:[1,{jn:[7,{"?":1}]}]}],V:[5,{$:[4,{"?BCIMN^":1}],I:1,j:[7,{$:[4,{"?BIMN^":1,C:[6,{$CI:1}]}],C:[4,{"?BIMNjns":1,C:[6,{CI:1}],"^":[6,{C:1}]}],V:[4,{"?BIM^":1,C:[3,{MN:1}]}],I:[6,{CI:1}],"?":1,B:[4,{BIMs:1,"C^":[6,{C:1}]}],N:[4,{BCIMNn:1}],M:[3,{M:1}]}],n:[4,{"?BIMNjns":1,"C^":[6,{$CI:1}],V:[7,{"?":1}]}],s:[4,{"?BCIMN^jns":1,V:[1,{fhnsw:1}]}],C:[3,{M:1}]}],"^fh":1}],"7":[2,{"?fh":1,C:[5,{"$?CIhs":1,j:[6,{"$?CIhs":1,BV:[1,{j:1}],M:[1,{j:[3,{"?NV^":1,C:[4,{"?MV^hns":1}],I:[4,{IV:1}],j:[7,{BC:1}],n:[4,{"BCIM^j":1}],B:[7,{$j:1}],M:[4,{MN:1}],h:[4,{h:1}]}]}],j:[7,{"$?CIjn":1,M:[1,{j:1}]}],n:[7,{"$?CIj":1,n:[3,{BCMVn:1}],M:[1,{jn:1}]}]}],n:[6,{"$?CINhs":1,BV:[1,{j:1}],M:[1,{jn:1}],j:[7,{"$?BCIVjn":1,M:[1,{jn:1}]}],n:[7,{"$?CIVjn":1,M:[1,{jn:1}]}]}],B:[1,{jn:[3,{"?BCIM^hjns":1,V:[6,{n:1}]}]}],V:[1,{j:[3,{"?":[6,{C:1}],V:[6,{"?":1}]}],n:[3,{"?":[7,{M:1}]}]}],M:[1,{jn:[3,{V:[7,{"?":1}]}]}]}],I:[5,{"$?CIs":1,jn:[6,{"$?CIjn":1}],B:[1,{jn:1}],V:[1,{j:1,n:[7,{C:1}]}]}],j:[5,{"$?Ifhs":1,C:[3,{"?BCIMN^fhjns":1,V:[4,{"BIM^n":1,N:[6,{$BCMN:1,V:[7,{"$?n":1}]}],V:[6,{$CM:1,V:[7,{$:1}]}],j:[6,{$BCM:1,V:[7,{$n:1}]}]}]}],j:[6,{"$?CIjn":1,M:[1,{j:1}],V:[3,{"^j":1}],B:[3,{I:1}]}],n:[6,{"$?CIhj":1,n:[7,{"$?BCIVjn":1}],M:[1,{jn:1}],V:[3,{"V^jn":1}],B:[3,{Ij:1}]}],B:[3,{CV:[1,{jn:1}],j:[4,{I:1}],n:[4,{Ij:1}],"^h":1}],M:[3,{C:[1,{j:[4,{"?Vs":1,B:[6,{Ihj:1}],C:[6,{"?BIVhj":1}],I:[7,{"?Cn":1}],M:[7,{"$?Bjn":1}],"^":[6,{"?I":1}],h:[6,{C:1}],j:[6,{CI:1}],n:[7,{CIn:1}]}],n:[4,{V:[7,{"?":1}]}]}],MNj:[1,{j:1}],Vn:[1,{jn:1}],"^":1}],V:[3,{C:[1,{j:1}],M:1,n:[1,{fhjsw:1,n:[7,{$C:1}]}],N:[4,{M:1}],j:[4,{"^":1}],"^":[1,{fhjsw:1,n:[7,{$:1}]}]}],N:[3,{M:1}]}],n:[5,{"$?CINfhs":1,j:[6,{"$?CIVhj":1,n:[7,{"$?BCIVjn":1}],B:[3,{CIj:1}],M:[1,{jn:1}]}],n:[6,{"$?CIVhj":1,n:[7,{"$?CIVjn":1}],M:[1,{jn:1}],B:[3,{Ij:1}]}],M:[1,{jn:1,fhsw:[3,{"^":1}]}],V:[3,{M:1,n:[7,{$BC:1,M:[1,{n:1}]}],N:[4,{M:1}],j:[4,{"^":1}],"^":[7,{$C:1}]}],B:[3,{V:[1,{jn:1}],jn:[4,{Ij:1}],"^h":1}]}],s:[7,{"$?BCINVhjns":1,M:[5,{"?BCIMNhjns":1,V:[1,{fhjsw:1}]}]}],B:[4,{"?BIhns":1,C:[3,{CINVj:1,M:[7,{$:[1,{fhjsw:[5,{Cjs:1}],n:[5,{n:1}]}],"?":1,C:[1,{fhjsw:[5,{Cs:1}]}],BIMVjn:[1,{fhjsw:[5,{C:1}]}]}]}],M:[3,{B:[1,{f:1}],CIh:1}],N:[1,{fhjsw:[5,{Cjs:1}],n:[5,{n:1}]}],V:[3,{C:[7,{$C:[1,{fhjsw:[5,{Cjs:1}],n:[5,{n:1}]}],"?":1}],Ijn:1}],"^":[3,{"C^":1,I:[5,{$CIs:1,jn:[6,{$CIjn:1}]}]}],j:[3,{CIn:1}]}],M:[5,{"$?CIhs":1,j:[6,{"$?CINVhns":1,j:[7,{"$?CIjn":1}],M:[1,{j:1}]}],n:[6,{"$?CINVhns":1,j:[7,{"$?CIjn":1}],M:[1,{jn:1}]}],B:[1,{jn:[6,{C:[4,{"?":1}],n:1}]}],M:[1,{j:[4,{"CM^":1}]}]}],V:[3,{C:[5,{$:[1,{fhnsw:1}],I:[4,{"?":1,V:[1,{fhnsw:1}]}],j:[1,{fhnsw:[4,{"?":[7,{$C:1}],I:[7,{"?":1}]}],j:[6,{"$?BIMs":1,j:[7,{"$?CIjn":1}],n:[7,{"$?CIVjn":1}]}]}],n:[4,{"?":1,B:[7,{$Ijn:[1,{fhnsw:1}],"?N":1}],C:[1,{fhnsw:[6,{CIs:1}]}],I:[6,{"?":1,CIns:[1,{fhnsw:1}],j:[7,{"?":1}]}],M:[1,{fhsw:[6,{CIs:1}],n:[6,{CIMs:1}]}],Nhs:[1,{fhnsw:1}],V:[1,{fhsw:[6,{"?CIV":1}],n:[7,{$CIVjn:1}]}],"^":[7,{$:[1,{n:1}],"?":1,j:[1,{fhnsw:1}]}],j:[6,{"?":1,Cj:[1,{fhnsw:1}],n:[7,{"?":1}],B:[1,{n:1}]}],n:[1,{fhnsw:[6,{Cn:1}]}]}],s:[1,{fhnsw:1,j:[4,{"?":1,I:[7,{"?":1}]}]}],"?":[1,{fhnsw:1,j:[4,{I:1}]}],M:[1,{n:1}],B:[1,{n:[4,{"M^j":1}]}],V:[1,{n:1,j:[6,{I:1}],fhsw:[4,{V:1}]}],h:1}],BI:[5,{jns:1}],M:1,N:[6,{$:[5,{"$?jns":1}],C:[5,{Ins:1,j:[7,{$BCMN:1}],C:[4,{M:1}]}],"?I":1,j:[7,{$I:1}],n:[7,{CIj:1}]}],V:[5,{$Ijns:1}],j:[6,{$:[5,{$Ijns:1}],C:[4,{C:[5,{I:1,ns:[1,{fhnsw:1}]}],"^":[5,{n:1}],j:1}],Ij:1,n:[7,{$CI:1}]}],n:[5,{ns:[1,{fhnsw:1,j:[6,{C:1}]}],j:[4,{Vn:1}],$:1}],"^":[5,{$jns:1}]}],N:[5,{$Cs:1,j:[6,{$C:1,M:[1,{j:1}],V:[3,{M:1}]}],n:[6,{$C:1,M:[1,{jn:1}],V:[3,{M:1}]}],V:[1,{j:[4,{C:[3,{C:1}],"IMV^":1}]}],B:[1,{jn:1}]}],"^":[5,{"?BCIMfhjns":1,V:[1,{fhjsw:1,n:[7,{$:1}]}]}]}],"8":[2,{"?":[3,{"?CIMV^":1,D:[5,{jns:1}]}],j:[5,{"$?DIfhs":1,C:[3,{"?BCDIM^fhjns":1,V:[4,{C:[7,{$:[6,{Mn:1}],C:[6,{I:1}],n:[6,{M:1}],"?":1,B:[1,{h:1}],M:[1,{j:1}],j:[6,{j:1}]}],DIMVjn:1}]}],M:[3,{C:[1,{j:1,n:[7,{C:[6,{"?":1}],BD:[4,{n:1}],"?":1}]}],DM:[1,{j:1}],"^hs":1,j:[1,{j:1,n:[4,{Is:1,j:[6,{C:1}]}],fhsw:[4,{s:1}]}],In:[1,{jn:1}]}],V:[3,{C:[1,{j:[6,{$BDIMVjns:1,C:[7,{I:1}]}],n:[6,{$BDIVns:1,j:[7,{$CDIj:1}]}]}],DMn:[1,{jn:1}],V:[1,{j:[6,{C:1}]}],"^s":1,j:[4,{s:1}]}],j:[6,{$CDIn:1,M:[3,{Cj:[1,{j:1}],"^s":1}],j:[7,{$CDIn:1,j:[3,{j:[4,{BDIMVj:1}],BDIMV:1,C:[1,{jn:1}]}],M:[1,{j:1}]}],V:[3,{s:1}],B:[3,{"M^":1}]}],n:[6,{$CDIs:1,M:[1,{jn:1,fhsw:[3,{"^s":1}]}],j:[7,{j:[3,{j:[4,{BDIMVj:1}],BDIMV:1,C:[1,{jn:1}]}],$CDIn:1,M:[1,{jn:1}]}],n:[7,{$CDIn:1}],V:[3,{s:1}],B:[3,{"M^":1}]}],B:[3,{CD:[1,{jn:1}],"^n":1,j:[4,{"M^":1}]}]}],n:[5,{"$?CDIfhs":1,M:[1,{jn:1,fhsw:[3,{j:[4,{s:1}],"^":1}]}],j:[6,{$BCDIs:1,M:[1,{jn:1,fhsw:[3,{"^s":1}]}],j:[7,{j:[3,{j:[4,{BDIMVj:1}],BDIMV:1,C:[1,{jn:1}]}],$CDIn:1,M:[1,{jn:1}]}],n:[7,{$CDIn:1}],V:[1,{jn:1}]}],n:[6,{$BCDIjs:1,n:[7,{$CDIn:1}],MV:[1,{jn:1}]}],V:[3,{Mn:[1,{jn:1}],V:[1,{n:[6,{C:1}]}],"^":1,j:[4,{s:1}]}],B:[3,{"^n":1,j:[4,{"M^":1}]}]}],"^fhs":1,C:[5,{"$?CDIhs":1,j:[6,{"$?CDIhs":1,B:[1,{j:1}],M:[1,{j:1,n:[3,{C:[4,{n:1}],D:[7,{n:1}]}]}],V:[1,{j:[7,{$BDIMVjns:1,C:[3,{h:1}]}]}],j:[7,{$CDn:1,M:[1,{j:1}],j:[1,{j:1,n:[4,{Cj:1}]}]}],n:[7,{$CDIj:1,n:[3,{"CV^":1}],M:[1,{jn:1}]}]}],n:[6,{"$?CDIhs":1,BV:[1,{j:1}],M:[1,{jn:1}],n:[7,{MV:[1,{jn:1}],$BCDIjn:1}],j:[7,{$BCDn:1,MVj:[1,{jn:1}]}]}],B:[1,{j:[3,{"BCDIM^jns":1,V:[6,{jn:1}]}],n:[3,{"BCDIM^jns":1,V:[6,{n:1}]}]}],M:[1,{j:[6,{B:[3,{s:[7,{s:1}]}],C:[3,{j:[7,{$:1}],V:[7,{C:1}],s:[4,{"^":1}]}],D:[3,{B:[4,{I:1}]}],I:[3,{B:1,I:[4,{I:1}]}],n:[4,{B:1,"^":[7,{$:1}]}],"?":1,j:[3,{C:[7,{D:1}]}]}]}],V:[1,{j:[6,{$:[3,{BCDIMhjns:1}],n:[3,{"BCDIM^jns":1,V:[4,{C:1}]}],I:[3,{CDIM:1}],Ds:1}],n:[6,{$:[3,{BCDIMhjns:1}],n:[3,{"BCDI^jns":1,M:[7,{C:1}],V:[4,{C:1}]}],I:[3,{CDIM:1}],BDs:1}]}]}],M:[5,{"$?CDIhs":1,j:[6,{"$?CDIhns":1,j:[7,{$BCDIj:1,M:[1,{j:1}]}],M:[1,{j:1}],V:[1,{jn:1}]}],n:[6,{"$?CDIhns":1,j:[7,{$BCDIj:1,M:[1,{jn:1}]}],MV:[1,{jn:1}]}],M:[1,{j:[6,{$C:1}]}],B:[1,{jn:[6,{n:1}]}]}],V:[3,{C:[6,{$:[1,{f:[5,{$DIns:1}],hsw:[5,{$Ins:1}],j:[5,{j:1}],n:[5,{$BDIns:1}]}],C:[1,{fs:[5,{j:[4,{"?":1}],Ins:1,D:[7,{M:1}]}],hw:[5,{j:[4,{"?":1}],DIns:1}],j:[4,{"?":[7,{$CV:1}],V:[7,{h:1}]}],n:[5,{j:[4,{"?":1}],BIns:1,D:[7,{MV:1}]}]}],D:[1,{fhnsw:[5,{Ins:1}],j:[5,{j:1}]}],j:[7,{$CDIj:[1,{fhnsw:[5,{ns:1}],j:[5,{j:1}]}],V:1}],n:[5,{j:[1,{j:1}],n:[1,{fhsw:[7,{$CDIjns:1}],n:1}],Ds:[1,{fhnsw:1}],I:1}],s:[1,{fhnsw:[5,{ns:1}],j:[5,{j:1}]}],I:[5,{ns:[1,{fhnsw:1}],j:[1,{j:1}],I:[1,{n:1}],"?":1}],B:[1,{fhnsw:[5,{Is:1}]}],V:[1,{fhsw:[5,{s:1}],n:[5,{n:[4,{M:1}],s:1}]}],M:[1,{fhsw:[5,{s:1}],j:[5,{j:1}],n:[5,{ns:1}]}],"?":1}],D:[5,{jns:1}],Ijn:[5,{$jns:1}],"M^":1,V:[5,{$jns:1,C:[7,{C:[1,{hn:1}],V:1}]}]}],B:[3,{C:[4,{"BCDIM^fhjns":1,V:[6,{$:[1,{fhjs:1}],B:[7,{$:1}],C:[5,{C:1,I:[7,{M:1}],j:[1,{fhjsw:1}],n:[1,{ns:1}],s:[7,{$BDMVj:1}]}],DIV:1,M:[1,{fhjsw:1}],j:[5,{Cs:1,j:[1,{fhjsw:1}],n:[1,{ns:1}]}],n:[1,{fjs:[5,{js:1}],hw:1,n:[5,{n:1}]}],s:[1,{fhns:1}]}]}],"DIV^jn":1,M:[1,{fhjsw:[5,{$CIs:1,j:[6,{$Cjns:1}]}],n:[4,{C:[5,{n:[6,{Cjns:1}]}],"^":[5,{n:1}]}]}]}],D:[5,{"$?CDIhs":1,j:[6,{"$?CDIhjns":1,BMV:[1,{j:1}]}],n:[6,{"$?CDIhjns":1,BV:[1,{j:1}],M:[1,{jn:1}]}],B:[1,{jn:1}],M:[1,{j:1}]}],I:[5,{"$?CDIhs":1,j:[6,{"$?CDIhns":1,j:[7,{$CDj:1}],M:[1,{jn:1}]}],n:[6,{"$?CDIhns":1,j:[7,{$CDj:1}]}],BV:[1,{jn:1}]}]}],"9":[1,{fhsw:[5,{$CIs:1,"?":[2,{"?":[4,{"?IMV^":1,C:[6,{C:1}]}],C:[6,{"$?CIV":1,M:[3,{CM:1}]}],"V^s":1,jn:[6,{$:[4,{"?CIV^":1}],"?":[4,{"?IV^":1,CM:[3,{C:1}]}],CV:1,I:[7,{"$?M":1}],M:[7,{$C:1}]}],I:[3,{"CIM^":1,"?":[7,{$C:1}]}],M:[6,{$CMV:1,"?":[4,{"CIMV^":1}],I:[7,{"$?M":1}]}]}],j:[6,{$CIs:1,"?":[4,{"?IMV":1,C:[2,{"?":[3,{C:1}],CMV:1,I:[3,{M:1}]}],"^":[7,{"$?CV":1,I:[2,{C:1}]}]}],j:[7,{$CIj:1}],M:[2,{"^":1}]}],n:[2,{"^ns":1,j:[3,{j:[4,{j:1}],"^":1}]}],M:[2,{"^s":1,j:[3,{"^":1}]}],V:[2,{s:1}]}],j:[5,{"$?CIjs":1,n:[6,{"$?CIjns":1,M:[2,{I:[4,{"?":1,C:[3,{"?":1}],"M^":[7,{"?":1}]}],"?":[3,{C:[7,{$:1}]}],"^":1}]}],M:[2,{I:[4,{"?":1,C:[3,{"?":1}],M:[6,{"?":1}]}],"^js":1,n:[3,{I:[4,{CI:[6,{"?":1}]}],"^":1}],"?":[3,{C:[6,{"$?":1}]}]}],V:[2,{js:1}]}],n:[2,{"?":[5,{"$?CIs":1,j:[6,{"$?CIMVj":1}],M:[3,{C:[6,{"$?":1}]}]}],C:[5,{"$?CIs":1,j:[6,{"$?CIMV":1}]}],I:[5,{M:[4,{"?":1,C:[3,{"?":1}],M:[6,{"?":1}]}],"$?CIjs":1}],MV:[5,{"$?CIjs":1}],j:[3,{"?":[5,{"$?CIMVj":1}],C:[5,{"$?CIMV":1}],IMV:1,"^":[5,{M:1}]}],s:[5,{MV:1}],"^":[5,{M:1,j:[6,{M:1}]}]}]}],a:1,"4":[2,{"?":[6,{"$?IMNVjn":1,C:[5,{"?CIjns":1}],B:[5,{"?CIs":1}]}],B:[4,{"?Bjn":1,C:[3,{CIVjn:1,M:[1,{fhjsw:[5,{CIjs:1}],n:[5,{n:1}]}]}],I:[3,{BCIj:1,M:[5,{$C:1,j:[6,{$:1}],s:[6,{C:1}]}]}],M:[3,{C:1,I:[5,{"$?CIjns":1}],M:[1,{fsw:1}],n:[1,{fj:1}]}],N:[5,{$:1}],V:[7,{$:[5,{$:1,C:[1,{fhjsw:1}],jns:[6,{$:1}]}],BCMV:1}],"^":[5,{"$?CIjns":1}]}],C:[5,{$:[3,{"?BCIMN^jns":1,V:[4,{"MNV^jn":1}]}],"?":[6,{"$?C":1,I:[1,{fhnsw:1}]}],C:[3,{"?BCIMN^jns":1,V:[1,{fhnsw:1,j:[4,{IMNjn:1}]}]}],I:[3,{"?BCIM^jn":1,V:[1,{fhnsw:1}]}],j:[6,{$:[3,{"?BCIMN^jns":1,V:[4,{"MNV^jn":1}]}],"?":[3,{"?CIM^":1,V:[7,{"$?C":1}]}],C:[3,{"?BCIMN^jns":1,V:[4,{C:[1,{j:1}],IMNjn:1}]}],I:[3,{"?BCIM^jn":1,V:[1,{j:1}]}],BV:[1,{j:[3,{"?":1}]}],n:[3,{"CIM^":[7,{$CIn:1}],N:1,V:[4,{N:1}],n:[7,{$C:1}],B:[4,{M:1}]}],j:[3,{M:[7,{$Cjn:1}],C:[7,{$CI:1}],"?I":1,"^":[7,{CI:1}]}],hs:1}],n:[6,{$:[3,{"?BCIMN^jns":1,V:[4,{"MNV^jn":1}]}],"?":[3,{"?CIM^":1,V:[1,{fhnsw:1}]}],C:[3,{"?BCIMN^jns":1,V:[1,{fhnsw:1,j:[4,{IMNjn:1}]}]}],I:[3,{"?BCIM^jn":1,V:[1,{fhnsw:1}]}],BV:[1,{j:[3,{"?":1}]}],N:[3,{"?BCIMN^jn":1,V:[1,{fhnsw:1}]}],n:[3,{CNn:1,IM:[7,{$CIVn:1}],V:[1,{fhnsw:1}],B:[4,{M:1}],"^":[7,{$BCIVn:1}]}],j:[3,{"?CIM^":1}],hs:1}],s:[3,{"?BCIMN^hjns":1,V:[1,{fhnsw:1,j:[4,{C:[7,{"?":1}],IMNVjn:1}]}]}],B:[1,{jn:[3,{"?":1}]}],h:1}],I:[4,{"?":[5,{"$?CIs":1,jn:[6,{"$?CI":1}]}],B:[5,{$CIs:1,jn:[6,{$CI:1}]}],C:[3,{"?BINhjn":1,C:[5,{$CIs:1,jn:[6,{$CI:1}]}],M:[5,{"$?CIs":1,jn:[6,{"$?CIjn":1}]}],V:[1,{fhnsw:[5,{CIs:1,n:[6,{CI:1}]}],j:[5,{j:[6,{CI:1}]}]}]}],IV:[5,{$CIs:1,jn:[6,{$CIn:1}]}],M:[5,{"$?CIs":1,jn:[6,{"$?CIn":1}]}],N:[6,{$:[5,{$CIjns:1}],"?CINVn":1,M:[5,{Cs:1}],B:[5,{s:1}]}],"^":[5,{"$?CIs":1,jn:[6,{"$?CINjn":1}],V:[1,{jn:1}]}],jns:1}],j:[5,{"$?Ihs":1,C:[3,{"?BCIMN^hjns":1,V:[6,{$I:1,"?":[7,{"$?I":1}],B:[7,{CI:1}],C:[4,{CIMjn:1,N:[7,{$V:1}]}],M:[4,{C:[7,{"?":1}],M:1}],N:[7,{$CIVn:1}],V:[7,{$Bn:1,C:[4,{M:1}]}],j:[7,{$CVjn:1}],n:[7,{BIVn:1,C:[4,{C:1}]}]}]}],j:[6,{"$?CIjn":1,B:[3,{I:1}]}],n:[6,{"$?CIjn":1,B:[3,{IM:1}],V:[3,{Vn:1}]}],B:[3,{C:[1,{jn:[6,{"?":1}]}],"B^n":1,j:[4,{I:1}]}],M:[3,{I:[1,{j:[4,{"^":1}],n:[6,{C:[7,{V:1}],I:1}]}],N:[1,{jn:[4,{M:1}]}],"^":1}],V:[3,{C:[1,{j:[4,{"?":1}]}],"M^n":1,V:[4,{"V^":1}]}],N:[3,{"IMN^":1}]}],n:[5,{"$?CINhs":1,jn:[6,{"$?BCIVjn":1}],M:[3,{I:[1,{j:[4,{M:[6,{C:1}]}],n:[6,{C:[4,{M:1}],I:1}]}],N:[1,{jn:[4,{M:1}]}],"^":1}],V:[3,{"M^n":1,V:[4,{"MV^":1}]}],B:[3,{"B^n":1,j:[4,{I:1}]}]}],"^hs":1,M:[5,{"$?CIs":1,jn:[6,{"$?CINVjns":1}],B:[1,{jn:[4,{"?":1}]}]}],N:[5,{$CIs:1,jn:[6,{$CINn:1}]}],V:[3,{C:[6,{C:[5,{j:[7,{$:[4,{"?BCIMN^jn":1}],C:[4,{"?BCIMN^jns":1}],M:[4,{"?":1}],B:[4,{"BCIM^":1}],N:1,V:[4,{BCINjn:1}],n:[4,{"BCIM^n":1}],"?":[4,{CIMn:1}],I:[4,{"CIMN^n":1}],j:[4,{"CM^":1}]}],n:[4,{"?BCIMN^jns":1,V:[1,{n:1}]}],s:[4,{"?BCIMN^jns":1,V:[1,{fhsw:1}]}],h:1}],$:[5,{$jns:[4,{"BCIMN^jn":1}],"?h":1}],j:[4,{BIjn:1,CM:[5,{jns:1}],V:[1,{fhsw:[5,{s:1}],j:[5,{j:1}],n:[5,{n:1}]}]}],n:[4,{"BCIM^n":[5,{jns:1}],Nj:1,V:[1,{fhnsw:[5,{ns:1}],j:[5,{j:1}]}]}],I:[7,{$:[1,{fhnsw:[5,{ns:1}],j:[5,{j:1}]}],C:[4,{"CIM^":[5,{jns:1}],n:1}],IV:[5,{jns:1}],M:1}],hs:1,BV:[1,{fhnsw:[5,{s:1}]}],"?":[5,{"?jns":1}],M:[5,{s:1}]}],I:[5,{j:[7,{$C:1}],$ns:1}],M:1,N:[6,{C:[7,{M:[5,{Ins:1}],$:[5,{jns:1}],CN:1}],Ij:1,n:[7,{n:1}]}],V:[5,{IVns:1,j:[6,{C:[7,{$:1}],IVn:1}]}],j:[5,{j:[7,{$C:1}],ns:1}],n:[5,{$ns:1,j:[7,{$C:1}]}],"^":[5,{Vns:1,j:[6,{C:[7,{$:1}],V:1}]}]}]}],"5":[5,{C:[2,{"?CIM^fhns":1,V:[4,{"?":1,C:[3,{C:[6,{"?":1,M:[7,{"?":1}]}],M:1}],I:[6,{"?":1}],M:[7,{C:[6,{"?":1}],"?":1}],V:[7,{"?":1}],"^":[6,{"?":1,M:[7,{"?":1}]}]}],j:[3,{"?CIM^fhjns":1,V:[7,{"$?CIVhjns":1,M:[6,{CMn:1}]}]}]}],j:[6,{"$?CIfhs":1,M:[2,{C:[1,{j:[7,{"$?CIMhjns":1}],n:[4,{"?":1,C:[7,{"?":1}],"^":[3,{"?":1}]}]}],M:[1,{j:[7,{C:1}]}],n:[1,{jn:1}],s:1}],n:[7,{$CIjn:1,M:[1,{jn:1}]}],V:[2,{M:1}],j:[3,{"CM^n":1}]}],n:[6,{"$?CIfhs":1,M:[2,{C:[1,{jn:[7,{"$?CIMhjns":1}]}],M:[1,{jn:[7,{C:1}]}],jn:[1,{jn:1}],s:[1,{fhnsw:1}],V:1}],n:[7,{$CIjn:1,M:[1,{jn:1}]}],V:[2,{M:1}],j:[3,{"CM^n":1}]}],"$?Ifhs":1,M:[2,{j:[1,{j:[6,{$:[3,{C:1}],"?CIfhjns":1,M:[7,{C:1}]}],n:[3,{C:[4,{M:[6,{"?":1}]}],n:1}]}],n:[1,{j:[6,{$:[3,{C:1}],"?CIfhjns":1,M:[7,{C:1}]}],n:[6,{"$?CIfhjns":1,M:[7,{C:1}]}]}],s:[1,{fhnsw:1,j:[7,{"?":1}]}],V:1}],V:[1,{fhnsw:[2,{s:1,n:[3,{M:1}]}],j:[2,{j:[3,{M:1}]}]}]}],"6":[2,{"?fhw":1,j:[5,{"$?Ifhsw":1,C:[3,{"?BCIM^fjns":1,V:[4,{"BMV^jn":1,C:[7,{C:[6,{"?":1}],"?":1}]}]}],M:[1,{j:1,n:[6,{C:[3,{C:[4,{"?":1}],"^":1}],M:[3,{M:1}],"?":1,n:[4,{C:1}]}],fhsw:[3,{"^":1}]}],V:[1,{j:[3,{"CM^":1}],n:[6,{C:[3,{C:[7,{"?":1}],M:1}],n:[4,{BIn:1,CM:[3,{C:1}]}],I:[4,{IM:1}],j:1,s:[7,{$:1}]}],f:[3,{"^":1}]}],n:[6,{$CIjn:1,M:[1,{jn:1}]}],B:[3,{CV:[1,{jn:1}],"B^":1,n:[4,{C:1}]}],j:[4,{"BCMV^jn":1}]}],n:[5,{"$?CIfhsw":1,M:[1,{jn:1,fhsw:[3,{"^":1}]}],jn:[6,{$CIVjn:1,M:[1,{jn:1}],B:[3,{C:1}]}],B:[3,{"B^":1,V:[1,{jn:1}],n:[4,{C:1}]}],V:[1,{fs:[3,{"^":1}],jn:[3,{"M^":1}],w:[3,{M:1}]}]}],s:[5,{"$?BCIMfhjnsw":1,V:[7,{"$?BCIhjn":1,M:[1,{fhsw:1}],V:[4,{"BCIM^n":1}]}]}],C:[5,{"$?CIhs":1,j:[6,{"$?CIhs":1,BV:[1,{j:1}],M:[1,{j:1,n:[7,{n:[3,{B:1}],"?":1}]}],n:[7,{$CIn:1,M:[1,{jn:1}]}],j:[3,{Mn:1}]}],n:[6,{"$?CIhjs":1,BV:[1,{j:1}],M:[1,{jn:1}],n:[7,{$BCIVn:1,M:[1,{jn:1}]}]}],B:[1,{jn:1}],V:[1,{jn:[7,{"?":1}]}]}],M:[5,{"$?CIsw":1,j:[6,{"$?CIVjnw":1,M:[1,{j:1,n:[3,{C:[4,{V:1}],M:1}]}]}],n:[6,{"$?CIVjnw":1,M:[1,{jn:1}]}],B:[1,{jn:[4,{"BCIM^jn":1}]}],M:[1,{j:[7,{C:1}]}]}],V:[3,{C:[1,{fhsw:[5,{$Is:1,j:[4,{"?":1}],n:[6,{$CIjs:1,n:[7,{$CIjn:1}]}],V:[4,{V:1}]}],j:[4,{"?":[6,{$Cn:1}],B:[5,{j:[7,{C:1}]}],"C^":[7,{"?":1}],IM:[5,{j:[6,{Ijn:1}]}],V:[5,{j:1}],n:[5,{j:[6,{n:1}]}]}],n:[5,{$BIVs:1,j:[4,{"?":1}],n:[7,{"$?CIMVj":1,B:[6,{CI:1}],n:[6,{Cjn:1}]}]}]}],BIjn:[5,{jns:1}],M:1,V:[6,{$Cn:1}],"^":[5,{$jns:1}]}],B:[4,{Bjs:1,C:[3,{BCIVn:1,M:[6,{$IMjn:1,B:[1,{fhjsw:1,n:[7,{C:1}]}],C:[5,{C:[7,{$BCIMn:1}],Ijns:1}],V:[7,{$Ijs:1,C:[5,{C:1}]}]}]}],I:[5,{$Cjns:1}],M:[5,{$CIVjns:1}],V:[3,{C:[6,{$:[5,{Ij:1}],B:[1,{fjs:1}],C:[1,{f:[7,{$CMVs:1}],h:[7,{$BCMs:1}],j:[7,{BCMVs:1}],n:[7,{BCs:1}],sw:[5,{Cjs:1}]}],MV:[1,{fhjsw:1}],s:1,I:[7,{$B:1,C:[1,{hw:1}]}],n:[5,{j:1,s:[7,{C:1}]}]}],In:1}],"^n":[5,{$CIjns:1}]}],I:[5,{"$?CIs":1,jn:[6,{"$?CIjn":1}],BV:[1,{jn:1}]}],"^":[5,{"?BCIMfjns":1,V:[1,{fhsw:1}]}]}]}],fold:[{name:"anusvara",step:"anusvara",blocks:[2304,2432,2560,2688,2816,3072,3200,3328],virama:77,anusvara:2,rows:[[25,21,24],[30,26,29],[35,31,34],[40,36,39],[46,42,45]]},{name:"ar-letters",step:"map",map:{ي:"ی",ى:"ی",ك:"ک",ه:"ہ",ە:"ہ"}},{name:"nukta",step:"map",map:{"़":"","়":"","਼":"","઼":"","଼":"","":"","఼":"","಼":"","഼":""}},{name:"chandrabindu",step:"map",map:{"ँ":"ं","ঁ":"ং","ਁ":"ਂ","ઁ":"ં","ଁ":"ଂ","":"ஂ","ఁ":"ం","ಁ":"ಂ","ഁ":"ം"}},{name:"as-bn",step:"map",map:{ৰ:"র",ৱ:"ব"}},{name:"joiners",step:"map",map:{"":"","":""},after:[[2304,3583],[1536,1791],[7248,7295],[43968,44031]]},{name:"or-wa",step:"map",map:{ଵ:"ୱ"}},{name:"ar-harakat",step:"map",map:{"ً":"","ٌ":"","ٍ":"","َ":"","ُ":"","ِ":"","ّ":"","ْ":"","ٰ":""},langs:["ur"]},{name:"ml-chillu",step:"map",map:{ൺ:"ണ്",ൻ:"ന്",ർ:"ര്",ൽ:"ല്",ൾ:"ള്",ൿ:"ക്"},before:[[3328,3455]]}]};var _={unicode:"15.0.0",python:"3.12.13",ranges:[1536,1791,1872,1919,2304,3455,7248,7295,7376,7423,43232,43263,43744,44031,64336,65023,65136,65279,72448,72543],mn:[1552,1562,1611,1631,1648,1648,1750,1756,1759,1764,1767,1768,1770,1773,2304,2306,2362,2362,2364,2364,2369,2376,2381,2381,2385,2391,2402,2403,2433,2433,2492,2492,2497,2500,2509,2509,2530,2531,2558,2558,2561,2562,2620,2620,2625,2626,2631,2632,2635,2637,2641,2641,2672,2673,2677,2677,2689,2690,2748,2748,2753,2757,2759,2760,2765,2765,2786,2787,2810,2815,2817,2817,2876,2876,2879,2879,2881,2884,2893,2893,2901,2902,2914,2915,2946,2946,3008,3008,3021,3021,3072,3072,3076,3076,3132,3132,3134,3136,3142,3144,3146,3149,3157,3158,3170,3171,3201,3201,3260,3260,3263,3263,3270,3270,3276,3277,3298,3299,3328,3329,3387,3388,3393,3396,3405,3405,3426,3427,7376,7378,7380,7392,7394,7400,7405,7405,7412,7412,7416,7417,43232,43249,43263,43263,43756,43757,43766,43766,44005,44005,44008,44008,44013,44013],m:[1552,1562,1611,1631,1648,1648,1750,1756,1759,1764,1767,1768,1770,1773,2304,2307,2362,2364,2366,2383,2385,2391,2402,2403,2433,2435,2492,2492,2494,2500,2503,2504,2507,2509,2519,2519,2530,2531,2558,2558,2561,2563,2620,2620,2622,2626,2631,2632,2635,2637,2641,2641,2672,2673,2677,2677,2689,2691,2748,2748,2750,2757,2759,2761,2763,2765,2786,2787,2810,2815,2817,2819,2876,2876,2878,2884,2887,2888,2891,2893,2901,2903,2914,2915,2946,2946,3006,3010,3014,3016,3018,3021,3031,3031,3072,3076,3132,3132,3134,3140,3142,3144,3146,3149,3157,3158,3170,3171,3201,3203,3260,3260,3262,3268,3270,3272,3274,3277,3285,3286,3298,3299,3315,3315,3328,3331,3387,3388,3390,3396,3398,3400,3402,3405,3415,3415,3426,3427,7376,7378,7380,7400,7405,7405,7412,7412,7415,7417,43232,43249,43263,43263,43755,43759,43765,43766,44003,44010,44012,44013],l:[1568,1610,1646,1647,1649,1747,1749,1749,1765,1766,1774,1775,1786,1788,1791,1791,1872,1919,2308,2361,2365,2365,2384,2384,2392,2401,2417,2432,2437,2444,2447,2448,2451,2472,2474,2480,2482,2482,2486,2489,2493,2493,2510,2510,2524,2525,2527,2529,2544,2545,2556,2556,2565,2570,2575,2576,2579,2600,2602,2608,2610,2611,2613,2614,2616,2617,2649,2652,2654,2654,2674,2676,2693,2701,2703,2705,2707,2728,2730,2736,2738,2739,2741,2745,2749,2749,2768,2768,2784,2785,2809,2809,2821,2828,2831,2832,2835,2856,2858,2864,2866,2867,2869,2873,2877,2877,2908,2909,2911,2913,2929,2929,2947,2947,2949,2954,2958,2960,2962,2965,2969,2970,2972,2972,2974,2975,2979,2980,2984,2986,2990,3001,3024,3024,3077,3084,3086,3088,3090,3112,3114,3129,3133,3133,3160,3162,3165,3165,3168,3169,3200,3200,3205,3212,3214,3216,3218,3240,3242,3251,3253,3257,3261,3261,3293,3294,3296,3297,3313,3314,3332,3340,3342,3344,3346,3386,3389,3389,3406,3406,3412,3414,3423,3425,3450,3455,7258,7293,7401,7404,7406,7411,7413,7414,7418,7418,43250,43255,43259,43259,43261,43262,43744,43754,43762,43764,43777,43782,43785,43790,43793,43798,43808,43814,43816,43822,43824,43866,43868,43881,43888,44002,64336,64433,64467,64829,64848,64911,64914,64967,65008,65019,65136,65140,65142,65276],ccc:[1552,1559,230,1560,1560,30,1561,1561,31,1562,1562,32,1611,1611,27,1612,1612,28,1613,1613,29,1614,1614,30,1615,1615,31,1616,1616,32,1617,1617,33,1618,1618,34,1619,1620,230,1621,1622,220,1623,1627,230,1628,1628,220,1629,1630,230,1631,1631,220,1648,1648,35,1750,1756,230,1759,1762,230,1763,1763,220,1764,1764,230,1767,1768,230,1770,1770,220,1771,1772,230,1773,1773,220,2364,2364,7,2381,2381,9,2385,2385,230,2386,2386,220,2387,2388,230,2492,2492,7,2509,2509,9,2558,2558,230,2620,2620,7,2637,2637,9,2748,2748,7,2765,2765,9,2876,2876,7,2893,2893,9,3021,3021,9,3132,3132,7,3149,3149,9,3157,3157,84,3158,3158,91,3260,3260,7,3277,3277,9,3387,3388,9,3405,3405,9,7376,7378,230,7380,7380,1,7381,7385,220,7386,7387,230,7388,7391,220,7392,7392,230,7394,7400,1,7405,7405,220,7412,7412,230,7416,7417,230,43232,43249,230,43766,43766,9,44013,44013,9],decomp:{"1570":[1575,1619],"1571":[1575,1620],"1572":[1608,1620],"1573":[1575,1621],"1574":[1610,1620],"1728":[1749,1620],"1730":[1729,1620],"1747":[1746,1620],"2345":[2344,2364],"2353":[2352,2364],"2356":[2355,2364],"2392":[2325,2364],"2393":[2326,2364],"2394":[2327,2364],"2395":[2332,2364],"2396":[2337,2364],"2397":[2338,2364],"2398":[2347,2364],"2399":[2351,2364],"2507":[2503,2494],"2508":[2503,2519],"2524":[2465,2492],"2525":[2466,2492],"2527":[2479,2492],"2611":[2610,2620],"2614":[2616,2620],"2649":[2582,2620],"2650":[2583,2620],"2651":[2588,2620],"2654":[2603,2620],"2888":[2887,2902],"2891":[2887,2878],"2892":[2887,2903],"2908":[2849,2876],"2909":[2850,2876],"2964":[2962,3031],"3018":[3014,3006],"3019":[3015,3006],"3020":[3014,3031],"3144":[3142,3158],"3264":[3263,3285],"3271":[3270,3285],"3272":[3270,3286],"3274":[3270,3266],"3275":[3274,3285],"3402":[3398,3390],"3403":[3399,3390],"3404":[3398,3415]},excl:[2392,2393,2394,2395,2396,2397,2398,2399,2524,2525,2527,2611,2614,2649,2650,2651,2654,2908,2909]};var F1=_.unicode,r1=1,D1=2,K1=4,P=8,W=new Map,y=new Map,c=new Map;for(let n=0;n<_.ranges.length;n+=2)for(let j=_.ranges[n];j<=_.ranges[n+1];j++)W.set(j,0);var F=(n,j)=>{for(let s=0;s<n.length;s+=2)for(let C=n[s];C<=n[s+1];C++)W.set(C,W.get(C)|j)};F(_.mn,r1);F(_.m,D1);F(_.l,K1);for(let n=0;n<_.ccc.length;n+=3)for(let j=_.ccc[n];j<=_.ccc[n+1];j++)W.set(j,W.get(j)|_.ccc[n+2]<<4);var d1=new Set(_.excl);for(let[n,j]of Object.entries(_.decomp)){let s=Number(n);if(y.set(s,j),j.length===2&&!d1.has(s))c.set(j[0]*1114112+j[1],s),W.set(j[1],W.get(j[1])|P)}var U1=(n)=>String.fromCodePoint(n);function O(n,j,s){let C="";for(let M=j;M<s;M+=8192)C+=String.fromCodePoint(...n.slice(M,Math.min(s,M+8192)));return C}function n1(n){if(!W.has(n))return Array.from(U1(n).normalize("NFD"),(s)=>s.codePointAt(0));let j=y.get(n);return j?j.flatMap(n1):[n]}var t1=(n,j)=>n>>4===0&&(n&P)===0&&!y.has(j);function q(n){let j=Array.from(n,(C)=>C.codePointAt(0)),s="";for(let C=0;C<j.length;){let M=C+1,i=W.has(j[C]);for(;M<j.length;M++){let b=W.get(j[M]);if(b===void 0)i=!1;else if(t1(b,j[M]))break}s+=i?o1(j,C,M):O(j,C,M).normalize("NFC"),C=M}return s}function o1(n,j,s){let C=0,M=!0;for(let B=j;B<s&&M;B++){let w=W.get(n[B]),I=w>>4;if(y.has(n[B])||(w&P)!==0||I!==0&&I<C)M=!1;C=I}if(M)return O(n,j,s);let i=[];for(let B=j;B<s;B++)i.push(...n1(n[B]));let b=(B)=>W.get(B)>>4;for(let B=0;B<i.length;){if(b(i[B])===0){B++;continue}let w=B;while(w<i.length&&b(i[w])!==0)w++;let I=i.slice(B,w).sort(($,m)=>b($)-b(m));for(let $=0;$<I.length;$++)i[B+$]=I[$];B=w}let a=[],N=-1;for(let B of i){let w=b(B);if(N>=0&&(a.length-1===N||b(a[a.length-1])<w)){let I=c.get(a[N]*1114112+B);if(I!==void 0){a[N]=I;continue}}if(w===0)N=a.length;a.push(B)}return O(a,0,a.length)}var g1="0123456789abcdefghijklmnopqrstuvwxyz",u=(n)=>n.codePointAt(0);function j1(n){let j="";for(let s=0;s<n.length;s+=8192)j+=String.fromCodePoint(...n.slice(s,s+8192));return j}function l1(n){let j=new Map;for(let[V,A]of Object.entries(n.invisible))j.set(u(V),A);let[s,C]=n.width,M=n.scripts.map(([,V],A)=>[g1[A],V]),i=new Map;for(let[V,A,h]of n.classes)for(let R=V;R<=A;R++)i.set(R,h);function b(V){for(let[A,h]of M)for(let[R,D]of h)if(V>=R&&V<=D)return A;return}function a(V){return j.get(V)??i.get(V)??(b(V)!==void 0?"?":void 0)}function N(V){if(typeof V==="number")return V;let A=new Map;for(let[h,R]of Object.entries(V[1])){let D=N(R);for(let g of h)A.set(g,D)}return{f:V[0],kids:A}}let B=N(n.tree);function w(V,A,h){let R=[...V].reverse().find((d)=>!j.has(d)),D=h.find((d)=>!j.has(d)),g;for(let d of[R,D])if(d!==void 0&&(g=b(d))!==void 0)break;if(g===void 0)return!1;let l=[g,j.get(A)],f=[];for(let d=V.length-1;d>=0;d--){let Y=a(V[d]);if(Y===void 0)break;f.push(Y)}let Q=[];for(let d of h){let Y=a(d);if(Y===void 0)break;Q.push(Y)}for(let d=0;d<s;d++)l.push(f[d]??"^");for(let d=0;d<C;d++)l.push(Q[d]??"$");let T=B;while(typeof T!=="number")T=T.kids.get(l[T.f])??0;return T===1}let I=new Map;for(let[V,A]of Object.entries(n.chillu.map))I.set(u(V),u(A));let $={virama:u(n.chillu.virama),joiner:u(n.chillu.joiner),notBefore:u(n.chillu.not_before)},m={virama:u(n.ra.virama),assamese:u(n.ra.assamese),bengali:u(n.ra.bengali)},U={from:Array.from(n.khanda_ta.from,u),to:u(n.khanda_ta.to),notBefore:n.khanda_ta.not_before};function z(V,A){let h=Array.from(q(V),u),R=[];for(let f=0;f<h.length;f++){let Q=I.get(h[f]);if(Q!==void 0&&(f===0||h[f-1]!==$.virama)&&h[f+1]===$.virama&&h[f+2]===$.joiner&&h[f+3]!==$.notBefore)R.push(Q),f+=2;else R.push(h[f])}let[D,g]=n.ra.assamese_langs.includes(A??"")?[m.assamese,m.bengali]:[m.bengali,m.assamese];h=R,R=[];for(let f=0;f<h.length;f++)if(h[f]===m.virama&&h[f+1]===g)R.push(m.virama,D),f++;else R.push(h[f]);h=R,R=[];let l=U.from.length;for(let f=0;f<h.length;f++){let Q=h[f+l];if(U.from.every((T,d)=>h[f+d]===T)&&!(Q!==void 0&&U.notBefore.some(([T,d])=>Q>=T&&Q<=d)))R.push(U.to),f+=l-1;else R.push(h[f])}h=R,R=[];for(let f=0;f<h.length;f++){if(j.has(h[f])&&w(R.slice(-s),h[f],h.slice(f+1,f+1+C)))continue;R.push(h[f])}return q(j1(R))}function e(V,A,h){let R=A;for(let D=0;D<n.max_passes;D++){let g=V(R,h);if(g===R)break;R=g}return R}let o=(V,A)=>V!==void 0&&A.some(([h,R])=>V>=h&&V<=R),t=n.fold.map((V)=>{let A=(h)=>(R,D)=>V.langs&&!V.langs.includes(D??"")?R:h(R);if(V.step==="map"){let h=new Map;for(let[l,f]of Object.entries(V.map))h.set(u(l),f);let{before:R,after:D}=V,g=(l,f)=>(!R||o(l[f+1],R))&&(!D||o(f>0?l[f-1]:void 0,D));return A((l)=>Array.from(l.map((f,Q)=>{let T=h.get(f);return T!==void 0&&g(l,Q)?T:String.fromCodePoint(f)}).join(""),u))}return A((h)=>{let R=[];for(let D=0;D<h.length;D++){let g=V.blocks.find((l)=>h[D]>=l&&h[D]<l+128);if(g!==void 0&&D+2<h.length&&h[D+1]===g+V.virama&&V.rows.some(([l,f,Q])=>h[D]===g+l&&h[D+2]>=g+f&&h[D+2]<=g+Q))R.push(g+V.anusvara),D++;else R.push(h[D])}return R})}),r=(V,A)=>e(z,V,A),X=(V,A)=>{let h=Array.from(r(V,A),u);for(let R of t)h=R(h,A);return j1(h)};return{normalize:r,fold:(V,A)=>e(X,V,A)}}var s1=l1(J),L1=J.version;function C1(n,j){return s1.normalize(n,Z(j))}function M1(n,j){return s1.fold(n,Z(j))}var K=x,jn=K.rules_version,L=(n)=>n==="names"?["names","words"]:["words"];function sn(n="words"){let j=new Set;for(let s of L(n))for(let C of Object.keys(K.families[s]))j.add(C);return[...j].sort()}var u1=`https://cdn.jsdelivr.net/gh/micahchoo/indickit@v${p}/deromanize/lang/`;async function S(n){let j=await fetch(n);if(!j.ok)throw Error(`deromanize: ${n}: ${j.status}`);return j.arrayBuffer()}function _1(n){return async(j)=>{try{return await S(j)}catch{return S(new URL(j.href.slice(n.href.length),u1))}}}function z1(n){let j=Z(n);return j==="kok"?"gom":j}function B1(n){return n.normalize("NFD").replace(/\p{M}/gu,"").toLowerCase().replace(/[^a-z]/g,"")}var I1=(n)=>{let j=n.codePointAt(0);return B1(n)!==""||j>=768&&j<=879},v=new Map,$1=new Map;async function Cn(n,j="words",s={}){let C=z1(n),M=L(j).filter(($)=>K.families[$][C]);if(M.length===0)throw Error(`deromanize: no ${j} tables for "${n}"`);let i=new URL(s.base??"../deromanize/lang/",import.meta.url),b=s.fetch??(s.base?S:_1(i)),a=($)=>{let m=`${i}${$}`;if(!v.has(m))v.set(m,b(new URL($,i)));return v.get(m)},N={},B=[];for(let $ of M){let m=K.families[$][C];B.push(`${m.group}/${m.pooled}`,`${C}/${m.file}`)}let w=K.lists[C]??{};for(let $ of j==="names"?["words","names"]:["words"])if(w[$])B.push(`${C}/${w[$]}`);let I=await Promise.all(B.map(a));return B.forEach(($,m)=>N[$.slice($.indexOf("/")+1)]=new Uint8Array(I[m])),Q1(C,j,N)}function Q1(n,j,s){let C=[];for(let B of L(j)){let w=K.families[B][n];if(!w)continue;let I=$1.get(w.pooled);if(!I){let $=new H(s[w.pooled],"IKD1");I=new E($,w1($),new a1),$1.set(w.pooled,I)}C.push(new R1(s[w.file],I,w.tag,w.group))}if(C.length===0)throw Error(`deromanize: no ${j} tables for "${n}"`);let M=new Map,i=K.lists[n]??{};for(let B of j==="names"?["words","names"]:["words"]){let w=i[B];if(w&&s[w])X1(s[w],M)}let b=K.alpha[j],a=K.cut_modes.includes(j),N=(B,w=4)=>{let I=B1(B);if(I==="")return[];if(I.length>K.max_letters){let e="";for(let o=0;o<I.length;o+=K.max_letters)e+=N(I.slice(o,o+K.max_letters),1)[0]??"";return e===""?[]:[e]}let $=new Map;for(let e of C)for(let[o,t,r]of e.decode(I)){let X=T1(o,n),V=$.get(X);$.set(X,V===void 0?[t,r]:[Math.max(V[0],t),V[1]&&r])}let m=[...$].map(([e,[o,t]])=>[e,o,t]).sort(k),U=[],z=[];for(let[e,o,t]of m){let r=M.get(M1(C1(e,n),n));if(r===void 0||a&&t)z.push(e);else U.push([e,o+b*Math.log(r)])}return[...U.sort(k).map((e)=>e[0]),...z].filter((e)=>e!=="").slice(0,w)};return{lang:n,mode:j,word:N,text(B){let w=[...B],I="";for(let $=0;$<w.length;){if(!I1(w[$])){I+=w[$++];continue}let m=$;while(m<w.length&&I1(w[m]))m++;let U=w.slice($,m).join("");I+=N(U,1)[0]??U,$=m}return I}}}var k=(n,j)=>n[1]!==j[1]?j[1]-n[1]:n[0]<j[0]?-1:n[0]>j[0]?1:0;function h1(n,j,s){for(let C=j;C<j+s;C++)if(!K.silent.includes(n[C])&&!(C>0&&n[C]===n[C-1]))return!0;return!1}function T1(n,j){let s=K.blocks[j];if(s===void 0)return n;let C="";for(let M of n){let i=M.codePointAt(0);C+=i>=2304&&i<=2431?String.fromCodePoint(s+(i&127)):M}return C}function W1(n){for(let[j,s]of Object.entries(K.groups))for(let[C,M]of s)if(n>=C&&n<=M)return j;return""}class H{b;pos=4;constructor(n,j){this.b=n;for(let s=0;s<4;s++)if(n[s]!==j.charCodeAt(s))throw Error(`deromanize: not an ${j} file`)}varint(){let n=0,j=1;for(;;){let s=this.b[this.pos++];if(n+=(s&127)*j,s<128)return n;j*=128}}str(){let n=this.varint(),j=i1.decode(this.b.subarray(this.pos,this.pos+n));return this.pos+=n,j}float64(){let n=new DataView(this.b.buffer,this.b.byteOffset+this.pos,8).getFloat64(0,!0);return this.pos+=8,n}}var i1=new TextDecoder;function w1(n){let j=[];for(let s=n.varint();s>0;s--)j.push(n.str());return j}function X1(n,j){let s=new H(n,"IKL2"),C=new Uint8Array(0);for(let M=s.varint();M>0;M--){let i=s.varint(),b=s.varint(),a=new Uint8Array(i+b);a.set(C.subarray(0,i)),a.set(n.subarray(s.pos,s.pos+b),i),s.pos+=b,C=a;let N=i1.decode(a);j.set(N,(j.get(N)??0)+s.varint())}}var f1=2097152;function G(n,j){let s=0;for(let C=j;C<n.length;C++)s=s*f1+(n[C]+1);return s}class a1{ids=new Map;strs=[];id(n){let j=this.ids.get(n);if(j===void 0)j=this.strs.length,this.ids.set(n,j),this.strs.push(n);return j}}class E{ids;vocab;levels=[];toks=[];constructor(n,j,s){this.ids=s;this.vocab=n.varint();for(let C=n.varint();C>0;C--){let M={stats:new Map,counts:new Map};for(let i=n.varint();i>0;i--){let b=[];for(let $=n.varint();$>0;$--)b.push(s.id(j[n.varint()]));let a=G(b,0),N=n.varint(),B=n.varint(),w=new Map,I=0;for(let $=n.varint();$>0;$--){I+=n.varint();let m=s.id(j[I]);if(w.set(m,n.varint()),this.levels.length===0)this.toks.push(m)}M.stats.set(a,[N,B]),M.counts.set(a,w)}this.levels.push(M)}if(s.strs.length>=f1)throw Error("deromanize: beyond the engine's limits")}stats(n){let j={has:[],counts:[],total:[],wb:[]};for(let s=0;s<this.levels.length;s++){let C=G(n,n.length-s),M=this.levels[s].stats.get(C);if(M)j.has[s]=!0,j.counts[s]=this.levels[s].counts.get(C),j.total[s]=M[0],j.wb[s]=M[0]/(M[0]+M[1])}return j}prob(n,j){let s=1/(this.vocab+1);for(let C=0;C<this.levels.length;C++){if(!n.has[C])continue;let M=n.wb[C];s=M*(n.counts[C]?.get(j)??0)/n.total[C]+(1-M)*s}return s}}function Y1(n){let j=[];for(let s=n;s;s=s.parent)j.push(s.piece);return j.reverse().join("")}function Z1(n,j){let s=[n.piece],C=[j.piece],M=n.parent,i=j.parent;while(M!==i)if(i===null||M!==null&&M.at>i.at)s.push(M.piece),M=M.parent;else if(M===null||i.at>M.at)C.push(i.piece),i=i.parent;else s.push(M.piece),M=M.parent,C.push(i.piece),i=i.parent;let b=s.reverse().join(""),a=C.reverse().join("");return b<a?-1:b>a?1:0}function V1(n,j){if(n.score!==j.score)return n.score>j.score;let s=Z1(n,j);if(s!==0)return s<0;return n.idx<j.idx}class m1{k;all;n=0;best=[];constructor(n,j){this.k=n;this.all=j}closed(n){return!this.all&&this.best.length===this.k&&n+0.000000001<this.best[this.k-1].score}add(n,j,s,C,M){let i=this.n++,b=!this.all&&this.best.length===this.k;if(b&&n<this.best[this.k-1].score)return;let a={score:n,parent:j,piece:s,tok:C,idx:i,cut:M};if(this.all){this.best.push(a);return}if(b&&!V1(a,this.best[this.k-1]))return;let N=0,B=this.best.length;while(N<B){let w=N+B>>1;if(V1(a,this.best[w]))B=w;else N=w+1}if(this.best.splice(N,0,a),this.best.length>this.k)this.best.pop()}}class R1{b;a;lam;start=[];eos;options=new Map;constructor(n,j,s,C){this.b=j;let M=j.ids,i=new H(n,"IKD1"),b=w1(i);this.lam=i.float64(),this.a=new E(i,b,M);for(let a=0;a<K.order-2;a++)this.start.push(M.id(K.bos));this.start.push(M.id(`<s:${s}>`)),this.eos=M.id(K.eos);for(let a of j.toks){let N=M.strs[a],B=N.indexOf("|");if(B<0)continue;let w=N.slice(B+1),I=!0;for(let U of w){let z=W1(U.codePointAt(0));if(z!==""&&z!==C){I=!1;break}}if(!I)continue;let $=N.slice(0,B),m=this.options.get($)??[];m.push({tok:a,native:w}),this.options.set($,m)}for(let a of this.options.values())a.sort((N,B)=>N.native<B.native?-1:N.native>B.native?1:0)}logp(n,j,s){return Math.log(this.lam*this.a.prob(n,s)+(1-this.lam)*this.b.prob(j,s))}decode(n){let j=[...n],s=K.order-1,C={score:0,parent:null,piece:"",at:0,ctx:this.start,cut:!1},M=Array.from({length:j.length+1},(I,$)=>new m1(K.beam,$===j.length));M[0].add(0,null,"",-1,!1);let i=(I)=>{if(I.tok<0)return I.parent.ctx;let $=[...I.parent.ctx,I.tok];return $.slice($.length-s)},b=Array(K.max_n+1);for(let I=0;I<j.length;I++){let $=new Map;for(let m of M[I].best){let U=!1,z=!1;for(let r=1;r<=K.max_n&&I+r<=j.length;r++)if(b[r]=this.options.get(j.slice(I,I+r).join("")),b[r]?.length)U=!0,z||=!M[I+r].closed(m.score);if(U&&!z){for(let r=1;r<=K.max_n&&I+r<=j.length;r++)M[I+r].n+=b[r]?.length??0;continue}let e=I===0?C:{score:m.score,parent:m.parent,piece:m.piece,at:I,ctx:i(m),cut:m.cut};if(!U){M[I+1].add(e.score-K.unknown_penalty,e,"",-1,e.cut||h1(j,I,1));continue}let o=G(e.ctx,0),t=$.get(o);if(!t)t={sa:this.a.stats(e.ctx),sb:this.b.stats(e.ctx),lp:[]},$.set(o,t);for(let r=1;r<=K.max_n&&I+r<=j.length;r++){let X=b[r];if(!X)continue;if(M[I+r].closed(e.score)){M[I+r].n+=X.length;continue}let V=t.lp[r];if(!V)V=X.map((A)=>this.logp(t.sa,t.sb,A.tok)),t.lp[r]=V;for(let A=0;A<X.length;A++){let h=X[A];M[I+r].add(e.score+V[A],e,h.native,h.tok,e.cut||h.native===""&&h1(j,I,r))}}}}let a=new Map,N=new Map,B=new Map;for(let I of M[j.length].best){let $=I.parent===null?this.start:i(I),m=G($,0),U=N.get(m);if(U===void 0)U=this.logp(this.a.stats($),this.b.stats($),this.eos),N.set(m,U);let z=I.score+U,e=I.piece;if(I.parent!==null){let t=B.get(I.parent);if(t===void 0)t=Y1(I.parent),B.set(I.parent,t);e=t+I.piece}let o=a.get(e);a.set(e,o===void 0?[z,I.cut]:[Math.max(o[0],z),o[1]&&I.cut])}return[...a].map(([I,[$,m]])=>[I,$,m]).sort(k).slice(0,K.nbest)}}export{Cn as load,sn as languages,Q1 as fromBytes,B1 as clean,jn as RULES_VERSION,u1 as CDN};
|