[Cleanup] Removed TARGET_JVM
[mono.git] / mcs / class / System.Web / Test / System.Web / HttpUtilityTest.cs
1 //
2 // System.Web.HttpUtilityTest.cs - Unit tests for System.Web.HttpUtility
3 //
4 // Author:
5 //      Sebastien Pouliot  <sebastien@ximian.com>
6 //
7 // Copyright (C) 2005 Novell, Inc (http://www.novell.com)
8 //
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
16 // 
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
19 // 
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 //
28
29 using System;
30 using System.Text;
31 using System.Web;
32 using System.IO;
33 using System.Collections.Specialized;
34
35 using NUnit.Framework;
36 using MonoTests.Common;
37
38 namespace MonoTests.System.Web {
39
40         [TestFixture]
41         public class HttpUtilityTest
42         {
43
44                 [Test]
45                 public void HtmlAttributeEncode ()
46                 {
47                         Assert.AreEqual (null, HttpUtility.HtmlAttributeEncode (null), "#A1");
48                         Assert.AreEqual (String.Empty, HttpUtility.HtmlAttributeEncode (String.Empty), "#A2");
49                         Assert.AreEqual ("&lt;script>", HttpUtility.HtmlAttributeEncode ("<script>"), "#A3");
50                         Assert.AreEqual ("&quot;a&amp;b&quot;", HttpUtility.HtmlAttributeEncode ("\"a&b\""), "#A4");
51 #if NET_4_0
52                         Assert.AreEqual ("&#39;string&#39;", HttpUtility.HtmlAttributeEncode ("'string'"), "#A5");
53 #else
54                         Assert.AreEqual ("'string'", HttpUtility.HtmlAttributeEncode ("'string'"), "#A5");
55 #endif
56                 }
57
58                 [Test]
59                 public void HtmlAttributeEncode_String_TextWriter ()
60                 {
61                         var sw = new StringWriter ();
62 #if NET_4_0
63                         AssertExtensions.Throws<ArgumentNullException> (() => {
64                                 HttpUtility.HtmlAttributeEncode ("string", null);
65                         }, "#A1");
66 #else
67                         AssertExtensions.Throws<NullReferenceException> (() => {
68                                 HttpUtility.HtmlAttributeEncode ("string", null);
69                         }, "#A1");
70 #endif
71
72                         HttpUtility.HtmlAttributeEncode ("<script>", sw);
73                         Assert.AreEqual ("&lt;script>", sw.ToString (), "#A2");
74
75                         sw = new StringWriter ();
76                         HttpUtility.HtmlAttributeEncode ("\"a&b\"", sw);
77                         Assert.AreEqual ("&quot;a&amp;b&quot;", sw.ToString (), "#A3");
78
79                         sw = new StringWriter ();
80                         HttpUtility.HtmlAttributeEncode ("'string'", sw);
81 #if NET_4_0
82                         Assert.AreEqual ("&#39;string&#39;", sw.ToString (), "#A4");
83 #else
84                         Assert.AreEqual ("'string'", sw.ToString (), "#A4");
85 #endif
86                         sw = new StringWriter ();
87                         HttpUtility.HtmlAttributeEncode ("\\string\\", sw);
88                         Assert.AreEqual ("\\string\\", sw.ToString (), "#A5");
89
90                         sw = new StringWriter ();
91                         HttpUtility.HtmlAttributeEncode (String.Empty, sw);
92                         Assert.AreEqual (String.Empty, sw.ToString (), "#A6");
93
94                         sw = new StringWriter ();
95                         HttpUtility.HtmlAttributeEncode (null, sw);
96                         Assert.AreEqual (String.Empty, sw.ToString (), "#A7");
97                 }
98
99                 [Test]
100                 public void HtmlDecode ()
101                 {
102                         Assert.AreEqual (null, HttpUtility.HtmlDecode (null), "#A1");
103                         Assert.AreEqual (String.Empty, HttpUtility.HtmlDecode (String.Empty), "#A2");
104
105                         for (int i = 0; i < decoding_pairs.Length; i += 2)
106                                 Assert.AreEqual (decoding_pairs [i + 1], HttpUtility.HtmlDecode (decoding_pairs [i]), "#B" + (i / 2).ToString ());
107                 }
108
109                 [Test]
110                 public void HtmlDecode_String_TextWriter ()
111                 {
112                         StringWriter sw;
113 #if NET_4_0
114                         AssertExtensions.Throws<ArgumentNullException> (() => {
115                                 HttpUtility.HtmlDecode ("string", null);
116                         }, "#A1");
117 #else
118                         AssertExtensions.Throws<NullReferenceException> (() => {
119                                 HttpUtility.HtmlDecode ("string", null);
120                         }, "#A1");
121 #endif
122
123                         sw = new StringWriter ();
124                         HttpUtility.HtmlDecode (null, sw);
125                         Assert.AreEqual (String.Empty, sw.ToString (), "#A2");
126
127                         sw = new StringWriter ();
128                         HttpUtility.HtmlDecode (String.Empty, sw);
129                         Assert.AreEqual (String.Empty, sw.ToString (), "#A3");
130
131                         for (int i = 0; i < decoding_pairs.Length; i += 2) {
132                                 sw = new StringWriter ();
133                                 HttpUtility.HtmlDecode (decoding_pairs [i], sw);
134                                 Assert.AreEqual (decoding_pairs [i + 1], sw.ToString (), "#B" + (i / 2).ToString ());
135                         }
136                 }
137
138                 [Test]
139                 public void HtmlEncode_LtGt ()
140                 {
141                         Assert.AreEqual ("&lt;script&gt;", HttpUtility.HtmlEncode ("<script>"));
142                 }
143
144                 // Notes:
145                 // * this is to avoid a regression that would cause Mono to 
146                 //   fail item #3 of the XSS vulnerabilities listed at:
147                 //   http://it-project.ru/andir/docs/aspxvuln/aspxvuln.en.xml
148                 //   we didn't fall the first time so let's ensure we never will
149                 // * The author notes that Microsoft has decided not to fix 
150                 //   this issue (hence the NotDotNet category).
151
152                 [Test]
153                 [Category ("NotDotNet")]
154                 public void HtmlEncode_XSS ()
155                 {
156                         string problem = "\xff1cscript\xff1e";  // unicode looks alike <script>
157                         byte [] utf8data = Encoding.UTF8.GetBytes (problem);
158                         Encoding win1251 = Encoding.GetEncoding ("windows-1251");
159                         byte [] windata = Encoding.Convert (Encoding.UTF8, win1251, utf8data);
160                         // now it's a real problem
161                         Assert.AreEqual ("<script>", Encoding.ASCII.GetString (windata), "<script>");
162
163                         string encoded = HttpUtility.HtmlEncode (problem);
164                         Assert.AreEqual ("&#65308;script&#65310;", encoded, "&#65308;script&#65310;");
165
166                         utf8data = Encoding.UTF8.GetBytes (encoded);
167                         windata = Encoding.Convert (Encoding.UTF8, win1251, utf8data);
168                         Assert.AreEqual ("&#65308;script&#65310;", Encoding.ASCII.GetString (windata), "ok");
169                 }
170 #if NET_4_0
171                 [Test]
172                 public void JavaScriptStringEncode ()
173                 {
174                         Assert.AreEqual (String.Empty, HttpUtility.JavaScriptStringEncode (null), "#A1");
175                         Assert.AreEqual ("\"\"", HttpUtility.JavaScriptStringEncode (null, true), "#A2");
176                         Assert.AreEqual (String.Empty, HttpUtility.JavaScriptStringEncode (String.Empty), "#A3");
177                         Assert.AreEqual ("\"\"", HttpUtility.JavaScriptStringEncode (String.Empty, true), "#A4");
178
179                         for (char c = char.MinValue; c < char.MaxValue; c++) {
180                                 string exp = JavaScriptStringEncode (c.ToString (), false);
181                                 string expQuoted = JavaScriptStringEncode (c.ToString (), true);
182                                 string act = HttpUtility.JavaScriptStringEncode (c.ToString ());
183                                 string actQuoted = HttpUtility.JavaScriptStringEncode (c.ToString (), true);
184                                 Assert.AreEqual (exp, act, "JavaScriptStringEncode " + c.ToString () + " [" + (int) c + "]");
185                                 Assert.AreEqual (expQuoted, actQuoted, "JavaScriptStringEncode (quoted) " + c.ToString () + " [" + (int) c + "]");
186                         }
187                 }
188
189                 string JavaScriptStringEncode (string s, bool addDoubleQuotes)
190                 {
191                         if (String.IsNullOrEmpty (s))
192                                 return addDoubleQuotes ? "\"\"" : String.Empty;
193
194                         int len = s.Length;
195                         bool needEncode = false;
196                         char c;
197                         for (int i = 0; i < len; i++) {
198                                 c = s [i];
199
200                                 if (c >= 0 && c <= 31 || c == 34 || c == 39 || c == 60 || c == 62 || c == 92) {
201                                         needEncode = true;
202                                         break;
203                                 }
204                         }
205
206                         if (!needEncode)
207                                 return addDoubleQuotes ? "\"" + s + "\"" : s;
208
209                         var sb = new StringBuilder ();
210                         if (addDoubleQuotes)
211                                 sb.Append ('"');
212
213                         for (int i = 0; i < len; i++) {
214                                 c = s [i];
215                                 if (c >= 0 && c <= 7 || c == 11 || c >= 14 && c <= 31 || c == 39 || c == 60 || c == 62)
216                                         sb.AppendFormat ("\\u{0:x4}", (int) c);
217                                 else switch ((int) c) {
218                                                 case 8:
219                                                         sb.Append ("\\b");
220                                                         break;
221
222                                                 case 9:
223                                                         sb.Append ("\\t");
224                                                         break;
225
226                                                 case 10:
227                                                         sb.Append ("\\n");
228                                                         break;
229
230                                                 case 12:
231                                                         sb.Append ("\\f");
232                                                         break;
233
234                                                 case 13:
235                                                         sb.Append ("\\r");
236                                                         break;
237
238                                                 case 34:
239                                                         sb.Append ("\\\"");
240                                                         break;
241
242                                                 case 92:
243                                                         sb.Append ("\\\\");
244                                                         break;
245
246                                                 default:
247                                                         sb.Append (c);
248                                                         break;
249                                         }
250                         }
251
252                         if (addDoubleQuotes)
253                                 sb.Append ('"');
254
255                         return sb.ToString ();
256                 }
257 #endif
258                 [Test]
259                 public void HtmlEncode_2 ()
260                 {
261                         StringWriter sw;
262 #if NET_4_0
263                         AssertExtensions.Throws<ArgumentNullException> (() => {
264                                 HttpUtility.HtmlEncode ("string", null);
265                         }, "#A1");
266 #else
267                         AssertExtensions.Throws<NullReferenceException> (() => {
268                                 HttpUtility.HtmlEncode ("string", null);
269                         }, "#A1");
270 #endif
271
272                         sw = new StringWriter ();
273                         HttpUtility.HtmlEncode (null, sw);
274                         Assert.AreEqual (String.Empty, sw.ToString (), "#A2");
275
276                         sw = new StringWriter ();
277                         HttpUtility.HtmlEncode (String.Empty, sw);
278                         Assert.AreEqual (String.Empty, sw.ToString (), "#A3");
279
280                         for (int i = 0; i < encoding_pairs.Length; i += 2) {
281                                 sw = new StringWriter ();
282                                 HttpUtility.HtmlEncode (encoding_pairs [i], sw);
283                                 Assert.AreEqual (encoding_pairs [i + 1], sw.ToString (), "#B" + (i / 2).ToString ());
284                         }
285                 }
286
287                 [Test]
288                 public void HtmlEncode_3 ()
289                 {
290                         Assert.AreEqual (null, HttpUtility.HtmlEncode (null), "#A1");
291                         Assert.AreEqual (String.Empty, HttpUtility.HtmlEncode (String.Empty), "#A2");
292
293                         for (int i = 0; i < encoding_pairs.Length; i += 2)
294                                 Assert.AreEqual (encoding_pairs [i + 1], HttpUtility.HtmlEncode (encoding_pairs [i]), "#B" + (i / 2).ToString ());
295                 }
296 #if NET_4_0
297                 [Test]
298                 public void HtmlEncode_IHtmlString ()
299                 {
300                         string origString = "<script>alert ('Hola');</script>";
301                         var hs = new HtmlString (origString);
302                         Assert.AreEqual (origString, HttpUtility.HtmlEncode (hs), "#A1");
303                 }
304 #endif
305                 [Test]
306                 [Category ("NotWorking")]
307                 public void HtmlEncode ()
308                 {
309                         for (char c = char.MinValue; c < char.MaxValue; c++) {
310                                 String exp = HtmlEncode (c.ToString ());
311                                 String act = HttpUtility.HtmlEncode (c.ToString ());
312                                 Assert.AreEqual (exp, act, "HtmlEncode " + c.ToString () + " [" + (int) c + "]");
313                         }
314                 }
315
316                 string HtmlEncode (string s)
317                 {
318                         if (s == null)
319                                 return null;
320
321                         bool needEncode = false;
322                         for (int i = 0; i < s.Length; i++) {
323                                 char c = s [i];
324                                 if (c == '&' || c == '"' || c == '<' || c == '>' || c > 159
325 #if NET_4_0
326  || c == '\''
327 #endif
328 ) {
329                                         needEncode = true;
330                                         break;
331                                 }
332                         }
333
334                         if (!needEncode)
335                                 return s;
336
337                         StringBuilder output = new StringBuilder ();
338
339                         int len = s.Length;
340                         for (int i = 0; i < len; i++)
341                                 switch (s [i]) {
342                                         case '&':
343                                                 output.Append ("&amp;");
344                                                 break;
345                                         case '>':
346                                                 output.Append ("&gt;");
347                                                 break;
348                                         case '<':
349                                                 output.Append ("&lt;");
350                                                 break;
351                                         case '"':
352                                                 output.Append ("&quot;");
353                                                 break;
354 #if NET_4_0
355                                         case '\'':
356                                                 output.Append ("&#39;");
357                                                 break;
358 #endif
359                                         default:
360                                                 // MS starts encoding with &# from 160 and stops at 255.
361                                                 // We don't do that. One reason is the 65308/65310 unicode
362                                                 // characters that look like '<' and '>'.
363                                                 if (s [i] > 159 && s [i] < 256) {
364                                                         output.Append ("&#");
365                                                         output.Append (((int) s [i]).ToString ());
366                                                         output.Append (";");
367                                                 } else {
368                                                         output.Append (s [i]);
369                                                 }
370                                                 break;
371                                 }
372                         return output.ToString ();
373                 }
374
375                 [Test]
376                 public void UrlDecodeToBytes ()
377                 {
378                         byte [] bytes = HttpUtility.UrlDecodeToBytes ("%5c");
379                         Assert.AreEqual (1, bytes.Length, "#1");
380                         Assert.AreEqual (0x5c, bytes [0], "#2");
381                         bytes = HttpUtility.UrlDecodeToBytes ("%5");
382                         Assert.AreEqual (2, bytes.Length, "#3");
383                         Assert.AreEqual (0x25, bytes [0], "#4");
384                         Assert.AreEqual (0x25, bytes [0], "#5");
385                 }
386
387                 [Test]
388                 public void UrlDecode1 ()
389                 {
390                         Assert.AreEqual ("http://127.0.0.1:8080/appDir/page.aspx?foo=bar",
391                                 HttpUtility.UrlDecode ("http://127.0.0.1:8080/appDir/page.aspx?foo=b%61r"),
392                                 "UrlDecode1 #1");
393
394                         Assert.AreEqual ("http://127.0.0.1:8080/appDir/page.aspx?foo=b%ar",
395                                 HttpUtility.UrlDecode ("http://127.0.0.1:8080/appDir/page.aspx?foo=b%%61r"),
396                                 "UrlDecode1 #2");
397
398                         Assert.AreEqual ("http://127.0.0.1:8080/app%Dir/page.aspx?foo=b%ar",
399                                 HttpUtility.UrlDecode ("http://127.0.0.1:8080/app%Dir/page.aspx?foo=b%%61r"),
400                                 "UrlDecode1 #3");
401
402                         Assert.AreEqual ("http://127.0.0.1:8080/app%%Dir/page.aspx?foo=b%%r",
403                                 HttpUtility.UrlDecode ("http://127.0.0.1:8080/app%%Dir/page.aspx?foo=b%%r"),
404                                 "UrlDecode1 #4");
405
406                         Assert.AreEqual ("http://127.0.0.1:8080/appDir/page.aspx?foo=ba%r",
407                                 HttpUtility.UrlDecode ("http://127.0.0.1:8080/appDir/page.aspx?foo=b%61%r"),
408                                 "UrlDecode1 #5");
409
410                         Assert.AreEqual ("http://127.0.0.1:8080/appDir/page.aspx?foo=bar",
411                                 HttpUtility.UrlDecode ("http://127.0.0.1:8080/appDir/page.aspx?foo=b%u0061r"),
412                                 "UrlDecode1 #6");
413
414                         Assert.AreEqual ("http://127.0.0.1:8080/appDir/page.aspx?foo=b%ar",
415                                 HttpUtility.UrlDecode ("http://127.0.0.1:8080/appDir/page.aspx?foo=b%%u0061r"),
416                                 "UrlDecode1 #7");
417
418                         Assert.AreEqual ("http://127.0.0.1:8080/appDir/page.aspx?foo=b%uu0061r",
419                                 HttpUtility.UrlDecode ("http://127.0.0.1:8080/appDir/page.aspx?foo=b%uu0061r"),
420                                 "UrlDecode1 #8");
421                 }
422
423                 [Test]
424                 public void UrlDecode2 ()
425                 {
426                         Assert.AreEqual (
427                                 "http://127.0.0.1:8080/appDir/page.aspx?foo=bar",
428                                 HttpUtility.UrlDecode (
429                                 Encoding.UTF8.GetBytes ("http://127.0.0.1:8080/appDir/page.aspx?foo=b%61r"),
430                                 Encoding.UTF8),
431                                 "UrlDecode2 #1");
432
433                         Assert.AreEqual (
434                                 "http://127.0.0.1:8080/appDir/page.aspx?foo=b%ar",
435                                 HttpUtility.UrlDecode (
436                                 Encoding.UTF8.GetBytes ("http://127.0.0.1:8080/appDir/page.aspx?foo=b%%61r"),
437                                 Encoding.UTF8),
438                                 "UrlDecode2 #2");
439
440                         Assert.AreEqual (
441                                 "http://127.0.0.1:8080/app%Dir/page.aspx?foo=b%ar",
442                                 HttpUtility.UrlDecode (
443                                 Encoding.UTF8.GetBytes ("http://127.0.0.1:8080/app%Dir/page.aspx?foo=b%%61r"),
444                                 Encoding.UTF8),
445                                 "UrlDecode2 #3");
446
447                         Assert.AreEqual (
448                                 "http://127.0.0.1:8080/app%%Dir/page.aspx?foo=b%%r",
449                                 HttpUtility.UrlDecode (
450                                 Encoding.UTF8.GetBytes ("http://127.0.0.1:8080/app%%Dir/page.aspx?foo=b%%r"),
451                                 Encoding.UTF8),
452                                 "UrlDecode2 #4");
453
454                         Assert.AreEqual (
455                                 "http://127.0.0.1:8080/appDir/page.aspx?foo=ba%r",
456                                 HttpUtility.UrlDecode (
457                                 Encoding.UTF8.GetBytes ("http://127.0.0.1:8080/appDir/page.aspx?foo=b%61%r"),
458                                 Encoding.UTF8),
459                                 "UrlDecode2 #5");
460
461                         Assert.AreEqual (
462                                 "http://127.0.0.1:8080/appDir/page.aspx?foo=bar",
463                                 HttpUtility.UrlDecode (
464                                 Encoding.UTF8.GetBytes ("http://127.0.0.1:8080/appDir/page.aspx?foo=b%u0061r"),
465                                 Encoding.UTF8),
466                                 "UrlDecode2 #6");
467
468                         Assert.AreEqual (
469                                 "http://127.0.0.1:8080/appDir/page.aspx?foo=b%ar",
470                                 HttpUtility.UrlDecode (
471                                 Encoding.UTF8.GetBytes ("http://127.0.0.1:8080/appDir/page.aspx?foo=b%%u0061r"),
472                                 Encoding.UTF8),
473                                 "UrlDecode2 #7");
474
475                         Assert.AreEqual (
476                                 "http://127.0.0.1:8080/appDir/page.aspx?foo=b%uu0061r",
477                                 HttpUtility.UrlDecode (
478                                 Encoding.UTF8.GetBytes ("http://127.0.0.1:8080/appDir/page.aspx?foo=b%uu0061r"),
479                                 Encoding.UTF8),
480                                 "UrlDecode2 #8");
481                 }
482
483                 [Test]
484                 public void UrlDecodeToBytes2 ()
485                 {
486                         Assert.AreEqual (
487                                 "http://127.0.0.1:8080/appDir/page.aspx?foo=bar",
488                                 Encoding.UTF8.GetString (
489                                 HttpUtility.UrlDecodeToBytes ("http://127.0.0.1:8080/appDir/page.aspx?foo=b%61r")),
490                                 "UrlDecodeToBytes2 #1");
491
492                         Assert.AreEqual (
493                                 "http://127.0.0.1:8080/appDir/page.aspx?foo=b%ar",
494                                 Encoding.UTF8.GetString (
495                                 HttpUtility.UrlDecodeToBytes ("http://127.0.0.1:8080/appDir/page.aspx?foo=b%%61r")),
496                                 "UrlDecodeToBytes2 #2");
497
498                         Assert.AreEqual (
499                                 "http://127.0.0.1:8080/app%Dir/page.aspx?foo=b%ar",
500                                 Encoding.UTF8.GetString (
501                                 HttpUtility.UrlDecodeToBytes ("http://127.0.0.1:8080/app%Dir/page.aspx?foo=b%%61r")),
502                                 "UrlDecodeToBytes2 #3");
503
504                         Assert.AreEqual (
505                                 "http://127.0.0.1:8080/app%%Dir/page.aspx?foo=b%%r",
506                                 Encoding.UTF8.GetString (
507                                 HttpUtility.UrlDecodeToBytes ("http://127.0.0.1:8080/app%%Dir/page.aspx?foo=b%%r")),
508                                 "UrlDecodeToBytes2 #4");
509
510                         Assert.AreEqual (
511                                 "http://127.0.0.1:8080/appDir/page.aspx?foo=ba%r",
512                                 Encoding.UTF8.GetString (
513                                 HttpUtility.UrlDecodeToBytes ("http://127.0.0.1:8080/appDir/page.aspx?foo=b%61%r")),
514                                 "UrlDecodeToBytes2 #5");
515
516                         Assert.AreEqual (
517                                 "http://127.0.0.1:8080/appDir/page.aspx?foo=b%u0061r",
518                                 Encoding.UTF8.GetString (
519                                 HttpUtility.UrlDecodeToBytes ("http://127.0.0.1:8080/appDir/page.aspx?foo=b%u0061r")),
520                                 "UrlDecodeToBytes2 #6");
521
522                         Assert.AreEqual (
523                                 "http://127.0.0.1:8080/appDir/page.aspx?foo=b%%u0061r",
524                                 Encoding.UTF8.GetString (
525                                 HttpUtility.UrlDecodeToBytes ("http://127.0.0.1:8080/appDir/page.aspx?foo=b%%u0061r")),
526                                 "UrlDecodeToBytes2 #7");
527
528                         Assert.AreEqual (
529                                 "http://127.0.0.1:8080/appDir/page.aspx?foo=b%uu0061r",
530                                 Encoding.UTF8.GetString (
531                                 HttpUtility.UrlDecodeToBytes ("http://127.0.0.1:8080/appDir/page.aspx?foo=b%uu0061r")),
532                                 "UrlDecodeToBytes2 #8");
533                 }
534
535                 [Test]
536                 public void EscapedCharacters ()
537                 {
538                         for (int i = 0; i < 256; i++) {
539                                 string str = new string ((char) i, 1);
540                                 string encoded = HttpUtility.HtmlEncode (str);
541                                 if ((i > 159 && i < 256) || i == '&' || i == '<' || i == '>' || i == '"'
542 #if NET_4_0
543  || i == '\''
544 #endif
545 ) {
546                                         if (encoded [0] != '&' || encoded [encoded.Length - 1] != ';')
547                                                 Assert.Fail ("Failed for i = " + i);
548                                 } else if (encoded.Length != 1) {
549                                         Assert.Fail ("Wrong length for i = " + i);
550                                 }
551                         }
552                 }
553
554                 [Test (Description = "Bug #507666")]
555                 public void UrlDecode_Bug507666 ()
556                 {
557                         // Get Encoding object.
558                         var enc_utf8 = Encoding.UTF8;
559                         var enc_sjis = Encoding.GetEncoding (932);
560
561                         // Generate equiv. client request query string with url-encoded shift_jis string.
562                         var utf8_string = "紅茶"; // it's UTF-8 string
563                         var utf8_bin = enc_utf8.GetBytes (utf8_string); // convert to UTF-8 byte[]
564                         var sjis_bin = Encoding.Convert (enc_utf8, enc_sjis, utf8_bin); // convert to Shift_jis byte[]
565                         var urlenc_string = HttpUtility.UrlEncode (sjis_bin); // equiv. client request query string.
566
567                         // Test using UrlDecode only.
568                         var decoded_by_web = HttpUtility.UrlDecode (urlenc_string, enc_sjis);
569
570                         Assert.AreEqual (utf8_string, decoded_by_web, "#A1");
571                 }
572
573                 [Test]
574                 public void Decode1 ()
575                 {
576                         Assert.AreEqual ("\xE9", HttpUtility.HtmlDecode ("&#233;"));
577                 }
578
579                 [Test (Description = "Bug #585992")]
580                 public void Decode2 ()
581                 {
582                         string encodedSource = "&#169; == &#xA9; == &#XA9; and &#915; == &#x393; == &#X393;";
583                         string utf8Result = "© == © == © and Γ == Γ == Γ";
584
585                         Assert.AreEqual (utf8Result, HttpUtility.HtmlDecode (encodedSource), "#A1");
586                 }
587
588                 [Test]
589                 public void RoundTrip ()
590                 {
591                         string x = "<html>& hello+= world!";
592                         string y = HttpUtility.HtmlEncode (x);
593                         string z = HttpUtility.HtmlDecode (y);
594                         Assert.AreEqual (x, z);
595                 }
596
597                 [Test]
598                 public void LooksLikeEntity ()
599                 {
600                         string str = "<%# \"hola\" + \"/somepage.aspx?ItemID=\" + DataBinder.Eval(Container.DataItem,\"Country\")" +
601                                         " + \"&mid=\" + ModuleID + \"&pageindex=\" + Request.Params.Get(\"pageindex\") %>";
602                         Assert.AreEqual (str, HttpUtility.HtmlDecode (str));
603                 }
604
605                 [Test]
606                 public void UrlEncodeUnicodeTest ()
607                 {
608                         string str = "sch" + (char) 0xf6 + "n";
609
610                         Assert.AreEqual ("sch%u00f6n", HttpUtility.UrlEncodeUnicode (str), "#1");
611                         Assert.AreEqual ("abc", "abc", "#2");
612                         Assert.AreEqual ("%26", HttpUtility.UrlEncodeUnicode ("&"), "#3");
613                         Assert.AreEqual ("%7f", HttpUtility.UrlEncodeUnicode ("" + (char) 127), "#4");
614                         Assert.AreEqual ("%u0080", HttpUtility.UrlEncodeUnicode ("" + (char) 128), "#5");
615                 }
616
617                 [Test]
618                 public void UrlDecodeNoThrow ()
619                 {
620                         string str = "../../&amp;param2=%CURRREV%";
621                         Assert.AreEqual (str, HttpUtility.UrlDecode (str), "#1");
622                 }
623
624                 static char [] hexChars = "0123456789abcdef".ToCharArray ();
625
626 #if NET_4_0
627                 const string notEncoded = "!()*-._";
628 #else
629                 const string notEncoded = "!'()*-._";
630 #endif
631
632                 static void UrlPathEncodeChar (char c, Stream result)
633                 {
634 #if NET_2_0
635                         if (c < 33 || c > 126) {
636 #else
637                         if (c > 127) {
638 #endif
639                                 byte [] bIn = Encoding.UTF8.GetBytes (c.ToString ());
640                                 for (int i = 0; i < bIn.Length; i++) {
641                                         result.WriteByte ((byte) '%');
642                                         int idx = ((int) bIn [i]) >> 4;
643                                         result.WriteByte ((byte) hexChars [idx]);
644                                         idx = ((int) bIn [i]) & 0x0F;
645                                         result.WriteByte ((byte) hexChars [idx]);
646                                 }
647                         } else if (c == ' ') {
648                                 result.WriteByte ((byte) '%');
649                                 result.WriteByte ((byte) '2');
650                                 result.WriteByte ((byte) '0');
651                         } else
652                                 result.WriteByte ((byte) c);
653                 }
654
655                 static void UrlEncodeChar (char c, Stream result, bool isUnicode)
656                 {
657                         if (c > 255) {
658                                 //FIXME: what happens when there is an internal error?
659                                 //if (!isUnicode)
660                                 //      throw new ArgumentOutOfRangeException ("c", c, "c must be less than 256");
661                                 int idx;
662                                 int i = (int) c;
663
664                                 result.WriteByte ((byte) '%');
665                                 result.WriteByte ((byte) 'u');
666                                 idx = i >> 12;
667                                 result.WriteByte ((byte) hexChars [idx]);
668                                 idx = (i >> 8) & 0x0F;
669                                 result.WriteByte ((byte) hexChars [idx]);
670                                 idx = (i >> 4) & 0x0F;
671                                 result.WriteByte ((byte) hexChars [idx]);
672                                 idx = i & 0x0F;
673                                 result.WriteByte ((byte) hexChars [idx]);
674                                 return;
675                         }
676
677                         if (c > ' ' && notEncoded.IndexOf (c) != -1) {
678                                 result.WriteByte ((byte) c);
679                                 return;
680                         }
681                         if (c == ' ') {
682                                 result.WriteByte ((byte) '+');
683                                 return;
684                         }
685                         if ((c < '0') ||
686                                 (c < 'A' && c > '9') ||
687                                 (c > 'Z' && c < 'a') ||
688                                 (c > 'z')) {
689                                 if (isUnicode && c > 127) {
690                                         result.WriteByte ((byte) '%');
691                                         result.WriteByte ((byte) 'u');
692                                         result.WriteByte ((byte) '0');
693                                         result.WriteByte ((byte) '0');
694                                 } else
695                                         result.WriteByte ((byte) '%');
696
697                                 int idx = ((int) c) >> 4;
698                                 result.WriteByte ((byte) hexChars [idx]);
699                                 idx = ((int) c) & 0x0F;
700                                 result.WriteByte ((byte) hexChars [idx]);
701                         } else
702                                 result.WriteByte ((byte) c);
703                 }
704
705                 [Test]
706                 public void UrlEncode ()
707                 {
708                         for (char c = char.MinValue; c < char.MaxValue; c++) {
709                                 byte [] bIn;
710                                 bIn = Encoding.UTF8.GetBytes (c.ToString ());
711                                 MemoryStream expected = new MemoryStream ();
712                                 MemoryStream expUnicode = new MemoryStream ();
713
714                                 //build expected result for UrlEncode
715                                 for (int i = 0; i < bIn.Length; i++)
716                                         UrlEncodeChar ((char) bIn [i], expected, false);
717                                 //build expected result for UrlEncodeUnicode
718                                 UrlEncodeChar (c, expUnicode, true);
719
720                                 Assert.AreEqual (Encoding.ASCII.GetString (expected.ToArray ()), HttpUtility.UrlEncode (c.ToString ()),
721                                         "UrlEncode " + c.ToString ());
722                                 Assert.AreEqual (Encoding.ASCII.GetString (expUnicode.ToArray ()), HttpUtility.UrlEncodeUnicode (c.ToString ()),
723                                         "UrlEncodeUnicode " + c.ToString ());
724                         }
725                 }
726
727                 [Test]
728                 public void UrlPathEncode ()
729                 {
730                         Assert.AreEqual (null, HttpUtility.UrlPathEncode (null), "#A1-1");
731                         Assert.AreEqual (String.Empty, HttpUtility.UrlPathEncode (String.Empty), "#A1-2");
732
733                         for (char c = char.MinValue; c < char.MaxValue; c++) {
734                                 MemoryStream expected = new MemoryStream ();
735                                 UrlPathEncodeChar (c, expected);
736
737                                 String exp = Encoding.ASCII.GetString (expected.ToArray ());
738                                 String act = HttpUtility.UrlPathEncode (c.ToString ());
739                                 Assert.AreEqual (exp, act, "UrlPathEncode " + c.ToString ());
740                         }
741                 }
742                 [Test]
743                 public void UrlPathEncode2 ()
744                 {
745                         string s = "default.xxx?sdsd=sds";
746                         string s2 = HttpUtility.UrlPathEncode (s);
747                         Assert.AreEqual (s, s2, "UrlPathEncode " + s);
748                 }
749
750
751                 [Test]
752                 public void ParseQueryString ()
753                 {
754                         ParseQueryString_Helper (HttpUtility.ParseQueryString ("name=value"), "#1",
755                                 new string [] { "name" }, new string [] [] { new string [] { "value" } });
756
757                         ParseQueryString_Helper (HttpUtility.ParseQueryString ("name=value&foo=bar"), "#2",
758                                 new string [] { "name", "foo" }, new string [] [] { new string [] { "value" }, new string [] { "bar" } });
759
760                         ParseQueryString_Helper (HttpUtility.ParseQueryString ("name=value&name=bar"), "#3",
761                                 new string [] { "name" }, new string [] [] { new string [] { "value", "bar" } });
762
763                         ParseQueryString_Helper (HttpUtility.ParseQueryString ("value"), "#4",
764                                 new string [] { null }, new string [] [] { new string [] { "value" } });
765
766                         ParseQueryString_Helper (HttpUtility.ParseQueryString ("name=value&bar"), "#5",
767                                 new string [] { "name", null }, new string [] [] { new string [] { "value" }, new string [] { "bar" } });
768
769                         ParseQueryString_Helper (HttpUtility.ParseQueryString ("bar&name=value"), "#6",
770                                 new string [] { null, "name" }, new string [] [] { new string [] { "bar" }, new string [] { "value" } });
771
772                         ParseQueryString_Helper (HttpUtility.ParseQueryString ("value&bar"), "#7",
773                                 new string [] { null }, new string [] [] { new string [] { "value", "bar" } });
774
775                         ParseQueryString_Helper (HttpUtility.ParseQueryString (""), "#8",
776                                 new string [0], new string [0] []);
777
778                         ParseQueryString_Helper (HttpUtility.ParseQueryString ("="), "#9",
779                                 new string [] { "" }, new string [] [] { new string [] { "" } });
780
781                         ParseQueryString_Helper (HttpUtility.ParseQueryString ("&"), "#10",
782                                 new string [] { null }, new string [] [] { new string [] { "", "" } });
783
784                         ParseQueryString_Helper (HttpUtility.ParseQueryString ("?value"), "#11",
785                                 new string [] { null }, new string [] [] { new string [] { "value" } });
786
787                         try {
788                                 HttpUtility.ParseQueryString (null);
789                         } catch (Exception e) {
790                                 Assert.AreEqual (typeof (ArgumentNullException), e.GetType (), "#12");
791                         }
792
793                         try {
794                                 HttpUtility.ParseQueryString ("", null);
795                         } catch (Exception e) {
796                                 Assert.AreEqual (typeof (ArgumentNullException), e.GetType (), "#13");
797                         }
798
799                         string str = new string (new char [] { '\u304a', '\u75b2', '\u308c', '\u69d8', '\u3067', '\u3059' });
800                         string utf8url = HttpUtility.UrlEncode (str, Encoding.UTF8);
801                         ParseQueryString_Helper (HttpUtility.ParseQueryString (utf8url + "=" + utf8url), "#14",
802                                 new string [] { str }, new string [] [] { new string [] { str } });
803
804                         ParseQueryString_Helper (HttpUtility.ParseQueryString ("name=value=test"), "#15",
805                                 new string [] { "name" }, new string [] [] { new string [] { "value=test" } });
806                 }
807                 static void ParseQueryString_Helper (NameValueCollection nvc, string msg, string [] keys, string [] [] values)
808                 {
809                         Assert.AreEqual (keys.Length, nvc.Count, msg + "[Count]");
810                         for (int i = 0; i < keys.Length; i++) {
811                                 Assert.AreEqual (keys [i], nvc.GetKey (i), msg + "[Key]");
812                                 string [] tmp = nvc.GetValues (i);
813                                 Assert.AreEqual (values [i].Length, tmp.Length, msg + "[ValueCount]");
814                                 for (int q = 0; q < values [i].Length; q++)
815                                         Assert.AreEqual (values [i] [q], tmp [q], msg + "[Value]");
816                         }
817                 }
818
819                 string [] decoding_pairs = {
820         @"&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;",
821         @"áÁâ´æÆàÀℵαΑ&∧∠åÅ≈ãÃäÄ„βΒ¦•∩çǸ¢χΧˆ♣≅©↵∪¤†‡↓⇓°δΔ♦÷éÉêÊèÈ∅  εΕ≡ηΗðÐëË€∃ƒ∀½¼¾⁄γΓ≥>↔⇔♥…íÍîΡìÌℑ∞∫ιΙ¿∈ïÏκΚλΛ〈«←⇐⌈“≤⌊∗◊‎‹‘<¯—µ·−μΜ∇ –≠∋¬∉⊄ñÑνΝóÓôÔœŒòÒ‾ωΩοΟ⊕∨ªºøØõÕ⊗öÖ¶∂‰⊥φΦπΠϖ±£′″∏∝ψΨ""√〉»→⇒⌉”ℜ®⌋ρΡ‏›’‚šŠ⋅§­σΣς∼♠⊂⊆∑⊃¹²³⊇ßτΤ∴θΘϑ þޘיúÚ↑⇑ûÛùÙ¨ϒυΥüÜ℘ξΞýÝ¥ÿŸζΖ‍‌",
822         @"&aacute;?dCO+6Mk'2R&Aacute;T148quH^^=972 &acirc;#&Acirc;js""{1LZz)U&acute;u@Rv-05n L&aelig;3x}&AElig;!&agrave;,=*-J*&Agrave;=P|B&alefsym;Y<g?cg>jB)&alpha;&Alpha;9#4V`)|&J/n&amp;JVK56X\2q*F&and;Js&ang;6k6&aring;""&Aring;?rGt&asymp;\F <9IM{s-&atilde;(ShK&Atilde;w/[%,ksf93'k&auml;+b$@Q{5&Auml;Uo&bdquo;aN~'ycb>VKGcjo&beta;oR8""%B`L&Beta;I7g""k5]A>^B&brvbar;lllUPg5#b&bull;8Pw,bwSiY ""5]a&cap;_R@m&D+Lz""dKLT&ccedil;KH&I}6)_Q&Ccedil;mS%BZV/*Xo&cedil;s5[&cent;-$|)|L&5~&chi;Y/3cdUrn&Chi;8&circ;&)@KU@scEW2I&clubs;p2,US7f>&m!F&cong;Fr9A%,Ci'y[]F+&copy;PY&crarr;FeCrQI<:pPP~;>&cup;&curren;y J#R&%%i&dagger;Ow,&Dagger;T&darr;KpY`WSAo$i:r&dArr;']=&deg;k12&UI@_&delta;(9xD&Delta;dz&diams;RJdB""F^Y}g&divide;2kbZ2>@yBfu&eacute;9!9J(v&Eacute;\TwTS2X5i&ecirc;SLWaTMQE]e&&Ecirc;jW{\#JAh{Ua=&egrave;5&Egrave;6/GY&empty;U&emsp;n:&ensp;dcSf&epsilon;&Epsilon;1Yoi?X&equiv;.-s!n|i9U?3:6&eta;+|6&Eta;ha?>fm!v,&eth;c;Ky]88&ETH;4T@qO#.&euml;@Kl3%&Euml;X-VvUoE& &euro;o9T:r8\||^ha;&exist;1;/BMT*xJ(a>B&fnof;bH'-TH!6NrP&forall;n&frac12;5Fqvq_e9_""XJ&frac14;vmLXTtu:TVZ,&frac34;syl;qEe:b$5j&frasl;b Hg%T&gamma;[&Gamma;H&ge;&gt;{1wT&harr;o6i~jjKC02&hArr;Q4i6m(2tpl&hearts;&#6iQj!&hellip;4le""4} Lv5{Cs&iacute;D*u]j&Iacute;s}#br=&icirc;fh&Icirc;&iexcl;_B:|&igrave;k2U7lZ;_sI\c]&Igrave;s&image; T!5h"".um9ctz&infin; YDL&int;b(S^&iota;bCm&Iota;_L(\-F&iquest;m9g.h$^HSv&isin;cWH#>&iuml;m0&Iuml;KtgRE3c5@0&&kappa;T[2?\>T^H**&Kappa;=^6 [&lambda;um&Lambda;[3wQ5gT?H(Bo\/&lang;6car8P@AjF4e|b&laquo;397jxG:m&larr;U~?~""f&lArr;`O9iwJ#&lceil;L:q-* !V&ldquo;os)Wq6S{t&le;=80A&lfloor;#tS6&lowast;x`g6a>]U-b&loz;SHb/-]&lrm;m9dm""/d<;xR)4&lsaquo;jrb/,q&lsquo;RW}n2shoM11D|&lt;{}*]WPE#d#&macr;&mdash;yhT   k&micro;&middot;`f~o&minus;{Kmf&mu;d7fmt&Mu;PT@OOrzj&nabla;y ;M01XyI:&nbsp;+l<&ndash;x5|a>62y&ne;GNKJQjmj3&ni;Az&not;?V&notin;,<&nsub;R]Lc&ntilde;kV:&Ntilde;9LLf&Z%`d-H^L&nu;v_yXht&Nu;R1yuF!&oacute;j3]zOwQf_YtT9t&Oacute;}s]&1T&ocirc;&Ocirc;2lEN&oelig;:Rp^X+tPNL.&OElig;x0 ?c3ZP&ograve;3&Ograve;&oline;@nE&omega;uK-*HjL-h5z&Omega;~x&omicron;FNQ8D#{&Omicron;Yj|]'LX&oplus;ie-Y&or;&ordf;$*.c&ordm;VM7KQ.b]hmV &oslash;x{R>J-D_0v&Oslash;Hp&otilde;L'IG&Otilde;`&otimes;E &ouml;>KNCm&Ouml;O2dH_&jd^ >2&para;U%""_n&part;U>F&permil;?TSz0~~&perp;!p@G~bH^E&phi;dg)A&Phi; J<<j_,7Q)dEs,&pi;Z&Pi;_B<@%.&?70&piv;9Y^C|VRPrb4}&plusmn;Yn=9=SQ;`}(e%&pound;y;6|RN;|w&prime;AH=XXf&Prime;&prod;DGf6ol&prop;&psi;]UXZU\vzW4&Psi;e`NY[vrvs&quot;xay&radic;[@\scKIznodD<s&rang;PB C)<itm+&raquo;{t-L&rarr;s^^x<:&sh3&rArr;p^s6Y~3Csw=&rceil;_pKnhDNTmA*p&rdquo;]yG6;,ZuPx&real;xsd&reg;`hXlUn~(pK=N:^&rfloor;OS""P{%j-Wjbx.w&rho;ts^&Rho;r$h<:u^&rlm;Vj}\?7SIauBh&rsaquo;u[ !rto/[UHog&rsquo;xe6gY<24BY.&sbquo;`ZNR}&scaron;uY{Gg;F&Scaron;&sdot;az4TlWKYbJ.h&sect;c`9FrP&shy;5_)&sigma;wx.nP}z@&Sigma;NP9-$@j5&sigmaf;&sim;'ogIt:.@Gul&spades;""p\\rH[)&sub;Om/|3G+BQe&sube;5s!f/O9SA\RJkv&sum;GOFMAXu&sup;W&sup1;&sup2;L`r""}u/n&sup3;.ouLC&supe;(f&szlig;{&tau;B%e [&Tau;$DD>kIdV#X`?^\&there4;|S?W&theta;x)2P.![^5&Theta;zqF""pj&thetasym;#BE1u?&thinsp;GGG>(EQE&thorn;!""y1r/&THORN;m&@[\mw[kNR&tilde;|1G#i[(&times;X<UotTID uY&trade;sWW+TbxY&uacute;kQXr!H6&Uacute;~0TiH1POP&uarr;(CRZttz\EY<&uArr;&bN7ki|&ucirc;r,3j!e$kJE&Z$z&Ucirc;5{0[bvD""[<P)&ugrave;;1EeRSrz/gY/&Ugrave;/1 S`I*q8:Z-&uml;%N)W&upsih;O[2P9 ?&upsilon;O&Upsilon;t&uuml;&Uuml;VLq&weierp;2""(Z'~~""uiX&xi;NCq&Xi;9)S]^v 3&yacute;x""|2&$`G&Yacute;<&Nr&yen;[3NB5f&yuml; c""MzMw3(;""s&Yuml;&zeta;{!&Zeta;oevp1'j(E`vJ&zwj;Si&zwnj;gw>yc*U",
823         @"á?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♥&#6iQj!…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",
824         @"&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",
825         @"&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",
826         @"&#160;&#161;&#162;&#163;&#164;&#165;&#166;&#167;&#168;&#169;&#170;&#171;&#172;&#173;&#174;&#175;&#176;&#177;&#178;&#179;&#180;&#181;&#182;&#183;&#184;&#185;&#186;&#187;&#188;&#189;&#190;&#191;&#192;&#193;&#194;&#195;&#196;&#197;&#198;&#199;&#200;&#201;&#202;&#203;&#204;&#205;&#206;&#207;&#208;&#209;&#210;&#211;&#212;&#213;&#214;&#215;&#216;&#217;&#218;&#219;&#220;&#221;&#222;&#223;&#224;&#225;&#226;&#227;&#228;&#229;&#230;&#231;&#232;&#233;&#234;&#235;&#236;&#237;&#238;&#239;&#240;&#241;&#242;&#243;&#244;&#245;&#246;&#247;&#248;&#249;&#250;&#251;&#252;&#253;&#254;&#255;",
827         @" ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ",
828         @"&#000;&#001;&#002;&#003;&#004;&#005;&#006;&#007;&#008;&#009;&#010;&#011;&#012;&#013;&#014;&#015;&#016;&#017;&#018;&#019;&#020;&#021;&#022;&#023;&#024;&#025;&#026;&#027;&#028;&#029;&#030;&#031;&#032;",
829 #if NET_4_0
830         "&#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 ",
831 #else
832         "\x0\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 ",
833 #endif
834         @"&#x00;&#x01;&#x02;&#x03;&#x04;&#x05;&#x06;&#x07;&#x08;&#x09;&#x0A;&#x0B;&#x0C;&#x0D;&#x0E;&#x0F;&#x10;&#x11;&#x12;&#x13;&#x14;&#x15;&#x16;&#x17;&#x18;&#x19;&#x1A;&#x1B;&#x1C;&#x1D;&#x1E;&#x1F;&#x20;",
835 #if NET_4_0     
836         "&#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 ",
837 #else
838         "\x0\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 ",
839 #endif
840 @"&#xA0;&#xA1;&#xA2;&#xA3;&#xA4;&#xA5;&#xA6;&#xA7;&#xA8;&#xA9;&#xAA;&#xAB;&#xAC;&#xAD;&#xAE;&#xAF;&#xB0;&#xB1;&#xB2;&#xB3;&#xB4;&#xB5;&#xB6;&#xB7;&#xB8;&#xB9;&#xBA;&#xBB;&#xBC;&#xBD;&#xBE;&#xBF;&#xC0;&#xC1;&#xC2;&#xC3;&#xC4;&#xC5;&#xC6;&#xC7;&#xC8;&#xC9;&#xCA;&#xCB;&#xCC;&#xCD;&#xCE;&#xCF;&#xD0;&#xD1;&#xD2;&#xD3;&#xD4;&#xD5;&#xD6;&#xD7;&#xD8;&#xD9;&#xDA;&#xDB;&#xDC;&#xDD;&#xDE;&#xDF;&#xE0;&#xE1;&#xE2;&#xE3;&#xE4;&#xE5;&#xE6;&#xE7;&#xE8;&#xE9;&#xEA;&#xEB;&#xEC;&#xED;&#xEE;&#xEF;&#xF0;&#xF1;&#xF2;&#xF3;&#xF4;&#xF5;&#xF6;&#xF7;&#xF8;&#xF9;&#xFA;&#xFB;&#xFC;&#xFD;&#xFE;&#xFF;",
841         " ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ",
842 };
843                 string [] encoding_pairs = {
844         @"áÁâ´æÆàÀℵαΑ&∧∠åÅ≈ãÃäÄ„βΒ¦•∩çǸ¢χΧˆ♣≅©↵∪¤†‡↓⇓°δΔ♦÷éÉêÊèÈ∅  εΕ≡ηΗðÐëË€∃ƒ∀½¼¾⁄γΓ≥>↔⇔♥…íÍîΡìÌℑ∞∫ιΙ¿∈ïÏκΚλΛ〈«←⇐⌈“≤⌊∗◊‎‹‘<¯—µ·−μΜ∇ –≠∋¬∉⊄ñÑνΝóÓôÔœŒòÒ‾ωΩοΟ⊕∨ªºøØõÕ⊗öÖ¶∂‰⊥φΦπΠϖ±£′″∏∝ψΨ""√〉»→⇒⌉”ℜ®⌋ρΡ‏›’‚šŠ⋅§­σΣς∼♠⊂⊆∑⊃¹²³⊇ßτΤ∴θΘϑ þޘיúÚ↑⇑ûÛùÙ¨ϒυΥüÜ℘ξΞýÝ¥ÿŸζΖ‍‌",
845         @"&#225;&#193;&#226;&#194;&#180;&#230;&#198;&#224;&#192;ℵαΑ&amp;∧∠&#229;&#197;≈&#227;&#195;&#228;&#196;„βΒ&#166;•∩&#231;&#199;&#184;&#162;χΧˆ♣≅&#169;↵∪&#164;†‡↓⇓&#176;δΔ♦&#247;&#233;&#201;&#234;&#202;&#232;&#200;∅  εΕ≡ηΗ&#240;&#208;&#235;&#203;€∃ƒ∀&#189;&#188;&#190;⁄γΓ≥&gt;↔⇔♥…&#237;&#205;&#238;&#206;&#161;&#236;&#204;ℑ∞∫ιΙ&#191;∈&#239;&#207;κΚλΛ〈&#171;←⇐⌈“≤⌊∗◊‎‹‘&lt;&#175;—&#181;&#183;−μΜ∇&#160;–≠∋&#172;∉⊄&#241;&#209;νΝ&#243;&#211;&#244;&#212;œŒ&#242;&#210;‾ωΩοΟ⊕∨&#170;&#186;&#248;&#216;&#245;&#213;⊗&#246;&#214;&#182;∂‰⊥φΦπΠϖ&#177;&#163;′″∏∝ψΨ&quot;√〉&#187;→⇒⌉”ℜ&#174;⌋ρΡ‏›’‚šŠ⋅&#167;&#173;σΣς∼♠⊂⊆∑⊃&#185;&#178;&#179;⊇&#223;τΤ∴θΘϑ &#254;&#222;˜&#215;™&#250;&#218;↑⇑&#251;&#219;&#249;&#217;&#168;ϒυΥ&#252;&#220;℘ξΞ&#253;&#221;&#165;&#255;ŸζΖ‍‌",
846         @"á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:,0z6‏oTxP""""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+5‍9.W\v‌]GGtKvCC0`A",
847 #if NET_4_0     
848         @"&#225;9cP!qdO#hU@mg1&#193;K%0&lt;}*&#226;&#194;5[Y;lfMQ$4`&#180;uim7E`%_1zVDk&#230;[cM{&#198;t9y:E8Hb;;$;Y&#39;&#224;Ua6w&#192;&lt;$@W9$4NL*h#&#39;ℵk\zαG}{}hC-Α|=QhyLT%`&amp;wB!@#x51R 4C∧]Z3n∠y&gt;:{JZ&#39;v|c0;N&quot;&#229;zcWM&#39;z&quot;g&#197;o-JX!r.e≈Z+BT{wF8+&#227;Q 6P1o?x&quot;ef}vU&#195;+&lt;/Nt)TI]s&#228;0Eg_&#39;mn&amp;6WY[8&#196;ay+ u[3kqoZ„i6rβUX\:_y1A^x.p&gt;+Β`uf3/HI&#166;7bCRv%o$X3:•∩&#231;|(fgiA|MBLf=y@&#199;&#184;&#162;R,qDW;F9&lt;mχU]$)Q`w^KF^(hΧ?ukX+O!UOftˆZE♣@MLR(vcH]k8≅CU;r#(&#169;7DZ`1&gt;r~.↵4B&amp;R∪+x2T`q[M-lq&#39;&#164;~3rp%~-Gd†;35wU+II1tQJ‡`NGh[↓Lr&gt;74~yHB=&amp;EI⇓,u@Jx&#176;δcC`2,Δo2B]6PP8♦|{!wZa&amp;,*N&#39;$6&#247;-{nVSgO]%(I&#233;6&#201;&#234;osx-2xDI!&#202;_]7Ub%&#232;YG4`Gx{&#200;H&gt;vwMPJ∅ :Z-u#ph l,s*8(AεΕOnj|Gy|]iYLPR≡5Wi:(vZUUK.YlηDΗ6T&#240;T!Z:Nq_0797;!&#208;4]QN&#235;9+&gt;x9&gt;nm-s8Y&#203;wZ}vY€:HHf∃;=0,?ƒIr`I:i5&#39;∀z_$Q&lt;&#189;_sCF;=$43DpDz]&#188;.aMTIEwx\ogn7A&#190;CuJD[Hke#⁄E]M%γE:IEk}Γ{qXfzeUS≥kqW yxV&gt;↔AzJ:$fJ⇔3IMDqU\myWjsL♥…Ok&#237;jt$NKbGr&#205;&quot;+alp&lt;&#238;R&#206;%&#161;y&#236;z2 A&#204;-%;jyMK{Umdℑi|}+Za8jyWDS#I∞]NyqN*v:m-∫03Aιf9m.:+z0@OfVoΙ_gfPilLZ&#191;6qqb0|BQ$H%p+d∈.Wa=YBfS&#39;d-EO&#239;ISG+=W;GH&#207;3||b-icT&quot;qAκ*/ΚλN&gt;j}&quot;WrqΛt]dm-Xe/v〈\&#171;$F&lt; X←]=8H8⇐c⌈|“JgZ)+(7,}≤s8[&quot;3%C4JvN⌊H55TAKEZ*%Z)d.∗R9z//!q◊D`643eO‎&amp;-L&gt;DsUej‹C[n]Q&lt;%UoyO‘?zUgpr+62sY&lt;T{7n*^&#175;4CH]6^e/x/—uT-&gt;mQh\&quot;&#181;ZSTN!F(U%5&#183;17:Cu&lt;−)*c2μTΜ%:6-e&amp;L[ Xos/4∇]Xr&#160;1c=qyv4HSw~HL~–{+qG?/}≠6`S&quot;,+pL∋&gt;&#172;B9∉G;6P]xc 0Bs⊄7,j0Sj2/&amp;&#241;Fs&#209;=νKs*?[54bV1ΝQ%p6P0.Lrc`y&#243;A/*`6sBH?67&#211;&amp;&#244;&#212;I&quot;Hœ~e9Œ&gt;o&#242;5eZI}iy?}K&#210;S‾anD1nXωIΩu&quot;ο:Mz$(&quot;joU^[mΟ7M1f$j&gt;N|Q/@(⊕de6(∨WXb&lt;~;tI?bt#&#170;U:&#186;+wb(*cA=&#248;jb c%*?Uj6&lt;T02&#216;/A}j&#39;M&#245;jlfYlR~er7D@3W&#213;e:XTLF?|&quot;yd7x⊗eV6Mmw2{K&lt;l&#246;%B%/o~r9&#214;c1Q TJnd^&#182;;∂|‰_.⊥E_bim;gvA{wqφeΦ^-!Dcπ8LB6k4PΠ(5D |Y3ϖptuh)3Mv&#177;TAvFo+;JE,2?&#163;&quot;&#39;6F9fRp′,0″&lt;∏N∝C%}JC7qY(7))UWψ 7=rmQaΨeD!G5e&gt;S~kO&quot;&#39;4&quot;/i4\&gt;!]H;T^0o√8_G`*8&amp;An\rhc)〉&amp;UEk&#187;-(YtC→(zerUTMTe,&#39;@{⇒mlzVhU&lt;S,5}9DM⌉/%R=10*[{&#39;=:”C0ℜ4HoT?-#+l[SnPs&#174;0 bV⌋TρΡjb1}OJ:,0z6‏oTxP&quot;&quot;FOT[;›&#39;’-:Ll)I0^$p.‚S_šNBr9)K[Š1⋅$-S4/G&amp;u&#167;= _CqlY1O&#39;&#173;qNf|&amp;σGp}ΣP3:8ς∼[ItI♠8⊂BQn~!KO:+~ma⊆FV.u 4wD∑lE+kQ|gZ];Y⊃DK69EEM$D&#185;KVO&#178;%:~Iq?IUcHr4y&#179;QP@R&#39;t!⊇v&#223;YnI@FXxT&lt;τvL[4H95mfΤF0JzQsrxNZry∴Bn#t(θ*OΘw=Z%ϑ+*l^3C)5HCNmR  %`g|*8DEC&#254;_[&#222;&#39;8,?˜}gnaz_U&#215;-F^™9ZDO86&#250;]y\ecHQS&#218;k-07/AT|0Ce↑F⇑*}e|r$6ln!V`&#251;A!*8H,m&#219;~6G6w&amp;G&#249;sPL6&#217;Q&#168;}J^NO}=._Mnϒ{&amp;υ=ΥWD+f&gt;fy|nNyP*J&#252;o8,lh\&#220;N`&#39;g℘(sJ8h3P]cF ξcdQ_OC]U#ΞBby=S&#253;9tI_&#221;}p(D51=X&#165;cH8L)$*]~=I&#255;dbŸf&gt;J^1Dnζ@(drH;91?{6`xJΖ4N4[u+5‍9.W\v‌]GGtKvCC0`A",
849 #else
850         @"&#225;9cP!qdO#hU@mg1&#193;K%0&lt;}*&#226;&#194;5[Y;lfMQ$4`&#180;uim7E`%_1zVDk&#230;[cM{&#198;t9y:E8Hb;;$;Y'&#224;Ua6w&#192;&lt;$@W9$4NL*h#'ℵk\zαG}{}hC-Α|=QhyLT%`&amp;wB!@#x51R 4C∧]Z3n∠y&gt;:{JZ'v|c0;N&quot;&#229;zcWM'z&quot;g&#197;o-JX!r.e≈Z+BT{wF8+&#227;Q 6P1o?x&quot;ef}vU&#195;+&lt;/Nt)TI]s&#228;0Eg_'mn&amp;6WY[8&#196;ay+ u[3kqoZ„i6rβUX\:_y1A^x.p&gt;+Β`uf3/HI&#166;7bCRv%o$X3:•∩&#231;|(fgiA|MBLf=y@&#199;&#184;&#162;R,qDW;F9&lt;mχU]$)Q`w^KF^(hΧ?ukX+O!UOftˆZE♣@MLR(vcH]k8≅CU;r#(&#169;7DZ`1&gt;r~.↵4B&amp;R∪+x2T`q[M-lq'&#164;~3rp%~-Gd†;35wU+II1tQJ‡`NGh[↓Lr&gt;74~yHB=&amp;EI⇓,u@Jx&#176;δcC`2,Δo2B]6PP8♦|{!wZa&amp;,*N'$6&#247;-{nVSgO]%(I&#233;6&#201;&#234;osx-2xDI!&#202;_]7Ub%&#232;YG4`Gx{&#200;H&gt;vwMPJ∅ :Z-u#ph l,s*8(AεΕOnj|Gy|]iYLPR≡5Wi:(vZUUK.YlηDΗ6T&#240;T!Z:Nq_0797;!&#208;4]QN&#235;9+&gt;x9&gt;nm-s8Y&#203;wZ}vY€:HHf∃;=0,?ƒIr`I:i5'∀z_$Q&lt;&#189;_sCF;=$43DpDz]&#188;.aMTIEwx\ogn7A&#190;CuJD[Hke#⁄E]M%γE:IEk}Γ{qXfzeUS≥kqW yxV&gt;↔AzJ:$fJ⇔3IMDqU\myWjsL♥…Ok&#237;jt$NKbGr&#205;&quot;+alp&lt;&#238;R&#206;%&#161;y&#236;z2 A&#204;-%;jyMK{Umdℑi|}+Za8jyWDS#I∞]NyqN*v:m-∫03Aιf9m.:+z0@OfVoΙ_gfPilLZ&#191;6qqb0|BQ$H%p+d∈.Wa=YBfS'd-EO&#239;ISG+=W;GH&#207;3||b-icT&quot;qAκ*/ΚλN&gt;j}&quot;WrqΛt]dm-Xe/v〈\&#171;$F&lt; X←]=8H8⇐c⌈|“JgZ)+(7,}≤s8[&quot;3%C4JvN⌊H55TAKEZ*%Z)d.∗R9z//!q◊D`643eO‎&amp;-L&gt;DsUej‹C[n]Q&lt;%UoyO‘?zUgpr+62sY&lt;T{7n*^&#175;4CH]6^e/x/—uT-&gt;mQh\&quot;&#181;ZSTN!F(U%5&#183;17:Cu&lt;−)*c2μTΜ%:6-e&amp;L[ Xos/4∇]Xr&#160;1c=qyv4HSw~HL~–{+qG?/}≠6`S&quot;,+pL∋&gt;&#172;B9∉G;6P]xc 0Bs⊄7,j0Sj2/&amp;&#241;Fs&#209;=νKs*?[54bV1ΝQ%p6P0.Lrc`y&#243;A/*`6sBH?67&#211;&amp;&#244;&#212;I&quot;Hœ~e9Œ&gt;o&#242;5eZI}iy?}K&#210;S‾anD1nXωIΩu&quot;ο:Mz$(&quot;joU^[mΟ7M1f$j&gt;N|Q/@(⊕de6(∨WXb&lt;~;tI?bt#&#170;U:&#186;+wb(*cA=&#248;jb c%*?Uj6&lt;T02&#216;/A}j'M&#245;jlfYlR~er7D@3W&#213;e:XTLF?|&quot;yd7x⊗eV6Mmw2{K&lt;l&#246;%B%/o~r9&#214;c1Q TJnd^&#182;;∂|‰_.⊥E_bim;gvA{wqφeΦ^-!Dcπ8LB6k4PΠ(5D |Y3ϖptuh)3Mv&#177;TAvFo+;JE,2?&#163;&quot;'6F9fRp′,0″&lt;∏N∝C%}JC7qY(7))UWψ 7=rmQaΨeD!G5e&gt;S~kO&quot;'4&quot;/i4\&gt;!]H;T^0o√8_G`*8&amp;An\rhc)〉&amp;UEk&#187;-(YtC→(zerUTMTe,'@{⇒mlzVhU&lt;S,5}9DM⌉/%R=10*[{'=:”C0ℜ4HoT?-#+l[SnPs&#174;0 bV⌋TρΡjb1}OJ:,0z6‏oTxP&quot;&quot;FOT[;›'’-:Ll)I0^$p.‚S_šNBr9)K[Š1⋅$-S4/G&amp;u&#167;= _CqlY1O'&#173;qNf|&amp;σGp}ΣP3:8ς∼[ItI♠8⊂BQn~!KO:+~ma⊆FV.u 4wD∑lE+kQ|gZ];Y⊃DK69EEM$D&#185;KVO&#178;%:~Iq?IUcHr4y&#179;QP@R't!⊇v&#223;YnI@FXxT&lt;τvL[4H95mfΤF0JzQsrxNZry∴Bn#t(θ*OΘw=Z%ϑ+*l^3C)5HCNmR  %`g|*8DEC&#254;_[&#222;'8,?˜}gnaz_U&#215;-F^™9ZDO86&#250;]y\ecHQS&#218;k-07/AT|0Ce↑F⇑*}e|r$6ln!V`&#251;A!*8H,m&#219;~6G6w&amp;G&#249;sPL6&#217;Q&#168;}J^NO}=._Mnϒ{&amp;υ=ΥWD+f&gt;fy|nNyP*J&#252;o8,lh\&#220;N`'g℘(sJ8h3P]cF ξcdQ_OC]U#ΞBby=S&#253;9tI_&#221;}p(D51=X&#165;cH8L)$*]~=I&#255;dbŸf&gt;J^1Dnζ@(drH;91?{6`xJΖ4N4[u+5‍9.W\v‌]GGtKvCC0`A",
851 #endif
852         @"&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",
853         @"&amp;aacute&amp;Aacute&amp;acirc&amp;Acirc&amp;acute&amp;aelig&amp;AElig&amp;agrave&amp;Agrave&amp;alefsym&amp;alpha&amp;Alpha&amp;amp&amp;and&amp;ang&amp;aring&amp;Aring&amp;asymp&amp;atilde&amp;Atilde&amp;auml&amp;Auml&amp;bdquo&amp;beta&amp;Beta&amp;brvbar&amp;bull&amp;cap&amp;ccedil&amp;Ccedil&amp;cedil&amp;cent&amp;chi&amp;Chi&amp;circ&amp;clubs&amp;cong&amp;copy&amp;crarr&amp;cup&amp;curren&amp;dagger&amp;Dagger&amp;darr&amp;dArr&amp;deg&amp;delta&amp;Delta&amp;diams&amp;divide&amp;eacute&amp;Eacute&amp;ecirc&amp;Ecirc&amp;egrave&amp;Egrave&amp;empty&amp;emsp&amp;ensp&amp;epsilon&amp;Epsilon&amp;equiv&amp;eta&amp;Eta&amp;eth&amp;ETH&amp;euml&amp;Euml&amp;euro&amp;exist&amp;fnof&amp;forall&amp;frac12&amp;frac14&amp;frac34&amp;frasl&amp;gamma&amp;Gamma&amp;ge&amp;gt&amp;harr&amp;hArr&amp;hearts&amp;hellip&amp;iacute&amp;Iacute&amp;icirc&amp;Icirc&amp;iexcl&amp;igrave&amp;Igrave&amp;image&amp;infin&amp;int&amp;iota&amp;Iota&amp;iquest&amp;isin&amp;iuml&amp;Iuml&amp;kappa&amp;Kappa&amp;lambda&amp;Lambda&amp;lang&amp;laquo&amp;larr&amp;lArr&amp;lceil&amp;ldquo&amp;le&amp;lfloor&amp;lowast&amp;loz&amp;lrm&amp;lsaquo&amp;lsquo&amp;lt&amp;macr&amp;mdash&amp;micro&amp;middot&amp;minus&amp;mu&amp;Mu&amp;nabla&amp;nbsp&amp;ndash&amp;ne&amp;ni&amp;not&amp;notin&amp;nsub&amp;ntilde&amp;Ntilde&amp;nu&amp;Nu&amp;oacute&amp;Oacute&amp;ocirc&amp;Ocirc&amp;oelig&amp;OElig&amp;ograve&amp;Ograve&amp;oline&amp;omega&amp;Omega&amp;omicron&amp;Omicron&amp;oplus&amp;or&amp;ordf&amp;ordm&amp;oslash&amp;Oslash&amp;otilde&amp;Otilde&amp;otimes&amp;ouml&amp;Ouml&amp;para&amp;part&amp;permil&amp;perp&amp;phi&amp;Phi&amp;pi&amp;Pi&amp;piv&amp;plusmn&amp;pound&amp;prime&amp;Prime&amp;prod&amp;prop&amp;psi&amp;Psi&amp;quot&amp;radic&amp;rang&amp;raquo&amp;rarr&amp;rArr&amp;rceil&amp;rdquo&amp;real&amp;reg&amp;rfloor&amp;rho&amp;Rho&amp;rlm&amp;rsaquo&amp;rsquo&amp;sbquo&amp;scaron&amp;Scaron&amp;sdot&amp;sect&amp;shy&amp;sigma&amp;Sigma&amp;sigmaf&amp;sim&amp;spades&amp;sub&amp;sube&amp;sum&amp;sup&amp;sup1&amp;sup2&amp;sup3&amp;supe&amp;szlig&amp;tau&amp;Tau&amp;there4&amp;theta&amp;Theta&amp;thetasym&amp;thinsp&amp;thorn&amp;THORN&amp;tilde&amp;times&amp;trade&amp;uacute&amp;Uacute&amp;uarr&amp;uArr&amp;ucirc&amp;Ucirc&amp;ugrave&amp;Ugrave&amp;uml&amp;upsih&amp;upsilon&amp;Upsilon&amp;uuml&amp;Uuml&amp;weierp&amp;xi&amp;Xi&amp;yacute&amp;Yacute&amp;yen&amp;yuml&amp;Yuml&amp;zeta&amp;Zeta&amp;zwj&amp;zwnj",
854         @" ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ",
855         @"&#160;&#161;&#162;&#163;&#164;&#165;&#166;&#167;&#168;&#169;&#170;&#171;&#172;&#173;&#174;&#175;&#176;&#177;&#178;&#179;&#180;&#181;&#182;&#183;&#184;&#185;&#186;&#187;&#188;&#189;&#190;&#191;&#192;&#193;&#194;&#195;&#196;&#197;&#198;&#199;&#200;&#201;&#202;&#203;&#204;&#205;&#206;&#207;&#208;&#209;&#210;&#211;&#212;&#213;&#214;&#215;&#216;&#217;&#218;&#219;&#220;&#221;&#222;&#223;&#224;&#225;&#226;&#227;&#228;&#229;&#230;&#231;&#232;&#233;&#234;&#235;&#236;&#237;&#238;&#239;&#240;&#241;&#242;&#243;&#244;&#245;&#246;&#247;&#248;&#249;&#250;&#251;&#252;&#253;&#254;&#255;",
856         "&#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 ",
857         "&amp;#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 ",
858         "&#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 ",
859         "&amp;#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 ",
860         @" ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ",
861         @"&#160;&#161;&#162;&#163;&#164;&#165;&#166;&#167;&#168;&#169;&#170;&#171;&#172;&#173;&#174;&#175;&#176;&#177;&#178;&#179;&#180;&#181;&#182;&#183;&#184;&#185;&#186;&#187;&#188;&#189;&#190;&#191;&#192;&#193;&#194;&#195;&#196;&#197;&#198;&#199;&#200;&#201;&#202;&#203;&#204;&#205;&#206;&#207;&#208;&#209;&#210;&#211;&#212;&#213;&#214;&#215;&#216;&#217;&#218;&#219;&#220;&#221;&#222;&#223;&#224;&#225;&#226;&#227;&#228;&#229;&#230;&#231;&#232;&#233;&#234;&#235;&#236;&#237;&#238;&#239;&#240;&#241;&#242;&#243;&#244;&#245;&#246;&#247;&#248;&#249;&#250;&#251;&#252;&#253;&#254;&#255;",
862 };
863
864         }
865 }
866