1use crate::{FileCtx, Violation, violation};
2
3#[rustfmt::skip]
5const CONFUSABLES: &[(char, char)] = &[
6 ('\u{00A0}', ' '), ('\u{00B4}', '`'), ('\u{00B8}', ','), ('\u{00D7}', 'x'),
7 ('\u{0131}', 'i'), ('\u{017F}', 'f'), ('\u{0184}', 'b'), ('\u{018D}', 'g'),
8 ('\u{01A6}', 'R'), ('\u{01A7}', '2'), ('\u{01B7}', '3'), ('\u{01BC}', '5'),
9 ('\u{01BD}', 's'), ('\u{01C0}', 'I'), ('\u{01C3}', '!'), ('\u{021C}', '3'),
10 ('\u{0222}', '8'), ('\u{0223}', '8'), ('\u{0241}', '?'), ('\u{0251}', 'a'),
11 ('\u{0261}', 'g'), ('\u{0263}', 'y'), ('\u{0269}', 'i'), ('\u{026A}', 'i'),
12 ('\u{026F}', 'w'), ('\u{028B}', 'u'), ('\u{028F}', 'y'), ('\u{0294}', '?'),
13 ('\u{02B9}', '`'), ('\u{02BB}', '`'), ('\u{02BC}', '`'), ('\u{02BD}', '`'),
14 ('\u{02BE}', '`'), ('\u{02C2}', '<'), ('\u{02C3}', '>'), ('\u{02C4}', '^'),
15 ('\u{02C6}', '^'), ('\u{02C8}', '`'), ('\u{02CA}', '`'), ('\u{02CB}', '`'),
16 ('\u{02D0}', ':'), ('\u{02D7}', '-'), ('\u{02DB}', 'i'), ('\u{02DC}', '~'),
17 ('\u{02F4}', '`'), ('\u{02F8}', ':'), ('\u{0374}', '`'), ('\u{037A}', 'i'),
18 ('\u{037E}', ';'), ('\u{037F}', 'J'), ('\u{0384}', '`'), ('\u{0391}', 'A'),
19 ('\u{0392}', 'B'), ('\u{0395}', 'E'), ('\u{0396}', 'Z'), ('\u{0397}', 'H'),
20 ('\u{0399}', 'I'), ('\u{039A}', 'K'), ('\u{039C}', 'M'), ('\u{039D}', 'N'),
21 ('\u{039F}', 'O'), ('\u{03A1}', 'P'), ('\u{03A4}', 'T'), ('\u{03A5}', 'Y'),
22 ('\u{03A7}', 'X'), ('\u{03B1}', 'a'), ('\u{03B3}', 'y'), ('\u{03B9}', 'i'),
23 ('\u{03BD}', 'v'), ('\u{03BF}', 'o'), ('\u{03C1}', 'p'), ('\u{03C3}', 'o'),
24 ('\u{03C5}', 'u'), ('\u{03D2}', 'Y'), ('\u{03DC}', 'F'), ('\u{03E8}', '2'),
25 ('\u{03F1}', 'p'), ('\u{03F2}', 'c'), ('\u{03F3}', 'j'), ('\u{03F9}', 'C'),
26 ('\u{03FA}', 'M'), ('\u{0405}', 'S'), ('\u{0406}', 'I'), ('\u{0408}', 'J'),
27 ('\u{0410}', 'A'), ('\u{0412}', 'B'), ('\u{0415}', 'E'), ('\u{0417}', '3'),
28 ('\u{041A}', 'K'), ('\u{041C}', 'M'), ('\u{041D}', 'H'), ('\u{041E}', 'O'),
29 ('\u{0420}', 'P'), ('\u{0421}', 'C'), ('\u{0422}', 'T'), ('\u{0423}', 'Y'),
30 ('\u{0425}', 'X'), ('\u{042C}', 'b'), ('\u{0430}', 'a'), ('\u{0431}', '6'),
31 ('\u{0433}', 'r'), ('\u{0435}', 'e'), ('\u{043E}', 'o'), ('\u{0440}', 'p'),
32 ('\u{0441}', 'c'), ('\u{0443}', 'y'), ('\u{0445}', 'x'), ('\u{0455}', 's'),
33 ('\u{0456}', 'i'), ('\u{0458}', 'j'), ('\u{0461}', 'w'), ('\u{0474}', 'V'),
34 ('\u{0475}', 'v'), ('\u{04AE}', 'Y'), ('\u{04AF}', 'y'), ('\u{04BB}', 'h'),
35 ('\u{04BD}', 'e'), ('\u{04C0}', 'I'), ('\u{04CF}', 'i'), ('\u{04E0}', '3'),
36 ('\u{0501}', 'd'), ('\u{050C}', 'G'), ('\u{051B}', 'q'), ('\u{051C}', 'W'),
37 ('\u{051D}', 'w'), ('\u{054D}', 'U'), ('\u{054F}', 'S'), ('\u{0555}', 'O'),
38 ('\u{055A}', '`'), ('\u{055D}', '`'), ('\u{0561}', 'w'), ('\u{0563}', 'q'),
39 ('\u{0566}', 'q'), ('\u{0570}', 'h'), ('\u{0578}', 'n'), ('\u{057C}', 'n'),
40 ('\u{057D}', 'u'), ('\u{0581}', 'g'), ('\u{0584}', 'f'), ('\u{0585}', 'o'),
41 ('\u{0589}', ':'), ('\u{05C0}', 'l'), ('\u{05C3}', ':'), ('\u{05D5}', 'l'),
42 ('\u{05D8}', 'v'), ('\u{05D9}', '`'), ('\u{05DF}', 'l'), ('\u{05E1}', 'o'),
43 ('\u{05F3}', '`'), ('\u{060D}', ','), ('\u{0627}', 'l'), ('\u{0647}', 'o'),
44 ('\u{0660}', '.'), ('\u{0661}', 'l'), ('\u{0665}', 'o'), ('\u{0667}', 'V'),
45 ('\u{066B}', ','), ('\u{066D}', '*'), ('\u{06BE}', 'o'), ('\u{06C1}', 'o'),
46 ('\u{06D4}', '-'), ('\u{06D5}', 'o'), ('\u{06F0}', '.'), ('\u{06F1}', 'I'),
47 ('\u{06F5}', 'o'), ('\u{06F7}', 'V'), ('\u{0701}', '.'), ('\u{0702}', '.'),
48 ('\u{0703}', ':'), ('\u{0704}', ':'), ('\u{07C0}', 'O'), ('\u{07CA}', 'l'),
49 ('\u{07F4}', '`'), ('\u{07F5}', '`'), ('\u{07FA}', '_'), ('\u{0903}', ':'),
50 ('\u{0966}', 'o'), ('\u{097D}', '?'), ('\u{09E6}', 'O'), ('\u{09EA}', '8'),
51 ('\u{09ED}', '9'), ('\u{0A66}', 'o'), ('\u{0A67}', '9'), ('\u{0A6A}', '8'),
52 ('\u{0A83}', ':'), ('\u{0AE6}', 'o'), ('\u{0B03}', '8'), ('\u{0B20}', 'O'),
53 ('\u{0B66}', 'O'), ('\u{0B68}', '9'), ('\u{0BE6}', 'o'), ('\u{0C02}', 'o'),
54 ('\u{0C66}', 'o'), ('\u{0C82}', 'o'), ('\u{0CE6}', 'o'), ('\u{0D02}', 'o'),
55 ('\u{0D20}', 'o'), ('\u{0D66}', 'o'), ('\u{0D6D}', '9'), ('\u{0D82}', 'o'),
56 ('\u{0E50}', 'o'), ('\u{0ED0}', 'o'), ('\u{101D}', 'o'), ('\u{1040}', 'o'),
57 ('\u{10E7}', 'y'), ('\u{10FF}', 'o'), ('\u{1200}', 'U'), ('\u{12D0}', 'O'),
58 ('\u{13A0}', 'D'), ('\u{13A1}', 'R'), ('\u{13A2}', 'T'), ('\u{13A5}', 'i'),
59 ('\u{13A9}', 'Y'), ('\u{13AA}', 'A'), ('\u{13AB}', 'J'), ('\u{13AC}', 'E'),
60 ('\u{13AE}', '?'), ('\u{13B3}', 'W'), ('\u{13B7}', 'M'), ('\u{13BB}', 'H'),
61 ('\u{13BD}', 'Y'), ('\u{13C0}', 'G'), ('\u{13C2}', 'h'), ('\u{13C3}', 'Z'),
62 ('\u{13CE}', '4'), ('\u{13CF}', 'b'), ('\u{13D2}', 'R'), ('\u{13D4}', 'W'),
63 ('\u{13D5}', 'S'), ('\u{13D9}', 'V'), ('\u{13DA}', 'S'), ('\u{13DE}', 'L'),
64 ('\u{13DF}', 'C'), ('\u{13E2}', 'P'), ('\u{13E6}', 'K'), ('\u{13E7}', 'd'),
65 ('\u{13EE}', '6'), ('\u{13F3}', 'G'), ('\u{13F4}', 'B'), ('\u{1400}', '='),
66 ('\u{142F}', 'V'), ('\u{1433}', '>'), ('\u{1438}', '<'), ('\u{144A}', '`'),
67 ('\u{144C}', 'U'), ('\u{146D}', 'P'), ('\u{146F}', 'd'), ('\u{1472}', 'b'),
68 ('\u{148D}', 'J'), ('\u{14AA}', 'L'), ('\u{14BF}', '2'), ('\u{1541}', 'x'),
69 ('\u{157C}', 'H'), ('\u{157D}', 'x'), ('\u{1587}', 'R'), ('\u{15AF}', 'b'),
70 ('\u{15B4}', 'F'), ('\u{15C5}', 'A'), ('\u{15DE}', 'D'), ('\u{15EA}', 'D'),
71 ('\u{15F0}', 'M'), ('\u{15F7}', 'B'), ('\u{166D}', 'X'), ('\u{166E}', 'x'),
72 ('\u{1680}', ' '), ('\u{16B2}', '<'), ('\u{16B7}', 'X'), ('\u{16C1}', 'I'),
73 ('\u{16CC}', '`'), ('\u{16D5}', 'K'), ('\u{16D6}', 'M'), ('\u{16EC}', ':'),
74 ('\u{16ED}', '+'), ('\u{1735}', '/'), ('\u{1803}', ':'), ('\u{1809}', ':'),
75 ('\u{1D04}', 'c'), ('\u{1D0F}', 'o'), ('\u{1D11}', 'o'), ('\u{1D1C}', 'u'),
76 ('\u{1D20}', 'v'), ('\u{1D21}', 'w'), ('\u{1D22}', 'z'), ('\u{1D26}', 'r'),
77 ('\u{1D83}', 'g'), ('\u{1D8C}', 'y'), ('\u{1E9D}', 'f'), ('\u{1EFF}', 'y'),
78 ('\u{1FBD}', '`'), ('\u{1FBE}', 'i'), ('\u{1FBF}', '`'), ('\u{1FC0}', '~'),
79 ('\u{1FEF}', '`'), ('\u{1FFD}', '`'), ('\u{1FFE}', '`'), ('\u{2000}', ' '),
80 ('\u{2001}', ' '), ('\u{2002}', ' '), ('\u{2003}', ' '), ('\u{2004}', ' '),
81 ('\u{2005}', ' '), ('\u{2006}', ' '), ('\u{2007}', ' '), ('\u{2008}', ' '),
82 ('\u{2009}', ' '), ('\u{200A}', ' '), ('\u{2010}', '-'), ('\u{2011}', '-'),
83 ('\u{2012}', '-'), ('\u{2013}', '-'), ('\u{2018}', '`'), ('\u{2019}', '`'),
84 ('\u{201A}', ','), ('\u{201B}', '`'), ('\u{2024}', '.'), ('\u{2028}', ' '),
85 ('\u{2029}', ' '), ('\u{202F}', ' '), ('\u{2032}', '`'), ('\u{2035}', '`'),
86 ('\u{2039}', '<'), ('\u{203A}', '>'), ('\u{2041}', '/'), ('\u{2043}', '-'),
87 ('\u{2044}', '/'), ('\u{204E}', '*'), ('\u{2053}', '~'), ('\u{205A}', ':'),
88 ('\u{205F}', ' '), ('\u{2102}', 'C'), ('\u{210A}', 'g'), ('\u{210B}', 'H'),
89 ('\u{210C}', 'H'), ('\u{210D}', 'H'), ('\u{210E}', 'h'), ('\u{2110}', 'I'),
90 ('\u{2111}', 'I'), ('\u{2112}', 'L'), ('\u{2113}', 'l'), ('\u{2115}', 'N'),
91 ('\u{2119}', 'P'), ('\u{211A}', 'Q'), ('\u{211B}', 'R'), ('\u{211C}', 'R'),
92 ('\u{211D}', 'R'), ('\u{2124}', 'Z'), ('\u{2128}', 'Z'), ('\u{212A}', 'K'),
93 ('\u{212C}', 'B'), ('\u{212D}', 'C'), ('\u{212E}', 'e'), ('\u{212F}', 'e'),
94 ('\u{2130}', 'E'), ('\u{2131}', 'F'), ('\u{2133}', 'M'), ('\u{2134}', 'o'),
95 ('\u{2139}', 'i'), ('\u{213D}', 'y'), ('\u{2145}', 'D'), ('\u{2146}', 'd'),
96 ('\u{2147}', 'e'), ('\u{2148}', 'i'), ('\u{2149}', 'j'), ('\u{2160}', 'I'),
97 ('\u{2164}', 'V'), ('\u{2169}', 'X'), ('\u{216C}', 'L'), ('\u{216D}', 'C'),
98 ('\u{216E}', 'D'), ('\u{216F}', 'M'), ('\u{2170}', 'i'), ('\u{2174}', 'v'),
99 ('\u{2179}', 'x'), ('\u{217C}', 'I'), ('\u{217D}', 'c'), ('\u{217E}', 'd'),
100 ('\u{2212}', '-'), ('\u{2215}', '/'), ('\u{2216}', '\\'), ('\u{2217}', '*'),
101 ('\u{2223}', 'I'), ('\u{2228}', 'v'), ('\u{222A}', 'U'), ('\u{2236}', ':'),
102 ('\u{223C}', '~'), ('\u{22A4}', 'T'), ('\u{22C1}', 'v'), ('\u{22C3}', 'U'),
103 ('\u{22FF}', 'E'), ('\u{2373}', 'i'), ('\u{2374}', 'p'), ('\u{237A}', 'a'),
104 ('\u{23FD}', 'I'), ('\u{2571}', '/'), ('\u{2573}', 'X'), ('\u{2768}', '('),
105 ('\u{2769}', ')'), ('\u{276E}', '<'), ('\u{276F}', '>'), ('\u{2772}', '('),
106 ('\u{2773}', ')'), ('\u{2774}', '{'), ('\u{2775}', '}'), ('\u{2795}', '+'),
107 ('\u{2796}', '-'), ('\u{27CB}', '/'), ('\u{27CD}', '\\'), ('\u{27D9}', 'T'),
108 ('\u{292B}', 'x'), ('\u{292C}', 'x'), ('\u{29F5}', '\\'), ('\u{29F8}', '/'),
109 ('\u{29F9}', '\\'), ('\u{2A2F}', 'x'), ('\u{2C85}', 'r'), ('\u{2C8E}', 'H'),
110 ('\u{2C92}', 'I'), ('\u{2C94}', 'K'), ('\u{2C98}', 'M'), ('\u{2C9A}', 'N'),
111 ('\u{2C9E}', 'O'), ('\u{2C9F}', 'o'), ('\u{2CA2}', 'P'), ('\u{2CA3}', 'p'),
112 ('\u{2CA4}', 'C'), ('\u{2CA5}', 'c'), ('\u{2CA6}', 'T'), ('\u{2CA8}', 'Y'),
113 ('\u{2CAC}', 'X'), ('\u{2CBA}', '-'), ('\u{2CC6}', '/'), ('\u{2CCA}', '9'),
114 ('\u{2CCC}', '3'), ('\u{2CD0}', 'L'), ('\u{2CD2}', '6'), ('\u{2D38}', 'V'),
115 ('\u{2D39}', 'E'), ('\u{2D4F}', 'I'), ('\u{2D51}', '!'), ('\u{2D54}', 'O'),
116 ('\u{2D55}', 'Q'), ('\u{2D5D}', 'X'), ('\u{2E40}', '='), ('\u{2F02}', '\\'),
117 ('\u{2F03}', '/'), ('\u{3007}', 'O'), ('\u{3014}', '('), ('\u{3015}', ')'),
118 ('\u{3033}', '/'), ('\u{30A0}', '='), ('\u{30CE}', '/'), ('\u{31D3}', '/'),
119 ('\u{31D4}', '\\'), ('\u{4E36}', '\\'), ('\u{4E3F}', '/'), ('\u{A4D0}', 'B'),
120 ('\u{A4D1}', 'P'), ('\u{A4D2}', 'd'), ('\u{A4D3}', 'D'), ('\u{A4D4}', 'T'),
121 ('\u{A4D6}', 'G'), ('\u{A4D7}', 'K'), ('\u{A4D9}', 'J'), ('\u{A4DA}', 'C'),
122 ('\u{A4DC}', 'Z'), ('\u{A4DD}', 'F'), ('\u{A4DF}', 'M'), ('\u{A4E0}', 'N'),
123 ('\u{A4E1}', 'L'), ('\u{A4E2}', 'S'), ('\u{A4E3}', 'R'), ('\u{A4E6}', 'V'),
124 ('\u{A4E7}', 'H'), ('\u{A4EA}', 'W'), ('\u{A4EB}', 'X'), ('\u{A4EC}', 'Y'),
125 ('\u{A4EE}', 'A'), ('\u{A4F0}', 'E'), ('\u{A4F2}', 'I'), ('\u{A4F3}', 'O'),
126 ('\u{A4F4}', 'U'), ('\u{A4F8}', '.'), ('\u{A4F9}', ','), ('\u{A4FD}', ':'),
127 ('\u{A4FF}', '='), ('\u{A60E}', '.'), ('\u{A644}', '2'), ('\u{A647}', 'i'),
128 ('\u{A6DF}', 'V'), ('\u{A6EB}', '?'), ('\u{A6EF}', '2'), ('\u{A731}', 's'),
129 ('\u{A75A}', '2'), ('\u{A76A}', '3'), ('\u{A76E}', '9'), ('\u{A778}', '&'),
130 ('\u{A789}', ':'), ('\u{A78C}', '`'), ('\u{A798}', 'F'), ('\u{A799}', 'f'),
131 ('\u{A79F}', 'u'), ('\u{A7AB}', '3'), ('\u{A7B2}', 'J'), ('\u{A7B3}', 'X'),
132 ('\u{A7B4}', 'B'), ('\u{AB32}', 'e'), ('\u{AB35}', 'f'), ('\u{AB3D}', 'o'),
133 ('\u{AB47}', 'r'), ('\u{AB48}', 'r'), ('\u{AB4E}', 'u'), ('\u{AB52}', 'u'),
134 ('\u{AB5A}', 'y'), ('\u{AB75}', 'i'), ('\u{AB81}', 'r'), ('\u{AB83}', 'w'),
135 ('\u{AB93}', 'z'), ('\u{ABA9}', 'v'), ('\u{ABAA}', 's'), ('\u{ABAF}', 'c'),
136 ('\u{FBA6}', 'o'), ('\u{FBA7}', 'o'), ('\u{FBA8}', 'o'), ('\u{FBA9}', 'o'),
137 ('\u{FBAA}', 'o'), ('\u{FBAB}', 'o'), ('\u{FBAC}', 'o'), ('\u{FBAD}', 'o'),
138 ('\u{FD3E}', '('), ('\u{FD3F}', ')'), ('\u{FE30}', ':'), ('\u{FE4D}', '_'),
139 ('\u{FE4E}', '_'), ('\u{FE4F}', '_'), ('\u{FE58}', '-'), ('\u{FE68}', '\\'),
140 ('\u{FE8D}', 'l'), ('\u{FE8E}', 'l'), ('\u{FEE9}', 'o'), ('\u{FEEA}', 'o'),
141 ('\u{FEEB}', 'o'), ('\u{FEEC}', 'o'), ('\u{FF01}', '!'), ('\u{FF02}', '"'),
142 ('\u{FF03}', '#'), ('\u{FF04}', '$'), ('\u{FF05}', '%'), ('\u{FF06}', '&'),
143 ('\u{FF07}', '`'), ('\u{FF08}', '('), ('\u{FF09}', ')'), ('\u{FF0A}', '*'),
144 ('\u{FF0B}', '+'), ('\u{FF0C}', ','), ('\u{FF0D}', '-'), ('\u{FF0E}', '.'),
145 ('\u{FF0F}', '/'), ('\u{FF10}', '0'), ('\u{FF11}', '1'), ('\u{FF12}', '2'),
146 ('\u{FF13}', '3'), ('\u{FF14}', '4'), ('\u{FF15}', '5'), ('\u{FF16}', '6'),
147 ('\u{FF17}', '7'), ('\u{FF18}', '8'), ('\u{FF19}', '9'), ('\u{FF1A}', ':'),
148 ('\u{FF1B}', ';'), ('\u{FF1C}', '<'), ('\u{FF1D}', '='), ('\u{FF1E}', '>'),
149 ('\u{FF1F}', '?'), ('\u{FF20}', '@'), ('\u{FF21}', 'A'), ('\u{FF22}', 'B'),
150 ('\u{FF23}', 'C'), ('\u{FF24}', 'D'), ('\u{FF25}', 'E'), ('\u{FF26}', 'F'),
151 ('\u{FF27}', 'G'), ('\u{FF28}', 'H'), ('\u{FF29}', 'I'), ('\u{FF2A}', 'J'),
152 ('\u{FF2B}', 'K'), ('\u{FF2C}', 'L'), ('\u{FF2D}', 'M'), ('\u{FF2E}', 'N'),
153 ('\u{FF2F}', 'O'), ('\u{FF30}', 'P'), ('\u{FF31}', 'Q'), ('\u{FF32}', 'R'),
154 ('\u{FF33}', 'S'), ('\u{FF34}', 'T'), ('\u{FF35}', 'U'), ('\u{FF36}', 'V'),
155 ('\u{FF37}', 'W'), ('\u{FF38}', 'X'), ('\u{FF39}', 'Y'), ('\u{FF3A}', 'Z'),
156 ('\u{FF3B}', '['), ('\u{FF3C}', '\\'), ('\u{FF3D}', ']'), ('\u{FF3E}', '^'),
157 ('\u{FF3F}', '_'), ('\u{FF40}', '`'), ('\u{FF41}', 'a'), ('\u{FF42}', 'b'),
158 ('\u{FF43}', 'c'), ('\u{FF44}', 'd'), ('\u{FF45}', 'e'), ('\u{FF46}', 'f'),
159 ('\u{FF47}', 'g'), ('\u{FF48}', 'h'), ('\u{FF49}', 'i'), ('\u{FF4A}', 'j'),
160 ('\u{FF4B}', 'k'), ('\u{FF4C}', 'l'), ('\u{FF4D}', 'm'), ('\u{FF4E}', 'n'),
161 ('\u{FF4F}', 'o'), ('\u{FF50}', 'p'), ('\u{FF51}', 'q'), ('\u{FF52}', 'r'),
162 ('\u{FF53}', 's'), ('\u{FF54}', 't'), ('\u{FF55}', 'u'), ('\u{FF56}', 'v'),
163 ('\u{FF57}', 'w'), ('\u{FF58}', 'x'), ('\u{FF59}', 'y'), ('\u{FF5A}', 'z'),
164 ('\u{FF5B}', '{'), ('\u{FF5C}', '|'), ('\u{FF5D}', '}'), ('\u{FF5E}', '~'),
165 ('\u{FFE8}', 'I'), ('\u{10282}', 'B'), ('\u{10286}', 'E'), ('\u{10287}', 'F'),
166 ('\u{1028A}', '|'), ('\u{10290}', 'X'), ('\u{10292}', 'O'), ('\u{10295}', 'P'),
167 ('\u{10296}', 'S'), ('\u{10297}', 'T'), ('\u{1029B}', '+'), ('\u{102A0}', 'A'),
168 ('\u{102A1}', 'B'), ('\u{102A2}', 'C'), ('\u{102A5}', 'F'), ('\u{102AB}', 'O'),
169 ('\u{102B0}', 'M'), ('\u{102B1}', 'T'), ('\u{102B2}', 'Y'), ('\u{102B4}', 'X'),
170 ('\u{102CF}', 'H'), ('\u{102F5}', 'Z'), ('\u{10301}', 'B'), ('\u{10302}', 'C'),
171 ('\u{10309}', '|'), ('\u{10311}', 'M'), ('\u{10315}', 'T'), ('\u{10317}', 'X'),
172 ('\u{1031A}', '8'), ('\u{1031F}', '*'), ('\u{10320}', 'l'), ('\u{10322}', 'X'),
173 ('\u{10404}', 'O'), ('\u{10415}', 'C'), ('\u{1041B}', 'L'), ('\u{10420}', 'S'),
174 ('\u{1042C}', 'o'), ('\u{1043D}', 'c'), ('\u{10448}', 's'), ('\u{104B4}', 'R'),
175 ('\u{104C2}', 'O'), ('\u{104CE}', 'U'), ('\u{104D2}', '7'), ('\u{104EA}', 'o'),
176 ('\u{104F6}', 'u'), ('\u{10513}', 'N'), ('\u{10516}', 'O'), ('\u{10518}', 'K'),
177 ('\u{1051C}', 'C'), ('\u{1051D}', 'V'), ('\u{10525}', 'F'), ('\u{10526}', 'L'),
178 ('\u{10527}', 'X'), ('\u{10A50}', '.'), ('\u{114D0}', 'O'), ('\u{11706}', 'v'),
179 ('\u{1170A}', 'w'), ('\u{1170E}', 'w'), ('\u{1170F}', 'w'), ('\u{118A0}', 'V'),
180 ('\u{118A2}', 'F'), ('\u{118A3}', 'L'), ('\u{118A4}', 'Y'), ('\u{118A6}', 'E'),
181 ('\u{118A9}', 'Z'), ('\u{118AC}', '9'), ('\u{118AE}', 'E'), ('\u{118AF}', '4'),
182 ('\u{118B2}', 'L'), ('\u{118B5}', 'O'), ('\u{118B8}', 'U'), ('\u{118BB}', '5'),
183 ('\u{118BC}', 'T'), ('\u{118C0}', 'v'), ('\u{118C1}', 's'), ('\u{118C2}', 'F'),
184 ('\u{118C3}', 'i'), ('\u{118C4}', 'z'), ('\u{118C6}', '7'), ('\u{118C8}', 'o'),
185 ('\u{118CA}', '3'), ('\u{118CC}', '9'), ('\u{118D5}', '6'), ('\u{118D6}', '9'),
186 ('\u{118D7}', 'o'), ('\u{118D8}', 'u'), ('\u{118DC}', 'y'), ('\u{118E0}', 'O'),
187 ('\u{118E5}', 'Z'), ('\u{118E6}', 'W'), ('\u{118E9}', 'C'), ('\u{118EC}', 'X'),
188 ('\u{118EF}', 'W'), ('\u{118F2}', 'C'), ('\u{16F08}', 'V'), ('\u{16F0A}', 'T'),
189 ('\u{16F16}', 'L'), ('\u{16F28}', 'I'), ('\u{16F35}', 'R'), ('\u{16F3A}', 'S'),
190 ('\u{16F3B}', '3'), ('\u{16F3F}', '>'), ('\u{16F40}', 'A'), ('\u{16F42}', 'U'),
191 ('\u{16F43}', 'Y'), ('\u{16F51}', '`'), ('\u{16F52}', '`'), ('\u{1D114}', '{'),
192 ('\u{1D16D}', '.'), ('\u{1D206}', '3'), ('\u{1D20D}', 'V'), ('\u{1D20F}', '\\'),
193 ('\u{1D212}', '7'), ('\u{1D213}', 'F'), ('\u{1D216}', 'R'), ('\u{1D22A}', 'L'),
194 ('\u{1D236}', '<'), ('\u{1D237}', '>'), ('\u{1D23A}', '/'), ('\u{1D23B}', '\\'),
195 ('\u{1D400}', 'A'), ('\u{1D401}', 'B'), ('\u{1D402}', 'C'), ('\u{1D403}', 'D'),
196 ('\u{1D404}', 'E'), ('\u{1D405}', 'F'), ('\u{1D406}', 'G'), ('\u{1D407}', 'H'),
197 ('\u{1D408}', 'I'), ('\u{1D409}', 'J'), ('\u{1D40A}', 'K'), ('\u{1D40B}', 'L'),
198 ('\u{1D40C}', 'M'), ('\u{1D40D}', 'N'), ('\u{1D40E}', 'O'), ('\u{1D40F}', 'P'),
199 ('\u{1D410}', 'Q'), ('\u{1D411}', 'R'), ('\u{1D412}', 'S'), ('\u{1D413}', 'T'),
200 ('\u{1D414}', 'U'), ('\u{1D415}', 'V'), ('\u{1D416}', 'W'), ('\u{1D417}', 'X'),
201 ('\u{1D418}', 'Y'), ('\u{1D419}', 'Z'), ('\u{1D41A}', 'a'), ('\u{1D41B}', 'b'),
202 ('\u{1D41C}', 'c'), ('\u{1D41D}', 'd'), ('\u{1D41E}', 'e'), ('\u{1D41F}', 'f'),
203 ('\u{1D420}', 'g'), ('\u{1D421}', 'h'), ('\u{1D422}', 'i'), ('\u{1D423}', 'j'),
204 ('\u{1D424}', 'k'), ('\u{1D425}', 'l'), ('\u{1D427}', 'n'), ('\u{1D428}', 'o'),
205 ('\u{1D429}', 'p'), ('\u{1D42A}', 'q'), ('\u{1D42B}', 'r'), ('\u{1D42C}', 's'),
206 ('\u{1D42D}', 't'), ('\u{1D42E}', 'u'), ('\u{1D42F}', 'v'), ('\u{1D430}', 'w'),
207 ('\u{1D431}', 'x'), ('\u{1D432}', 'y'), ('\u{1D433}', 'z'), ('\u{1D434}', 'A'),
208 ('\u{1D435}', 'B'), ('\u{1D436}', 'C'), ('\u{1D437}', 'D'), ('\u{1D438}', 'E'),
209 ('\u{1D439}', 'F'), ('\u{1D43A}', 'G'), ('\u{1D43B}', 'H'), ('\u{1D43C}', 'I'),
210 ('\u{1D43D}', 'J'), ('\u{1D43E}', 'K'), ('\u{1D43F}', 'L'), ('\u{1D440}', 'M'),
211 ('\u{1D441}', 'N'), ('\u{1D442}', 'O'), ('\u{1D443}', 'P'), ('\u{1D444}', 'Q'),
212 ('\u{1D445}', 'R'), ('\u{1D446}', 'S'), ('\u{1D447}', 'T'), ('\u{1D448}', 'U'),
213 ('\u{1D449}', 'V'), ('\u{1D44A}', 'W'), ('\u{1D44B}', 'X'), ('\u{1D44C}', 'Y'),
214 ('\u{1D44D}', 'Z'), ('\u{1D44E}', 'a'), ('\u{1D44F}', 'b'), ('\u{1D450}', 'c'),
215 ('\u{1D451}', 'd'), ('\u{1D452}', 'e'), ('\u{1D453}', 'f'), ('\u{1D454}', 'g'),
216 ('\u{1D456}', 'i'), ('\u{1D457}', 'j'), ('\u{1D458}', 'k'), ('\u{1D459}', 'l'),
217 ('\u{1D45B}', 'n'), ('\u{1D45C}', 'o'), ('\u{1D45D}', 'p'), ('\u{1D45E}', 'q'),
218 ('\u{1D45F}', 'r'), ('\u{1D460}', 's'), ('\u{1D461}', 't'), ('\u{1D462}', 'u'),
219 ('\u{1D463}', 'v'), ('\u{1D464}', 'w'), ('\u{1D465}', 'x'), ('\u{1D466}', 'y'),
220 ('\u{1D467}', 'z'), ('\u{1D468}', 'A'), ('\u{1D469}', 'B'), ('\u{1D46A}', 'C'),
221 ('\u{1D46B}', 'D'), ('\u{1D46C}', 'E'), ('\u{1D46D}', 'F'), ('\u{1D46E}', 'G'),
222 ('\u{1D46F}', 'H'), ('\u{1D470}', 'I'), ('\u{1D471}', 'J'), ('\u{1D472}', 'K'),
223 ('\u{1D473}', 'L'), ('\u{1D474}', 'M'), ('\u{1D475}', 'N'), ('\u{1D476}', 'O'),
224 ('\u{1D477}', 'P'), ('\u{1D478}', 'Q'), ('\u{1D479}', 'R'), ('\u{1D47A}', 'S'),
225 ('\u{1D47B}', 'T'), ('\u{1D47C}', 'U'), ('\u{1D47D}', 'V'), ('\u{1D47E}', 'W'),
226 ('\u{1D47F}', 'X'), ('\u{1D480}', 'Y'), ('\u{1D481}', 'Z'), ('\u{1D482}', 'a'),
227 ('\u{1D483}', 'b'), ('\u{1D484}', 'c'), ('\u{1D485}', 'd'), ('\u{1D486}', 'e'),
228 ('\u{1D487}', 'f'), ('\u{1D488}', 'g'), ('\u{1D489}', 'h'), ('\u{1D48A}', 'i'),
229 ('\u{1D48B}', 'j'), ('\u{1D48C}', 'k'), ('\u{1D48D}', 'l'), ('\u{1D48F}', 'n'),
230 ('\u{1D490}', 'o'), ('\u{1D491}', 'p'), ('\u{1D492}', 'q'), ('\u{1D493}', 'r'),
231 ('\u{1D494}', 's'), ('\u{1D495}', 't'), ('\u{1D496}', 'u'), ('\u{1D497}', 'v'),
232 ('\u{1D498}', 'w'), ('\u{1D499}', 'x'), ('\u{1D49A}', 'y'), ('\u{1D49B}', 'z'),
233 ('\u{1D49C}', 'A'), ('\u{1D49E}', 'C'), ('\u{1D49F}', 'D'), ('\u{1D4A2}', 'G'),
234 ('\u{1D4A5}', 'J'), ('\u{1D4A6}', 'K'), ('\u{1D4A9}', 'N'), ('\u{1D4AA}', 'O'),
235 ('\u{1D4AB}', 'P'), ('\u{1D4AC}', 'Q'), ('\u{1D4AE}', 'S'), ('\u{1D4AF}', 'T'),
236 ('\u{1D4B0}', 'U'), ('\u{1D4B1}', 'V'), ('\u{1D4B2}', 'W'), ('\u{1D4B3}', 'X'),
237 ('\u{1D4B4}', 'Y'), ('\u{1D4B5}', 'Z'), ('\u{1D4B6}', 'a'), ('\u{1D4B7}', 'b'),
238 ('\u{1D4B8}', 'c'), ('\u{1D4B9}', 'd'), ('\u{1D4BB}', 'f'), ('\u{1D4BD}', 'h'),
239 ('\u{1D4BE}', 'i'), ('\u{1D4BF}', 'j'), ('\u{1D4C0}', 'k'), ('\u{1D4C1}', 'l'),
240 ('\u{1D4C3}', 'n'), ('\u{1D4C5}', 'p'), ('\u{1D4C6}', 'q'), ('\u{1D4C7}', 'r'),
241 ('\u{1D4C8}', 's'), ('\u{1D4C9}', 't'), ('\u{1D4CA}', 'u'), ('\u{1D4CB}', 'v'),
242 ('\u{1D4CC}', 'w'), ('\u{1D4CD}', 'x'), ('\u{1D4CE}', 'y'), ('\u{1D4CF}', 'z'),
243 ('\u{1D4D0}', 'A'), ('\u{1D4D1}', 'B'), ('\u{1D4D2}', 'C'), ('\u{1D4D3}', 'D'),
244 ('\u{1D4D4}', 'E'), ('\u{1D4D5}', 'F'), ('\u{1D4D6}', 'G'), ('\u{1D4D7}', 'H'),
245 ('\u{1D4D8}', 'I'), ('\u{1D4D9}', 'J'), ('\u{1D4DA}', 'K'), ('\u{1D4DB}', 'L'),
246 ('\u{1D4DC}', 'M'), ('\u{1D4DD}', 'N'), ('\u{1D4DE}', 'O'), ('\u{1D4DF}', 'P'),
247 ('\u{1D4E0}', 'Q'), ('\u{1D4E1}', 'R'), ('\u{1D4E2}', 'S'), ('\u{1D4E3}', 'T'),
248 ('\u{1D4E4}', 'U'), ('\u{1D4E5}', 'V'), ('\u{1D4E6}', 'W'), ('\u{1D4E7}', 'X'),
249 ('\u{1D4E8}', 'Y'), ('\u{1D4E9}', 'Z'), ('\u{1D4EA}', 'a'), ('\u{1D4EB}', 'b'),
250 ('\u{1D4EC}', 'c'), ('\u{1D4ED}', 'd'), ('\u{1D4EE}', 'e'), ('\u{1D4EF}', 'f'),
251 ('\u{1D4F0}', 'g'), ('\u{1D4F1}', 'h'), ('\u{1D4F2}', 'i'), ('\u{1D4F3}', 'j'),
252 ('\u{1D4F4}', 'k'), ('\u{1D4F5}', 'l'), ('\u{1D4F7}', 'n'), ('\u{1D4F8}', 'o'),
253 ('\u{1D4F9}', 'p'), ('\u{1D4FA}', 'q'), ('\u{1D4FB}', 'r'), ('\u{1D4FC}', 's'),
254 ('\u{1D4FD}', 't'), ('\u{1D4FE}', 'u'), ('\u{1D4FF}', 'v'), ('\u{1D500}', 'w'),
255 ('\u{1D501}', 'x'), ('\u{1D502}', 'y'), ('\u{1D503}', 'z'), ('\u{1D504}', 'A'),
256 ('\u{1D505}', 'B'), ('\u{1D507}', 'D'), ('\u{1D508}', 'E'), ('\u{1D509}', 'F'),
257 ('\u{1D50A}', 'G'), ('\u{1D50D}', 'J'), ('\u{1D50E}', 'K'), ('\u{1D50F}', 'L'),
258 ('\u{1D510}', 'M'), ('\u{1D511}', 'N'), ('\u{1D512}', 'O'), ('\u{1D513}', 'P'),
259 ('\u{1D514}', 'Q'), ('\u{1D516}', 'S'), ('\u{1D517}', 'T'), ('\u{1D518}', 'U'),
260 ('\u{1D519}', 'V'), ('\u{1D51A}', 'W'), ('\u{1D51B}', 'X'), ('\u{1D51C}', 'Y'),
261 ('\u{1D51E}', 'a'), ('\u{1D51F}', 'b'), ('\u{1D520}', 'c'), ('\u{1D521}', 'd'),
262 ('\u{1D522}', 'e'), ('\u{1D523}', 'f'), ('\u{1D524}', 'g'), ('\u{1D525}', 'h'),
263 ('\u{1D526}', 'i'), ('\u{1D527}', 'j'), ('\u{1D528}', 'k'), ('\u{1D529}', 'I'),
264 ('\u{1D52B}', 'n'), ('\u{1D52C}', 'o'), ('\u{1D52D}', 'p'), ('\u{1D52E}', 'q'),
265 ('\u{1D52F}', 'r'), ('\u{1D530}', 's'), ('\u{1D531}', 't'), ('\u{1D532}', 'u'),
266 ('\u{1D533}', 'v'), ('\u{1D534}', 'w'), ('\u{1D535}', 'x'), ('\u{1D536}', 'y'),
267 ('\u{1D537}', 'z'), ('\u{1D538}', 'A'), ('\u{1D539}', 'B'), ('\u{1D53B}', 'D'),
268 ('\u{1D53C}', 'E'), ('\u{1D53D}', 'F'), ('\u{1D53E}', 'G'), ('\u{1D540}', 'I'),
269 ('\u{1D541}', 'J'), ('\u{1D542}', 'K'), ('\u{1D543}', 'L'), ('\u{1D544}', 'M'),
270 ('\u{1D546}', 'O'), ('\u{1D54A}', 'S'), ('\u{1D54B}', 'T'), ('\u{1D54C}', 'U'),
271 ('\u{1D54D}', 'V'), ('\u{1D54E}', 'W'), ('\u{1D54F}', 'X'), ('\u{1D550}', 'Y'),
272 ('\u{1D552}', 'a'), ('\u{1D553}', 'b'), ('\u{1D554}', 'c'), ('\u{1D555}', 'd'),
273 ('\u{1D556}', 'e'), ('\u{1D557}', 'f'), ('\u{1D558}', 'g'), ('\u{1D559}', 'h'),
274 ('\u{1D55A}', 'i'), ('\u{1D55B}', 'j'), ('\u{1D55C}', 'k'), ('\u{1D55D}', 'I'),
275 ('\u{1D55F}', 'n'), ('\u{1D560}', 'o'), ('\u{1D561}', 'p'), ('\u{1D562}', 'q'),
276 ('\u{1D563}', 'r'), ('\u{1D564}', 's'), ('\u{1D565}', 't'), ('\u{1D566}', 'u'),
277 ('\u{1D567}', 'v'), ('\u{1D568}', 'w'), ('\u{1D569}', 'x'), ('\u{1D56A}', 'y'),
278 ('\u{1D56B}', 'z'), ('\u{1D56C}', 'A'), ('\u{1D56D}', 'B'), ('\u{1D56E}', 'C'),
279 ('\u{1D56F}', 'D'), ('\u{1D570}', 'E'), ('\u{1D571}', 'F'), ('\u{1D572}', 'G'),
280 ('\u{1D573}', 'H'), ('\u{1D574}', 'I'), ('\u{1D575}', 'J'), ('\u{1D576}', 'K'),
281 ('\u{1D577}', 'L'), ('\u{1D578}', 'M'), ('\u{1D579}', 'N'), ('\u{1D57A}', 'O'),
282 ('\u{1D57B}', 'P'), ('\u{1D57C}', 'Q'), ('\u{1D57D}', 'R'), ('\u{1D57E}', 'S'),
283 ('\u{1D57F}', 'T'), ('\u{1D580}', 'U'), ('\u{1D581}', 'V'), ('\u{1D582}', 'W'),
284 ('\u{1D583}', 'X'), ('\u{1D584}', 'Y'), ('\u{1D585}', 'Z'), ('\u{1D586}', 'a'),
285 ('\u{1D587}', 'b'), ('\u{1D588}', 'c'), ('\u{1D589}', 'd'), ('\u{1D58A}', 'e'),
286 ('\u{1D58B}', 'f'), ('\u{1D58C}', 'g'), ('\u{1D58D}', 'h'), ('\u{1D58E}', 'i'),
287 ('\u{1D58F}', 'j'), ('\u{1D590}', 'k'), ('\u{1D591}', 'I'), ('\u{1D593}', 'n'),
288 ('\u{1D594}', 'o'), ('\u{1D595}', 'p'), ('\u{1D596}', 'q'), ('\u{1D597}', 'r'),
289 ('\u{1D598}', 's'), ('\u{1D599}', 't'), ('\u{1D59A}', 'u'), ('\u{1D59B}', 'v'),
290 ('\u{1D59C}', 'w'), ('\u{1D59D}', 'x'), ('\u{1D59E}', 'y'), ('\u{1D59F}', 'z'),
291 ('\u{1D5A0}', 'A'), ('\u{1D5A1}', 'B'), ('\u{1D5A2}', 'C'), ('\u{1D5A3}', 'D'),
292 ('\u{1D5A4}', 'E'), ('\u{1D5A5}', 'F'), ('\u{1D5A6}', 'G'), ('\u{1D5A7}', 'H'),
293 ('\u{1D5A8}', 'I'), ('\u{1D5A9}', 'J'), ('\u{1D5AA}', 'K'), ('\u{1D5AB}', 'L'),
294 ('\u{1D5AC}', 'M'), ('\u{1D5AD}', 'N'), ('\u{1D5AE}', 'O'), ('\u{1D5AF}', 'P'),
295 ('\u{1D5B0}', 'Q'), ('\u{1D5B1}', 'R'), ('\u{1D5B2}', 'S'), ('\u{1D5B3}', 'T'),
296 ('\u{1D5B4}', 'U'), ('\u{1D5B5}', 'V'), ('\u{1D5B6}', 'W'), ('\u{1D5B7}', 'X'),
297 ('\u{1D5B8}', 'Y'), ('\u{1D5B9}', 'Z'), ('\u{1D5BA}', 'a'), ('\u{1D5BB}', 'b'),
298 ('\u{1D5BC}', 'c'), ('\u{1D5BD}', 'd'), ('\u{1D5BE}', 'e'), ('\u{1D5BF}', 'f'),
299 ('\u{1D5C0}', 'g'), ('\u{1D5C1}', 'h'), ('\u{1D5C2}', 'i'), ('\u{1D5C3}', 'j'),
300 ('\u{1D5C4}', 'k'), ('\u{1D5C5}', 'I'), ('\u{1D5C7}', 'n'), ('\u{1D5C8}', 'o'),
301 ('\u{1D5C9}', 'p'), ('\u{1D5CA}', 'q'), ('\u{1D5CB}', 'r'), ('\u{1D5CC}', 's'),
302 ('\u{1D5CD}', 't'), ('\u{1D5CE}', 'u'), ('\u{1D5CF}', 'v'), ('\u{1D5D0}', 'w'),
303 ('\u{1D5D1}', 'x'), ('\u{1D5D2}', 'y'), ('\u{1D5D3}', 'z'), ('\u{1D5D4}', 'A'),
304 ('\u{1D5D5}', 'B'), ('\u{1D5D6}', 'C'), ('\u{1D5D7}', 'D'), ('\u{1D5D8}', 'E'),
305 ('\u{1D5D9}', 'F'), ('\u{1D5DA}', 'G'), ('\u{1D5DB}', 'H'), ('\u{1D5DC}', 'I'),
306 ('\u{1D5DD}', 'J'), ('\u{1D5DE}', 'K'), ('\u{1D5DF}', 'L'), ('\u{1D5E0}', 'M'),
307 ('\u{1D5E1}', 'N'), ('\u{1D5E2}', 'O'), ('\u{1D5E3}', 'P'), ('\u{1D5E4}', 'Q'),
308 ('\u{1D5E5}', 'R'), ('\u{1D5E6}', 'S'), ('\u{1D5E7}', 'T'), ('\u{1D5E8}', 'U'),
309 ('\u{1D5E9}', 'V'), ('\u{1D5EA}', 'W'), ('\u{1D5EB}', 'X'), ('\u{1D5EC}', 'Y'),
310 ('\u{1D5ED}', 'Z'), ('\u{1D5EE}', 'a'), ('\u{1D5EF}', 'b'), ('\u{1D5F0}', 'c'),
311 ('\u{1D5F1}', 'd'), ('\u{1D5F2}', 'e'), ('\u{1D5F3}', 'f'), ('\u{1D5F4}', 'g'),
312 ('\u{1D5F5}', 'h'), ('\u{1D5F6}', 'i'), ('\u{1D5F7}', 'j'), ('\u{1D5F8}', 'k'),
313 ('\u{1D5F9}', 'I'), ('\u{1D5FB}', 'n'), ('\u{1D5FC}', 'o'), ('\u{1D5FD}', 'p'),
314 ('\u{1D5FE}', 'q'), ('\u{1D5FF}', 'r'), ('\u{1D600}', 's'), ('\u{1D601}', 't'),
315 ('\u{1D602}', 'u'), ('\u{1D603}', 'v'), ('\u{1D604}', 'w'), ('\u{1D605}', 'x'),
316 ('\u{1D606}', 'y'), ('\u{1D607}', 'z'), ('\u{1D608}', 'A'), ('\u{1D609}', 'B'),
317 ('\u{1D60A}', 'C'), ('\u{1D60B}', 'D'), ('\u{1D60C}', 'E'), ('\u{1D60D}', 'F'),
318 ('\u{1D60E}', 'G'), ('\u{1D60F}', 'H'), ('\u{1D610}', 'I'), ('\u{1D611}', 'J'),
319 ('\u{1D612}', 'K'), ('\u{1D613}', 'L'), ('\u{1D614}', 'M'), ('\u{1D615}', 'N'),
320 ('\u{1D616}', 'O'), ('\u{1D617}', 'P'), ('\u{1D618}', 'Q'), ('\u{1D619}', 'R'),
321 ('\u{1D61A}', 'S'), ('\u{1D61B}', 'T'), ('\u{1D61C}', 'U'), ('\u{1D61D}', 'V'),
322 ('\u{1D61E}', 'W'), ('\u{1D61F}', 'X'), ('\u{1D620}', 'Y'), ('\u{1D621}', 'Z'),
323 ('\u{1D622}', 'a'), ('\u{1D623}', 'b'), ('\u{1D624}', 'c'), ('\u{1D625}', 'd'),
324 ('\u{1D626}', 'e'), ('\u{1D627}', 'f'), ('\u{1D628}', 'g'), ('\u{1D629}', 'h'),
325 ('\u{1D62A}', 'i'), ('\u{1D62B}', 'j'), ('\u{1D62C}', 'k'), ('\u{1D62D}', 'I'),
326 ('\u{1D62F}', 'n'), ('\u{1D630}', 'o'), ('\u{1D631}', 'p'), ('\u{1D632}', 'q'),
327 ('\u{1D633}', 'r'), ('\u{1D634}', 's'), ('\u{1D635}', 't'), ('\u{1D636}', 'u'),
328 ('\u{1D637}', 'v'), ('\u{1D638}', 'w'), ('\u{1D639}', 'x'), ('\u{1D63A}', 'y'),
329 ('\u{1D63B}', 'z'), ('\u{1D63C}', 'A'), ('\u{1D63D}', 'B'), ('\u{1D63E}', 'C'),
330 ('\u{1D63F}', 'D'), ('\u{1D640}', 'E'), ('\u{1D641}', 'F'), ('\u{1D642}', 'G'),
331 ('\u{1D643}', 'H'), ('\u{1D644}', 'I'), ('\u{1D645}', 'J'), ('\u{1D646}', 'K'),
332 ('\u{1D647}', 'L'), ('\u{1D648}', 'M'), ('\u{1D649}', 'N'), ('\u{1D64A}', 'O'),
333 ('\u{1D64B}', 'P'), ('\u{1D64C}', 'Q'), ('\u{1D64D}', 'R'), ('\u{1D64E}', 'S'),
334 ('\u{1D64F}', 'T'), ('\u{1D650}', 'U'), ('\u{1D651}', 'V'), ('\u{1D652}', 'W'),
335 ('\u{1D653}', 'X'), ('\u{1D654}', 'Y'), ('\u{1D655}', 'Z'), ('\u{1D656}', 'a'),
336 ('\u{1D657}', 'b'), ('\u{1D658}', 'c'), ('\u{1D659}', 'd'), ('\u{1D65A}', 'e'),
337 ('\u{1D65B}', 'f'), ('\u{1D65C}', 'g'), ('\u{1D65D}', 'h'), ('\u{1D65E}', 'i'),
338 ('\u{1D65F}', 'j'), ('\u{1D660}', 'k'), ('\u{1D661}', 'I'), ('\u{1D663}', 'n'),
339 ('\u{1D664}', 'o'), ('\u{1D665}', 'p'), ('\u{1D666}', 'q'), ('\u{1D667}', 'r'),
340 ('\u{1D668}', 's'), ('\u{1D669}', 't'), ('\u{1D66A}', 'u'), ('\u{1D66B}', 'v'),
341 ('\u{1D66C}', 'w'), ('\u{1D66D}', 'x'), ('\u{1D66E}', 'y'), ('\u{1D66F}', 'z'),
342 ('\u{1D670}', 'A'), ('\u{1D671}', 'B'), ('\u{1D672}', 'C'), ('\u{1D673}', 'D'),
343 ('\u{1D674}', 'E'), ('\u{1D675}', 'F'), ('\u{1D676}', 'G'), ('\u{1D677}', 'H'),
344 ('\u{1D678}', 'I'), ('\u{1D679}', 'J'), ('\u{1D67A}', 'K'), ('\u{1D67B}', 'L'),
345 ('\u{1D67C}', 'M'), ('\u{1D67D}', 'N'), ('\u{1D67E}', 'O'), ('\u{1D67F}', 'P'),
346 ('\u{1D680}', 'Q'), ('\u{1D681}', 'R'), ('\u{1D682}', 'S'), ('\u{1D683}', 'T'),
347 ('\u{1D684}', 'U'), ('\u{1D685}', 'V'), ('\u{1D686}', 'W'), ('\u{1D687}', 'X'),
348 ('\u{1D688}', 'Y'), ('\u{1D689}', 'Z'), ('\u{1D68A}', 'a'), ('\u{1D68B}', 'b'),
349 ('\u{1D68C}', 'c'), ('\u{1D68D}', 'd'), ('\u{1D68E}', 'e'), ('\u{1D68F}', 'f'),
350 ('\u{1D690}', 'g'), ('\u{1D691}', 'h'), ('\u{1D692}', 'i'), ('\u{1D693}', 'j'),
351 ('\u{1D694}', 'k'), ('\u{1D695}', 'I'), ('\u{1D697}', 'n'), ('\u{1D698}', 'o'),
352 ('\u{1D699}', 'p'), ('\u{1D69A}', 'q'), ('\u{1D69B}', 'r'), ('\u{1D69C}', 's'),
353 ('\u{1D69D}', 't'), ('\u{1D69E}', 'u'), ('\u{1D69F}', 'v'), ('\u{1D6A0}', 'w'),
354 ('\u{1D6A1}', 'x'), ('\u{1D6A2}', 'y'), ('\u{1D6A3}', 'z'), ('\u{1D6A4}', 'i'),
355 ('\u{1D6A8}', 'A'), ('\u{1D6A9}', 'B'), ('\u{1D6AC}', 'E'), ('\u{1D6AD}', 'Z'),
356 ('\u{1D6AE}', 'H'), ('\u{1D6B0}', 'I'), ('\u{1D6B1}', 'K'), ('\u{1D6B3}', 'M'),
357 ('\u{1D6B4}', 'N'), ('\u{1D6B6}', 'O'), ('\u{1D6B8}', 'P'), ('\u{1D6BB}', 'T'),
358 ('\u{1D6BC}', 'Y'), ('\u{1D6BE}', 'X'), ('\u{1D6C2}', 'a'), ('\u{1D6C4}', 'y'),
359 ('\u{1D6CA}', 'i'), ('\u{1D6CE}', 'v'), ('\u{1D6D0}', 'o'), ('\u{1D6D2}', 'p'),
360 ('\u{1D6D4}', 'o'), ('\u{1D6D6}', 'u'), ('\u{1D6E0}', 'p'), ('\u{1D6E2}', 'A'),
361 ('\u{1D6E3}', 'B'), ('\u{1D6E6}', 'E'), ('\u{1D6E7}', 'Z'), ('\u{1D6E8}', 'H'),
362 ('\u{1D6EA}', 'I'), ('\u{1D6EB}', 'K'), ('\u{1D6ED}', 'M'), ('\u{1D6EE}', 'N'),
363 ('\u{1D6F0}', 'O'), ('\u{1D6F2}', 'P'), ('\u{1D6F5}', 'T'), ('\u{1D6F6}', 'Y'),
364 ('\u{1D6F8}', 'X'), ('\u{1D6FC}', 'a'), ('\u{1D6FE}', 'y'), ('\u{1D704}', 'i'),
365 ('\u{1D708}', 'v'), ('\u{1D70A}', 'o'), ('\u{1D70C}', 'p'), ('\u{1D70E}', 'o'),
366 ('\u{1D710}', 'u'), ('\u{1D71A}', 'p'), ('\u{1D71C}', 'A'), ('\u{1D71D}', 'B'),
367 ('\u{1D720}', 'E'), ('\u{1D721}', 'Z'), ('\u{1D722}', 'H'), ('\u{1D724}', 'I'),
368 ('\u{1D725}', 'K'), ('\u{1D727}', 'M'), ('\u{1D728}', 'N'), ('\u{1D72A}', 'O'),
369 ('\u{1D72C}', 'P'), ('\u{1D72F}', 'T'), ('\u{1D730}', 'Y'), ('\u{1D732}', 'X'),
370 ('\u{1D736}', 'a'), ('\u{1D738}', 'y'), ('\u{1D73E}', 'i'), ('\u{1D742}', 'v'),
371 ('\u{1D744}', 'o'), ('\u{1D746}', 'p'), ('\u{1D748}', 'o'), ('\u{1D74A}', 'u'),
372 ('\u{1D754}', 'p'), ('\u{1D756}', 'A'), ('\u{1D757}', 'B'), ('\u{1D75A}', 'E'),
373 ('\u{1D75B}', 'Z'), ('\u{1D75C}', 'H'), ('\u{1D75E}', 'I'), ('\u{1D75F}', 'K'),
374 ('\u{1D761}', 'M'), ('\u{1D762}', 'N'), ('\u{1D764}', 'O'), ('\u{1D766}', 'P'),
375 ('\u{1D769}', 'T'), ('\u{1D76A}', 'Y'), ('\u{1D76C}', 'X'), ('\u{1D770}', 'a'),
376 ('\u{1D772}', 'y'), ('\u{1D778}', 'i'), ('\u{1D77C}', 'v'), ('\u{1D77E}', 'o'),
377 ('\u{1D780}', 'p'), ('\u{1D782}', 'o'), ('\u{1D784}', 'u'), ('\u{1D78E}', 'p'),
378 ('\u{1D790}', 'A'), ('\u{1D791}', 'B'), ('\u{1D794}', 'E'), ('\u{1D795}', 'Z'),
379 ('\u{1D796}', 'H'), ('\u{1D798}', 'I'), ('\u{1D799}', 'K'), ('\u{1D79B}', 'M'),
380 ('\u{1D79C}', 'N'), ('\u{1D79E}', 'O'), ('\u{1D7A0}', 'P'), ('\u{1D7A3}', 'T'),
381 ('\u{1D7A4}', 'Y'), ('\u{1D7A6}', 'X'), ('\u{1D7AA}', 'a'), ('\u{1D7AC}', 'y'),
382 ('\u{1D7B2}', 'i'), ('\u{1D7B6}', 'v'), ('\u{1D7B8}', 'o'), ('\u{1D7BA}', 'p'),
383 ('\u{1D7BC}', 'o'), ('\u{1D7BE}', 'u'), ('\u{1D7C8}', 'p'), ('\u{1D7CA}', 'F'),
384 ('\u{1D7CE}', 'O'), ('\u{1D7CF}', 'I'), ('\u{1D7D0}', '2'), ('\u{1D7D1}', '3'),
385 ('\u{1D7D2}', '4'), ('\u{1D7D3}', '5'), ('\u{1D7D4}', '6'), ('\u{1D7D5}', '7'),
386 ('\u{1D7D6}', '8'), ('\u{1D7D7}', '9'), ('\u{1D7D8}', 'O'), ('\u{1D7D9}', 'I'),
387 ('\u{1D7DA}', '2'), ('\u{1D7DB}', '3'), ('\u{1D7DC}', '4'), ('\u{1D7DD}', '5'),
388 ('\u{1D7DE}', '6'), ('\u{1D7DF}', '7'), ('\u{1D7E0}', '8'), ('\u{1D7E1}', '9'),
389 ('\u{1D7E2}', 'O'), ('\u{1D7E3}', 'I'), ('\u{1D7E4}', '2'), ('\u{1D7E5}', '3'),
390 ('\u{1D7E6}', '4'), ('\u{1D7E7}', '5'), ('\u{1D7E8}', '6'), ('\u{1D7E9}', '7'),
391 ('\u{1D7EA}', '8'), ('\u{1D7EB}', '9'), ('\u{1D7EC}', 'O'), ('\u{1D7ED}', 'I'),
392 ('\u{1D7EE}', '2'), ('\u{1D7EF}', '3'), ('\u{1D7F0}', '4'), ('\u{1D7F1}', '5'),
393 ('\u{1D7F2}', '6'), ('\u{1D7F3}', '7'), ('\u{1D7F4}', '8'), ('\u{1D7F5}', '9'),
394 ('\u{1D7F6}', 'O'), ('\u{1D7F7}', 'I'), ('\u{1D7F8}', '2'), ('\u{1D7F9}', '3'),
395 ('\u{1D7FA}', '4'), ('\u{1D7FB}', '5'), ('\u{1D7FC}', '6'), ('\u{1D7FD}', '7'),
396 ('\u{1D7FE}', '8'), ('\u{1D7FF}', '9'), ('\u{1E8C7}', 'l'), ('\u{1E8CB}', '8'),
397 ('\u{1EE00}', 'l'), ('\u{1EE24}', 'o'), ('\u{1EE64}', 'o'), ('\u{1EE80}', 'l'),
398 ('\u{1EE84}', 'o'), ('\u{1F74C}', 'C'), ('\u{1F768}', 'T'), ('\u{1FBF0}', 'O'),
399 ('\u{1FBF1}', 'I'), ('\u{1FBF2}', '2'), ('\u{1FBF3}', '3'), ('\u{1FBF4}', '4'),
400 ('\u{1FBF5}', '5'), ('\u{1FBF6}', '6'), ('\u{1FBF7}', '7'), ('\u{1FBF8}', '8'),
401 ('\u{1FBF9}', '9'),
402];
403
404pub(crate) fn ambiguous_unicode_violations(ctx: &FileCtx<'_>) -> Vec<Violation> {
405 let mut out = Vec::new();
406
407 for (i, line) in ctx.lines.iter().enumerate() {
408 if line.is_ascii() {
409 continue;
410 }
411
412 for ch in line.chars() {
413 if ch.is_ascii() {
414 continue;
415 }
416
417 if let Ok(idx) = CONFUSABLES.binary_search_by_key(&ch, |&(c, _)| c) {
418 let Some((_, looks_like)) = CONFUSABLES.get(idx) else {
419 continue;
420 };
421
422 out.push(violation(
423 ctx.rel,
424 i + 1,
425 format!(
426 "ambiguous Unicode character U+{:04X} (confusable with {looks_like:?})",
427 ch as u32
428 ),
429 ));
430 break;
431 }
432 }
433 }
434
435 out
436}