3 // Marek Habersack <mhabersack@novell.com>
5 // Copyright (C) 2010 Novell, Inc. (http://novell.com/)
7 // Permission is hereby granted, free of charge, to any person obtaining
8 // a copy of this software and associated documentation files (the
9 // "Software"), to deal in the Software without restriction, including
10 // without limitation the rights to use, copy, modify, merge, publish,
11 // distribute, sublicense, and/or sell copies of the Software, and to
12 // permit persons to whom the Software is furnished to do so, subject to
13 // the following conditions:
15 // The above copyright notice and this permission notice shall be
16 // included in all copies or substantial portions of the Software.
18 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
22 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28 using System.Collections.Generic;
32 using System.Web.Util;
34 using NUnit.Framework;
36 using MonoTests.SystemWeb.Framework;
37 using MonoTests.stand_alone.WebHarness;
38 using MonoTests.Common;
40 namespace MonoTests.System.Web.Util
42 class HttpEncoderPoker : HttpEncoder
44 public void CallHtmlAttributeEncode (string value, TextWriter output)
46 HtmlAttributeEncode (value, output);
49 public void CallHtmlDecode (string value, TextWriter output)
51 HtmlDecode (value, output);
54 public void CallHtmlEncode (string value, TextWriter output)
56 HtmlEncode (value, output);
59 public byte [] CallUrlEncode (byte [] bytes, int offset, int count)
61 return UrlEncode (bytes, offset, count);
64 public string CallUrlPathEncode (string value)
66 return UrlPathEncode (value);
69 public void CallHeaderNameValueEncode (string headerName, string headerValue, out string encodedHeaderName, out string encodedHeaderValue)
71 HeaderNameValueEncode (headerName, headerValue, out encodedHeaderName, out encodedHeaderValue);
76 public class HttpEncoderTest
79 const string notEncoded = "!()*-._";
81 const string notEncoded = "!'()*-._";
83 static char [] hexChars = "0123456789abcdef".ToCharArray ();
86 public void HtmlAttributeEncode ()
88 var encoder = new HttpEncoderPoker ();
89 var sw = new StringWriter ();
91 AssertExtensions.Throws<ArgumentNullException> (() => {
92 encoder.CallHtmlAttributeEncode ("string", null);
95 encoder.CallHtmlAttributeEncode ("<script>", sw);
96 Assert.AreEqual ("<script>", sw.ToString (), "#A2");
98 sw = new StringWriter ();
99 encoder.CallHtmlAttributeEncode ("\"a&b\"", sw);
100 Assert.AreEqual (""a&b"", sw.ToString (), "#A3");
102 sw = new StringWriter ();
103 encoder.CallHtmlAttributeEncode ("'string'", sw);
104 Assert.AreEqual ("'string'", sw.ToString (), "#A4");
106 sw = new StringWriter ();
107 encoder.CallHtmlAttributeEncode ("\\string\\", sw);
108 Assert.AreEqual ("\\string\\", sw.ToString (), "#A5");
110 sw = new StringWriter ();
111 encoder.CallHtmlAttributeEncode (null, sw);
112 Assert.AreEqual (String.Empty, sw.ToString (), "#A6");
114 sw = new StringWriter ();
115 encoder.CallHtmlAttributeEncode (null, sw);
116 Assert.AreEqual (String.Empty, sw.ToString (), "#A7");
120 public void HtmlDecode ()
122 var encoder = new HttpEncoderPoker ();
125 AssertExtensions.Throws<ArgumentNullException> (() => {
126 encoder.CallHtmlDecode ("string", null);
129 sw = new StringWriter ();
130 encoder.CallHtmlDecode (null, sw);
131 Assert.AreEqual (String.Empty, sw.ToString (), "#A2");
133 sw = new StringWriter ();
134 encoder.CallHtmlDecode (String.Empty, sw);
135 Assert.AreEqual (String.Empty, sw.ToString (), "#A3");
137 for (int i = 0; i < decoding_pairs.Length; i += 2) {
138 sw = new StringWriter ();
139 encoder.CallHtmlDecode (decoding_pairs [i], sw);
140 Assert.AreEqual (decoding_pairs [i + 1], sw.ToString (), "#B" + (i / 2).ToString ());
145 public void HtmlDecode_Specials ()
147 var encoder = new HttpEncoderPoker ();
148 var sw = new StringWriter ();
150 encoder.CallHtmlDecode ("♥iQj", sw);
151 Assert.AreEqual ("♥iQj", sw.ToString (), "#A1");
155 public void HtmlEncode ()
157 var encoder = new HttpEncoderPoker ();
160 AssertExtensions.Throws<ArgumentNullException> (() => {
161 encoder.CallHtmlEncode ("string", null);
164 sw = new StringWriter ();
165 encoder.CallHtmlEncode (null, sw);
166 Assert.AreEqual (String.Empty, sw.ToString (), "#A2");
168 sw = new StringWriter ();
169 encoder.CallHtmlEncode (String.Empty, sw);
170 Assert.AreEqual (String.Empty, sw.ToString (), "#A3");
172 for (int i = 0; i < encoding_pairs.Length; i += 2) {
173 sw = new StringWriter ();
174 encoder.CallHtmlEncode (encoding_pairs [i], sw);
175 Assert.AreEqual (encoding_pairs [i + 1], sw.ToString (), "#B" + (i / 2).ToString ());
180 public void UrlEncode ()
182 var encoder = new HttpEncoderPoker ();
183 byte [] bytes = new byte [10];
185 AssertExtensions.Throws<ArgumentOutOfRangeException> (() => {
186 encoder.CallUrlEncode (bytes, -1, 1);
189 AssertExtensions.Throws<ArgumentOutOfRangeException> (() => {
190 encoder.CallUrlEncode (bytes, 11, 1);
193 AssertExtensions.Throws<ArgumentOutOfRangeException> (() => {
194 encoder.CallUrlEncode (bytes, 0, -1);
197 AssertExtensions.Throws<ArgumentOutOfRangeException> (() => {
198 encoder.CallUrlEncode (bytes, 01, 11);
201 AssertExtensions.Throws<ArgumentNullException> (() => {
202 encoder.CallUrlEncode (null, 0, 1);
205 for (char c = char.MinValue; c < char.MaxValue; c++) {
207 bIn = Encoding.UTF8.GetBytes (c.ToString ());
208 MemoryStream expected = new MemoryStream ();
209 MemoryStream expUnicode = new MemoryStream ();
211 //build expected result for UrlEncode
212 for (int i = 0; i < bIn.Length; i++)
213 UrlEncodeChar ((char) bIn [i], expected, false);
215 byte [] expectedBytes = expected.ToArray ();
216 byte [] encodedBytes = encoder.CallUrlEncode (bIn, 0, bIn.Length);
217 Assert.IsNotNull (encodedBytes, "#B1-1");
218 Assert.AreEqual (expectedBytes.Length, encodedBytes.Length, "#B1-2");
220 for (int i = 0; i < expectedBytes.Length; i++)
221 Assert.AreEqual (expectedBytes [i], encodedBytes [i], String.Format ("[Char: {0}] [Pos: {1}]", c, i));
224 byte [] encoded = encoder.CallUrlEncode (new byte [0], 0, 0);
225 Assert.IsNotNull (encoded, "#C1-1");
226 Assert.AreEqual (0, encoded.Length, "#C1-2");
229 static void UrlEncodeChar (char c, Stream result, bool isUnicode)
232 //FIXME: what happens when there is an internal error?
234 // throw new ArgumentOutOfRangeException ("c", c, "c must be less than 256");
238 result.WriteByte ((byte) '%');
239 result.WriteByte ((byte) 'u');
241 result.WriteByte ((byte) hexChars [idx]);
242 idx = (i >> 8) & 0x0F;
243 result.WriteByte ((byte) hexChars [idx]);
244 idx = (i >> 4) & 0x0F;
245 result.WriteByte ((byte) hexChars [idx]);
247 result.WriteByte ((byte) hexChars [idx]);
251 if (c > ' ' && notEncoded.IndexOf (c) != -1) {
252 result.WriteByte ((byte) c);
256 result.WriteByte ((byte) '+');
260 (c < 'A' && c > '9') ||
261 (c > 'Z' && c < 'a') ||
263 if (isUnicode && c > 127) {
264 result.WriteByte ((byte) '%');
265 result.WriteByte ((byte) 'u');
266 result.WriteByte ((byte) '0');
267 result.WriteByte ((byte) '0');
269 result.WriteByte ((byte) '%');
271 int idx = ((int) c) >> 4;
272 result.WriteByte ((byte) hexChars [idx]);
273 idx = ((int) c) & 0x0F;
274 result.WriteByte ((byte) hexChars [idx]);
276 result.WriteByte ((byte) c);
280 public void UrlPathEncode ()
282 var encoder = new HttpEncoderPoker ();
284 Assert.AreEqual (null, encoder.CallUrlPathEncode (null), "#A1-1");
285 Assert.AreEqual (String.Empty, encoder.CallUrlPathEncode (String.Empty), "#A1-2");
287 for (char c = char.MinValue; c < char.MaxValue; c++) {
288 MemoryStream expected = new MemoryStream ();
289 UrlPathEncodeChar (c, expected);
291 string exp = Encoding.ASCII.GetString (expected.ToArray ());
292 string act = encoder.CallUrlPathEncode (c.ToString ());
293 Assert.AreEqual (exp, act, "UrlPathEncode " + c.ToString ());
298 public void UrlPathEncode2 ()
300 var encoder = new HttpEncoderPoker ();
302 string s = "default.xxx?sdsd=sds";
303 string s2 = encoder.CallUrlPathEncode (s);
304 Assert.AreEqual (s, s2, "UrlPathEncode " + s);
307 static void UrlPathEncodeChar (char c, Stream result)
309 if (c < 33 || c > 126) {
310 byte [] bIn = Encoding.UTF8.GetBytes (c.ToString ());
311 for (int i = 0; i < bIn.Length; i++) {
312 result.WriteByte ((byte) '%');
313 int idx = ((int) bIn [i]) >> 4;
314 result.WriteByte ((byte) hexChars [idx]);
315 idx = ((int) bIn [i]) & 0x0F;
316 result.WriteByte ((byte) hexChars [idx]);
318 } else if (c == ' ') {
319 result.WriteByte ((byte) '%');
320 result.WriteByte ((byte) '2');
321 result.WriteByte ((byte) '0');
323 result.WriteByte ((byte) c);
327 public void HeaderNameValueEncode ()
329 var encoder = new HttpEncoderPoker ();
333 encoder.CallHeaderNameValueEncode (null, null, out encodedName, out encodedValue);
334 Assert.AreEqual (null, encodedName, "#A1-1");
335 Assert.AreEqual (null, encodedValue, "#A1-2");
337 encoder.CallHeaderNameValueEncode (String.Empty, String.Empty, out encodedName, out encodedValue);
338 Assert.AreEqual (String.Empty, encodedName, "#A2-1");
339 Assert.AreEqual (String.Empty, encodedValue, "#A2-2");
342 for (int i = Char.MinValue; i <= Char.MaxValue; i++) {
344 encoder.CallHeaderNameValueEncode (ch.ToString (), null, out encodedName, out encodedValue);
346 if (headerNameEncodedChars.ContainsKey (ch))
347 Assert.AreEqual (headerNameEncodedChars [ch], encodedName, "#B1-" + i.ToString ());
349 Assert.AreEqual (ch.ToString (), encodedName, "#B1-" + i.ToString ());
351 encoder.CallHeaderNameValueEncode (null, ch.ToString (), out encodedName, out encodedValue);
352 if (headerValueEncodedChars.ContainsKey (ch))
353 Assert.AreEqual (headerValueEncodedChars [ch], encodedValue, "#C1-" + i.ToString ());
355 Assert.AreEqual (ch.ToString (), encodedValue, "#C1-" + i.ToString ());
359 Dictionary<char, string> headerNameEncodedChars = new Dictionary<char, string> {
360 {'\u0000', "%00"}, {'\u0001', "%01"}, {'\u0002', "%02"}, {'\u0003', "%03"}, {'\u0004', "%04"},
361 {'\u0005', "%05"}, {'\u0006', "%06"}, {'\u0007', "%07"}, {'\u0008', "%08"}, {'\u000A', "%0a"},
362 {'\u000B', "%0b"}, {'\u000C', "%0c"}, {'\u000D', "%0d"}, {'\u000E', "%0e"}, {'\u000F', "%0f"},
363 {'\u0010', "%10"}, {'\u0011', "%11"}, {'\u0012', "%12"}, {'\u0013', "%13"}, {'\u0014', "%14"},
364 {'\u0015', "%15"}, {'\u0016', "%16"}, {'\u0017', "%17"}, {'\u0018', "%18"}, {'\u0019', "%19"},
365 {'\u001A', "%1a"}, {'\u001B', "%1b"}, {'\u001C', "%1c"}, {'\u001D', "%1d"}, {'\u001E', "%1e"},
366 {'\u001F', "%1f"}, {'
\7f', "%7f"},
369 Dictionary<char, string> headerValueEncodedChars = new Dictionary<char, string> {
370 {'\u0000', "%00"}, {'\u0001', "%01"}, {'\u0002', "%02"}, {'\u0003', "%03"}, {'\u0004', "%04"},
371 {'\u0005', "%05"}, {'\u0006', "%06"}, {'\u0007', "%07"}, {'\u0008', "%08"}, {'\u000A', "%0a"},
372 {'\u000B', "%0b"}, {'\u000C', "%0c"}, {'\u000D', "%0d"}, {'\u000E', "%0e"}, {'\u000F', "%0f"},
373 {'\u0010', "%10"}, {'\u0011', "%11"}, {'\u0012', "%12"}, {'\u0013', "%13"}, {'\u0014', "%14"},
374 {'\u0015', "%15"}, {'\u0016', "%16"}, {'\u0017', "%17"}, {'\u0018', "%18"}, {'\u0019', "%19"},
375 {'\u001A', "%1a"}, {'\u001B', "%1b"}, {'\u001C', "%1c"}, {'\u001D', "%1d"}, {'\u001E', "%1e"},
376 {'\u001F', "%1f"}, {'
\7f', "%7f"},
379 #region Long arrays of strings
380 string [] decoding_pairs = {
381 @"áÁâ´æÆàÀℵαΑ&∧∠åÅ≈ãÃäÄ„βΒ¦•∩çǸ¢χΧˆ♣≅©↵∪¤†‡↓⇓°δΔ♦÷éÉêÊèÈ∅  εΕ≡ηΗðÐëË€∃ƒ∀½¼¾⁄γΓ≥>↔⇔♥…íÍîΡìÌℑ∞∫ιΙ¿∈ïÏκΚλΛ⟨«←⇐⌈“≤⌊∗◊‎‹‘<¯—µ·−μΜ∇ –≠∋¬∉⊄ñÑνΝóÓôÔœŒòÒ‾ωΩοΟ⊕∨ªºøØõÕ⊗öÖ¶∂‰⊥φΦπΠϖ±£′″∏∝ψΨ"√⟩»→⇒⌉”ℜ®⌋ρΡ‏›’‚šŠ⋅§­σΣς∼♠⊂⊆∑⊃¹²³⊇ßτΤ∴θΘϑ þޘיúÚ↑⇑ûÛùÙ¨ϒυΥüÜ℘ξΞýÝ¥ÿŸζΖ‍‌",
382 @"áÁâ´æÆàÀℵαΑ&∧∠åÅ≈ãÃäÄ„βΒ¦•∩çǸ¢χΧˆ♣≅©↵∪¤†‡↓⇓°δΔ♦÷éÉêÊèÈ∅ εΕ≡ηΗðÐëË€∃ƒ∀½¼¾⁄γΓ≥>↔⇔♥…íÍîΡìÌℑ∞∫ιΙ¿∈ïÏκΚλΛ〈«←⇐⌈“≤⌊∗◊‹‘<¯—µ·−μΜ∇ –≠∋¬∉⊄ñÑνΝóÓôÔœŒòÒ‾ωΩοΟ⊕∨ªºøØõÕ⊗öÖ¶∂‰⊥φΦπΠϖ±£′″∏∝ψΨ""√〉»→⇒⌉”ℜ®⌋ρΡ›’‚šŠ⋅§σΣς∼♠⊂⊆∑⊃¹²³⊇ßτΤ∴θΘϑ þޘיúÚ↑⇑ûÛùÙ¨ϒυΥüÜ℘ξΞýÝ¥ÿŸζΖ",
383 @"á?dCO+6Mk'2RÁT148quH^^=972 â#Âjs""{1LZz)U´u@Rv-05n Læ3x}Æ!à,=*-J*À=P|BℵY<g?cg>jB)αΑ9#4V`)|&J/n&JVK56X\2q*F∧Js∠6k6å""Å?rGt≈\F <9IM{s-ã(ShKÃw/[%,ksf93'kä+b$@Q{5ÄUo„aN~'ycb>VKGcjoβoR8""%B`LΒI7g""k5]A>^B¦lllUPg5#b•8Pw,bwSiY ""5]a∩_R@m&D+Lz""dKLTçKH&I}6)_QÇmS%BZV/*Xo¸s5[¢-$|)|L&5~χY/3cdUrnΧ8ˆ&)@KU@scEW2I♣p2,US7f>&m!F≅Fr9A%,Ci'y[]F+©PY↵FeCrQI<:pPP~;>∪¤y J#R&%%i†Ow,‡T↓KpY`WSAo$i:r⇓']=°k12&UI@_δ(9xDΔdz♦RJdB""F^Y}g÷2kbZ2>@yBfué9!9J(vÉ\TwTS2X5iêSLWaTMQE]e&ÊjW{\#JAh{Ua=è5È6/GY∅U n: dcSfεΕ1Yoi?X≡.-s!n|i9U?3:6η+|6Ηha?>fm!v,ðc;Ky]88Ð4T@qO#.ë@Kl3%ËX-VvUoE& €o9T:r8\||^ha;∃1;/BMT*xJ(a>BƒbH'-TH!6NrP∀n½5Fqvq_e9_""XJ¼vmLXTtu:TVZ,¾syl;qEe:b$5j⁄b Hg%Tγ[ΓH≥>{1wT↔o6i~jjKC02⇔Q4i6m(2tpl♥iQj!…4le""4} Lv5{CsíD*u]jÍs}#br=îfhΡ_B:|ìk2U7lZ;_sI\c]Ìsℑ T!5h"".um9ctz∞ YDL∫b(S^ιbCmΙ_L(\-F¿m9g.h$^HSv∈cWH#>ïm0ÏKtgRE3c5@0&κT[2?\>T^H**Κ=^6 [λumΛ[3wQ5gT?H(Bo\/⟨6car8P@AjF4e|b«397jxG:m←U~?~""f⇐`O9iwJ#⌈L:q-* !V“os)Wq6S{t≤=80A⌊#tS6∗x`g6a>]U-b◊SHb/-]‎m9dm""/d<;xR)4‹jrb/,q‘RW}n2shoM11D|<{}*]WPE#d#¯—yhT kµ·`f~o−{Kmfμd7fmtΜPT@OOrzj∇y ;M01XyI: +l<–x5|a>62y≠GNKJQjmj3∋Az¬?V∉,<⊄R]LcñkV:Ñ9LLf&Z%`d-H^Lνv_yXhtΝR1yuF!ój3]zOwQf_YtT9tÓ}s]&1TôÔ2lENœ:Rp^X+tPNL.Œx0 ?c3ZPò3Ò‾@nEωuK-*HjL-h5zΩ~xοFNQ8D#{ΟYj|]'LX⊕ie-Y∨ª$*.cºVM7KQ.b]hmV øx{R>J-D_0vØHpõL'IGÕ`⊗E ö>KNCmÖO2dH_&jd^ >2¶U%""_n∂U>F‰?TSz0~~⊥!p@G~bH^Eφdg)AΦ J<<j_,7Q)dEs,πZΠ_B<@%.&?70ϖ9Y^C|VRPrb4}±Yn=9=SQ;`}(e%£y;6|RN;|w′AH=XXf″∏DGf6ol∝ψ]UXZU\vzW4Ψe`NY[vrvs"xay√[@\scKIznodD<s⟩PB C)<itm+»{t-L→s^^x<:&sh3⇒p^s6Y~3Csw=⌉_pKnhDNTmA*p”]yG6;,ZuPxℜxsd®`hXlUn~(pK=N:^⌋OS""P{%j-Wjbx.wρts^Ρr$h<:u^‏Vj}\?7SIauBh›u[ !rto/[UHog’xe6gY<24BY.‚`ZNR}šuY{Gg;FŠ⋅az4TlWKYbJ.h§c`9FrP­5_)σwx.nP}z@ΣNP9-$@j5ς∼'ogIt:.@Gul♠""p\\rH[)⊂Om/|3G+BQe⊆5s!f/O9SA\RJkv∑GOFMAXu⊃W¹²L`r""}u/n³.ouLC⊇(fß{τB%e [Τ$DD>kIdV#X`?^\∴|S?Wθx)2P.![^5ΘzqF""pjϑ#BE1u? GGG>(EQEþ!""y1r/Þm&@[\mw[kNR˜|1G#i[(×X<UotTID uY™sWW+TbxYúkQXr!H6Ú~0TiH1POP↑(CRZttz\EY<⇑&bN7ki|ûr,3j!e$kJE&Z$zÛ5{0[bvD""[<P)ù;1EeRSrz/gY/Ù/1 S`I*q8:Z-¨%N)WϒO[2P9 ?υOΥtüÜVLq℘2""(Z'~~""uiXξNCqΞ9)S]^v 3ýx""|2&$`GÝ<&Nr¥[3NB5fÿ c""MzMw3(;""sŸζ{!Ζoevp1'j(E`vJ‍Si‌gw>yc*U",
384 @"á?dCO+6Mk'2RÁT148quH^^=972 â#Âjs""{1LZz)U´u@Rv-05n Læ3x}Æ!à,=*-J*À=P|BℵY<g?cg>jB)αΑ9#4V`)|&J/n&JVK56X\2q*F∧Js∠6k6å""Å?rGt≈\F <9IM{s-ã(ShKÃw/[%,ksf93'kä+b$@Q{5ÄUo„aN~'ycb>VKGcjoβoR8""%B`LΒI7g""k5]A>^B¦lllUPg5#b•8Pw,bwSiY ""5]a∩_R@m&D+Lz""dKLTçKH&I}6)_QÇmS%BZV/*Xo¸s5[¢-$|)|L&5~χY/3cdUrnΧ8ˆ&)@KU@scEW2I♣p2,US7f>&m!F≅Fr9A%,Ci'y[]F+©PY↵FeCrQI<:pPP~;>∪¤y J#R&%%i†Ow,‡T↓KpY`WSAo$i:r⇓']=°k12&UI@_δ(9xDΔdz♦RJdB""F^Y}g÷2kbZ2>@yBfué9!9J(vÉ\TwTS2X5iêSLWaTMQE]e&ÊjW{\#JAh{Ua=è5È6/GY∅U n: dcSfεΕ1Yoi?X≡.-s!n|i9U?3:6η+|6Ηha?>fm!v,ðc;Ky]88Ð4T@qO#.ë@Kl3%ËX-VvUoE& €o9T:r8\||^ha;∃1;/BMT*xJ(a>BƒbH'-TH!6NrP∀n½5Fqvq_e9_""XJ¼vmLXTtu:TVZ,¾syl;qEe:b$5j⁄b Hg%Tγ[ΓH≥>{1wT↔o6i~jjKC02⇔Q4i6m(2tpl♥iQj!…4le""4} Lv5{CsíD*u]jÍs}#br=îfhΡ_B:|ìk2U7lZ;_sI\c]Ìsℑ T!5h"".um9ctz∞ YDL∫b(S^ιbCmΙ_L(\-F¿m9g.h$^HSv∈cWH#>ïm0ÏKtgRE3c5@0&κT[2?\>T^H**Κ=^6 [λumΛ[3wQ5gT?H(Bo\/〈6car8P@AjF4e|b«397jxG:m←U~?~""f⇐`O9iwJ#⌈L:q-* !V“os)Wq6S{t≤=80A⌊#tS6∗x`g6a>]U-b◊SHb/-]m9dm""/d<;xR)4‹jrb/,q‘RW}n2shoM11D|<{}*]WPE#d#¯—yhT kµ·`f~o−{Kmfμd7fmtΜPT@OOrzj∇y ;M01XyI: +l<–x5|a>62y≠GNKJQjmj3∋Az¬?V∉,<⊄R]LcñkV:Ñ9LLf&Z%`d-H^Lνv_yXhtΝR1yuF!ój3]zOwQf_YtT9tÓ}s]&1TôÔ2lENœ:Rp^X+tPNL.Œx0 ?c3ZPò3Ò‾@nEωuK-*HjL-h5zΩ~xοFNQ8D#{ΟYj|]'LX⊕ie-Y∨ª$*.cºVM7KQ.b]hmV øx{R>J-D_0vØHpõL'IGÕ`⊗E ö>KNCmÖO2dH_&jd^ >2¶U%""_n∂U>F‰?TSz0~~⊥!p@G~bH^Eφdg)AΦ J<<j_,7Q)dEs,πZΠ_B<@%.&?70ϖ9Y^C|VRPrb4}±Yn=9=SQ;`}(e%£y;6|RN;|w′AH=XXf″∏DGf6ol∝ψ]UXZU\vzW4Ψe`NY[vrvs""xay√[@\scKIznodD<s〉PB C)<itm+»{t-L→s^^x<:&sh3⇒p^s6Y~3Csw=⌉_pKnhDNTmA*p”]yG6;,ZuPxℜxsd®`hXlUn~(pK=N:^⌋OS""P{%j-Wjbx.wρts^Ρr$h<:u^Vj}\?7SIauBh›u[ !rto/[UHog’xe6gY<24BY.‚`ZNR}šuY{Gg;FŠ⋅az4TlWKYbJ.h§c`9FrP5_)σwx.nP}z@ΣNP9-$@j5ς∼'ogIt:.@Gul♠""p\\rH[)⊂Om/|3G+BQe⊆5s!f/O9SA\RJkv∑GOFMAXu⊃W¹²L`r""}u/n³.ouLC⊇(fß{τB%e [Τ$DD>kIdV#X`?^\∴|S?Wθx)2P.![^5ΘzqF""pjϑ#BE1u? GGG>(EQEþ!""y1r/Þm&@[\mw[kNR˜|1G#i[(×X<UotTID uY™sWW+TbxYúkQXr!H6Ú~0TiH1POP↑(CRZttz\EY<⇑&bN7ki|ûr,3j!e$kJE&Z$zÛ5{0[bvD""[<P)ù;1EeRSrz/gY/Ù/1 S`I*q8:Z-¨%N)WϒO[2P9 ?υOΥtüÜVLq℘2""(Z'~~""uiXξNCqΞ9)S]^v 3ýx""|2&$`GÝ<&Nr¥[3NB5fÿ c""MzMw3(;""sŸζ{!Ζoevp1'j(E`vJSigw>yc*U",
385 @"áÁâ´æÆàÀ&alefsym&alpha&Alpha&&and&angåÅ&asympãÃäÄ&bdquo&beta&Beta¦&bull&capçǸ¢&chi&Chi&circ&clubs&cong©&crarr&cup¤&dagger&Dagger&darr&dArr°&delta&Delta&diams÷éÉêÊèÈ&empty&emsp&ensp&epsilon&Epsilon&equiv&eta&EtaðÐëË&euro&exist&fnof&forall½¼¾&frasl&gamma&Gamma&ge>&harr&hArr&hearts&hellipíÍîΡìÌ&image&infin&int&iota&Iota¿&isinïÏ&kappa&Kappa&lambda&Lambda&lang«&larr&lArr&lceil&ldquo&le&lfloor&lowast&loz&lrm&lsaquo&lsquo<¯&mdashµ·&minus&mu&Mu&nabla &ndash&ne&ni¬¬in&nsubñÑ&nu&NuóÓôÔ&oelig&OEligòÒ&oline&omega&Omega&omicron&Omicron&oplus&orªºøØõÕ&otimesöÖ¶&part&permil&perp&phi&Phi&pi&Pi&piv±£&prime&Prime&prod&prop&psi&Psi"&radic&rang»&rarr&rArr&rceil&rdquo&real®&rfloor&rho&Rho&rlm&rsaquo&rsquo&sbquo&scaron&Scaron&sdot§­&sigma&Sigma&sigmaf&sim&spades&sub&sube&sum&sup¹²³&supeß&tau&Tau&there4&theta&Theta&thetasym&thinspþÞ&tilde×&tradeúÚ&uarr&uArrûÛùÙ¨&upsih&upsilon&UpsilonüÜ&weierp&xi&XiýÝ¥ÿ&Yuml&zeta&Zeta&zwj&zwnj",
386 @"áÁâ´æÆàÀ&alefsym&alpha&Alpha&&and&angåÅ&asympãÃäÄ&bdquo&beta&Beta¦&bull&capçǸ¢&chi&Chi&circ&clubs&cong©&crarr&cup¤&dagger&Dagger&darr&dArr°&delta&Delta&diams÷éÉêÊèÈ&empty&emsp&ensp&epsilon&Epsilon&equiv&eta&EtaðÐëË&euro&exist&fnof&forall½¼¾&frasl&gamma&Gamma&ge>&harr&hArr&hearts&hellipíÍîΡìÌ&image&infin&int&iota&Iota¿&isinïÏ&kappa&Kappa&lambda&Lambda&lang«&larr&lArr&lceil&ldquo&le&lfloor&lowast&loz&lrm&lsaquo&lsquo<¯&mdashµ·&minus&mu&Mu&nabla &ndash&ne&ni¬¬in&nsubñÑ&nu&NuóÓôÔ&oelig&OEligòÒ&oline&omega&Omega&omicron&Omicron&oplus&orªºøØõÕ&otimesöÖ¶&part&permil&perp&phi&Phi&pi&Pi&piv±£&prime&Prime&prod&prop&psi&Psi"&radic&rang»&rarr&rArr&rceil&rdquo&real®&rfloor&rho&Rho&rlm&rsaquo&rsquo&sbquo&scaron&Scaron&sdot§­&sigma&Sigma&sigmaf&sim&spades&sub&sube&sum&sup¹²³&supeß&tau&Tau&there4&theta&Theta&thetasym&thinspþÞ&tilde×&tradeúÚ&uarr&uArrûÛùÙ¨&upsih&upsilon&UpsilonüÜ&weierp&xi&XiýÝ¥ÿ&Yuml&zeta&Zeta&zwj&zwnj",
387 @" ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ",
388 @" ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ",
389 @"�	

 ",
390 "�\x1\x2\x3\x4\x5\x6\x7\x8\x9\xa\xb\xc\xd\xe\xf\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f ",
391 @"�	

 ",
392 "�\x1\x2\x3\x4\x5\x6\x7\x8\x9\xa\xb\xc\xd\xe\xf\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f ",
393 @" ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ",
394 " ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ",
396 string [] encoding_pairs = {
397 @"áÁâ´æÆàÀℵαΑ&∧∠åÅ≈ãÃäÄ„βΒ¦•∩çǸ¢χΧˆ♣≅©↵∪¤†‡↓⇓°δΔ♦÷éÉêÊèÈ∅ εΕ≡ηΗðÐëË€∃ƒ∀½¼¾⁄γΓ≥>↔⇔♥…íÍîΡìÌℑ∞∫ιΙ¿∈ïÏκΚλΛ〈«←⇐⌈“≤⌊∗◊‹‘<¯—µ·−μΜ∇ –≠∋¬∉⊄ñÑνΝóÓôÔœŒòÒ‾ωΩοΟ⊕∨ªºøØõÕ⊗öÖ¶∂‰⊥φΦπΠϖ±£′″∏∝ψΨ""√〉»→⇒⌉”ℜ®⌋ρΡ›’‚šŠ⋅§σΣς∼♠⊂⊆∑⊃¹²³⊇ßτΤ∴θΘϑ þޘיúÚ↑⇑ûÛùÙ¨ϒυΥüÜ℘ξΞýÝ¥ÿŸζΖ",
398 @"áÁâ´æÆàÀℵαΑ&∧∠åÅ≈ãÃäÄ„βΒ¦•∩çǸ¢χΧˆ♣≅©↵∪¤†‡↓⇓°δΔ♦÷éÉêÊèÈ∅ εΕ≡ηΗðÐëË€∃ƒ∀½¼¾⁄γΓ≥>↔⇔♥…íÍîΡìÌℑ∞∫ιΙ¿∈ïÏκΚλΛ〈«←⇐⌈“≤⌊∗◊‹‘<¯—µ·−μΜ∇ –≠∋¬∉⊄ñÑνΝóÓôÔœŒòÒ‾ωΩοΟ⊕∨ªºøØõÕ⊗öÖ¶∂‰⊥φΦπΠϖ±£′″∏∝ψΨ"√〉»→⇒⌉”ℜ®⌋ρΡ›’‚šŠ⋅§­σΣς∼♠⊂⊆∑⊃¹²³⊇ßτΤ∴θΘϑ þޘיúÚ↑⇑ûÛùÙ¨ϒυΥüÜ℘ξΞýÝ¥ÿŸζΖ",
399 @"á9cP!qdO#hU@mg1ÁK%0<}*âÂ5[Y;lfMQ$4`´uim7E`%_1zVDkæ[cM{Æt9y:E8Hb;;$;Y'àUa6wÀ<$@W9$4NL*h#'ℵk\zαG}{}hC-Α|=QhyLT%`&wB!@#x51R 4C∧]Z3n∠y>:{JZ'v|c0;N""åzcWM'z""gÅo-JX!r.e≈Z+BT{wF8+ãQ 6P1o?x""ef}vUÃ+</Nt)TI]sä0Eg_'mn&6WY[8Äay+ u[3kqoZ„i6rβUX\:_y1A^x.p>+Β`uf3/HI¦7bCRv%o$X3:•∩ç|(fgiA|MBLf=y@Ǹ¢R,qDW;F9<mχU]$)Q`w^KF^(hΧ?ukX+O!UOftˆZE♣@MLR(vcH]k8≅CU;r#(©7DZ`1>r~.↵4B&R∪+x2T`q[M-lq'¤~3rp%~-Gd†;35wU+II1tQJ‡`NGh[↓Lr>74~yHB=&EI⇓,u@Jx°δcC`2,Δo2B]6PP8♦|{!wZa&,*N'$6÷-{nVSgO]%(Ié6Éêosx-2xDI!Ê_]7Ub%èYG4`Gx{ÈH>vwMPJ∅ :Z-u#ph l,s*8(AεΕOnj|Gy|]iYLPR≡5Wi:(vZUUK.YlηDΗ6TðT!Z:Nq_0797;!Ð4]QNë9+>x9>nm-s8YËwZ}vY€:HHf∃;=0,?ƒIr`I:i5'∀z_$Q<½_sCF;=$43DpDz]¼.aMTIEwx\ogn7A¾CuJD[Hke#⁄E]M%γE:IEk}Γ{qXfzeUS≥kqW yxV>↔AzJ:$fJ⇔3IMDqU\myWjsL♥…Okíjt$NKbGrÍ""+alp<îRÎ%¡yìz2 AÌ-%;jyMK{Umdℑi|}+Za8jyWDS#I∞]NyqN*v:m-∫03Aιf9m.:+z0@OfVoΙ_gfPilLZ¿6qqb0|BQ$H%p+d∈.Wa=YBfS'd-EOïISG+=W;GHÏ3||b-icT""qAκ*/ΚλN>j}""WrqΛt]dm-Xe/v〈\«$F< X←]=8H8⇐c⌈|“JgZ)+(7,}≤s8[""3%C4JvN⌊H55TAKEZ*%Z)d.∗R9z//!q◊D`643eO&-L>DsUej‹C[n]Q<%UoyO‘?zUgpr+62sY<T{7n*^¯4CH]6^e/x/—uT->mQh\""µZSTN!F(U%5·17:Cu<−)*c2μTΜ%:6-e&L[ Xos/4∇]Xr 1c=qyv4HSw~HL~–{+qG?/}≠6`S"",+pL∋>¬B9∉G;6P]xc 0Bs⊄7,j0Sj2/&ñFsÑ=νKs*?[54bV1ΝQ%p6P0.Lrc`yóA/*`6sBH?67Ó&ôÔI""Hœ~e9Œ>oò5eZI}iy?}KÒS‾anD1nXωIΩu""ο:Mz$(""joU^[mΟ7M1f$j>N|Q/@(⊕de6(∨WXb<~;tI?bt#ªU:º+wb(*cA=øjb c%*?Uj6<T02Ø/A}j'MõjlfYlR~er7D@3WÕe:XTLF?|""yd7x⊗eV6Mmw2{K<lö%B%/o~r9Öc1Q TJnd^¶;∂|‰_.⊥E_bim;gvA{wqφeΦ^-!Dcπ8LB6k4PΠ(5D |Y3ϖptuh)3Mv±TAvFo+;JE,2?£""'6F9fRp′,0″<∏N∝C%}JC7qY(7))UWψ 7=rmQaΨeD!G5e>S~kO""'4""/i4\>!]H;T^0o√8_G`*8&An\rhc)〉&UEk»-(YtC→(zerUTMTe,'@{⇒mlzVhU<S,5}9DM⌉/%R=10*[{'=:”C0ℜ4HoT?-#+l[SnPs®0 bV⌋TρΡjb1}OJ:,0z6oTxP""""FOT[;›'’-:Ll)I0^$p.‚S_šNBr9)K[Š1⋅$-S4/G&u§= _CqlY1O'qNf|&σGp}ΣP3:8ς∼[ItI♠8⊂BQn~!KO:+~ma⊆FV.u 4wD∑lE+kQ|gZ];Y⊃DK69EEM$D¹KVO²%:~Iq?IUcHr4y³QP@R't!⊇vßYnI@FXxT<τvL[4H95mfΤF0JzQsrxNZry∴Bn#t(θ*OΘw=Z%ϑ+*l^3C)5HCNmR %`g|*8DECþ_[Þ'8,?˜}gnaz_U×-F^™9ZDO86ú]y\ecHQSÚk-07/AT|0Ce↑F⇑*}e|r$6ln!V`ûA!*8H,mÛ~6G6w&GùsPL6ÙQ¨}J^NO}=._Mnϒ{&υ=ΥWD+f>fy|nNyP*Jüo8,lh\ÜN`'g℘(sJ8h3P]cF ξcdQ_OC]U#ΞBby=Sý9tI_Ý}p(D51=X¥cH8L)$*]~=IÿdbŸf>J^1Dnζ@(drH;91?{6`xJΖ4N4[u+59.W\v]GGtKvCC0`A",
400 @"á9cP!qdO#hU@mg1ÁK%0<}*âÂ5[Y;lfMQ$4`´uim7E`%_1zVDkæ[cM{Æt9y:E8Hb;;$;Y'àUa6wÀ<$@W9$4NL*h#'ℵk\zαG}{}hC-Α|=QhyLT%`&wB!@#x51R 4C∧]Z3n∠y>:{JZ'v|c0;N"åzcWM'z"gÅo-JX!r.e≈Z+BT{wF8+ãQ 6P1o?x"ef}vUÃ+</Nt)TI]sä0Eg_'mn&6WY[8Äay+ u[3kqoZ„i6rβUX\:_y1A^x.p>+Β`uf3/HI¦7bCRv%o$X3:•∩ç|(fgiA|MBLf=y@Ǹ¢R,qDW;F9<mχU]$)Q`w^KF^(hΧ?ukX+O!UOftˆZE♣@MLR(vcH]k8≅CU;r#(©7DZ`1>r~.↵4B&R∪+x2T`q[M-lq'¤~3rp%~-Gd†;35wU+II1tQJ‡`NGh[↓Lr>74~yHB=&EI⇓,u@Jx°δcC`2,Δo2B]6PP8♦|{!wZa&,*N'$6÷-{nVSgO]%(Ié6Éêosx-2xDI!Ê_]7Ub%èYG4`Gx{ÈH>vwMPJ∅ :Z-u#ph l,s*8(AεΕOnj|Gy|]iYLPR≡5Wi:(vZUUK.YlηDΗ6TðT!Z:Nq_0797;!Ð4]QNë9+>x9>nm-s8YËwZ}vY€:HHf∃;=0,?ƒIr`I:i5'∀z_$Q<½_sCF;=$43DpDz]¼.aMTIEwx\ogn7A¾CuJD[Hke#⁄E]M%γE:IEk}Γ{qXfzeUS≥kqW yxV>↔AzJ:$fJ⇔3IMDqU\myWjsL♥…Okíjt$NKbGrÍ"+alp<îRÎ%¡yìz2 AÌ-%;jyMK{Umdℑi|}+Za8jyWDS#I∞]NyqN*v:m-∫03Aιf9m.:+z0@OfVoΙ_gfPilLZ¿6qqb0|BQ$H%p+d∈.Wa=YBfS'd-EOïISG+=W;GHÏ3||b-icT"qAκ*/ΚλN>j}"WrqΛt]dm-Xe/v〈\«$F< X←]=8H8⇐c⌈|“JgZ)+(7,}≤s8["3%C4JvN⌊H55TAKEZ*%Z)d.∗R9z//!q◊D`643eO&-L>DsUej‹C[n]Q<%UoyO‘?zUgpr+62sY<T{7n*^¯4CH]6^e/x/—uT->mQh\"µZSTN!F(U%5·17:Cu<−)*c2μTΜ%:6-e&L[ Xos/4∇]Xr 1c=qyv4HSw~HL~–{+qG?/}≠6`S",+pL∋>¬B9∉G;6P]xc 0Bs⊄7,j0Sj2/&ñFsÑ=νKs*?[54bV1ΝQ%p6P0.Lrc`yóA/*`6sBH?67Ó&ôÔI"Hœ~e9Œ>oò5eZI}iy?}KÒS‾anD1nXωIΩu"ο:Mz$("joU^[mΟ7M1f$j>N|Q/@(⊕de6(∨WXb<~;tI?bt#ªU:º+wb(*cA=øjb c%*?Uj6<T02Ø/A}j'MõjlfYlR~er7D@3WÕe:XTLF?|"yd7x⊗eV6Mmw2{K<lö%B%/o~r9Öc1Q TJnd^¶;∂|‰_.⊥E_bim;gvA{wqφeΦ^-!Dcπ8LB6k4PΠ(5D |Y3ϖptuh)3Mv±TAvFo+;JE,2?£"'6F9fRp′,0″<∏N∝C%}JC7qY(7))UWψ 7=rmQaΨeD!G5e>S~kO"'4"/i4\>!]H;T^0o√8_G`*8&An\rhc)〉&UEk»-(YtC→(zerUTMTe,'@{⇒mlzVhU<S,5}9DM⌉/%R=10*[{'=:”C0ℜ4HoT?-#+l[SnPs®0 bV⌋TρΡjb1}OJ:,0z6oTxP""FOT[;›'’-:Ll)I0^$p.‚S_šNBr9)K[Š1⋅$-S4/G&u§= _CqlY1O'­qNf|&σGp}ΣP3:8ς∼[ItI♠8⊂BQn~!KO:+~ma⊆FV.u 4wD∑lE+kQ|gZ];Y⊃DK69EEM$D¹KVO²%:~Iq?IUcHr4y³QP@R't!⊇vßYnI@FXxT<τvL[4H95mfΤF0JzQsrxNZry∴Bn#t(θ*OΘw=Z%ϑ+*l^3C)5HCNmR %`g|*8DECþ_[Þ'8,?˜}gnaz_U×-F^™9ZDO86ú]y\ecHQSÚk-07/AT|0Ce↑F⇑*}e|r$6ln!V`ûA!*8H,mÛ~6G6w&GùsPL6ÙQ¨}J^NO}=._Mnϒ{&υ=ΥWD+f>fy|nNyP*Jüo8,lh\ÜN`'g℘(sJ8h3P]cF ξcdQ_OC]U#ΞBby=Sý9tI_Ý}p(D51=X¥cH8L)$*]~=IÿdbŸf>J^1Dnζ@(drH;91?{6`xJΖ4N4[u+59.W\v]GGtKvCC0`A",
401 @"áÁâ´æÆàÀ&alefsym&alpha&Alpha&&and&angåÅ&asympãÃäÄ&bdquo&beta&Beta¦&bull&capçǸ¢&chi&Chi&circ&clubs&cong©&crarr&cup¤&dagger&Dagger&darr&dArr°&delta&Delta&diams÷éÉêÊèÈ&empty&emsp&ensp&epsilon&Epsilon&equiv&eta&EtaðÐëË&euro&exist&fnof&forall½¼¾&frasl&gamma&Gamma&ge>&harr&hArr&hearts&hellipíÍîΡìÌ&image&infin&int&iota&Iota¿&isinïÏ&kappa&Kappa&lambda&Lambda&lang«&larr&lArr&lceil&ldquo&le&lfloor&lowast&loz&lrm&lsaquo&lsquo<¯&mdashµ·&minus&mu&Mu&nabla &ndash&ne&ni¬¬in&nsubñÑ&nu&NuóÓôÔ&oelig&OEligòÒ&oline&omega&Omega&omicron&Omicron&oplus&orªºøØõÕ&otimesöÖ¶&part&permil&perp&phi&Phi&pi&Pi&piv±£&prime&Prime&prod&prop&psi&Psi"&radic&rang»&rarr&rArr&rceil&rdquo&real®&rfloor&rho&Rho&rlm&rsaquo&rsquo&sbquo&scaron&Scaron&sdot§­&sigma&Sigma&sigmaf&sim&spades&sub&sube&sum&sup¹²³&supeß&tau&Tau&there4&theta&Theta&thetasym&thinspþÞ&tilde×&tradeúÚ&uarr&uArrûÛùÙ¨&upsih&upsilon&UpsilonüÜ&weierp&xi&XiýÝ¥ÿ&Yuml&zeta&Zeta&zwj&zwnj",
402 @"&aacute&Aacute&acirc&Acirc&acute&aelig&AElig&agrave&Agrave&alefsym&alpha&Alpha&amp&and&ang&aring&Aring&asymp&atilde&Atilde&auml&Auml&bdquo&beta&Beta&brvbar&bull&cap&ccedil&Ccedil&cedil&cent&chi&Chi&circ&clubs&cong&copy&crarr&cup&curren&dagger&Dagger&darr&dArr&deg&delta&Delta&diams&divide&eacute&Eacute&ecirc&Ecirc&egrave&Egrave&empty&emsp&ensp&epsilon&Epsilon&equiv&eta&Eta&eth&ETH&euml&Euml&euro&exist&fnof&forall&frac12&frac14&frac34&frasl&gamma&Gamma&ge&gt&harr&hArr&hearts&hellip&iacute&Iacute&icirc&Icirc&iexcl&igrave&Igrave&image&infin&int&iota&Iota&iquest&isin&iuml&Iuml&kappa&Kappa&lambda&Lambda&lang&laquo&larr&lArr&lceil&ldquo&le&lfloor&lowast&loz&lrm&lsaquo&lsquo&lt&macr&mdash&micro&middot&minus&mu&Mu&nabla&nbsp&ndash&ne&ni&not&notin&nsub&ntilde&Ntilde&nu&Nu&oacute&Oacute&ocirc&Ocirc&oelig&OElig&ograve&Ograve&oline&omega&Omega&omicron&Omicron&oplus&or&ordf&ordm&oslash&Oslash&otilde&Otilde&otimes&ouml&Ouml&para&part&permil&perp&phi&Phi&pi&Pi&piv&plusmn&pound&prime&Prime&prod&prop&psi&Psi&quot&radic&rang&raquo&rarr&rArr&rceil&rdquo&real&reg&rfloor&rho&Rho&rlm&rsaquo&rsquo&sbquo&scaron&Scaron&sdot&sect&shy&sigma&Sigma&sigmaf&sim&spades&sub&sube&sum&sup&sup1&sup2&sup3&supe&szlig&tau&Tau&there4&theta&Theta&thetasym&thinsp&thorn&THORN&tilde&times&trade&uacute&Uacute&uarr&uArr&ucirc&Ucirc&ugrave&Ugrave&uml&upsih&upsilon&Upsilon&uuml&Uuml&weierp&xi&Xi&yacute&Yacute&yen&yuml&Yuml&zeta&Zeta&zwj&zwnj",
403 @" ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ",
404 @" ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ",
405 "�\x1\x2\x3\x4\x5\x6\x7\x8\x9\xa\xb\xc\xd\xe\xf\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f ",
406 "&#000;\x1\x2\x3\x4\x5\x6\x7\x8\x9\xa\xb\xc\xd\xe\xf\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f ",
407 "�\x1\x2\x3\x4\x5\x6\x7\x8\x9\xa\xb\xc\xd\xe\xf\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f ",
408 "&#x00;\x1\x2\x3\x4\x5\x6\x7\x8\x9\xa\xb\xc\xd\xe\xf\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f ",
409 @" ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ",
410 @" ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ",