bidi-shaper
Version:
Logical→visual Unicode BiDi (UAX #9) reordering + Arabic contextual shaping for renderers outside the browser (PDF, canvas, WebGL, SVG, terminals, games). Zero dependencies.
737 lines (727 loc) • 55.1 kB
JavaScript
// src/bidi/types.ts
var BC = {
L: 0,
R: 1,
AL: 2,
EN: 3,
ES: 4,
ET: 5,
AN: 6,
CS: 7,
NSM: 8,
BN: 9,
B: 10,
S: 11,
WS: 12,
ON: 13,
LRE: 14,
LRO: 15,
RLE: 16,
RLO: 17,
PDF: 18,
LRI: 19,
RLI: 20,
FSI: 21,
PDI: 22
};
var JT = {
U: 0,
// Non_Joining
C: 1,
// Join_Causing
D: 2,
// Dual_Joining
L: 3,
// Left_Joining
R: 4,
// Right_Joining
T: 5
// Transparent
};
var MAX_DEPTH = 125;
// src/data/generated/bidi-classes.ts
var BIDI_CLASS_RANGES = [0, 8, 9, 9, 9, 11, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 10, 14, 27, 9, 28, 30, 10, 31, 31, 11, 32, 32, 12, 33, 34, 13, 35, 37, 5, 38, 42, 13, 43, 43, 4, 44, 44, 7, 45, 45, 4, 46, 47, 7, 48, 57, 3, 58, 58, 7, 59, 64, 13, 91, 96, 13, 123, 126, 13, 127, 132, 9, 133, 133, 10, 134, 159, 9, 160, 160, 7, 161, 161, 13, 162, 165, 5, 166, 169, 13, 171, 172, 13, 173, 173, 9, 174, 175, 13, 176, 177, 5, 178, 179, 3, 180, 180, 13, 182, 184, 13, 185, 185, 3, 187, 191, 13, 215, 215, 13, 247, 247, 13, 697, 698, 13, 706, 719, 13, 722, 735, 13, 741, 749, 13, 751, 767, 13, 768, 879, 8, 884, 885, 13, 894, 894, 13, 900, 901, 13, 903, 903, 13, 1014, 1014, 13, 1155, 1161, 8, 1418, 1418, 13, 1421, 1422, 13, 1423, 1423, 5, 1424, 1424, 1, 1425, 1469, 8, 1470, 1470, 1, 1471, 1471, 8, 1472, 1472, 1, 1473, 1474, 8, 1475, 1475, 1, 1476, 1477, 8, 1478, 1478, 1, 1479, 1479, 8, 1480, 1535, 1, 1536, 1541, 6, 1542, 1543, 13, 1544, 1544, 2, 1545, 1546, 5, 1547, 1547, 2, 1548, 1548, 7, 1549, 1549, 2, 1550, 1551, 13, 1552, 1562, 8, 1563, 1610, 2, 1611, 1631, 8, 1632, 1641, 6, 1642, 1642, 5, 1643, 1644, 6, 1645, 1647, 2, 1648, 1648, 8, 1649, 1749, 2, 1750, 1756, 8, 1757, 1757, 6, 1758, 1758, 13, 1759, 1764, 8, 1765, 1766, 2, 1767, 1768, 8, 1769, 1769, 13, 1770, 1773, 8, 1774, 1775, 2, 1776, 1785, 3, 1786, 1808, 2, 1809, 1809, 8, 1810, 1839, 2, 1840, 1866, 8, 1867, 1957, 2, 1958, 1968, 8, 1969, 1983, 2, 1984, 2026, 1, 2027, 2035, 8, 2036, 2037, 1, 2038, 2041, 13, 2042, 2044, 1, 2045, 2045, 8, 2046, 2069, 1, 2070, 2073, 8, 2074, 2074, 1, 2075, 2083, 8, 2084, 2084, 1, 2085, 2087, 8, 2088, 2088, 1, 2089, 2093, 8, 2094, 2136, 1, 2137, 2139, 8, 2140, 2143, 1, 2144, 2191, 2, 2192, 2193, 6, 2194, 2198, 2, 2199, 2207, 8, 2208, 2249, 2, 2250, 2273, 8, 2274, 2274, 6, 2275, 2306, 8, 2362, 2362, 8, 2364, 2364, 8, 2369, 2376, 8, 2381, 2381, 8, 2385, 2391, 8, 2402, 2403, 8, 2433, 2433, 8, 2492, 2492, 8, 2497, 2500, 8, 2509, 2509, 8, 2530, 2531, 8, 2546, 2547, 5, 2555, 2555, 5, 2558, 2558, 8, 2561, 2562, 8, 2620, 2620, 8, 2625, 2626, 8, 2631, 2632, 8, 2635, 2637, 8, 2641, 2641, 8, 2672, 2673, 8, 2677, 2677, 8, 2689, 2690, 8, 2748, 2748, 8, 2753, 2757, 8, 2759, 2760, 8, 2765, 2765, 8, 2786, 2787, 8, 2801, 2801, 5, 2810, 2815, 8, 2817, 2817, 8, 2876, 2876, 8, 2879, 2879, 8, 2881, 2884, 8, 2893, 2893, 8, 2901, 2902, 8, 2914, 2915, 8, 2946, 2946, 8, 3008, 3008, 8, 3021, 3021, 8, 3059, 3064, 13, 3065, 3065, 5, 3066, 3066, 13, 3072, 3072, 8, 3076, 3076, 8, 3132, 3132, 8, 3134, 3136, 8, 3142, 3144, 8, 3146, 3149, 8, 3157, 3158, 8, 3170, 3171, 8, 3192, 3198, 13, 3201, 3201, 8, 3260, 3260, 8, 3276, 3277, 8, 3298, 3299, 8, 3328, 3329, 8, 3387, 3388, 8, 3393, 3396, 8, 3405, 3405, 8, 3426, 3427, 8, 3457, 3457, 8, 3530, 3530, 8, 3538, 3540, 8, 3542, 3542, 8, 3633, 3633, 8, 3636, 3642, 8, 3647, 3647, 5, 3655, 3662, 8, 3761, 3761, 8, 3764, 3772, 8, 3784, 3790, 8, 3864, 3865, 8, 3893, 3893, 8, 3895, 3895, 8, 3897, 3897, 8, 3898, 3901, 13, 3953, 3966, 8, 3968, 3972, 8, 3974, 3975, 8, 3981, 3991, 8, 3993, 4028, 8, 4038, 4038, 8, 4141, 4144, 8, 4146, 4151, 8, 4153, 4154, 8, 4157, 4158, 8, 4184, 4185, 8, 4190, 4192, 8, 4209, 4212, 8, 4226, 4226, 8, 4229, 4230, 8, 4237, 4237, 8, 4253, 4253, 8, 4957, 4959, 8, 5008, 5017, 13, 5120, 5120, 13, 5760, 5760, 12, 5787, 5788, 13, 5906, 5908, 8, 5938, 5939, 8, 5970, 5971, 8, 6002, 6003, 8, 6068, 6069, 8, 6071, 6077, 8, 6086, 6086, 8, 6089, 6099, 8, 6107, 6107, 5, 6109, 6109, 8, 6128, 6137, 13, 6144, 6154, 13, 6155, 6157, 8, 6158, 6158, 9, 6159, 6159, 8, 6277, 6278, 8, 6313, 6313, 8, 6432, 6434, 8, 6439, 6440, 8, 6450, 6450, 8, 6457, 6459, 8, 6464, 6464, 13, 6468, 6469, 13, 6622, 6655, 13, 6679, 6680, 8, 6683, 6683, 8, 6742, 6742, 8, 6744, 6750, 8, 6752, 6752, 8, 6754, 6754, 8, 6757, 6764, 8, 6771, 6780, 8, 6783, 6783, 8, 6832, 6877, 8, 6880, 6891, 8, 6912, 6915, 8, 6964, 6964, 8, 6966, 6970, 8, 6972, 6972, 8, 6978, 6978, 8, 7019, 7027, 8, 7040, 7041, 8, 7074, 7077, 8, 7080, 7081, 8, 7083, 7085, 8, 7142, 7142, 8, 7144, 7145, 8, 7149, 7149, 8, 7151, 7153, 8, 7212, 7219, 8, 7222, 7223, 8, 7376, 7378, 8, 7380, 7392, 8, 7394, 7400, 8, 7405, 7405, 8, 7412, 7412, 8, 7416, 7417, 8, 7616, 7679, 8, 8125, 8125, 13, 8127, 8129, 13, 8141, 8143, 13, 8157, 8159, 13, 8173, 8175, 13, 8189, 8190, 13, 8192, 8202, 12, 8203, 8205, 9, 8207, 8207, 1, 8208, 8231, 13, 8232, 8232, 12, 8233, 8233, 10, 8234, 8234, 14, 8235, 8235, 16, 8236, 8236, 18, 8237, 8237, 15, 8238, 8238, 17, 8239, 8239, 7, 8240, 8244, 5, 8245, 8259, 13, 8260, 8260, 7, 8261, 8286, 13, 8287, 8287, 12, 8288, 8293, 9, 8294, 8294, 19, 8295, 8295, 20, 8296, 8296, 21, 8297, 8297, 22, 8298, 8303, 9, 8304, 8304, 3, 8308, 8313, 3, 8314, 8315, 4, 8316, 8318, 13, 8320, 8329, 3, 8330, 8331, 4, 8332, 8334, 13, 8352, 8399, 5, 8400, 8432, 8, 8448, 8449, 13, 8451, 8454, 13, 8456, 8457, 13, 8468, 8468, 13, 8470, 8472, 13, 8478, 8483, 13, 8485, 8485, 13, 8487, 8487, 13, 8489, 8489, 13, 8494, 8494, 5, 8506, 8507, 13, 8512, 8516, 13, 8522, 8525, 13, 8528, 8543, 13, 8585, 8587, 13, 8592, 8721, 13, 8722, 8722, 4, 8723, 8723, 5, 8724, 9013, 13, 9083, 9108, 13, 9110, 9257, 13, 9280, 9290, 13, 9312, 9351, 13, 9352, 9371, 3, 9450, 9899, 13, 9901, 10239, 13, 10496, 11123, 13, 11126, 11263, 13, 11493, 11498, 13, 11503, 11505, 8, 11513, 11519, 13, 11647, 11647, 8, 11744, 11775, 8, 11776, 11869, 13, 11904, 11929, 13, 11931, 12019, 13, 12032, 12245, 13, 12272, 12287, 13, 12288, 12288, 12, 12289, 12292, 13, 12296, 12320, 13, 12330, 12333, 8, 12336, 12336, 13, 12342, 12343, 13, 12349, 12351, 13, 12441, 12442, 8, 12443, 12444, 13, 12448, 12448, 13, 12539, 12539, 13, 12736, 12773, 13, 12783, 12783, 13, 12829, 12830, 13, 12880, 12895, 13, 12924, 12926, 13, 12977, 12991, 13, 13004, 13007, 13, 13175, 13178, 13, 13278, 13279, 13, 13311, 13311, 13, 19904, 19967, 13, 42128, 42182, 13, 42509, 42511, 13, 42607, 42610, 8, 42611, 42611, 13, 42612, 42621, 8, 42622, 42623, 13, 42654, 42655, 8, 42736, 42737, 8, 42752, 42785, 13, 42888, 42888, 13, 43010, 43010, 8, 43014, 43014, 8, 43019, 43019, 8, 43045, 43046, 8, 43048, 43051, 13, 43052, 43052, 8, 43064, 43065, 5, 43124, 43127, 13, 43204, 43205, 8, 43232, 43249, 8, 43263, 43263, 8, 43302, 43309, 8, 43335, 43345, 8, 43392, 43394, 8, 43443, 43443, 8, 43446, 43449, 8, 43452, 43453, 8, 43493, 43493, 8, 43561, 43566, 8, 43569, 43570, 8, 43573, 43574, 8, 43587, 43587, 8, 43596, 43596, 8, 43644, 43644, 8, 43696, 43696, 8, 43698, 43700, 8, 43703, 43704, 8, 43710, 43711, 8, 43713, 43713, 8, 43756, 43757, 8, 43766, 43766, 8, 43882, 43883, 13, 44005, 44005, 8, 44008, 44008, 8, 44013, 44013, 8, 64285, 64285, 1, 64286, 64286, 8, 64287, 64296, 1, 64297, 64297, 4, 64298, 64335, 1, 64336, 64450, 2, 64451, 64466, 13, 64467, 64829, 2, 64830, 64847, 13, 64848, 64911, 2, 64912, 64913, 13, 64914, 64967, 2, 64968, 64975, 13, 64976, 65007, 9, 65008, 65020, 2, 65021, 65023, 13, 65024, 65039, 8, 65040, 65049, 13, 65056, 65071, 8, 65072, 65103, 13, 65104, 65104, 7, 65105, 65105, 13, 65106, 65106, 7, 65108, 65108, 13, 65109, 65109, 7, 65110, 65118, 13, 65119, 65119, 5, 65120, 65121, 13, 65122, 65123, 4, 65124, 65126, 13, 65128, 65128, 13, 65129, 65130, 5, 65131, 65131, 13, 65136, 65278, 2, 65279, 65279, 9, 65281, 65282, 13, 65283, 65285, 5, 65286, 65290, 13, 65291, 65291, 4, 65292, 65292, 7, 65293, 65293, 4, 65294, 65295, 7, 65296, 65305, 3, 65306, 65306, 7, 65307, 65312, 13, 65339, 65344, 13, 65371, 65381, 13, 65504, 65505, 5, 65506, 65508, 13, 65509, 65510, 5, 65512, 65518, 13, 65520, 65528, 9, 65529, 65533, 13, 65534, 65535, 9, 65793, 65793, 13, 65856, 65932, 13, 65936, 65948, 13, 65952, 65952, 13, 66045, 66045, 8, 66272, 66272, 8, 66273, 66299, 3, 66422, 66426, 8, 67584, 67870, 1, 67871, 67871, 13, 67872, 68096, 1, 68097, 68099, 8, 68100, 68100, 1, 68101, 68102, 8, 68103, 68107, 1, 68108, 68111, 8, 68112, 68151, 1, 68152, 68154, 8, 68155, 68158, 1, 68159, 68159, 8, 68160, 68324, 1, 68325, 68326, 8, 68327, 68408, 1, 68409, 68415, 13, 68416, 68863, 1, 68864, 68899, 2, 68900, 68903, 8, 68904, 68911, 2, 68912, 68921, 6, 68922, 68927, 2, 68928, 68937, 6, 68938, 68968, 1, 68969, 68973, 8, 68974, 68974, 13, 68975, 69215, 1, 69216, 69246, 6, 69247, 69290, 1, 69291, 69292, 8, 69293, 69311, 1, 69312, 69327, 2, 69328, 69336, 13, 69337, 69369, 2, 69370, 69375, 8, 69376, 69423, 1, 69424, 69445, 2, 69446, 69456, 8, 69457, 69487, 2, 69488, 69505, 1, 69506, 69509, 8, 69510, 69631, 1, 69633, 69633, 8, 69688, 69702, 8, 69714, 69733, 13, 69744, 69744, 8, 69747, 69748, 8, 69759, 69761, 8, 69811, 69814, 8, 69817, 69818, 8, 69826, 69826, 8, 69888, 69890, 8, 69927, 69931, 8, 69933, 69940, 8, 70003, 70003, 8, 70016, 70017, 8, 70070, 70078, 8, 70089, 70092, 8, 70095, 70095, 8, 70191, 70193, 8, 70196, 70196, 8, 70198, 70199, 8, 70206, 70206, 8, 70209, 70209, 8, 70367, 70367, 8, 70371, 70378, 8, 70400, 70401, 8, 70459, 70460, 8, 70464, 70464, 8, 70502, 70508, 8, 70512, 70516, 8, 70587, 70592, 8, 70606, 70606, 8, 70608, 70608, 8, 70610, 70610, 8, 70625, 70626, 8, 70712, 70719, 8, 70722, 70724, 8, 70726, 70726, 8, 70750, 70750, 8, 70835, 70840, 8, 70842, 70842, 8, 70847, 70848, 8, 70850, 70851, 8, 71090, 71093, 8, 71100, 71101, 8, 71103, 71104, 8, 71132, 71133, 8, 71219, 71226, 8, 71229, 71229, 8, 71231, 71232, 8, 71264, 71276, 13, 71339, 71339, 8, 71341, 71341, 8, 71344, 71349, 8, 71351, 71351, 8, 71453, 71453, 8, 71455, 71455, 8, 71458, 71461, 8, 71463, 71467, 8, 71727, 71735, 8, 71737, 71738, 8, 71995, 71996, 8, 71998, 71998, 8, 72003, 72003, 8, 72148, 72151, 8, 72154, 72155, 8, 72160, 72160, 8, 72193, 72198, 8, 72201, 72202, 8, 72243, 72248, 8, 72251, 72254, 8, 72263, 72263, 8, 72273, 72278, 8, 72281, 72283, 8, 72330, 72342, 8, 72344, 72345, 8, 72544, 72544, 8, 72546, 72548, 8, 72550, 72550, 8, 72752, 72758, 8, 72760, 72765, 8, 72850, 72871, 8, 72874, 72880, 8, 72882, 72883, 8, 72885, 72886, 8, 73009, 73014, 8, 73018, 73018, 8, 73020, 73021, 8, 73023, 73029, 8, 73031, 73031, 8, 73104, 73105, 8, 73109, 73109, 8, 73111, 73111, 8, 73459, 73460, 8, 73472, 73473, 8, 73526, 73530, 8, 73536, 73536, 8, 73538, 73538, 8, 73562, 73562, 8, 73685, 73692, 13, 73693, 73696, 5, 73697, 73713, 13, 78912, 78912, 8, 78919, 78933, 8, 90398, 90409, 8, 90413, 90415, 8, 92912, 92916, 8, 92976, 92982, 8, 94031, 94031, 8, 94095, 94098, 8, 94178, 94178, 13, 94180, 94180, 8, 113821, 113822, 8, 113824, 113827, 9, 117760, 117973, 13, 118e3, 118009, 3, 118010, 118012, 13, 118016, 118451, 13, 118458, 118480, 13, 118496, 118512, 13, 118528, 118573, 8, 118576, 118598, 8, 119143, 119145, 8, 119155, 119162, 9, 119163, 119170, 8, 119173, 119179, 8, 119210, 119213, 8, 119273, 119274, 13, 119296, 119361, 13, 119362, 119364, 8, 119365, 119365, 13, 119552, 119638, 13, 120513, 120513, 13, 120539, 120539, 13, 120571, 120571, 13, 120597, 120597, 13, 120629, 120629, 13, 120655, 120655, 13, 120687, 120687, 13, 120713, 120713, 13, 120745, 120745, 13, 120771, 120771, 13, 120782, 120831, 3, 121344, 121398, 8, 121403, 121452, 8, 121461, 121461, 8, 121476, 121476, 8, 121499, 121503, 8, 121505, 121519, 8, 122880, 122886, 8, 122888, 122904, 8, 122907, 122913, 8, 122915, 122916, 8, 122918, 122922, 8, 123023, 123023, 8, 123184, 123190, 8, 123566, 123566, 8, 123628, 123631, 8, 123647, 123647, 5, 124140, 124143, 8, 124398, 124399, 8, 124643, 124643, 8, 124646, 124646, 8, 124654, 124655, 8, 124661, 124661, 8, 124928, 125135, 1, 125136, 125142, 8, 125143, 125251, 1, 125252, 125258, 8, 125259, 126063, 1, 126064, 126143, 2, 126144, 126207, 1, 126208, 126287, 2, 126288, 126463, 1, 126464, 126703, 2, 126704, 126705, 13, 126706, 126719, 2, 126720, 126975, 1, 126976, 127019, 13, 127024, 127123, 13, 127136, 127150, 13, 127153, 127167, 13, 127169, 127183, 13, 127185, 127221, 13, 127232, 127242, 3, 127243, 127247, 13, 127279, 127279, 13, 127338, 127343, 13, 127405, 127405, 13, 127584, 127589, 13, 127744, 128728, 13, 128732, 128748, 13, 128752, 128764, 13, 128768, 128985, 13, 128992, 129003, 13, 129008, 129008, 13, 129024, 129035, 13, 129040, 129095, 13, 129104, 129113, 13, 129120, 129159, 13, 129168, 129197, 13, 129200, 129211, 13, 129216, 129217, 13, 129232, 129240, 13, 129280, 129623, 13, 129632, 129645, 13, 129648, 129660, 13, 129664, 129674, 13, 129678, 129734, 13, 129736, 129736, 13, 129741, 129756, 13, 129759, 129770, 13, 129775, 129784, 13, 129792, 129938, 13, 129940, 130031, 13, 130032, 130041, 3, 130042, 130042, 13, 131070, 131071, 9, 196606, 196607, 9, 262142, 262143, 9, 327678, 327679, 9, 393214, 393215, 9, 458750, 458751, 9, 524286, 524287, 9, 589822, 589823, 9, 655358, 655359, 9, 720894, 720895, 9, 786430, 786431, 9, 851966, 851967, 9, 917502, 917759, 9, 917760, 917999, 8, 918e3, 921599, 9, 983038, 983039, 9, 1048574, 1048575, 9, 1114110, 1114111, 9];
// src/data/generated/mirroring.ts
var MIRROR_PAIRS = [40, 41, 41, 40, 60, 62, 62, 60, 91, 93, 93, 91, 123, 125, 125, 123, 171, 187, 187, 171, 3898, 3899, 3899, 3898, 3900, 3901, 3901, 3900, 5787, 5788, 5788, 5787, 8249, 8250, 8250, 8249, 8261, 8262, 8262, 8261, 8317, 8318, 8318, 8317, 8333, 8334, 8334, 8333, 8712, 8715, 8713, 8716, 8714, 8717, 8715, 8712, 8716, 8713, 8717, 8714, 8725, 10741, 8735, 11262, 8736, 10659, 8737, 10651, 8738, 10656, 8740, 10990, 8764, 8765, 8765, 8764, 8771, 8909, 8773, 8780, 8780, 8773, 8786, 8787, 8787, 8786, 8788, 8789, 8789, 8788, 8804, 8805, 8805, 8804, 8806, 8807, 8807, 8806, 8808, 8809, 8809, 8808, 8810, 8811, 8811, 8810, 8814, 8815, 8815, 8814, 8816, 8817, 8817, 8816, 8818, 8819, 8819, 8818, 8820, 8821, 8821, 8820, 8822, 8823, 8823, 8822, 8824, 8825, 8825, 8824, 8826, 8827, 8827, 8826, 8828, 8829, 8829, 8828, 8830, 8831, 8831, 8830, 8832, 8833, 8833, 8832, 8834, 8835, 8835, 8834, 8836, 8837, 8837, 8836, 8838, 8839, 8839, 8838, 8840, 8841, 8841, 8840, 8842, 8843, 8843, 8842, 8847, 8848, 8848, 8847, 8849, 8850, 8850, 8849, 8856, 10680, 8866, 8867, 8867, 8866, 8870, 10974, 8872, 10980, 8873, 10979, 8875, 10981, 8880, 8881, 8881, 8880, 8882, 8883, 8883, 8882, 8884, 8885, 8885, 8884, 8886, 8887, 8887, 8886, 8888, 10204, 8905, 8906, 8906, 8905, 8907, 8908, 8908, 8907, 8909, 8771, 8912, 8913, 8913, 8912, 8918, 8919, 8919, 8918, 8920, 8921, 8921, 8920, 8922, 8923, 8923, 8922, 8924, 8925, 8925, 8924, 8926, 8927, 8927, 8926, 8928, 8929, 8929, 8928, 8930, 8931, 8931, 8930, 8932, 8933, 8933, 8932, 8934, 8935, 8935, 8934, 8936, 8937, 8937, 8936, 8938, 8939, 8939, 8938, 8940, 8941, 8941, 8940, 8944, 8945, 8945, 8944, 8946, 8954, 8947, 8955, 8948, 8956, 8950, 8957, 8951, 8958, 8954, 8946, 8955, 8947, 8956, 8948, 8957, 8950, 8958, 8951, 8968, 8969, 8969, 8968, 8970, 8971, 8971, 8970, 9001, 9002, 9002, 9001, 10088, 10089, 10089, 10088, 10090, 10091, 10091, 10090, 10092, 10093, 10093, 10092, 10094, 10095, 10095, 10094, 10096, 10097, 10097, 10096, 10098, 10099, 10099, 10098, 10100, 10101, 10101, 10100, 10179, 10180, 10180, 10179, 10181, 10182, 10182, 10181, 10184, 10185, 10185, 10184, 10187, 10189, 10189, 10187, 10197, 10198, 10198, 10197, 10204, 8888, 10205, 10206, 10206, 10205, 10210, 10211, 10211, 10210, 10212, 10213, 10213, 10212, 10214, 10215, 10215, 10214, 10216, 10217, 10217, 10216, 10218, 10219, 10219, 10218, 10220, 10221, 10221, 10220, 10222, 10223, 10223, 10222, 10627, 10628, 10628, 10627, 10629, 10630, 10630, 10629, 10631, 10632, 10632, 10631, 10633, 10634, 10634, 10633, 10635, 10636, 10636, 10635, 10637, 10640, 10638, 10639, 10639, 10638, 10640, 10637, 10641, 10642, 10642, 10641, 10643, 10644, 10644, 10643, 10645, 10646, 10646, 10645, 10647, 10648, 10648, 10647, 10651, 8737, 10656, 8738, 10659, 8736, 10660, 10661, 10661, 10660, 10664, 10665, 10665, 10664, 10666, 10667, 10667, 10666, 10668, 10669, 10669, 10668, 10670, 10671, 10671, 10670, 10680, 8856, 10688, 10689, 10689, 10688, 10692, 10693, 10693, 10692, 10703, 10704, 10704, 10703, 10705, 10706, 10706, 10705, 10708, 10709, 10709, 10708, 10712, 10713, 10713, 10712, 10714, 10715, 10715, 10714, 10728, 10729, 10729, 10728, 10741, 8725, 10744, 10745, 10745, 10744, 10748, 10749, 10749, 10748, 10795, 10796, 10796, 10795, 10797, 10798, 10798, 10797, 10804, 10805, 10805, 10804, 10812, 10813, 10813, 10812, 10852, 10853, 10853, 10852, 10873, 10874, 10874, 10873, 10875, 10876, 10876, 10875, 10877, 10878, 10878, 10877, 10879, 10880, 10880, 10879, 10881, 10882, 10882, 10881, 10883, 10884, 10884, 10883, 10885, 10886, 10886, 10885, 10887, 10888, 10888, 10887, 10889, 10890, 10890, 10889, 10891, 10892, 10892, 10891, 10893, 10894, 10894, 10893, 10895, 10896, 10896, 10895, 10897, 10898, 10898, 10897, 10899, 10900, 10900, 10899, 10901, 10902, 10902, 10901, 10903, 10904, 10904, 10903, 10905, 10906, 10906, 10905, 10907, 10908, 10908, 10907, 10909, 10910, 10910, 10909, 10911, 10912, 10912, 10911, 10913, 10914, 10914, 10913, 10918, 10919, 10919, 10918, 10920, 10921, 10921, 10920, 10922, 10923, 10923, 10922, 10924, 10925, 10925, 10924, 10927, 10928, 10928, 10927, 10929, 10930, 10930, 10929, 10931, 10932, 10932, 10931, 10933, 10934, 10934, 10933, 10935, 10936, 10936, 10935, 10937, 10938, 10938, 10937, 10939, 10940, 10940, 10939, 10941, 10942, 10942, 10941, 10943, 10944, 10944, 10943, 10945, 10946, 10946, 10945, 10947, 10948, 10948, 10947, 10949, 10950, 10950, 10949, 10951, 10952, 10952, 10951, 10953, 10954, 10954, 10953, 10955, 10956, 10956, 10955, 10957, 10958, 10958, 10957, 10959, 10960, 10960, 10959, 10961, 10962, 10962, 10961, 10963, 10964, 10964, 10963, 10965, 10966, 10966, 10965, 10974, 8870, 10979, 8873, 10980, 8872, 10981, 8875, 10988, 10989, 10989, 10988, 10990, 8740, 10999, 11e3, 11e3, 10999, 11001, 11002, 11002, 11001, 11262, 8735, 11778, 11779, 11779, 11778, 11780, 11781, 11781, 11780, 11785, 11786, 11786, 11785, 11788, 11789, 11789, 11788, 11804, 11805, 11805, 11804, 11808, 11809, 11809, 11808, 11810, 11811, 11811, 11810, 11812, 11813, 11813, 11812, 11814, 11815, 11815, 11814, 11816, 11817, 11817, 11816, 11861, 11862, 11862, 11861, 11863, 11864, 11864, 11863, 11865, 11866, 11866, 11865, 11867, 11868, 11868, 11867, 12296, 12297, 12297, 12296, 12298, 12299, 12299, 12298, 12300, 12301, 12301, 12300, 12302, 12303, 12303, 12302, 12304, 12305, 12305, 12304, 12308, 12309, 12309, 12308, 12310, 12311, 12311, 12310, 12312, 12313, 12313, 12312, 12314, 12315, 12315, 12314, 65113, 65114, 65114, 65113, 65115, 65116, 65116, 65115, 65117, 65118, 65118, 65117, 65124, 65125, 65125, 65124, 65288, 65289, 65289, 65288, 65308, 65310, 65310, 65308, 65339, 65341, 65341, 65339, 65371, 65373, 65373, 65371, 65375, 65376, 65376, 65375, 65378, 65379, 65379, 65378];
// src/data/generated/brackets.ts
var BRACKET_CPS = [40, 41, 91, 93, 123, 125, 3898, 3899, 3900, 3901, 5787, 5788, 8261, 8262, 8317, 8318, 8333, 8334, 8968, 8969, 8970, 8971, 9001, 9002, 10088, 10089, 10090, 10091, 10092, 10093, 10094, 10095, 10096, 10097, 10098, 10099, 10100, 10101, 10181, 10182, 10214, 10215, 10216, 10217, 10218, 10219, 10220, 10221, 10222, 10223, 10627, 10628, 10629, 10630, 10631, 10632, 10633, 10634, 10635, 10636, 10637, 10638, 10639, 10640, 10641, 10642, 10643, 10644, 10645, 10646, 10647, 10648, 10712, 10713, 10714, 10715, 10748, 10749, 11810, 11811, 11812, 11813, 11814, 11815, 11816, 11817, 11861, 11862, 11863, 11864, 11865, 11866, 11867, 11868, 12296, 12297, 12298, 12299, 12300, 12301, 12302, 12303, 12304, 12305, 12308, 12309, 12310, 12311, 12312, 12313, 12314, 12315, 65113, 65114, 65115, 65116, 65117, 65118, 65288, 65289, 65339, 65341, 65371, 65373, 65375, 65376, 65378, 65379];
var BRACKET_PAIRS = [41, 40, 93, 91, 125, 123, 3899, 3898, 3901, 3900, 5788, 5787, 8262, 8261, 8318, 8317, 8334, 8333, 8969, 8968, 8971, 8970, 9002, 9001, 10089, 10088, 10091, 10090, 10093, 10092, 10095, 10094, 10097, 10096, 10099, 10098, 10101, 10100, 10182, 10181, 10215, 10214, 10217, 10216, 10219, 10218, 10221, 10220, 10223, 10222, 10628, 10627, 10630, 10629, 10632, 10631, 10634, 10633, 10636, 10635, 10640, 10639, 10638, 10637, 10642, 10641, 10644, 10643, 10646, 10645, 10648, 10647, 10713, 10712, 10715, 10714, 10749, 10748, 11811, 11810, 11813, 11812, 11815, 11814, 11817, 11816, 11862, 11861, 11864, 11863, 11866, 11865, 11868, 11867, 12297, 12296, 12299, 12298, 12301, 12300, 12303, 12302, 12305, 12304, 12309, 12308, 12311, 12310, 12313, 12312, 12315, 12314, 65114, 65113, 65116, 65115, 65118, 65117, 65289, 65288, 65341, 65339, 65373, 65371, 65376, 65375, 65379, 65378];
var BRACKET_TYPES = [0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1];
var BRACKET_CANONICAL = [9001, 12296, 9002, 12297];
// src/data/generated/joining-types.ts
var JOINING_TYPE_RANGES = [173, 173, 5, 768, 879, 5, 1155, 1161, 5, 1425, 1469, 5, 1471, 1471, 5, 1473, 1474, 5, 1476, 1477, 5, 1479, 1479, 5, 1552, 1562, 5, 1564, 1564, 5, 1568, 1568, 2, 1570, 1573, 4, 1574, 1574, 2, 1575, 1575, 4, 1576, 1576, 2, 1577, 1577, 4, 1578, 1582, 2, 1583, 1586, 4, 1587, 1599, 2, 1600, 1600, 1, 1601, 1607, 2, 1608, 1608, 4, 1609, 1610, 2, 1611, 1631, 5, 1646, 1647, 2, 1648, 1648, 5, 1649, 1651, 4, 1653, 1655, 4, 1656, 1671, 2, 1672, 1689, 4, 1690, 1727, 2, 1728, 1728, 4, 1729, 1730, 2, 1731, 1739, 4, 1740, 1740, 2, 1741, 1741, 4, 1742, 1742, 2, 1743, 1743, 4, 1744, 1745, 2, 1746, 1747, 4, 1749, 1749, 4, 1750, 1756, 5, 1759, 1764, 5, 1767, 1768, 5, 1770, 1773, 5, 1774, 1775, 4, 1786, 1788, 2, 1791, 1791, 2, 1807, 1807, 5, 1808, 1808, 4, 1809, 1809, 5, 1810, 1812, 2, 1813, 1817, 4, 1818, 1821, 2, 1822, 1822, 4, 1823, 1831, 2, 1832, 1832, 4, 1833, 1833, 2, 1834, 1834, 4, 1835, 1835, 2, 1836, 1836, 4, 1837, 1838, 2, 1839, 1839, 4, 1840, 1866, 5, 1869, 1869, 4, 1870, 1880, 2, 1881, 1883, 4, 1884, 1898, 2, 1899, 1900, 4, 1901, 1904, 2, 1905, 1905, 4, 1906, 1906, 2, 1907, 1908, 4, 1909, 1911, 2, 1912, 1913, 4, 1914, 1919, 2, 1958, 1968, 5, 1994, 2026, 2, 2027, 2035, 5, 2042, 2042, 1, 2045, 2045, 5, 2070, 2073, 5, 2075, 2083, 5, 2085, 2087, 5, 2089, 2093, 5, 2112, 2112, 4, 2113, 2117, 2, 2118, 2119, 4, 2120, 2120, 2, 2121, 2121, 4, 2122, 2131, 2, 2132, 2132, 4, 2133, 2133, 2, 2134, 2136, 4, 2137, 2139, 5, 2144, 2144, 2, 2146, 2149, 2, 2151, 2151, 4, 2152, 2152, 2, 2153, 2154, 4, 2160, 2178, 4, 2179, 2181, 1, 2182, 2182, 2, 2185, 2189, 2, 2190, 2190, 4, 2191, 2191, 2, 2199, 2207, 5, 2208, 2217, 2, 2218, 2220, 4, 2222, 2222, 4, 2223, 2224, 2, 2225, 2226, 4, 2227, 2232, 2, 2233, 2233, 4, 2234, 2248, 2, 2250, 2273, 5, 2275, 2306, 5, 2362, 2362, 5, 2364, 2364, 5, 2369, 2376, 5, 2381, 2381, 5, 2385, 2391, 5, 2402, 2403, 5, 2433, 2433, 5, 2492, 2492, 5, 2497, 2500, 5, 2509, 2509, 5, 2530, 2531, 5, 2558, 2558, 5, 2561, 2562, 5, 2620, 2620, 5, 2625, 2626, 5, 2631, 2632, 5, 2635, 2637, 5, 2641, 2641, 5, 2672, 2673, 5, 2677, 2677, 5, 2689, 2690, 5, 2748, 2748, 5, 2753, 2757, 5, 2759, 2760, 5, 2765, 2765, 5, 2786, 2787, 5, 2810, 2815, 5, 2817, 2817, 5, 2876, 2876, 5, 2879, 2879, 5, 2881, 2884, 5, 2893, 2893, 5, 2901, 2902, 5, 2914, 2915, 5, 2946, 2946, 5, 3008, 3008, 5, 3021, 3021, 5, 3072, 3072, 5, 3076, 3076, 5, 3132, 3132, 5, 3134, 3136, 5, 3142, 3144, 5, 3146, 3149, 5, 3157, 3158, 5, 3170, 3171, 5, 3201, 3201, 5, 3260, 3260, 5, 3263, 3263, 5, 3270, 3270, 5, 3276, 3277, 5, 3298, 3299, 5, 3328, 3329, 5, 3387, 3388, 5, 3393, 3396, 5, 3405, 3405, 5, 3426, 3427, 5, 3457, 3457, 5, 3530, 3530, 5, 3538, 3540, 5, 3542, 3542, 5, 3633, 3633, 5, 3636, 3642, 5, 3655, 3662, 5, 3761, 3761, 5, 3764, 3772, 5, 3784, 3790, 5, 3864, 3865, 5, 3893, 3893, 5, 3895, 3895, 5, 3897, 3897, 5, 3953, 3966, 5, 3968, 3972, 5, 3974, 3975, 5, 3981, 3991, 5, 3993, 4028, 5, 4038, 4038, 5, 4141, 4144, 5, 4146, 4151, 5, 4153, 4154, 5, 4157, 4158, 5, 4184, 4185, 5, 4190, 4192, 5, 4209, 4212, 5, 4226, 4226, 5, 4229, 4230, 5, 4237, 4237, 5, 4253, 4253, 5, 4957, 4959, 5, 5906, 5908, 5, 5938, 5939, 5, 5970, 5971, 5, 6002, 6003, 5, 6068, 6069, 5, 6071, 6077, 5, 6086, 6086, 5, 6089, 6099, 5, 6109, 6109, 5, 6151, 6151, 2, 6154, 6154, 1, 6155, 6157, 5, 6159, 6159, 5, 6176, 6264, 2, 6277, 6278, 5, 6279, 6312, 2, 6313, 6313, 5, 6314, 6314, 2, 6432, 6434, 5, 6439, 6440, 5, 6450, 6450, 5, 6457, 6459, 5, 6679, 6680, 5, 6683, 6683, 5, 6742, 6742, 5, 6744, 6750, 5, 6752, 6752, 5, 6754, 6754, 5, 6757, 6764, 5, 6771, 6780, 5, 6783, 6783, 5, 6832, 6877, 5, 6880, 6891, 5, 6912, 6915, 5, 6964, 6964, 5, 6966, 6970, 5, 6972, 6972, 5, 6978, 6978, 5, 7019, 7027, 5, 7040, 7041, 5, 7074, 7077, 5, 7080, 7081, 5, 7083, 7085, 5, 7142, 7142, 5, 7144, 7145, 5, 7149, 7149, 5, 7151, 7153, 5, 7212, 7219, 5, 7222, 7223, 5, 7376, 7378, 5, 7380, 7392, 5, 7394, 7400, 5, 7405, 7405, 5, 7412, 7412, 5, 7416, 7417, 5, 7616, 7679, 5, 8203, 8203, 5, 8205, 8205, 1, 8206, 8207, 5, 8234, 8238, 5, 8288, 8292, 5, 8298, 8303, 5, 8400, 8432, 5, 11503, 11505, 5, 11647, 11647, 5, 11744, 11775, 5, 12330, 12333, 5, 12441, 12442, 5, 42607, 42610, 5, 42612, 42621, 5, 42654, 42655, 5, 42736, 42737, 5, 43010, 43010, 5, 43014, 43014, 5, 43019, 43019, 5, 43045, 43046, 5, 43052, 43052, 5, 43072, 43121, 2, 43122, 43122, 3, 43204, 43205, 5, 43232, 43249, 5, 43263, 43263, 5, 43302, 43309, 5, 43335, 43345, 5, 43392, 43394, 5, 43443, 43443, 5, 43446, 43449, 5, 43452, 43453, 5, 43493, 43493, 5, 43561, 43566, 5, 43569, 43570, 5, 43573, 43574, 5, 43587, 43587, 5, 43596, 43596, 5, 43644, 43644, 5, 43696, 43696, 5, 43698, 43700, 5, 43703, 43704, 5, 43710, 43711, 5, 43713, 43713, 5, 43756, 43757, 5, 43766, 43766, 5, 44005, 44005, 5, 44008, 44008, 5, 44013, 44013, 5, 64286, 64286, 5, 65024, 65039, 5, 65056, 65071, 5, 65279, 65279, 5, 65529, 65531, 5, 66045, 66045, 5, 66272, 66272, 5, 66422, 66426, 5, 68097, 68099, 5, 68101, 68102, 5, 68108, 68111, 5, 68152, 68154, 5, 68159, 68159, 5, 68288, 68292, 2, 68293, 68293, 4, 68295, 68295, 4, 68297, 68298, 4, 68301, 68301, 3, 68302, 68306, 4, 68307, 68310, 2, 68311, 68311, 3, 68312, 68316, 2, 68317, 68317, 4, 68318, 68320, 2, 68321, 68321, 4, 68324, 68324, 4, 68325, 68326, 5, 68331, 68334, 2, 68335, 68335, 4, 68480, 68480, 2, 68481, 68481, 4, 68482, 68482, 2, 68483, 68485, 4, 68486, 68488, 2, 68489, 68489, 4, 68490, 68491, 2, 68492, 68492, 4, 68493, 68493, 2, 68494, 68495, 4, 68496, 68496, 2, 68497, 68497, 4, 68521, 68524, 4, 68525, 68526, 2, 68864, 68864, 3, 68865, 68897, 2, 68898, 68898, 4, 68899, 68899, 2, 68900, 68903, 5, 68969, 68973, 5, 69291, 69292, 5, 69314, 69314, 4, 69315, 69316, 2, 69318, 69319, 2, 69370, 69375, 5, 69424, 69426, 2, 69427, 69427, 4, 69428, 69444, 2, 69446, 69456, 5, 69457, 69459, 2, 69460, 69460, 4, 69488, 69491, 2, 69492, 69493, 4, 69494, 69505, 2, 69506, 69509, 5, 69552, 69552, 2, 69554, 69555, 2, 69556, 69558, 4, 69560, 69560, 2, 69561, 69562, 4, 69563, 69564, 2, 69565, 69565, 4, 69566, 69567, 2, 69569, 69569, 2, 69570, 69571, 4, 69572, 69572, 2, 69577, 69577, 4, 69578, 69578, 2, 69579, 69579, 3, 69633, 69633, 5, 69688, 69702, 5, 69744, 69744, 5, 69747, 69748, 5, 69759, 69761, 5, 69811, 69814, 5, 69817, 69818, 5, 69826, 69826, 5, 69888, 69890, 5, 69927, 69931, 5, 69933, 69940, 5, 70003, 70003, 5, 70016, 70017, 5, 70070, 70078, 5, 70089, 70092, 5, 70095, 70095, 5, 70191, 70193, 5, 70196, 70196, 5, 70198, 70199, 5, 70206, 70206, 5, 70209, 70209, 5, 70367, 70367, 5, 70371, 70378, 5, 70400, 70401, 5, 70459, 70460, 5, 70464, 70464, 5, 70502, 70508, 5, 70512, 70516, 5, 70587, 70592, 5, 70606, 70606, 5, 70608, 70608, 5, 70610, 70610, 5, 70625, 70626, 5, 70712, 70719, 5, 70722, 70724, 5, 70726, 70726, 5, 70750, 70750, 5, 70835, 70840, 5, 70842, 70842, 5, 70847, 70848, 5, 70850, 70851, 5, 71090, 71093, 5, 71100, 71101, 5, 71103, 71104, 5, 71132, 71133, 5, 71219, 71226, 5, 71229, 71229, 5, 71231, 71232, 5, 71339, 71339, 5, 71341, 71341, 5, 71344, 71349, 5, 71351, 71351, 5, 71453, 71453, 5, 71455, 71455, 5, 71458, 71461, 5, 71463, 71467, 5, 71727, 71735, 5, 71737, 71738, 5, 71995, 71996, 5, 71998, 71998, 5, 72003, 72003, 5, 72148, 72151, 5, 72154, 72155, 5, 72160, 72160, 5, 72193, 72202, 5, 72243, 72248, 5, 72251, 72254, 5, 72263, 72263, 5, 72273, 72278, 5, 72281, 72283, 5, 72330, 72342, 5, 72344, 72345, 5, 72544, 72544, 5, 72546, 72548, 5, 72550, 72550, 5, 72752, 72758, 5, 72760, 72765, 5, 72767, 72767, 5, 72850, 72871, 5, 72874, 72880, 5, 72882, 72883, 5, 72885, 72886, 5, 73009, 73014, 5, 73018, 73018, 5, 73020, 73021, 5, 73023, 73029, 5, 73031, 73031, 5, 73104, 73105, 5, 73109, 73109, 5, 73111, 73111, 5, 73459, 73460, 5, 73472, 73473, 5, 73526, 73530, 5, 73536, 73536, 5, 73538, 73538, 5, 73562, 73562, 5, 78896, 78912, 5, 78919, 78933, 5, 90398, 90409, 5, 90413, 90415, 5, 92912, 92916, 5, 92976, 92982, 5, 94031, 94031, 5, 94095, 94098, 5, 94180, 94180, 5, 113821, 113822, 5, 113824, 113827, 5, 118528, 118573, 5, 118576, 118598, 5, 119143, 119145, 5, 119155, 119170, 5, 119173, 119179, 5, 119210, 119213, 5, 119362, 119364, 5, 121344, 121398, 5, 121403, 121452, 5, 121461, 121461, 5, 121476, 121476, 5, 121499, 121503, 5, 121505, 121519, 5, 122880, 122886, 5, 122888, 122904, 5, 122907, 122913, 5, 122915, 122916, 5, 122918, 122922, 5, 123023, 123023, 5, 123184, 123190, 5, 123566, 123566, 5, 123628, 123631, 5, 124140, 124143, 5, 124398, 124399, 5, 124643, 124643, 5, 124646, 124646, 5, 124654, 124655, 5, 124661, 124661, 5, 125136, 125142, 5, 125184, 125251, 2, 125252, 125259, 5, 917505, 917505, 5, 917536, 917631, 5, 917760, 917999, 5];
// src/data/generated/shaping-forms.ts
var SHAPING_FORMS = {
1569: [65152, 0, 0, 0],
1570: [65153, 0, 0, 65154],
1571: [65155, 0, 0, 65156],
1572: [65157, 0, 0, 65158],
1573: [65159, 0, 0, 65160],
1574: [65161, 65163, 65164, 65162],
1575: [65165, 0, 0, 65166],
1576: [65167, 65169, 65170, 65168],
1577: [65171, 0, 0, 65172],
1578: [65173, 65175, 65176, 65174],
1579: [65177, 65179, 65180, 65178],
1580: [65181, 65183, 65184, 65182],
1581: [65185, 65187, 65188, 65186],
1582: [65189, 65191, 65192, 65190],
1583: [65193, 0, 0, 65194],
1584: [65195, 0, 0, 65196],
1585: [65197, 0, 0, 65198],
1586: [65199, 0, 0, 65200],
1587: [65201, 65203, 65204, 65202],
1588: [65205, 65207, 65208, 65206],
1589: [65209, 65211, 65212, 65210],
1590: [65213, 65215, 65216, 65214],
1591: [65217, 65219, 65220, 65218],
1592: [65221, 65223, 65224, 65222],
1593: [65225, 65227, 65228, 65226],
1594: [65229, 65231, 65232, 65230],
1601: [65233, 65235, 65236, 65234],
1602: [65237, 65239, 65240, 65238],
1603: [65241, 65243, 65244, 65242],
1604: [65245, 65247, 65248, 65246],
1605: [65249, 65251, 65252, 65250],
1606: [65253, 65255, 65256, 65254],
1607: [65257, 65259, 65260, 65258],
1608: [65261, 0, 0, 65262],
1609: [65263, 64488, 64489, 65264],
1610: [65265, 65267, 65268, 65266],
1649: [64336, 0, 0, 64337],
1655: [64477, 0, 0, 0],
1657: [64358, 64360, 64361, 64359],
1658: [64350, 64352, 64353, 64351],
1659: [64338, 64340, 64341, 64339],
1662: [64342, 64344, 64345, 64343],
1663: [64354, 64356, 64357, 64355],
1664: [64346, 64348, 64349, 64347],
1667: [64374, 64376, 64377, 64375],
1668: [64370, 64372, 64373, 64371],
1670: [64378, 64380, 64381, 64379],
1671: [64382, 64384, 64385, 64383],
1672: [64392, 0, 0, 64393],
1676: [64388, 0, 0, 64389],
1677: [64386, 0, 0, 64387],
1678: [64390, 0, 0, 64391],
1681: [64396, 0, 0, 64397],
1688: [64394, 0, 0, 64395],
1700: [64362, 64364, 64365, 64363],
1702: [64366, 64368, 64369, 64367],
1705: [64398, 64400, 64401, 64399],
1709: [64467, 64469, 64470, 64468],
1711: [64402, 64404, 64405, 64403],
1713: [64410, 64412, 64413, 64411],
1715: [64406, 64408, 64409, 64407],
1722: [64414, 0, 0, 64415],
1723: [64416, 64418, 64419, 64417],
1726: [64426, 64428, 64429, 64427],
1728: [64420, 0, 0, 64421],
1729: [64422, 64424, 64425, 64423],
1733: [64480, 0, 0, 64481],
1734: [64473, 0, 0, 64474],
1735: [64471, 0, 0, 64472],
1736: [64475, 0, 0, 64476],
1737: [64482, 0, 0, 64483],
1739: [64478, 0, 0, 64479],
1740: [64508, 64510, 64511, 64509],
1744: [64484, 64486, 64487, 64485],
1746: [64430, 0, 0, 64431],
1747: [64432, 0, 0, 64433]
};
var LAM_ALEF = {
1570: [65269, 65270],
1571: [65271, 65272],
1573: [65273, 65274],
1575: [65275, 65276]
};
// src/data/lookup.ts
function searchTriples(ranges, cp, def) {
let lo = 0;
let hi = ranges.length / 3 - 1;
while (lo <= hi) {
const mid = lo + hi >> 1;
const i = mid * 3;
if (cp < ranges[i]) hi = mid - 1;
else if (cp > ranges[i + 1]) lo = mid + 1;
else return ranges[i + 2];
}
return def;
}
function searchPairs(pairs, cp) {
let lo = 0;
let hi = pairs.length / 2 - 1;
while (lo <= hi) {
const mid = lo + hi >> 1;
const key = pairs[mid * 2];
if (cp < key) hi = mid - 1;
else if (cp > key) lo = mid + 1;
else return pairs[mid * 2 + 1];
}
return 0;
}
function getBidiClass(cp) {
return searchTriples(BIDI_CLASS_RANGES, cp, 0);
}
function getJoiningType(cp) {
return searchTriples(JOINING_TYPE_RANGES, cp, 0);
}
function getMirror(cp) {
return searchPairs(MIRROR_PAIRS, cp);
}
function bracketIndex(cp) {
let lo = 0;
let hi = BRACKET_CPS.length - 1;
while (lo <= hi) {
const mid = lo + hi >> 1;
const v = BRACKET_CPS[mid];
if (cp < v) hi = mid - 1;
else if (cp > v) lo = mid + 1;
else return mid;
}
return -1;
}
function getBracketType(cp) {
const i = bracketIndex(cp);
return i < 0 ? -1 : BRACKET_TYPES[i];
}
function getBracketPair(cp) {
const i = bracketIndex(cp);
return i < 0 ? 0 : BRACKET_PAIRS[i];
}
function canonicalBracket(cp) {
for (let i = 0; i < BRACKET_CANONICAL.length; i += 2) {
if (BRACKET_CANONICAL[i] === cp) return BRACKET_CANONICAL[i + 1];
}
return cp;
}
function getShapingForms(cp) {
return SHAPING_FORMS[cp];
}
function getLamAlef(cp) {
return LAM_ALEF[cp];
}
// src/bidi/levels.ts
function leastGreaterOdd(level) {
return (level & 1) === 0 ? level + 1 : level + 2;
}
function leastGreaterEven(level) {
return (level & 1) === 0 ? level + 2 : level + 1;
}
function computeBaseLevel(types, start, end) {
let isolateDepth = 0;
for (let i = start; i < end; i++) {
const t = types[i];
if (t === BC.LRI || t === BC.RLI || t === BC.FSI) {
isolateDepth++;
} else if (t === BC.PDI) {
if (isolateDepth > 0) isolateDepth--;
} else if (isolateDepth === 0) {
if (t === BC.L) return 0;
if (t === BC.R || t === BC.AL) return 1;
}
}
return 0;
}
function computeMatching(types) {
const n = types.length;
const matchPDI = new Int32Array(n).fill(-1);
const matchInit = new Int32Array(n).fill(-1);
const stack = [];
for (let i = 0; i < n; i++) {
const t = types[i];
if (t === BC.LRI || t === BC.RLI || t === BC.FSI) {
stack.push(i);
} else if (t === BC.PDI && stack.length > 0) {
const open = stack.pop();
matchPDI[open] = i;
matchInit[i] = open;
}
}
return { matchPDI, matchInit };
}
var NEUTRAL = -1;
var NO_DIR = -1;
function dirOf(t) {
if (t === BC.L) return BC.L;
if (t === BC.R || t === BC.EN || t === BC.AN) return BC.R;
return NO_DIR;
}
function isNI(t) {
return t === BC.B || t === BC.S || t === BC.WS || t === BC.ON || t === BC.FSI || t === BC.LRI || t === BC.RLI || t === BC.PDI;
}
function resolveParagraph(origTypes, codePoints, paraLevel) {
const n = origTypes.length;
const levels = new Uint8Array(n);
const types = Uint8Array.from(origTypes);
const removed = new Uint8Array(n);
if (n === 0) return { levels, removed };
const { matchPDI } = computeMatching(origTypes);
const stack = [{ level: paraLevel, override: NEUTRAL, isolate: false }];
let overflowIsolate = 0;
let overflowEmbedding = 0;
let validIsolate = 0;
const top = () => stack[stack.length - 1];
for (let i = 0; i < n; i++) {
const t = origTypes[i];
switch (t) {
case BC.RLE:
case BC.LRE:
case BC.RLO:
case BC.LRO: {
levels[i] = top().level;
removed[i] = 1;
const isRTL = t === BC.RLE || t === BC.RLO;
const newLevel = isRTL ? leastGreaterOdd(top().level) : leastGreaterEven(top().level);
const override = t === BC.RLO ? BC.R : t === BC.LRO ? BC.L : NEUTRAL;
if (newLevel <= MAX_DEPTH && overflowIsolate === 0 && overflowEmbedding === 0) {
stack.push({ level: newLevel, override, isolate: false });
} else if (overflowIsolate === 0) {
overflowEmbedding++;
}
break;
}
case BC.RLI:
case BC.LRI:
case BC.FSI: {
levels[i] = top().level;
if (top().override !== NEUTRAL) types[i] = top().override;
let isRTL;
if (t === BC.FSI) {
const innerEnd = matchPDI[i] === -1 ? n : matchPDI[i];
isRTL = computeBaseLevel(origTypes, i + 1, innerEnd) === 1;
} else {
isRTL = t === BC.RLI;
}
const newLevel = isRTL ? leastGreaterOdd(top().level) : leastGreaterEven(top().level);
if (newLevel <= MAX_DEPTH && overflowIsolate === 0 && overflowEmbedding === 0) {
validIsolate++;
stack.push({ level: newLevel, override: NEUTRAL, isolate: true });
} else {
overflowIsolate++;
}
break;
}
case BC.PDI: {
if (overflowIsolate > 0) {
overflowIsolate--;
} else if (validIsolate > 0) {
overflowEmbedding = 0;
while (!top().isolate) stack.pop();
stack.pop();
validIsolate--;
}
levels[i] = top().level;
if (top().override !== NEUTRAL) types[i] = top().override;
break;
}
case BC.PDF: {
levels[i] = top().level;
removed[i] = 1;
if (overflowIsolate > 0) ; else if (overflowEmbedding > 0) {
overflowEmbedding--;
} else if (!top().isolate && stack.length >= 2) {
stack.pop();
}
levels[i] = top().level;
break;
}
case BC.B: {
levels[i] = paraLevel;
break;
}
case BC.BN: {
levels[i] = top().level;
removed[i] = 1;
break;
}
default: {
levels[i] = top().level;
if (top().override !== NEUTRAL) types[i] = top().override;
break;
}
}
}
const sequences = buildIsolatingRunSequences(origTypes, levels, removed, matchPDI);
const embLevels = Uint8Array.from(levels);
for (const seq of sequences) {
resolveSequence(seq, origTypes, types, levels, embLevels, removed, paraLevel, matchPDI, codePoints);
}
return { levels, removed };
}
function buildIsolatingRunSequences(origTypes, levels, removed, matchPDI) {
const n = origTypes.length;
const runs = [];
let cur = [];
for (let i = 0; i < n; i++) {
if (removed[i]) continue;
if (cur.length === 0 || levels[i] === levels[cur[cur.length - 1]]) {
cur.push(i);
} else {
runs.push(cur);
cur = [i];
}
}
if (cur.length) runs.push(cur);
const runStartingAt = /* @__PURE__ */ new Map();
runs.forEach((r, ri) => runStartingAt.set(r[0], ri));
const sequences = [];
for (let ri = 0; ri < runs.length; ri++) {
const first = runs[ri][0];
if (origTypes[first] === BC.PDI && matchedInitiatorExists(origTypes, levels, removed, first)) {
continue;
}
let seq = [];
let curRi = ri;
while (curRi !== void 0) {
const run = runs[curRi];
seq = seq.concat(run);
const last = run[run.length - 1];
const lt = origTypes[last];
if ((lt === BC.LRI || lt === BC.RLI || lt === BC.FSI) && matchPDI[last] >= 0) {
curRi = runStartingAt.get(matchPDI[last]);
} else {
curRi = void 0;
}
}
sequences.push(seq);
}
return sequences;
}
function matchedInitiatorExists(types, _levels, _removed, pos) {
let depth = 0;
let lastInitiator = -1;
for (let i = 0; i < pos; i++) {
const t = types[i];
if (t === BC.LRI || t === BC.RLI || t === BC.FSI) {
depth++;
lastInitiator = i;
} else if (t === BC.PDI && depth > 0) {
depth--;
}
}
return depth > 0 && lastInitiator >= 0;
}
function resolveSequence(seq, origTypes, types, levels, embLevels, removed, paraLevel, matchPDI, codePoints) {
const len = seq.length;
if (len === 0) return;
const n = origTypes.length;
const seqLevel = embLevels[seq[0]];
const e = (seqLevel & 1) === 1 ? BC.R : BC.L;
const o = e === BC.L ? BC.R : BC.L;
let prevLevel = paraLevel;
for (let i = seq[0] - 1; i >= 0; i--) {
if (!removed[i]) {
prevLevel = embLevels[i];
break;
}
}
const sos = (Math.max(seqLevel, prevLevel) & 1) === 1 ? BC.R : BC.L;
const lastIdx = seq[len - 1];
const lastType = origTypes[lastIdx];
let eos;
if ((lastType === BC.LRI || lastType === BC.RLI || lastType === BC.FSI) && matchPDI[lastIdx] === -1) {
eos = (Math.max(seqLevel, paraLevel) & 1) === 1 ? BC.R : BC.L;
} else {
let nextLevel = paraLevel;
for (let i = lastIdx + 1; i < n; i++) {
if (!removed[i]) {
nextLevel = embLevels[i];
break;
}
}
eos = (Math.max(seqLevel, nextLevel) & 1) === 1 ? BC.R : BC.L;
}
const at = (k) => types[seq[k]];
const set = (k, v) => {
types[seq[k]] = v;
};
let prevType = sos;
for (let k = 0; k < len; k++) {
const t = at(k);
if (t === BC.NSM) {
const resolved = prevType === BC.LRI || prevType === BC.RLI || prevType === BC.FSI || prevType === BC.PDI ? BC.ON : prevType;
set(k, resolved);
prevType = resolved;
} else {
prevType = t;
}
}
let strong = sos;
for (let k = 0; k < len; k++) {
const t = at(k);
if (t === BC.EN && strong === BC.AL) set(k, BC.AN);
if (t === BC.L || t === BC.R || t === BC.AL) strong = t;
}
for (let k = 0; k < len; k++) {
if (at(k) === BC.AL) set(k, BC.R);
}
const snapshot = new Int32Array(len);
for (let k = 0; k < len; k++) snapshot[k] = at(k);
for (let k = 1; k < len - 1; k++) {
const t = snapshot[k];
const prev = snapshot[k - 1];
const next = snapshot[k + 1];
if (t === BC.ES && prev === BC.EN && next === BC.EN) set(k, BC.EN);
else if (t === BC.CS && prev === BC.EN && next === BC.EN) set(k, BC.EN);
else if (t === BC.CS && prev === BC.AN && next === BC.AN) set(k, BC.AN);
}
for (let k = 0; k < len; ) {
if (at(k) === BC.ET) {
let j = k;
while (j < len && at(j) === BC.ET) j++;
const before = k > 0 ? at(k - 1) : sos;
const after = j < len ? at(j) : eos;
if (before === BC.EN || after === BC.EN) {
for (let m = k; m < j; m++) set(m, BC.EN);
}
k = j;
} else {
k++;
}
}
for (let k = 0; k < len; k++) {
const t = at(k);
if (t === BC.ES || t === BC.ET || t === BC.CS) set(k, BC.ON);
}
strong = sos;
for (let k = 0; k < len; k++) {
const t = at(k);
if (t === BC.EN && strong === BC.L) set(k, BC.L);
if (t === BC.L || t === BC.R) strong = t;
}
if (codePoints) {
resolveBrackets(seq, origTypes, types, codePoints, e, o, sos);
}
for (let k = 0; k < len; ) {
if (isNI(at(k))) {
let j = k;
while (j < len && isNI(at(j))) j++;
const before = k > 0 ? dirOf(at(k - 1)) : sos;
const after = j < len ? dirOf(at(j)) : eos;
if (before === after && (before === BC.L || before === BC.R)) {
for (let m = k; m < j; m++) set(m, before);
}
k = j;
} else {
k++;
}
}
for (let k = 0; k < len; k++) {
if (isNI(at(k))) set(k, e);
}
for (let k = 0; k < len; k++) {
const idx = seq[k];
const lvl = embLevels[idx];
const t = types[idx];
if ((lvl & 1) === 0) {
if (t === BC.R) levels[idx] = lvl + 1;
else if (t === BC.AN || t === BC.EN) levels[idx] = lvl + 2;
} else if (t === BC.L || t === BC.EN || t === BC.AN) {
levels[idx] = lvl + 1;
}
}
}
function resolveBrackets(seq, origTypes, types, codePoints, e, o, sos) {
const len = seq.length;
const at = (k) => types[seq[k]];
const openStack = [];
const pairs = [];
for (let k = 0; k < len; k++) {
const idx = seq[k];
if (types[idx] !== BC.ON) continue;
const cp = codePoints[idx];
const bt = getBracketType(cp);
if (bt === 0) {
if (openStack.length === 63) break;
openStack.push({ canon: canonicalBracket(getBracketPair(cp)), k });
} else if (bt === 1) {
const cc = canonicalBracket(cp);
for (let s = openStack.length - 1; s >= 0; s--) {
if (openStack[s].canon === cc) {
pairs.push([openStack[s].k, k]);
openStack.length = s;
break;
}
}
}
}
pairs.sort((a, b) => a[0] - b[0]);
const setBracketNSM = (k, dir) => {
for (let m = k + 1; m < len && origTypes[seq[m]] === BC.NSM; m++) {
types[seq[m]] = dir;
}
};
for (const [openK, closeK] of pairs) {
let foundE = false;
let foundO = false;
for (let m = openK + 1; m < closeK; m++) {
const d = dirOf(at(m));
if (d === e) {
foundE = true;
break;
}
if (d === o) foundO = true;
}
let dir = NO_DIR;
if (foundE) {
dir = e;
} else if (foundO) {
let ctx = sos;
for (let m = openK - 1; m >= 0; m--) {
const d = dirOf(at(m));
if (d !== NO_DIR) {
ctx = d;
break;
}
}
dir = ctx === o ? o : e;
}
if (dir !== NO_DIR) {
types[seq[openK]] = dir;
types[seq[closeK]] = dir;
setBracketNSM(openK, dir);
setBracketNSM(closeK, dir);
}
}
}
// src/bidi/reorder.ts
function isResettable(origTypes, removed, i) {
if (removed[i]) return true;
const t = origTypes[i];
return t === BC.WS || t === BC.LRI || t === BC.RLI || t === BC.FSI || t === BC.PDI;
}
function applyL1(origTypes, levels, removed, paraLevel) {
const n = origTypes.length;
let i = n - 1;
while (i >= 0 && isResettable(origTypes, removed, i)) {
levels[i] = paraLevel;
i--;
}
for (let j = 0; j < n; j++) {
const t = origTypes[j];
if (t === BC.B || t === BC.S) {
levels[j] = paraLevel;
let k = j - 1;
while (k >= 0 && isResettable(origTypes, removed, k)) {
levels[k] = paraLevel;
k--;
}
}
}
}
function reverseRange(arr, from, to) {
while (from < to) {
const tmp = arr[from];
arr[from] = arr[to];
arr[to] = tmp;
from++;
to--;
}
}
function reorderIndices(levels, removed) {
const order = [];
for (let i = 0; i < levels.length; i++) {
if (!removed[i]) order.push(i);
}
if (order.length === 0) return order;
let maxLevel = 0;
let minOdd = Number.MAX_SAFE_INTEGER;
for (const i of order) {
const l = levels[i];
if (l > maxLevel) maxLevel = l;
if ((l & 1) === 1 && l < minOdd) minOdd = l;
}
if (minOdd === Number.MAX_SAFE_INTEGER) return order;
for (let level = maxLevel; level >= minOdd; level--) {
let s = 0;
while (s < order.length) {
if (levels[order[s]] >= level) {
let eIdx = s;
while (eIdx < order.length && levels[order[eIdx]] >= level) eIdx++;
reverseRange(order, s, eIdx - 1);
s = eIdx;
} else {
s++;
}
}
}
return order;
}
// src/bidi/algorithm.ts
function classify(codePoints) {
const types = new Uint8Array(codePoints.length);
for (let i = 0; i < codePoints.length; i++) types[i] = getBidiClass(codePoints[i]);
return types;
}
function toCodePoints(text) {
const out = [];
for (const ch of text) out.push(ch.codePointAt(0));
return out;
}
function splitParagraphs(types) {
const segs = [];
let start = 0;
for (let i = 0; i < types.length; i++) {
if (types[i] === BC.B) {
segs.push([start, i + 1]);
start = i + 1;
}
}
if (start < types.length || segs.length === 0) segs.push([start, types.length]);
return segs;
}
function paragraphLevelFor(types, start, end, base) {
if (base === "ltr") return 0;
if (base === "rtl") return 1;
return computeBaseLevel(types, start, end);
}
function runBidi(codePoints, base, options) {
const mirror = options?.mirror !== false;
const types = classify(codePoints);
const all = Int32Array.from(codePoints);
const n = all.length;
const segments = options?.singleParagraph ? [[0, n]] : splitParagraphs(types);
const visual = [];
const map = [];
const allLevels = new Uint8Array(n);
let direction = null;
for (const [s, e] of segments) {
if (s === e) continue;
const hasSep = !options?.singleParagraph && types[e - 1] === BC.B;
const contentEnd = hasSep ? e - 1 : e;
const paraLevel = paragraphLevelFor(types, s, e, base);
if (direction === null) direction = paraLevel === 1 ? "rtl" : "ltr";
if (s < contentEnd) {
const segTypes = types.subarray(s, contentEnd);
const segCps = all.subarray(s, contentEnd);
const { levels, removed } = resolveParagraph(segTypes, segCps, paraLevel);
applyL1(segTypes, levels, removed, paraLevel);
allLevels.set(levels, s);
for (const idx of reorderIndices(levels, removed)) {
let cp = segCps[idx];
if (mirror && (levels[idx] & 1) === 1) {
const m = getMirror(cp);
if (m !== 0) cp = m;
}
visual.push(cp);
map.push(s + idx);
}
}
if (hasSep) {
allLevels[e - 1] = paraLevel;
visual.push(all[e - 1]);
map.push(e - 1);
}
}
return {
codePoints: visual,
map,
levels: allLevels,
direction: direction ?? (base === "rtl" ? "rtl" : "ltr")
};
}
// src/shape/shape.ts
var LAM = 1604;
function isTashkeel(cp) {
return cp >= 1552 && cp <= 1562 || cp >= 1611 && cp <= 1631 || cp === 1648 || cp >= 1750 && cp <= 1756 || cp >= 1759 && cp <= 176