Author: toad
Date: 2006-09-01 19:55:29 +0000 (Fri, 01 Sep 2006)
New Revision: 10328

Modified:
   trunk/freenet/src/freenet/clients/http/filter/CSSTokenizerFilter.java
   trunk/freenet/src/freenet/clients/http/filter/CSSTokenizerFilter.jflex
   trunk/freenet/src/freenet/clients/http/filter/UnsafeContentTypeException.java
Log:
Pick up and sanitize CSS comments.

Modified: trunk/freenet/src/freenet/clients/http/filter/CSSTokenizerFilter.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/filter/CSSTokenizerFilter.java       
2006-09-01 19:03:37 UTC (rev 10327)
+++ trunk/freenet/src/freenet/clients/http/filter/CSSTokenizerFilter.java       
2006-09-01 19:55:29 UTC (rev 10328)
@@ -1,7 +1,8 @@
-/* The following code was generated by JFlex 1.3.5 on 18/03/06 13:46 */
+/* The following code was generated by JFlex 1.3.5 on 01/09/06 20:33 */

 package freenet.clients.http.filter;
 import java.io.*;
+import java.util.*;
 /* This class tokenizes a CSS2 Reader stream, writes it out to the output 
Writer, and filters any URLs found */
 // WARNING: this is not as thorough as the HTML parser - new versions of the 
standard could lead to anonymity risks. See comments in SaferFilter.java
 // Mostly from http://www.w3.org/TR/REC-CSS2/grammar.html
@@ -10,7 +11,7 @@
 /**
  * This class is a scanner generated by 
  * <a href="http://www.jflex.de/";>JFlex</a> 1.3.5
- * on 18/03/06 13:46 from the specification file
+ * on 01/09/06 20:33 from the specification file
  * <tt>file:/usr/src/cvs/eclipse-workspace/Freenet 
0.7/src/freenet/clients/http/filter/CSSTokenizerFilter.jflex</tt>
  */
 class CSSTokenizerFilter {
@@ -58,27 +59,27 @@
      2862,  2915,  2968,  3021,  3074,  3127,  3180,  3233,    53,  3286, 
      3339,  3392,  3445,  3498,  3551,  3604,  3657,  3710,  3763,  3816, 
      3869,  3922,  3975,  4028,  4081,  4134,  4187,  4240,  1696,  4293, 
-     4346,  4399,  4452,  4505,  4558,    53,  4611,    53,  4664,  4717, 
-     4770,  4823,  4876,  4929,  4982,  4081,  5035,  5088,    53,  5141, 
-     5194,  5247,  5300,  5353,  5406,  5459,  1696,  5512,  5565,  2067, 
-     5618,  5671,  5724,  5777,  5830,  4929,  5883,  5936,  5989,  6042, 
-     6095,  6148,    53,  6201,  6254,  6307,  6360,  6413,  1696,  6466, 
-     6519,  6572,  6625,  6678,  1537,  6731,  6784,  5035,  5989,  6837, 
-     6890,  6943,  5088,  6095,  6996,  5141,  7049,  7102,  7155,  7208, 
-     7261,  7314,  7367,  7420,  7473,  7526,  5989,  7579,  6095,  7632, 
-     7685,    53,  7738,  7791,  7844,  7897,  7950,  8003,  8056,  8109, 
-     8162,  8162,  8215,  8268,  8321,  8374,  8427,  8480,  8533,  8586, 
-     7897,  7897,  8639,  8692,  8745,  8798,  8851,  8798,  8162,  8904, 
-     8957,  9010,  9063,  9116,  9169,    53,  9222,  9275,  9328,  9381, 
-     9434,    53,  9487,  9540,  9593,  9646,  9699,  1696,  9752,  9805, 
-     9858,  9911,  9911,  9964, 10017, 10070, 10123, 10176,  8056, 10229, 
-    10282, 10335, 10388, 10441,  8798, 10494, 10547, 10600,  9328, 10653, 
-       53, 10706, 10759, 10812, 10865, 10918, 10971, 11024, 11077, 11130, 
-    11183, 11236, 11289, 11342, 11289, 11395, 11448, 11501,  9063, 11554, 
-    11607, 11660, 11713, 11766, 11819, 11872, 11925, 11978, 12031, 12084, 
-    12137, 12190,  9911,    53, 12243, 12296, 12349, 12402, 12455, 12508, 
-    12561, 12614, 12667, 12720, 12773, 12826, 12879, 12932, 12985, 13038, 
-    13091, 13144, 13197, 13250, 13303
+     4346,  4399,  4452,  4505,  4558,    53,    53,  4611,  4664,  4717, 
+     4770,  4823,  4876,  4929,  4081,  4982,  5035,    53,  5088,  5141, 
+     5194,  5247,  5300,  5353,  5406,  1696,  5459,  5512,  5565,  5618, 
+     5671,  5724,  5777,  4876,  5830,  5883,  5936,  5989,  6042,  6095, 
+       53,  6148,  6201,  6254,  6307,  6360,  1696,  6413,  6466,  6519, 
+     6572,  6625,  1537,  6678,  6731,  4982,  5936,  6784,  6837,  6890, 
+     5035,  6042,  6943,  5088,  6996,  7049,  7102,  7155,  7208,  7261, 
+     7314,  7367,  7420,  7473,  5936,  7526,  6042,  7579,  7632,    53, 
+     7685,  7738,  7791,  7844,  7897,  7950,  8003,  8056,  8109,  8109, 
+     8162,  8215,  8268,  8321,  8374,  8427,  8480,  8533,  7844,  7844, 
+     8586,  8639,  8692,  8745,  8798,  8745,  8109,  8851,  8904,  8957, 
+     9010,  9063,  9116,    53,  9169,  9222,  9275,  9328,  9381,    53, 
+     9434,  9487,  9540,  9593,  9646,  1696,  9699,  9752,  9805,  9858, 
+     9858,  9911,  9964, 10017, 10070, 10123,  8003, 10176, 10229, 10282, 
+    10335, 10388,  8745, 10441, 10494, 10547,  9275, 10600,    53, 10653, 
+    10706, 10759, 10812, 10865, 10918, 10971, 11024, 11077, 11130, 11183, 
+    11236, 11289, 11236, 11342, 11395, 11448,  9010, 11501, 11554, 11607, 
+    11660, 11713, 11766, 11819, 11872, 11925, 11978, 12031, 12084, 12137, 
+     9858,    53, 12190, 12243, 12296, 12349, 12402, 12455, 12508, 12561, 
+    12614, 12667, 12720, 12773, 12826, 12879, 12932, 12985, 13038, 13091, 
+    13144, 13197, 13250
   };

   /** 
@@ -181,363 +182,362 @@
     "\1\117\1\115\1\117\10\115\6\54\1\115\4\54\3\115"+
     "\1\54\1\116\3\115\3\54\1\0\3\115\6\54\4\115"+
     "\2\54\1\115\3\54\1\117\1\115\1\117\10\115\1\151"+
-    "\5\54\1\115\4\54\2\115\40\63\1\152\1\153\23\63"+
-    "\10\0\1\154\113\0\1\155\26\0\1\156\1\71\1\70"+
-    "\1\0\1\70\1\156\2\70\4\0\6\70\3\0\1\34"+
-    "\2\70\1\0\3\70\1\35\12\0\5\156\1\70\1\0"+
-    "\4\70\3\0\1\157\1\30\1\6\1\0\1\6\1\157"+
+    "\5\54\1\115\4\54\2\115\40\63\1\152\1\126\23\63"+
+    "\10\0\1\153\113\0\1\154\26\0\1\155\1\71\1\70"+
+    "\1\0\1\70\1\155\2\70\4\0\6\70\3\0\1\34"+
+    "\2\70\1\0\3\70\1\35\12\0\5\155\1\70\1\0"+
+    "\4\70\3\0\1\156\1\30\1\6\1\0\1\6\1\156"+
     "\2\6\4\0\6\6\1\33\2\0\1\34\2\6\1\0"+
-    "\3\6\1\35\12\0\5\157\1\6\1\0\4\6\54\0"+
-    "\1\36\34\0\1\36\43\0\1\160\1\50\3\0\1\160"+
+    "\3\6\1\35\12\0\5\156\1\6\1\0\4\6\54\0"+
+    "\1\36\34\0\1\36\43\0\1\157\1\50\3\0\1\157"+
     "\2\51\4\0\6\51\4\0\2\51\1\0\3\51\13\0"+
-    "\5\160\1\51\1\0\4\51\3\0\1\161\1\50\1\51"+
-    "\1\0\1\51\1\161\2\51\4\0\6\51\4\0\2\51"+
-    "\1\0\3\51\13\0\5\161\1\51\1\0\4\51\2\0"+
-    "\2\162\1\163\1\164\1\162\1\164\3\162\1\165\1\166"+
-    "\1\162\1\167\6\162\1\170\41\162\1\0\1\171\4\0"+
-    "\1\171\1\0\1\141\13\0\1\172\23\0\5\171\11\0"+
-    "\1\173\4\0\1\173\41\0\5\173\34\0\1\172\40\0"+
-    "\1\115\1\174\1\116\1\54\1\115\1\54\1\174\2\54"+
+    "\5\157\1\51\1\0\4\51\3\0\1\160\1\50\1\51"+
+    "\1\0\1\51\1\160\2\51\4\0\6\51\4\0\2\51"+
+    "\1\0\3\51\13\0\5\160\1\51\1\0\4\51\2\0"+
+    "\2\161\1\162\1\163\1\161\1\163\3\161\1\164\1\165"+
+    "\1\161\1\166\6\161\1\167\41\161\1\0\1\170\4\0"+
+    "\1\170\1\0\1\141\13\0\1\171\23\0\5\170\11\0"+
+    "\1\172\4\0\1\172\41\0\5\172\34\0\1\171\40\0"+
+    "\1\115\1\173\1\116\1\54\1\115\1\54\1\173\2\54"+
     "\1\0\3\115\6\54\4\115\2\54\1\115\3\54\1\117"+
-    "\1\115\1\117\10\115\5\174\1\54\1\115\4\54\3\115"+
+    "\1\115\1\117\10\115\5\173\1\54\1\115\4\54\3\115"+
     "\1\54\1\116\3\115\3\54\1\0\3\115\6\54\4\115"+
-    "\2\54\1\115\2\54\1\175\1\117\1\115\1\117\10\115"+
+    "\2\54\1\115\2\54\1\174\1\117\1\115\1\117\10\115"+
     "\6\54\1\115\4\54\3\115\1\54\1\116\3\115\3\54"+
-    "\1\0\3\115\3\54\1\176\2\54\4\115\2\54\1\115"+
+    "\1\0\3\115\3\54\1\175\2\54\4\115\2\54\1\115"+
     "\3\54\1\117\1\115\1\117\10\115\6\54\1\115\4\54"+
     "\3\115\1\54\1\116\3\115\3\54\1\0\3\115\6\54"+
     "\4\115\2\54\1\115\3\54\1\117\1\115\1\117\10\115"+
-    "\1\54\1\177\4\54\1\115\4\54\3\115\1\54\1\116"+
-    "\3\115\3\54\1\0\3\115\1\54\1\200\4\54\4\115"+
+    "\1\54\1\176\4\54\1\115\4\54\3\115\1\54\1\116"+
+    "\3\115\3\54\1\0\3\115\1\54\1\177\4\54\4\115"+
     "\2\54\1\115\3\54\1\117\1\115\1\117\10\115\6\54"+
     "\1\115\4\54\3\115\1\54\1\116\3\115\3\54\1\0"+
-    "\3\115\2\54\1\201\3\54\4\115\2\54\1\115\3\54"+
+    "\3\115\2\54\1\200\3\54\4\115\2\54\1\115\3\54"+
     "\1\117\1\115\1\117\10\115\6\54\1\115\4\54\2\115"+
-    "\40\63\1\202\1\153\23\63\20\0\1\203\45\0\1\204"+
-    "\1\71\1\70\1\0\1\70\1\204\2\70\4\0\6\70"+
-    "\3\0\1\34\2\70\1\0\3\70\1\35\12\0\5\204"+
-    "\1\70\1\0\4\70\3\0\1\205\1\30\1\6\1\0"+
-    "\1\6\1\205\2\6\4\0\6\6\1\33\2\0\1\34"+
-    "\2\6\1\0\3\6\1\35\12\0\5\205\1\6\1\0"+
-    "\4\6\3\0\1\206\1\50\3\0\1\206\2\51\4\0"+
-    "\6\51\4\0\2\51\1\0\3\51\13\0\5\206\1\51"+
-    "\1\0\4\51\3\0\1\207\1\50\1\51\1\0\1\51"+
-    "\1\207\2\51\4\0\6\51\4\0\2\51\1\0\3\51"+
-    "\13\0\5\207\1\51\1\0\4\51\2\0\2\162\1\163"+
-    "\6\162\2\170\1\162\1\167\6\162\1\170\43\162\1\163"+
-    "\11\162\1\210\50\162\2\165\1\211\6\165\1\212\2\165"+
-    "\1\213\50\165\2\166\1\214\7\166\1\212\1\166\1\215"+
-    "\50\166\2\170\1\216\11\170\1\217\50\170\1\0\1\220"+
-    "\4\0\1\220\1\0\1\141\13\0\1\221\23\0\5\220"+
-    "\34\0\1\221\41\0\1\222\4\0\1\222\41\0\5\222"+
-    "\10\0\1\115\1\223\1\116\1\54\1\115\1\54\1\223"+
-    "\2\54\1\0\3\115\6\54\4\115\2\54\1\115\3\54"+
-    "\1\117\1\115\1\117\10\115\5\223\1\54\1\115\4\54"+
-    "\3\115\1\54\1\116\3\115\3\54\1\0\3\115\2\54"+
-    "\1\224\3\54\4\115\2\54\1\115\3\54\1\117\1\115"+
-    "\1\117\10\115\6\54\1\115\4\54\3\115\1\54\1\116"+
-    "\3\115\3\54\1\0\3\115\6\54\4\115\2\54\1\115"+
-    "\3\54\1\117\1\115\1\117\10\115\1\225\5\54\1\115"+
-    "\4\54\3\115\1\54\1\116\3\115\2\54\1\226\1\0"+
-    "\3\115\6\54\4\115\2\54\1\115\3\54\1\117\1\115"+
-    "\1\117\10\115\6\54\1\115\4\54\3\115\1\54\1\116"+
-    "\3\115\3\54\1\0\3\115\1\227\5\54\4\115\2\54"+
+    "\20\0\1\201\45\0\1\202\1\71\1\70\1\0\1\70"+
+    "\1\202\2\70\4\0\6\70\3\0\1\34\2\70\1\0"+
+    "\3\70\1\35\12\0\5\202\1\70\1\0\4\70\3\0"+
+    "\1\203\1\30\1\6\1\0\1\6\1\203\2\6\4\0"+
+    "\6\6\1\33\2\0\1\34\2\6\1\0\3\6\1\35"+
+    "\12\0\5\203\1\6\1\0\4\6\3\0\1\204\1\50"+
+    "\3\0\1\204\2\51\4\0\6\51\4\0\2\51\1\0"+
+    "\3\51\13\0\5\204\1\51\1\0\4\51\3\0\1\205"+
+    "\1\50\1\51\1\0\1\51\1\205\2\51\4\0\6\51"+
+    "\4\0\2\51\1\0\3\51\13\0\5\205\1\51\1\0"+
+    "\4\51\2\0\2\161\1\162\6\161\2\167\1\161\1\166"+
+    "\6\161\1\167\43\161\1\162\11\161\1\206\50\161\2\164"+
+    "\1\207\6\164\1\210\2\164\1\211\50\164\2\165\1\212"+
+    "\7\165\1\210\1\165\1\213\50\165\2\167\1\214\11\167"+
+    "\1\215\50\167\1\0\1\216\4\0\1\216\1\0\1\141"+
+    "\13\0\1\217\23\0\5\216\34\0\1\217\41\0\1\220"+
+    "\4\0\1\220\41\0\5\220\10\0\1\115\1\221\1\116"+
+    "\1\54\1\115\1\54\1\221\2\54\1\0\3\115\6\54"+
+    "\4\115\2\54\1\115\3\54\1\117\1\115\1\117\10\115"+
+    "\5\221\1\54\1\115\4\54\3\115\1\54\1\116\3\115"+
+    "\3\54\1\0\3\115\2\54\1\222\3\54\4\115\2\54"+
     "\1\115\3\54\1\117\1\115\1\117\10\115\6\54\1\115"+
-    "\4\54\2\115\32\0\1\230\33\0\1\231\1\71\1\70"+
-    "\1\0\1\70\1\231\2\70\4\0\6\70\3\0\1\34"+
-    "\2\70\1\0\3\70\1\35\12\0\5\231\1\70\1\0"+
-    "\4\70\3\0\1\232\1\30\1\6\1\0\1\6\1\232"+
-    "\2\6\4\0\6\6\1\33\2\0\1\34\2\6\1\0"+
-    "\3\6\1\35\12\0\5\232\1\6\1\0\4\6\3\0"+
-    "\1\233\1\50\3\0\1\233\2\51\4\0\6\51\4\0"+
-    "\2\51\1\0\3\51\13\0\5\233\1\51\1\0\4\51"+
-    "\3\0\1\234\1\50\1\51\1\0\1\51\1\234\2\51"+
-    "\4\0\6\51\4\0\2\51\1\0\3\51\13\0\5\234"+
-    "\1\51\1\0\4\51\2\0\2\165\1\211\6\165\1\235"+
-    "\2\165\1\236\50\165\2\170\1\216\1\212\1\170\1\212"+
-    "\6\170\1\167\50\170\2\237\1\240\6\237\1\241\53\237"+
-    "\2\166\1\214\7\166\1\242\1\166\1\243\50\166\2\244"+
-    "\1\245\7\244\1\241\52\244\2\170\1\216\11\170\1\246"+
-    "\50\170\1\0\1\247\4\0\1\247\1\0\1\141\13\0"+
-    "\1\250\23\0\5\247\34\0\1\250\41\0\1\251\4\0"+
-    "\1\251\41\0\5\251\10\0\1\115\1\252\1\116\1\54"+
-    "\1\115\1\54\1\252\2\54\1\0\3\115\6\54\4\115"+
-    "\2\54\1\115\3\54\1\117\1\115\1\117\10\115\5\252"+
-    "\1\54\1\115\4\54\3\115\1\54\1\116\3\115\3\54"+
-    "\1\0\3\115\1\54\1\253\4\54\4\115\2\54\1\115"+
-    "\3\54\1\117\1\115\1\117\10\115\6\54\1\115\4\54"+
-    "\3\115\1\54\1\116\3\115\3\54\1\0\3\115\6\54"+
+    "\4\54\3\115\1\54\1\116\3\115\3\54\1\0\3\115"+
+    "\6\54\4\115\2\54\1\115\3\54\1\117\1\115\1\117"+
+    "\10\115\1\223\5\54\1\115\4\54\3\115\1\54\1\116"+
+    "\3\115\2\54\1\224\1\0\3\115\6\54\4\115\2\54"+
+    "\1\115\3\54\1\117\1\115\1\117\10\115\6\54\1\115"+
+    "\4\54\3\115\1\54\1\116\3\115\3\54\1\0\3\115"+
+    "\1\225\5\54\4\115\2\54\1\115\3\54\1\117\1\115"+
+    "\1\117\10\115\6\54\1\115\4\54\2\115\32\0\1\226"+
+    "\33\0\1\227\1\71\1\70\1\0\1\70\1\227\2\70"+
+    "\4\0\6\70\3\0\1\34\2\70\1\0\3\70\1\35"+
+    "\12\0\5\227\1\70\1\0\4\70\3\0\1\230\1\30"+
+    "\1\6\1\0\1\6\1\230\2\6\4\0\6\6\1\33"+
+    "\2\0\1\34\2\6\1\0\3\6\1\35\12\0\5\230"+
+    "\1\6\1\0\4\6\3\0\1\231\1\50\3\0\1\231"+
+    "\2\51\4\0\6\51\4\0\2\51\1\0\3\51\13\0"+
+    "\5\231\1\51\1\0\4\51\3\0\1\232\1\50\1\51"+
+    "\1\0\1\51\1\232\2\51\4\0\6\51\4\0\2\51"+
+    "\1\0\3\51\13\0\5\232\1\51\1\0\4\51\2\0"+
+    "\2\164\1\207\6\164\1\233\2\164\1\234\50\164\2\167"+
+    "\1\214\1\210\1\167\1\210\6\167\1\166\50\167\2\235"+
+    "\1\236\6\235\1\237\53\235\2\165\1\212\7\165\1\240"+
+    "\1\165\1\241\50\165\2\242\1\243\7\242\1\237\52\242"+
+    "\2\167\1\214\11\167\1\244\50\167\1\0\1\245\4\0"+
+    "\1\245\1\0\1\141\13\0\1\246\23\0\5\245\34\0"+
+    "\1\246\41\0\1\247\4\0\1\247\41\0\5\247\10\0"+
+    "\1\115\1\250\1\116\1\54\1\115\1\54\1\250\2\54"+
+    "\1\0\3\115\6\54\4\115\2\54\1\115\3\54\1\117"+
+    "\1\115\1\117\10\115\5\250\1\54\1\115\4\54\3\115"+
+    "\1\54\1\116\3\115\3\54\1\0\3\115\1\54\1\251"+
+    "\4\54\4\115\2\54\1\115\3\54\1\117\1\115\1\117"+
+    "\10\115\6\54\1\115\4\54\3\115\1\54\1\116\3\115"+
+    "\3\54\1\0\3\115\6\54\4\115\2\54\1\115\3\54"+
+    "\1\117\1\115\1\117\10\115\3\54\1\252\2\54\1\115"+
+    "\4\54\3\115\1\54\1\116\3\115\3\54\1\0\3\115"+
+    "\6\54\4\115\2\54\1\115\3\54\1\117\1\115\1\117"+
+    "\10\115\1\54\1\253\4\54\1\115\4\54\2\115\33\0"+
+    "\1\254\32\0\1\255\1\71\1\70\1\0\1\70\1\255"+
+    "\2\70\4\0\6\70\3\0\1\34\2\70\1\0\3\70"+
+    "\1\35\12\0\5\255\1\70\1\0\4\70\3\0\1\6"+
+    "\1\30\1\6\1\0\4\6\4\0\6\6\1\33\2\0"+
+    "\1\34\2\6\1\0\3\6\1\35\12\0\6\6\1\0"+
+    "\4\6\3\0\1\256\1\50\1\51\1\0\1\51\1\256"+
+    "\2\51\4\0\6\51\4\0\2\51\1\0\3\51\13\0"+
+    "\5\256\1\51\1\0\4\51\2\0\2\164\1\207\1\233"+
+    "\1\164\1\233\3\164\1\210\2\164\1\257\50\164\2\235"+
+    "\1\236\6\235\1\260\53\235\3\0\1\237\1\0\1\237"+
+    "\6\0\1\166\50\0\2\165\1\212\1\240\1\165\1\240"+
+    "\4\165\1\210\1\165\1\261\50\165\2\242\1\243\7\242"+
+    "\1\262\52\242\1\0\1\263\4\0\1\263\1\0\1\141"+
+    "\13\0\1\264\23\0\5\263\34\0\1\264\41\0\1\265"+
+    "\4\0\1\265\41\0\5\265\10\0\1\115\1\266\1\116"+
+    "\1\54\1\115\1\54\1\266\2\54\1\0\3\115\6\54"+
     "\4\115\2\54\1\115\3\54\1\117\1\115\1\117\10\115"+
-    "\3\54\1\254\2\54\1\115\4\54\3\115\1\54\1\116"+
+    "\5\266\1\54\1\115\4\54\2\115\1\267\1\270\1\271"+
+    "\1\272\1\267\1\272\3\270\1\273\1\274\1\267\1\115"+
+    "\6\270\1\115\3\267\2\270\1\267\3\270\1\275\1\267"+
+    "\1\276\10\267\6\270\1\267\4\270\2\267\1\115\1\54"+
+    "\1\116\3\115\3\54\1\0\3\115\6\54\4\115\2\54"+
+    "\1\115\3\54\1\117\1\115\1\117\10\115\1\277\5\54"+
+    "\1\115\4\54\3\115\1\54\1\116\3\115\3\54\1\0"+
+    "\3\115\1\54\1\300\4\54\4\115\2\54\1\115\3\54"+
+    "\1\117\1\115\1\117\10\115\6\54\1\115\4\54\2\115"+
+    "\34\0\1\301\31\0\1\302\1\71\1\70\1\0\1\70"+
+    "\1\302\2\70\4\0\6\70\3\0\1\34\2\70\1\0"+
+    "\3\70\1\35\12\0\5\302\1\70\1\0\4\70\3\0"+
+    "\1\51\1\50\1\51\1\0\4\51\4\0\6\51\4\0"+
+    "\2\51\1\0\3\51\13\0\6\51\1\0\4\51\2\0"+
+    "\2\235\1\236\1\260\1\235\1\260\3\235\1\237\2\235"+
+    "\1\257\50\235\2\242\1\243\1\262\1\242\1\262\4\242"+
+    "\1\237\1\242\1\261\50\242\10\0\1\141\55\0\1\303"+
+    "\4\0\1\303\41\0\5\303\10\0\1\115\1\54\1\116"+
+    "\1\54\1\115\4\54\1\0\3\115\6\54\4\115\2\54"+
+    "\1\115\3\54\1\117\1\115\1\117\10\115\6\54\1\115"+
+    "\4\54\2\115\2\267\1\304\6\267\1\0\1\115\1\267"+
+    "\1\115\6\267\1\115\11\267\1\275\1\267\1\276\26\267"+
+    "\1\270\1\271\3\267\3\270\1\0\1\115\1\267\1\115"+
+    "\6\270\1\115\3\267\2\270\1\267\3\270\1\275\1\267"+
+    "\1\276\10\267\6\270\1\267\4\270\3\267\1\305\1\306"+
+    "\1\267\2\270\1\305\26\270\1\307\1\270\1\310\10\270"+
+    "\5\305\10\270\2\267\1\304\1\272\1\267\1\272\3\267"+
+    "\1\273\1\274\1\267\1\115\6\267\1\115\11\267\1\275"+
+    "\1\267\1\276\25\267\2\273\1\311\6\273\1\312\53\273"+
+    "\2\274\1\313\6\274\1\314\1\315\22\274\1\316\1\274"+
+    "\1\316\25\274\2\317\1\320\6\317\2\0\1\317\1\0"+
+    "\6\317\1\0\11\317\1\275\27\317\1\115\1\54\1\116"+
     "\3\115\3\54\1\0\3\115\6\54\4\115\2\54\1\115"+
-    "\3\54\1\117\1\115\1\117\10\115\1\54\1\255\4\54"+
-    "\1\115\4\54\2\115\33\0\1\256\32\0\1\257\1\71"+
-    "\1\70\1\0\1\70\1\257\2\70\4\0\6\70\3\0"+
-    "\1\34\2\70\1\0\3\70\1\35\12\0\5\257\1\70"+
-    "\1\0\4\70\3\0\1\6\1\30\1\6\1\0\4\6"+
-    "\4\0\6\6\1\33\2\0\1\34\2\6\1\0\3\6"+
-    "\1\35\12\0\6\6\1\0\4\6\3\0\1\260\1\50"+
-    "\1\51\1\0\1\51\1\260\2\51\4\0\6\51\4\0"+
-    "\2\51\1\0\3\51\13\0\5\260\1\51\1\0\4\51"+
-    "\2\0\2\165\1\211\1\235\1\165\1\235\3\165\1\212"+
-    "\2\165\1\261\50\165\2\237\1\240\6\237\1\262\53\237"+
-    "\3\0\1\241\1\0\1\241\6\0\1\167\50\0\2\166"+
-    "\1\214\1\242\1\166\1\242\4\166\1\212\1\166\1\263"+
-    "\50\166\2\244\1\245\7\244\1\264\52\244\1\0\1\265"+
-    "\4\0\1\265\1\0\1\141\13\0\1\266\23\0\5\265"+
-    "\34\0\1\266\41\0\1\267\4\0\1\267\41\0\5\267"+
-    "\10\0\1\115\1\270\1\116\1\54\1\115\1\54\1\270"+
-    "\2\54\1\0\3\115\6\54\4\115\2\54\1\115\3\54"+
-    "\1\117\1\115\1\117\10\115\5\270\1\54\1\115\4\54"+
-    "\2\115\1\271\1\272\1\273\1\274\1\271\1\274\3\272"+
-    "\1\275\1\276\1\271\1\115\6\272\1\115\3\271\2\272"+
-    "\1\271\3\272\1\277\1\271\1\300\10\271\6\272\1\271"+
-    "\4\272\2\271\1\115\1\54\1\116\3\115\3\54\1\0"+
-    "\3\115\6\54\4\115\2\54\1\115\3\54\1\117\1\115"+
-    "\1\117\10\115\1\301\5\54\1\115\4\54\3\115\1\54"+
-    "\1\116\3\115\3\54\1\0\3\115\1\54\1\302\4\54"+
-    "\4\115\2\54\1\115\3\54\1\117\1\115\1\117\10\115"+
-    "\6\54\1\115\4\54\2\115\34\0\1\303\31\0\1\304"+
-    "\1\71\1\70\1\0\1\70\1\304\2\70\4\0\6\70"+
-    "\3\0\1\34\2\70\1\0\3\70\1\35\12\0\5\304"+
-    "\1\70\1\0\4\70\3\0\1\51\1\50\1\51\1\0"+
-    "\4\51\4\0\6\51\4\0\2\51\1\0\3\51\13\0"+
-    "\6\51\1\0\4\51\2\0\2\237\1\240\1\262\1\237"+
-    "\1\262\3\237\1\241\2\237\1\261\50\237\2\244\1\245"+
-    "\1\264\1\244\1\264\4\244\1\241\1\244\1\263\50\244"+
-    "\10\0\1\141\55\0\1\305\4\0\1\305\41\0\5\305"+
-    "\10\0\1\115\1\54\1\116\1\54\1\115\4\54\1\0"+
-    "\3\115\6\54\4\115\2\54\1\115\3\54\1\117\1\115"+
-    "\1\117\10\115\6\54\1\115\4\54\2\115\2\271\1\306"+
-    "\6\271\1\0\1\115\1\271\1\115\6\271\1\115\11\271"+
-    "\1\277\1\271\1\300\26\271\1\272\1\273\3\271\3\272"+
-    "\1\0\1\115\1\271\1\115\6\272\1\115\3\271\2\272"+
-    "\1\271\3\272\1\277\1\271\1\300\10\271\6\272\1\271"+
-    "\4\272\3\271\1\307\1\310\1\271\2\272\1\307\26\272"+
-    "\1\311\1\272\1\312\10\272\5\307\10\272\2\271\1\306"+
-    "\1\274\1\271\1\274\3\271\1\275\1\276\1\271\1\115"+
-    "\6\271\1\115\11\271\1\277\1\271\1\300\25\271\2\275"+
-    "\1\313\6\275\1\314\53\275\2\276\1\315\6\276\1\316"+
-    "\1\317\22\276\1\320\1\276\1\320\25\276\2\321\1\322"+
-    "\6\321\2\0\1\321\1\0\6\321\1\0\11\321\1\277"+
-    "\27\321\1\115\1\54\1\116\3\115\3\54\1\0\3\115"+
-    "\6\54\4\115\2\54\1\115\3\54\1\117\1\115\1\117"+
-    "\10\115\4\54\1\323\1\54\1\115\4\54\3\115\1\54"+
-    "\1\116\1\324\1\115\1\324\3\54\1\325\1\326\2\115"+
-    "\6\54\4\115\2\54\1\115\3\54\1\117\1\115\1\117"+
-    "\10\115\6\54\1\115\4\54\2\115\17\0\1\327\46\0"+
-    "\1\70\1\71\1\70\1\0\4\70\4\0\6\70\3\0"+
-    "\1\34\2\70\1\0\3\70\1\35\12\0\6\70\1\0"+
-    "\4\70\3\0\1\330\4\0\1\330\41\0\5\330\10\0"+
-    "\2\271\1\306\6\271\1\321\23\271\1\277\1\271\1\300"+
-    "\26\271\1\331\1\273\1\272\1\271\1\272\1\331\2\272"+
-    "\1\0\1\115\1\271\1\115\6\272\1\115\3\271\2\272"+
-    "\1\271\3\272\1\277\1\271\1\300\10\271\5\331\1\272"+
-    "\1\271\4\272\3\271\1\272\1\273\3\271\3\272\1\321"+
-    "\3\271\6\272\4\271\2\272\1\271\3\272\1\277\1\271"+
-    "\1\300\10\271\6\272\1\271\4\272\2\271\2\275\1\313"+
-    "\6\275\1\332\53\275\1\0\1\333\1\334\1\335\1\0"+
-    "\1\335\2\333\5\0\6\333\4\0\2\333\1\0\3\333"+
-    "\1\336\12\0\6\333\1\0\4\333\2\0\2\276\1\315"+
-    "\6\276\1\316\1\337\22\276\1\320\1\276\1\320\25\276"+
-    "\2\316\1\340\7\316\1\314\52\316\1\115\1\341\1\342"+
-    "\1\343\1\115\1\343\2\341\1\115\1\0\3\115\6\341"+
-    "\4\115\2\341\1\115\3\341\1\336\1\115\1\117\10\115"+
-    "\6\341\1\115\4\341\2\115\2\321\1\322\32\321\1\277"+
-    "\27\321\1\115\1\54\1\116\3\115\3\54\1\0\3\115"+
-    "\6\54\4\115\2\54\1\115\3\54\1\117\1\115\1\117"+
-    "\10\115\1\54\1\344\4\54\1\115\4\54\5\115\1\324"+
-    "\1\115\1\324\3\115\1\325\1\326\22\115\1\117\1\115"+
-    "\1\117\25\115\2\325\1\345\6\325\1\346\53\325\2\326"+
-    "\1\347\6\326\1\350\1\115\22\326\1\351\1\326\1\351"+
-    "\25\326\16\0\1\352\46\0\1\271\1\353\1\273\1\272"+
-    "\1\271\1\272\1\353\2\272\1\0\1\115\1\271\1\115"+
-    "\6\272\1\115\3\271\2\272\1\271\3\272\1\277\1\271"+
-    "\1\300\10\271\5\353\1\272\1\271\4\272\2\271\1\275"+
-    "\1\354\1\355\1\356\1\275\1\356\2\354\1\275\1\314"+
-    "\3\275\6\354\4\275\2\354\1\275\3\354\1\357\12\275"+
-    "\6\354\1\275\4\354\2\275\1\0\1\333\1\334\1\360"+
-    "\1\0\1\360\3\333\4\0\6\333\3\0\1\335\2\333"+
-    "\1\0\3\333\1\336\12\0\6\333\1\0\4\333\3\0"+
-    "\1\361\1\333\1\0\2\333\1\361\41\333\5\361\10\333"+
-    "\1\0\1\333\1\334\1\335\1\0\1\335\2\333\5\0"+
-    "\6\333\4\0\2\333\1\0\3\333\13\0\6\333\1\0"+
-    "\4\333\2\0\1\276\1\362\1\363\1\364\1\276\1\364"+
-    "\2\362\1\276\1\316\1\317\2\276\6\362\4\276\2\362"+
-    "\1\276\3\362\1\365\1\276\1\320\10\276\6\362\1\276"+
-    "\4\362\2\276\2\316\1\340\7\316\1\366\52\316\1\115"+
-    "\1\341\1\342\1\367\1\115\1\367\3\341\1\0\3\115"+
-    "\6\341\3\115\1\343\2\341\1\115\3\341\1\336\1\115"+
-    "\1\117\10\115\6\341\1\115\4\341\3\115\1\370\1\341"+
-    "\1\115\2\341\1\370\2\341\1\333\23\341\1\371\1\341"+
-    "\1\371\10\341\5\370\10\341\1\115\1\341\1\342\1\343"+
-    "\1\115\1\343\2\341\1\115\1\0\3\115\6\341\4\115"+
-    "\2\341\1\115\3\341\1\117\1\115\1\117\10\115\6\341"+
-    "\1\115\4\341\2\115\2\325\1\345\6\325\1\372\53\325"+
-    "\3\0\1\346\1\0\1\346\27\0\1\373\27\0\2\326"+
-    "\1\347\6\326\1\350\23\326\1\351\1\326\1\351\25\326"+
-    "\2\350\1\374\7\350\1\346\52\350\50\0\1\375\14\0"+
-    "\1\271\1\376\1\273\1\272\1\271\1\272\1\376\2\272"+
-    "\1\0\1\115\1\271\1\115\6\272\1\115\3\271\2\272"+
-    "\1\271\3\272\1\277\1\271\1\300\10\271\5\376\1\272"+
-    "\1\271\4\272\2\271\1\275\1\354\1\355\1\377\1\275"+
-    "\1\377\3\354\1\314\3\275\6\354\3\275\1\356\2\354"+
-    "\1\275\3\354\1\357\12\275\6\354\1\275\4\354\3\275"+
-    "\1\u0100\1\u0101\1\275\2\354\1\u0100\2\354\1\u0102\36\354"+
-    "\5\u0100\10\354\1\275\1\354\1\355\1\356\1\275\1\356"+
-    "\2\354\1\275\1\314\3\275\6\354\4\275\2\354\1\275"+
-    "\3\354\13\275\6\354\1\275\4\354\2\275\3\0\1\360"+
-    "\1\0\1\360\20\0\1\335\6\0\1\336\30\0\1\u0103"+
-    "\1\334\1\333\1\0\1\333\1\u0103\2\333\4\0\6\333"+
-    "\3\0\1\335\2\333\1\0\3\333\1\336\12\0\5\u0103"+
-    "\1\333\1\0\4\333\2\0\1\276\1\362\1\363\1\u0104"+
-    "\1\276\1\u0104\3\362\1\316\1\317\2\276\6\362\3\276"+
-    "\1\364\2\362\1\276\3\362\1\365\1\276\1\320\10\276"+
-    "\6\362\1\276\4\362\3\276\1\u0105\1\u0106\1\276\2\362"+
-    "\1\u0105\2\362\1\u0107\1\u0108\22\362\1\u0109\1\362\1\u0109"+
-    "\10\362\5\u0105\10\362\1\276\1\362\1\363\1\364\1\276"+
-    "\1\364\2\362\1\276\1\316\1\317\2\276\6\362\4\276"+
-    "\2\362\1\276\3\362\1\320\1\276\1\320\10\276\6\362"+
-    "\1\276\4\362\2\276\1\316\1\u0107\1\u010a\1\u010b\1\316"+
-    "\1\u010b\2\u0107\2\316\1\314\2\316\6\u0107\4\316\2\u0107"+
-    "\1\316\3\u0107\1\365\12\316\6\u0107\1\316\4\u0107\2\316"+
-    "\3\115\1\367\1\115\1\367\3\115\1\0\14\115\1\343"+
-    "\6\115\1\336\1\115\1\117\26\115\1\u010c\1\342\1\341"+
-    "\1\115\1\341\1\u010c\2\341\1\0\3\115\6\341\3\115"+
-    "\1\343\2\341\1\115\3\341\1\336\1\115\1\117\10\115"+
-    "\5\u010c\1\341\1\115\4\341\2\115\2\325\1\345\1\372"+
-    "\1\325\1\372\3\325\1\346\23\325\1\u010d\27\325\2\350"+
-    "\1\374\7\350\1\u010e\52\350\21\0\1\u010f\43\0\1\271"+
-    "\1\u0110\1\273\1\272\1\271\1\272\1\u0110\2\272\1\0"+
-    "\1\115\1\271\1\115\6\272\1\115\3\271\2\272\1\271"+
-    "\3\272\1\277\1\271\1\300\10\271\5\u0110\1\272\1\271"+
-    "\4\272\2\271\2\275\1\313\1\377\1\275\1\377\3\275"+
-    "\1\314\14\275\1\356\6\275\1\357\30\275\1\u0111\1\355"+
-    "\1\354\1\275\1\354\1\u0111\2\354\1\314\3\275\6\354"+
-    "\3\275\1\356\2\354\1\275\3\354\1\357\12\275\5\u0111"+
-    "\1\354\1\275\4\354\3\275\1\354\1\355\1\377\1\275"+
-    "\1\377\3\354\1\332\3\275\6\354\3\275\1\356\2\354"+
-    "\1\275\3\354\1\357\12\275\6\354\1\275\4\354\3\275"+
-    "\1\354\1\355\1\u0112\1\275\1\u0112\3\354\1\314\3\275"+
-    "\6\354\3\275\1\356\2\354\1\275\3\354\1\357\12\275"+
-    "\6\354\1\275\4\354\2\275\1\0\1\u0113\1\334\1\333"+
-    "\1\0\1\333\1\u0113\2\333\4\0\6\333\3\0\1\335"+
-    "\2\333\1\0\3\333\1\336\12\0\5\u0113\1\333\1\0"+
-    "\4\333\2\0\2\276\1\315\1\u0104\1\276\1\u0104\3\276"+
-    "\1\316\1\317\13\276\1\364\6\276\1\365\1\276\1\320"+
-    "\26\276\1\u0114\1\363\1\362\1\276\1\362\1\u0114\2\362"+
-    "\1\316\1\317\2\276\6\362\3\276\1\364\2\362\1\276"+
-    "\3\362\1\365\1\276\1\320\10\276\5\u0114\1\362\1\276"+
-    "\4\362\3\276\1\362\1\363\1\u0104\1\276\1\u0104\3\362"+
-    "\1\316\1\337\2\276\6\362\3\276\1\364\2\362\1\276"+
-    "\3\362\1\365\1\276\1\320\10\276\6\362\1\276\4\362"+
-    "\2\276\1\316\1\u0107\1\u010a\1\u0115\1\316\1\u0115\3\u0107"+
-    "\1\316\1\314\2\316\6\u0107\3\316\1\u010b\2\u0107\1\316"+
-    "\3\u0107\1\365\12\316\6\u0107\1\316\4\u0107\2\316\1\276"+
-    "\1\362\1\363\1\u0116\1\276\1\u0116\3\362\1\316\1\317"+
-    "\2\276\6\362\3\276\1\364\2\362\1\276\3\362\1\365"+
-    "\1\276\1\320\10\276\6\362\1\276\4\362\2\276\1\316"+
-    "\1\u0117\1\u0118\1\316\2\u0107\1\u0117\3\u0107\1\u0119\35\u0107"+
-    "\5\u0117\10\u0107\1\316\1\u0107\1\u010a\1\u010b\1\316\1\u010b"+
-    "\2\u0107\2\316\1\314\2\316\6\u0107\4\316\2\u0107\1\316"+
-    "\3\u0107\13\316\6\u0107\1\316\4\u0107\2\316\1\115\1\u011a"+
-    "\1\342\1\341\1\115\1\341\1\u011a\2\341\1\0\3\115"+
-    "\6\341\3\115\1\343\2\341\1\115\3\341\1\336\1\115"+
-    "\1\117\10\115\5\u011a\1\341\1\115\4\341\2\115\2\350"+
-    "\1\374\1\u010e\1\350\1\u010e\4\350\1\346\22\350\1\u011b"+
-    "\27\350\16\0\1\u011c\46\0\1\271\1\u011d\1\273\1\272"+
-    "\1\271\1\272\1\u011d\2\272\1\0\1\115\1\271\1\115"+
-    "\6\272\1\115\3\271\2\272\1\271\3\272\1\277\1\271"+
-    "\1\300\10\271\5\u011d\1\272\1\271\4\272\2\271\1\275"+
-    "\1\u011e\1\355\1\354\1\275\1\354\1\u011e\2\354\1\314"+
-    "\3\275\6\354\3\275\1\356\2\354\1\275\3\354\1\357"+
-    "\12\275\5\u011e\1\354\1\275\4\354\3\275\1\354\1\355"+
-    "\1\u0112\1\275\1\u0112\2\354\1\275\1\314\3\275\6\354"+
-    "\3\275\1\356\2\354\1\275\3\354\1\357\12\275\6\354"+
-    "\1\275\4\354\2\275\1\0\1\u011f\1\334\1\333\1\0"+
-    "\1\333\1\u011f\2\333\4\0\6\333\3\0\1\335\2\333"+
-    "\1\0\3\333\1\336\12\0\5\u011f\1\333\1\0\4\333"+
-    "\2\0\1\276\1\u0120\1\363\1\362\1\276\1\362\1\u0120"+
-    "\2\362\1\316\1\317\2\276\6\362\3\276\1\364\2\362"+
-    "\1\276\3\362\1\365\1\276\1\320\10\276\5\u0120\1\362"+
-    "\1\276\4\362\2\276\2\316\1\340\1\u0115\1\316\1\u0115"+
-    "\4\316\1\314\13\316\1\u010b\6\316\1\365\27\316\1\276"+
-    "\1\362\1\363\1\u0116\1\276\1\u0116\2\362\1\276\1\316"+
-    "\1\317\2\276\6\362\3\276\1\364\2\362\1\276\3\362"+
-    "\1\365\1\276\1\320\10\276\6\362\1\276\4\362\2\276"+
-    "\1\316\1\u0121\1\u010a\1\u0107\1\316\1\u0107\1\u0121\2\u0107"+
-    "\1\316\1\314\2\316\6\u0107\3\316\1\u010b\2\u0107\1\316"+
-    "\3\u0107\1\365\12\316\5\u0121\1\u0107\1\316\4\u0107\3\316"+
-    "\1\u0107\1\u010a\1\u0115\1\316\1\u0115\3\u0107\1\316\1\366"+
-    "\2\316\6\u0107\3\316\1\u010b\2\u0107\1\316\3\u0107\1\365"+
-    "\12\316\6\u0107\1\316\4\u0107\3\316\1\u0107\1\u010a\1\u0122"+
-    "\1\316\1\u0122\3\u0107\1\316\1\314\2\316\6\u0107\3\316"+
-    "\1\u010b\2\u0107\1\316\3\u0107\1\365\12\316\6\u0107\1\316"+
-    "\4\u0107\2\316\1\115\1\u0123\1\342\1\341\1\115\1\341"+
-    "\1\u0123\2\341\1\0\3\115\6\341\3\115\1\343\2\341"+
-    "\1\115\3\341\1\336\1\115\1\117\10\115\5\u0123\1\341"+
-    "\1\115\4\341\2\115\1\271\1\272\1\273\1\272\1\271"+
-    "\4\272\1\0\1\115\1\271\1\115\6\272\1\115\3\271"+
-    "\2\272\1\271\3\272\1\277\1\271\1\300\10\271\6\272"+
-    "\1\271\4\272\2\271\1\275\1\u0124\1\355\1\354\1\275"+
-    "\1\354\1\u0124\2\354\1\314\3\275\6\354\3\275\1\356"+
-    "\2\354\1\275\3\354\1\357\12\275\5\u0124\1\354\1\275"+
-    "\4\354\2\275\1\0\1\u0125\1\334\1\333\1\0\1\333"+
-    "\1\u0125\2\333\4\0\6\333\3\0\1\335\2\333\1\0"+
-    "\3\333\1\336\12\0\5\u0125\1\333\1\0\4\333\2\0"+
-    "\1\276\1\u0126\1\363\1\362\1\276\1\362\1\u0126\2\362"+
-    "\1\316\1\317\2\276\6\362\3\276\1\364\2\362\1\276"+
-    "\3\362\1\365\1\276\1\320\10\276\5\u0126\1\362\1\276"+
-    "\4\362\2\276\1\316\1\u0127\1\u010a\1\u0107\1\316\1\u0107"+
-    "\1\u0127\2\u0107\1\316\1\314\2\316\6\u0107\3\316\1\u010b"+
-    "\2\u0107\1\316\3\u0107\1\365\12\316\5\u0127\1\u0107\1\316"+
-    "\4\u0107\3\316\1\u0107\1\u010a\1\u0122\1\316\1\u0122\2\u0107"+
-    "\2\316\1\314\2\316\6\u0107\3\316\1\u010b\2\u0107\1\316"+
-    "\3\u0107\1\365\12\316\6\u0107\1\316\4\u0107\2\316\1\115"+
-    "\1\u0128\1\342\1\341\1\115\1\341\1\u0128\2\341\1\0"+
-    "\3\115\6\341\3\115\1\343\2\341\1\115\3\341\1\336"+
-    "\1\115\1\117\10\115\5\u0128\1\341\1\115\4\341\2\115"+
-    "\1\275\1\u0129\1\355\1\354\1\275\1\354\1\u0129\2\354"+
-    "\1\314\3\275\6\354\3\275\1\356\2\354\1\275\3\354"+
-    "\1\357\12\275\5\u0129\1\354\1\275\4\354\2\275\1\0"+
-    "\1\u012a\1\334\1\333\1\0\1\333\1\u012a\2\333\4\0"+
-    "\6\333\3\0\1\335\2\333\1\0\3\333\1\336\12\0"+
-    "\5\u012a\1\333\1\0\4\333\2\0\1\276\1\u012b\1\363"+
-    "\1\362\1\276\1\362\1\u012b\2\362\1\316\1\317\2\276"+
-    "\6\362\3\276\1\364\2\362\1\276\3\362\1\365\1\276"+
-    "\1\320\10\276\5\u012b\1\362\1\276\4\362\2\276\1\316"+
-    "\1\u012c\1\u010a\1\u0107\1\316\1\u0107\1\u012c\2\u0107\1\316"+
-    "\1\314\2\316\6\u0107\3\316\1\u010b\2\u0107\1\316\3\u0107"+
-    "\1\365\12\316\5\u012c\1\u0107\1\316\4\u0107\2\316\1\115"+
-    "\1\u012d\1\342\1\341\1\115\1\341\1\u012d\2\341\1\0"+
-    "\3\115\6\341\3\115\1\343\2\341\1\115\3\341\1\336"+
-    "\1\115\1\117\10\115\5\u012d\1\341\1\115\4\341\2\115"+
-    "\1\275\1\u012e\1\355\1\354\1\275\1\354\1\u012e\2\354"+
-    "\1\314\3\275\6\354\3\275\1\356\2\354\1\275\3\354"+
-    "\1\357\12\275\5\u012e\1\354\1\275\4\354\2\275\1\0"+
-    "\1\333\1\334\1\333\1\0\4\333\4\0\6\333\3\0"+
-    "\1\335\2\333\1\0\3\333\1\336\12\0\6\333\1\0"+
-    "\4\333\2\0\1\276\1\u012f\1\363\1\362\1\276\1\362"+
-    "\1\u012f\2\362\1\316\1\317\2\276\6\362\3\276\1\364"+
-    "\2\362\1\276\3\362\1\365\1\276\1\320\10\276\5\u012f"+
-    "\1\362\1\276\4\362\2\276\1\316\1\u0130\1\u010a\1\u0107"+
-    "\1\316\1\u0107\1\u0130\2\u0107\1\316\1\314\2\316\6\u0107"+
-    "\3\316\1\u010b\2\u0107\1\316\3\u0107\1\365\12\316\5\u0130"+
-    "\1\u0107\1\316\4\u0107\2\316\1\115\1\341\1\342\1\341"+
-    "\1\115\4\341\1\0\3\115\6\341\3\115\1\343\2\341"+
-    "\1\115\3\341\1\336\1\115\1\117\10\115\6\341\1\115"+
-    "\4\341\2\115\1\275\1\354\1\355\1\354\1\275\4\354"+
-    "\1\314\3\275\6\354\3\275\1\356\2\354\1\275\3\354"+
-    "\1\357\12\275\6\354\1\275\4\354\2\275\1\276\1\362"+
-    "\1\363\1\362\1\276\4\362\1\316\1\317\2\276\6\362"+
-    "\3\276\1\364\2\362\1\276\3\362\1\365\1\276\1\320"+
-    "\10\276\6\362\1\276\4\362\2\276\1\316\1\u0131\1\u010a"+
-    "\1\u0107\1\316\1\u0107\1\u0131\2\u0107\1\316\1\314\2\316"+
-    "\6\u0107\3\316\1\u010b\2\u0107\1\316\3\u0107\1\365\12\316"+
-    "\5\u0131\1\u0107\1\316\4\u0107\3\316\1\u0107\1\u010a\1\u0107"+
-    "\1\316\4\u0107\1\316\1\314\2\316\6\u0107\3\316\1\u010b"+
-    "\2\u0107\1\316\3\u0107\1\365\12\316\6\u0107\1\316\4\u0107"+
-    "\2\316";
+    "\3\54\1\117\1\115\1\117\10\115\4\54\1\321\1\54"+
+    "\1\115\4\54\3\115\1\54\1\116\1\322\1\115\1\322"+
+    "\3\54\1\323\1\324\2\115\6\54\4\115\2\54\1\115"+
+    "\3\54\1\117\1\115\1\117\10\115\6\54\1\115\4\54"+
+    "\2\115\17\0\1\325\46\0\1\70\1\71\1\70\1\0"+
+    "\4\70\4\0\6\70\3\0\1\34\2\70\1\0\3\70"+
+    "\1\35\12\0\6\70\1\0\4\70\3\0\1\326\4\0"+
+    "\1\326\41\0\5\326\10\0\2\267\1\304\6\267\1\317"+
+    "\23\267\1\275\1\267\1\276\26\267\1\327\1\271\1\270"+
+    "\1\267\1\270\1\327\2\270\1\0\1\115\1\267\1\115"+
+    "\6\270\1\115\3\267\2\270\1\267\3\270\1\275\1\267"+
+    "\1\276\10\267\5\327\1\270\1\267\4\270\3\267\1\270"+
+    "\1\271\3\267\3\270\1\317\3\267\6\270\4\267\2\270"+
+    "\1\267\3\270\1\275\1\267\1\276\10\267\6\270\1\267"+
+    "\4\270\2\267\2\273\1\311\6\273\1\330\53\273\1\0"+
+    "\1\331\1\332\1\333\1\0\1\333\2\331\5\0\6\331"+
+    "\4\0\2\331\1\0\3\331\1\334\12\0\6\331\1\0"+
+    "\4\331\2\0\2\274\1\313\6\274\1\314\1\335\22\274"+
+    "\1\316\1\274\1\316\25\274\2\314\1\336\7\314\1\312"+
+    "\52\314\1\115\1\337\1\340\1\341\1\115\1\341\2\337"+
+    "\1\115\1\0\3\115\6\337\4\115\2\337\1\115\3\337"+
+    "\1\334\1\115\1\117\10\115\6\337\1\115\4\337\2\115"+
+    "\2\317\1\320\32\317\1\275\27\317\1\115\1\54\1\116"+
+    "\3\115\3\54\1\0\3\115\6\54\4\115\2\54\1\115"+
+    "\3\54\1\117\1\115\1\117\10\115\1\54\1\342\4\54"+
+    "\1\115\4\54\5\115\1\322\1\115\1\322\3\115\1\323"+
+    "\1\324\22\115\1\117\1\115\1\117\25\115\2\323\1\343"+
+    "\6\323\1\344\53\323\2\324\1\345\6\324\1\346\1\115"+
+    "\22\324\1\347\1\324\1\347\25\324\16\0\1\350\46\0"+
+    "\1\267\1\351\1\271\1\270\1\267\1\270\1\351\2\270"+
+    "\1\0\1\115\1\267\1\115\6\270\1\115\3\267\2\270"+
+    "\1\267\3\270\1\275\1\267\1\276\10\267\5\351\1\270"+
+    "\1\267\4\270\2\267\1\273\1\352\1\353\1\354\1\273"+
+    "\1\354\2\352\1\273\1\312\3\273\6\352\4\273\2\352"+
+    "\1\273\3\352\1\355\12\273\6\352\1\273\4\352\2\273"+
+    "\1\0\1\331\1\332\1\356\1\0\1\356\3\331\4\0"+
+    "\6\331\3\0\1\333\2\331\1\0\3\331\1\334\12\0"+
+    "\6\331\1\0\4\331\3\0\1\357\1\331\1\0\2\331"+
+    "\1\357\41\331\5\357\10\331\1\0\1\331\1\332\1\333"+
+    "\1\0\1\333\2\331\5\0\6\331\4\0\2\331\1\0"+
+    "\3\331\13\0\6\331\1\0\4\331\2\0\1\274\1\360"+
+    "\1\361\1\362\1\274\1\362\2\360\1\274\1\314\1\315"+
+    "\2\274\6\360\4\274\2\360\1\274\3\360\1\363\1\274"+
+    "\1\316\10\274\6\360\1\274\4\360\2\274\2\314\1\336"+
+    "\7\314\1\364\52\314\1\115\1\337\1\340\1\365\1\115"+
+    "\1\365\3\337\1\0\3\115\6\337\3\115\1\341\2\337"+
+    "\1\115\3\337\1\334\1\115\1\117\10\115\6\337\1\115"+
+    "\4\337\3\115\1\366\1\337\1\115\2\337\1\366\2\337"+
+    "\1\331\23\337\1\367\1\337\1\367\10\337\5\366\10\337"+
+    "\1\115\1\337\1\340\1\341\1\115\1\341\2\337\1\115"+
+    "\1\0\3\115\6\337\4\115\2\337\1\115\3\337\1\117"+
+    "\1\115\1\117\10\115\6\337\1\115\4\337\2\115\2\323"+
+    "\1\343\6\323\1\370\53\323\3\0\1\344\1\0\1\344"+
+    "\27\0\1\371\27\0\2\324\1\345\6\324\1\346\23\324"+
+    "\1\347\1\324\1\347\25\324\2\346\1\372\7\346\1\344"+
+    "\52\346\50\0\1\373\14\0\1\267\1\374\1\271\1\270"+
+    "\1\267\1\270\1\374\2\270\1\0\1\115\1\267\1\115"+
+    "\6\270\1\115\3\267\2\270\1\267\3\270\1\275\1\267"+
+    "\1\276\10\267\5\374\1\270\1\267\4\270\2\267\1\273"+
+    "\1\352\1\353\1\375\1\273\1\375\3\352\1\312\3\273"+
+    "\6\352\3\273\1\354\2\352\1\273\3\352\1\355\12\273"+
+    "\6\352\1\273\4\352\3\273\1\376\1\377\1\273\2\352"+
+    "\1\376\2\352\1\u0100\36\352\5\376\10\352\1\273\1\352"+
+    "\1\353\1\354\1\273\1\354\2\352\1\273\1\312\3\273"+
+    "\6\352\4\273\2\352\1\273\3\352\13\273\6\352\1\273"+
+    "\4\352\2\273\3\0\1\356\1\0\1\356\20\0\1\333"+
+    "\6\0\1\334\30\0\1\u0101\1\332\1\331\1\0\1\331"+
+    "\1\u0101\2\331\4\0\6\331\3\0\1\333\2\331\1\0"+
+    "\3\331\1\334\12\0\5\u0101\1\331\1\0\4\331\2\0"+
+    "\1\274\1\360\1\361\1\u0102\1\274\1\u0102\3\360\1\314"+
+    "\1\315\2\274\6\360\3\274\1\362\2\360\1\274\3\360"+
+    "\1\363\1\274\1\316\10\274\6\360\1\274\4\360\3\274"+
+    "\1\u0103\1\u0104\1\274\2\360\1\u0103\2\360\1\u0105\1\u0106"+
+    "\22\360\1\u0107\1\360\1\u0107\10\360\5\u0103\10\360\1\274"+
+    "\1\360\1\361\1\362\1\274\1\362\2\360\1\274\1\314"+
+    "\1\315\2\274\6\360\4\274\2\360\1\274\3\360\1\316"+
+    "\1\274\1\316\10\274\6\360\1\274\4\360\2\274\1\314"+
+    "\1\u0105\1\u0108\1\u0109\1\314\1\u0109\2\u0105\2\314\1\312"+
+    "\2\314\6\u0105\4\314\2\u0105\1\314\3\u0105\1\363\12\314"+
+    "\6\u0105\1\314\4\u0105\2\314\3\115\1\365\1\115\1\365"+
+    "\3\115\1\0\14\115\1\341\6\115\1\334\1\115\1\117"+
+    "\26\115\1\u010a\1\340\1\337\1\115\1\337\1\u010a\2\337"+
+    "\1\0\3\115\6\337\3\115\1\341\2\337\1\115\3\337"+
+    "\1\334\1\115\1\117\10\115\5\u010a\1\337\1\115\4\337"+
+    "\2\115\2\323\1\343\1\370\1\323\1\370\3\323\1\344"+
+    "\23\323\1\u010b\27\323\2\346\1\372\7\346\1\u010c\52\346"+
+    "\21\0\1\u010d\43\0\1\267\1\u010e\1\271\1\270\1\267"+
+    "\1\270\1\u010e\2\270\1\0\1\115\1\267\1\115\6\270"+
+    "\1\115\3\267\2\270\1\267\3\270\1\275\1\267\1\276"+
+    "\10\267\5\u010e\1\270\1\267\4\270\2\267\2\273\1\311"+
+    "\1\375\1\273\1\375\3\273\1\312\14\273\1\354\6\273"+
+    "\1\355\30\273\1\u010f\1\353\1\352\1\273\1\352\1\u010f"+
+    "\2\352\1\312\3\273\6\352\3\273\1\354\2\352\1\273"+
+    "\3\352\1\355\12\273\5\u010f\1\352\1\273\4\352\3\273"+
+    "\1\352\1\353\1\375\1\273\1\375\3\352\1\330\3\273"+
+    "\6\352\3\273\1\354\2\352\1\273\3\352\1\355\12\273"+
+    "\6\352\1\273\4\352\3\273\1\352\1\353\1\u0110\1\273"+
+    "\1\u0110\3\352\1\312\3\273\6\352\3\273\1\354\2\352"+
+    "\1\273\3\352\1\355\12\273\6\352\1\273\4\352\2\273"+
+    "\1\0\1\u0111\1\332\1\331\1\0\1\331\1\u0111\2\331"+
+    "\4\0\6\331\3\0\1\333\2\331\1\0\3\331\1\334"+
+    "\12\0\5\u0111\1\331\1\0\4\331\2\0\2\274\1\313"+
+    "\1\u0102\1\274\1\u0102\3\274\1\314\1\315\13\274\1\362"+
+    "\6\274\1\363\1\274\1\316\26\274\1\u0112\1\361\1\360"+
+    "\1\274\1\360\1\u0112\2\360\1\314\1\315\2\274\6\360"+
+    "\3\274\1\362\2\360\1\274\3\360\1\363\1\274\1\316"+
+    "\10\274\5\u0112\1\360\1\274\4\360\3\274\1\360\1\361"+
+    "\1\u0102\1\274\1\u0102\3\360\1\314\1\335\2\274\6\360"+
+    "\3\274\1\362\2\360\1\274\3\360\1\363\1\274\1\316"+
+    "\10\274\6\360\1\274\4\360\2\274\1\314\1\u0105\1\u0108"+
+    "\1\u0113\1\314\1\u0113\3\u0105\1\314\1\312\2\314\6\u0105"+
+    "\3\314\1\u0109\2\u0105\1\314\3\u0105\1\363\12\314\6\u0105"+
+    "\1\314\4\u0105\2\314\1\274\1\360\1\361\1\u0114\1\274"+
+    "\1\u0114\3\360\1\314\1\315\2\274\6\360\3\274\1\362"+
+    "\2\360\1\274\3\360\1\363\1\274\1\316\10\274\6\360"+
+    "\1\274\4\360\2\274\1\314\1\u0115\1\u0116\1\314\2\u0105"+
+    "\1\u0115\3\u0105\1\u0117\35\u0105\5\u0115\10\u0105\1\314\1\u0105"+
+    "\1\u0108\1\u0109\1\314\1\u0109\2\u0105\2\314\1\312\2\314"+
+    "\6\u0105\4\314\2\u0105\1\314\3\u0105\13\314\6\u0105\1\314"+
+    "\4\u0105\2\314\1\115\1\u0118\1\340\1\337\1\115\1\337"+
+    "\1\u0118\2\337\1\0\3\115\6\337\3\115\1\341\2\337"+
+    "\1\115\3\337\1\334\1\115\1\117\10\115\5\u0118\1\337"+
+    "\1\115\4\337\2\115\2\346\1\372\1\u010c\1\346\1\u010c"+
+    "\4\346\1\344\22\346\1\u0119\27\346\16\0\1\u011a\46\0"+
+    "\1\267\1\u011b\1\271\1\270\1\267\1\270\1\u011b\2\270"+
+    "\1\0\1\115\1\267\1\115\6\270\1\115\3\267\2\270"+
+    "\1\267\3\270\1\275\1\267\1\276\10\267\5\u011b\1\270"+
+    "\1\267\4\270\2\267\1\273\1\u011c\1\353\1\352\1\273"+
+    "\1\352\1\u011c\2\352\1\312\3\273\6\352\3\273\1\354"+
+    "\2\352\1\273\3\352\1\355\12\273\5\u011c\1\352\1\273"+
+    "\4\352\3\273\1\352\1\353\1\u0110\1\273\1\u0110\2\352"+
+    "\1\273\1\312\3\273\6\352\3\273\1\354\2\352\1\273"+
+    "\3\352\1\355\12\273\6\352\1\273\4\352\2\273\1\0"+
+    "\1\u011d\1\332\1\331\1\0\1\331\1\u011d\2\331\4\0"+
+    "\6\331\3\0\1\333\2\331\1\0\3\331\1\334\12\0"+
+    "\5\u011d\1\331\1\0\4\331\2\0\1\274\1\u011e\1\361"+
+    "\1\360\1\274\1\360\1\u011e\2\360\1\314\1\315\2\274"+
+    "\6\360\3\274\1\362\2\360\1\274\3\360\1\363\1\274"+
+    "\1\316\10\274\5\u011e\1\360\1\274\4\360\2\274\2\314"+
+    "\1\336\1\u0113\1\314\1\u0113\4\314\1\312\13\314\1\u0109"+
+    "\6\314\1\363\27\314\1\274\1\360\1\361\1\u0114\1\274"+
+    "\1\u0114\2\360\1\274\1\314\1\315\2\274\6\360\3\274"+
+    "\1\362\2\360\1\274\3\360\1\363\1\274\1\316\10\274"+
+    "\6\360\1\274\4\360\2\274\1\314\1\u011f\1\u0108\1\u0105"+
+    "\1\314\1\u0105\1\u011f\2\u0105\1\314\1\312\2\314\6\u0105"+
+    "\3\314\1\u0109\2\u0105\1\314\3\u0105\1\363\12\314\5\u011f"+
+    "\1\u0105\1\314\4\u0105\3\314\1\u0105\1\u0108\1\u0113\1\314"+
+    "\1\u0113\3\u0105\1\314\1\364\2\314\6\u0105\3\314\1\u0109"+
+    "\2\u0105\1\314\3\u0105\1\363\12\314\6\u0105\1\314\4\u0105"+
+    "\3\314\1\u0105\1\u0108\1\u0120\1\314\1\u0120\3\u0105\1\314"+
+    "\1\312\2\314\6\u0105\3\314\1\u0109\2\u0105\1\314\3\u0105"+
+    "\1\363\12\314\6\u0105\1\314\4\u0105\2\314\1\115\1\u0121"+
+    "\1\340\1\337\1\115\1\337\1\u0121\2\337\1\0\3\115"+
+    "\6\337\3\115\1\341\2\337\1\115\3\337\1\334\1\115"+
+    "\1\117\10\115\5\u0121\1\337\1\115\4\337\2\115\1\267"+
+    "\1\270\1\271\1\270\1\267\4\270\1\0\1\115\1\267"+
+    "\1\115\6\270\1\115\3\267\2\270\1\267\3\270\1\275"+
+    "\1\267\1\276\10\267\6\270\1\267\4\270\2\267\1\273"+
+    "\1\u0122\1\353\1\352\1\273\1\352\1\u0122\2\352\1\312"+
+    "\3\273\6\352\3\273\1\354\2\352\1\273\3\352\1\355"+
+    "\12\273\5\u0122\1\352\1\273\4\352\2\273\1\0\1\u0123"+
+    "\1\332\1\331\1\0\1\331\1\u0123\2\331\4\0\6\331"+
+    "\3\0\1\333\2\331\1\0\3\331\1\334\12\0\5\u0123"+
+    "\1\331\1\0\4\331\2\0\1\274\1\u0124\1\361\1\360"+
+    "\1\274\1\360\1\u0124\2\360\1\314\1\315\2\274\6\360"+
+    "\3\274\1\362\2\360\1\274\3\360\1\363\1\274\1\316"+
+    "\10\274\5\u0124\1\360\1\274\4\360\2\274\1\314\1\u0125"+
+    "\1\u0108\1\u0105\1\314\1\u0105\1\u0125\2\u0105\1\314\1\312"+
+    "\2\314\6\u0105\3\314\1\u0109\2\u0105\1\314\3\u0105\1\363"+
+    "\12\314\5\u0125\1\u0105\1\314\4\u0105\3\314\1\u0105\1\u0108"+
+    "\1\u0120\1\314\1\u0120\2\u0105\2\314\1\312\2\314\6\u0105"+
+    "\3\314\1\u0109\2\u0105\1\314\3\u0105\1\363\12\314\6\u0105"+
+    "\1\314\4\u0105\2\314\1\115\1\u0126\1\340\1\337\1\115"+
+    "\1\337\1\u0126\2\337\1\0\3\115\6\337\3\115\1\341"+
+    "\2\337\1\115\3\337\1\334\1\115\1\117\10\115\5\u0126"+
+    "\1\337\1\115\4\337\2\115\1\273\1\u0127\1\353\1\352"+
+    "\1\273\1\352\1\u0127\2\352\1\312\3\273\6\352\3\273"+
+    "\1\354\2\352\1\273\3\352\1\355\12\273\5\u0127\1\352"+
+    "\1\273\4\352\2\273\1\0\1\u0128\1\332\1\331\1\0"+
+    "\1\331\1\u0128\2\331\4\0\6\331\3\0\1\333\2\331"+
+    "\1\0\3\331\1\334\12\0\5\u0128\1\331\1\0\4\331"+
+    "\2\0\1\274\1\u0129\1\361\1\360\1\274\1\360\1\u0129"+
+    "\2\360\1\314\1\315\2\274\6\360\3\274\1\362\2\360"+
+    "\1\274\3\360\1\363\1\274\1\316\10\274\5\u0129\1\360"+
+    "\1\274\4\360\2\274\1\314\1\u012a\1\u0108\1\u0105\1\314"+
+    "\1\u0105\1\u012a\2\u0105\1\314\1\312\2\314\6\u0105\3\314"+
+    "\1\u0109\2\u0105\1\314\3\u0105\1\363\12\314\5\u012a\1\u0105"+
+    "\1\314\4\u0105\2\314\1\115\1\u012b\1\340\1\337\1\115"+
+    "\1\337\1\u012b\2\337\1\0\3\115\6\337\3\115\1\341"+
+    "\2\337\1\115\3\337\1\334\1\115\1\117\10\115\5\u012b"+
+    "\1\337\1\115\4\337\2\115\1\273\1\u012c\1\353\1\352"+
+    "\1\273\1\352\1\u012c\2\352\1\312\3\273\6\352\3\273"+
+    "\1\354\2\352\1\273\3\352\1\355\12\273\5\u012c\1\352"+
+    "\1\273\4\352\2\273\1\0\1\331\1\332\1\331\1\0"+
+    "\4\331\4\0\6\331\3\0\1\333\2\331\1\0\3\331"+
+    "\1\334\12\0\6\331\1\0\4\331\2\0\1\274\1\u012d"+
+    "\1\361\1\360\1\274\1\360\1\u012d\2\360\1\314\1\315"+
+    "\2\274\6\360\3\274\1\362\2\360\1\274\3\360\1\363"+
+    "\1\274\1\316\10\274\5\u012d\1\360\1\274\4\360\2\274"+
+    "\1\314\1\u012e\1\u0108\1\u0105\1\314\1\u0105\1\u012e\2\u0105"+
+    "\1\314\1\312\2\314\6\u0105\3\314\1\u0109\2\u0105\1\314"+
+    "\3\u0105\1\363\12\314\5\u012e\1\u0105\1\314\4\u0105\2\314"+
+    "\1\115\1\337\1\340\1\337\1\115\4\337\1\0\3\115"+
+    "\6\337\3\115\1\341\2\337\1\115\3\337\1\334\1\115"+
+    "\1\117\10\115\6\337\1\115\4\337\2\115\1\273\1\352"+
+    "\1\353\1\352\1\273\4\352\1\312\3\273\6\352\3\273"+
+    "\1\354\2\352\1\273\3\352\1\355\12\273\6\352\1\273"+
+    "\4\352\2\273\1\274\1\360\1\361\1\360\1\274\4\360"+
+    "\1\314\1\315\2\274\6\360\3\274\1\362\2\360\1\274"+
+    "\3\360\1\363\1\274\1\316\10\274\6\360\1\274\4\360"+
+    "\2\274\1\314\1\u012f\1\u0108\1\u0105\1\314\1\u0105\1\u012f"+
+    "\2\u0105\1\314\1\312\2\314\6\u0105\3\314\1\u0109\2\u0105"+
+    "\1\314\3\u0105\1\363\12\314\5\u012f\1\u0105\1\314\4\u0105"+
+    "\3\314\1\u0105\1\u0108\1\u0105\1\314\4\u0105\1\314\1\312"+
+    "\2\314\6\u0105\3\314\1\u0109\2\u0105\1\314\3\u0105\1\363"+
+    "\12\314\6\u0105\1\314\4\u0105\2\314";

   /** 
    * The transition table of the DFA
@@ -569,19 +569,19 @@
      0,  0,  0,  0,  0,  9,  9,  0,  0,  1,  9,  1,  1,  0,  0,  0, 
      0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  0,  0,  9,  0, 
      0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  1,  1,  1,  1, 
-     0,  1,  1,  0,  0,  0,  0,  0,  0,  9,  0,  9,  0,  0,  1,  1, 
-     1,  0,  0,  0,  0,  0,  9,  0,  1,  1,  1,  0,  0,  0,  1,  0, 
-     0,  1,  0,  0,  1,  1,  1,  1,  0,  0,  1,  0,  1,  0,  9,  1, 
-     1,  1,  0,  0,  1,  0,  0,  0,  0,  1,  1,  1,  0,  1,  0,  0, 
-     0,  0,  1,  0,  0,  1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  1, 
-     1,  0,  1,  0,  1,  9,  1,  0,  0,  0,  0,  0,  0,  0,  1,  1, 
-     0,  0,  0,  0,  1,  0,  0,  0,  1,  1,  0,  0,  0,  0,  0,  1, 
-     0,  0,  0,  0,  0,  0,  0,  9,  0,  0,  0,  0,  0,  9,  0,  0, 
-     0,  0,  0,  1,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  1,  0, 
-     0,  0,  0,  0,  1,  0,  0,  0,  1,  0,  9,  0,  0,  0,  0,  0, 
-     0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  1,  0,  0,  0, 
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  9,  0,  0,  0,  0, 
-     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
+     0,  1,  1,  0,  0,  0,  0,  0,  0,  9,  9,  0,  0,  1,  1,  1, 
+     0,  0,  0,  0,  0,  9,  0,  1,  1,  1,  0,  0,  0,  1,  0,  0, 
+     0,  0,  1,  1,  1,  1,  0,  0,  1,  0,  1,  0,  9,  1,  1,  1, 
+     0,  0,  1,  0,  0,  0,  0,  1,  1,  1,  0,  1,  0,  0,  0,  0, 
+     1,  0,  0,  1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  1,  1,  0, 
+     1,  0,  1,  9,  1,  0,  0,  0,  0,  0,  0,  0,  1,  1,  0,  0, 
+     0,  0,  1,  0,  0,  0,  1,  1,  0,  0,  0,  0,  0,  1,  0,  0, 
+     0,  0,  0,  0,  0,  9,  0,  0,  0,  0,  0,  9,  0,  0,  0,  0, 
+     0,  1,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  1,  0,  0,  0, 
+     0,  0,  1,  0,  0,  0,  1,  0,  9,  0,  0,  0,  0,  0,  0,  0, 
+     0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  1,  0,  0,  0,  0,  0, 
+     0,  0,  0,  0,  0,  0,  0,  0,  1,  9,  0,  0,  0,  0,  0,  0, 
+     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
   };

   /** the input device */
@@ -650,7 +650,7 @@
        // Writer
        Writer w = null; // Will NPE if not initialized properly

-       public void parse () throws IOException, DataFilterException {
+       public void parse () throws IOException {
                while (yylex() != null);
        }

@@ -660,7 +660,7 @@
                this.paranoidStringCheck = paranoidStringCheck;
        }

-       void throwError(String s) throws IOException, DataFilterException {
+       void throwError(String s) throws IOException {
                throw new IllegalStateException("You MUST override 
throwError!");
        }

@@ -692,9 +692,9 @@
        // This is not very efficient. The parser below knows the quoting rules 
too.

        static boolean isHexDigit(char c) {
-               return ((('a' <= c) && (c <= 'f')) ||
-                       (('A' <= c) && (c <= 'F')) ||
-                       (('0' <= c) && (c <= '9')));
+               return ('a' <= c && c <= 'f' ||
+                       'A' <= c && c <= 'F' ||
+                       '0' <= c && c <= '9');
        }

        class DecodedStringThingy {
@@ -708,7 +708,7 @@
                                url = true;
                        }
                        char q = s.charAt(0);
-                       if((q == '\'') || (q == '\"')) {
+                       if(q == '\'' || q == '\"') {
                                quote = q;
                                s = s.substring(1);
                        } else quote = ' ';
@@ -734,7 +734,7 @@
                                                justEscaping = false;
                                        }
                                } else if(stillEscaping) {
-                                       if(isHexDigit(c) && (hexEscape.length() 
< 6)) {
+                                       if(isHexDigit(c) && hexEscape.length() 
< 6) {
                                                hexEscape.append(c);
                                        } else if(Character.isWhitespace(c)) {
                                                // Ignore one whitespace char 
after an escape
@@ -772,7 +772,7 @@
                                                hexEscape = new StringBuffer();
                                        }
                                } else {
-                                       if((quote != ' ') && (c == quote)) {
+                                       if(quote != ' ' && c == quote) {
                                                break;
                                        } else if (c == '\\') {
                                                justEscaping = true;
@@ -802,7 +802,7 @@
                        StringBuffer sb = new StringBuffer();
                        for(int i=0;i<data.length();i++) {
                                char c = data.charAt(i);
-                               if((c == quote) || (c == '\n')) {
+                               if(c == quote || c == '\n') {
                                        sb.append('\\');
                                }
                                sb.append(c);
@@ -838,7 +838,7 @@
    * @return the unpacked transition table
    */
   private static int [] yy_unpack() {
-    int [] trans = new int[13356];
+    int [] trans = new int[13303];
     int offset = 0;
     offset = yy_unpack(yy_packed0, offset, trans);
     return trans;
@@ -1060,9 +1060,8 @@
    *
    * @return      the next token
    * @exception   IOException  if any I/O-Error occurs
- * @throws DataFilterException 
    */
-  public Yytoken yylex() throws java.io.IOException, DataFilterException {
+  public Yytoken yylex() throws java.io.IOException {
     int yy_input;
     int yy_action;

@@ -1137,12 +1136,12 @@

         case 78: 
         case 98: 
-        case 191: 
-        case 201: 
-        case 207: 
-        case 232: 
-        case 248: 
-        case 264: 
+        case 189: 
+        case 199: 
+        case 205: 
+        case 230: 
+        case 246: 
+        case 262: 
           { 
        if(!deleteErrors) {
                throwError("Unknown @identifier "+yytext());
@@ -1152,11 +1151,11 @@
                // Ignore
        }
  }
-        case 306: break;
-        case 118: 
-        case 135: 
+        case 304: break;
+        case 117: 
+        case 133: 
+        case 174: 
         case 176: 
-        case 178: 
           { 
        // This is horrible. However it seems that there is no other way to do 
it with either jflex or CUP, as {URL} cannot be an unambiguous token :(
        String s = yytext();
@@ -1176,7 +1175,7 @@
        if(debug) log("URL now: "+s);
        s = processURL(s);
        dst.data = s;
-       if((s == null) || s.equals("")) {
+       if(s == null || s.equals("")) {
                if(debug) log("URL invalid");
                w.write("url()");
        } else {
@@ -1185,7 +1184,7 @@
                w.write(s);
        }
  }
-        case 307: break;
+        case 305: break;
         case 26: 
         case 94: 
           { 
@@ -1194,7 +1193,7 @@
        w.write(s);
        if(debug) log("Matched function start: "+s);
  }
-        case 308: break;
+        case 306: break;
         case 28: 
           { 
        if(postBadImportFlag) {
@@ -1208,12 +1207,12 @@
                if(debug) log("Matched and passing on mediums list: "+s);
        }
  }
-        case 309: break;
-        case 190: 
-        case 200: 
-        case 221: 
-        case 238: 
-        case 244: 
+        case 307: break;
+        case 188: 
+        case 198: 
+        case 219: 
+        case 236: 
+        case 242: 
           { 
        String s = yytext();
        if(debug) log("Found @import: "+s);
@@ -1223,7 +1222,7 @@
        s = dst.data;
        if(debug) log("URL: "+s);
        s = processURL(s);
-       if (!((s == null) || s.equals(""))) {
+       if (!(s == null || s.equals(""))) {
                if(debug) log("URL now: "+s);
                s = "@import "+dst.toString();
                if(debug) log("Writing: "+s);
@@ -1231,78 +1230,68 @@
        } else
                if(debug) log("Dropped @import");
  }
-        case 310: break;
-        case 105: 
-        case 129: 
-          { 
-       // Comment
-       // CSS comments are harmless? - FIXME check
-       String s = yytext();
-       w.write(s);
-       if(debug) log("Matched comment: "+s);
- }
-        case 311: break;
-        case 107: 
+        case 308: break;
+        case 106: 
           {  
        String s = yytext();
        w.write(s);
        if(debug) log("Matched HTML comment: "+s);
  }
-        case 312: break;
-        case 148: 
+        case 309: break;
+        case 146: 
           { 
        String s = yytext();
        w.write(s);
        if(debug) log("Matched @media: "+s);
  }
-        case 313: break;
+        case 310: break;
         case 74: 
         case 75: 
         case 95: 
         case 97: 
+        case 119: 
         case 120: 
-        case 121: 
-        case 143: 
-        case 144: 
-        case 166: 
-        case 167: 
-        case 180: 
-        case 181: 
+        case 141: 
+        case 142: 
+        case 164: 
+        case 165: 
+        case 178: 
+        case 179: 
           { 
        String s = yytext();
        w.write(s);
        if(debug) log("Matched unicode: "+s);
  }
-        case 314: break;
+        case 311: break;
         case 37: 
           { 
        String s = yytext();
        w.write(s);
        if(debug) log("Matched number: "+s);
  }
-        case 315: break;
+        case 312: break;
         case 54: 
           { 
        String s = yytext();
        w.write(s);
        if(debug) log("Matched |=: "+s);
  }
-        case 316: break;
-        case 126: 
+        case 313: break;
+        case 125: 
           { 
        String s = yytext();
        w.write(s);
        if(debug) log("Matched @page: "+s);
  }
-        case 317: break;
+        case 314: break;
         case 92: 
-        case 154: 
+        case 152: 
           { 
        String s = yytext();
        if(debug) log("Got hexcolor: "+s);
        w.write(s);
  }
-        case 318: break;
+        case 315: break;
         case 2: 
         case 5: 
         case 13: 
@@ -1311,115 +1300,140 @@
         case 57: 
         case 73: 
         case 89: 
-        case 110: 
-        case 132: 
-        case 153: 
+        case 109: 
+        case 130: 
+        case 151: 
           { 
        String s = yytext();
        w.write(s);
        if(debug) log("Matched ident: "+s);
  }
-        case 319: break;
+        case 316: break;
         case 34: 
         case 59: 
         case 60: 
           { 
        String s = yytext();
        if(debug) log("Matched string: "+s);
-       if(paranoidStringCheck && (s.indexOf(':') != -1)) {
+       if(paranoidStringCheck && s.indexOf(':') != -1) {
                w.write("/* Deleted disallowed string */");
                log("Deleted disallowed string: "+s);
        } else {
                w.write(s);
        }
  }
-        case 320: break;
+        case 317: break;
         case 38: 
         case 40: 
         case 71: 
         case 72: 
         case 93: 
+        case 110: 
         case 111: 
-        case 112: 
-        case 133: 
-        case 134: 
-        case 155: 
-        case 175: 
+        case 131: 
+        case 132: 
+        case 153: 
+        case 173: 
           { 
        String s = yytext();
        w.write(s);
        if(debug) log("Matched #name: "+s);
  }
-        case 321: break;
-        case 283: 
+        case 318: break;
+        case 281: 
           { 
        String s = yytext();
        w.write(s);
        if(debug) log("Matched important: "+s);
  }
-        case 322: break;
+        case 319: break;
         case 15: 
           { 
        String s = yytext();
        w.write(s);
        if(debug) log("Matched semicolon: "+s);
  }
-        case 323: break;
+        case 320: break;
+        case 136: 
         case 138: 
         case 140: 
-        case 142: 
-        case 157: 
-        case 162: 
-        case 165: 
+        case 155: 
+        case 160: 
+        case 163: 
           { 
        String s = yytext();
        if(debug) log("Ignoring unrecognizable url: "+s);
        w.write("/* Ignoring unmatchable URL */url()");
  }
-        case 324: break;
+        case 321: break;
         case 53: 
           {  
        String s = yytext();
        w.write(s); 
        if(debug) log("Matched ~=: "+s);
  }
-        case 325: break;
-        case 122: 
-        case 145: 
-        case 168: 
-        case 182: 
-        case 196: 
-        case 215: 
+        case 322: break;
+        case 121: 
+        case 143: 
+        case 166: 
+        case 180: 
+        case 194: 
+        case 213: 
           { 
        String s = yytext();
        w.write(s);
        if(debug) log("Matched unicode range: "+s);
  }
-        case 326: break;
+        case 323: break;
         case 17: 
           { 
        String s = yytext();
        w.write(s);
        if(debug) log("Matched close braces: "+s);
  }
-        case 327: break;
+        case 324: break;
         case 10: 
           { 
        String s = yytext();
        w.write(s);
        if(debug) log("Matched function end: "+s);
  }
-        case 328: break;
-        case 250: 
-        case 268: 
-        case 282: 
+        case 325: break;
+        case 105: 
           { 
        String s = yytext();
+       StringBuffer sb = new StringBuffer(s.length());
+       sb.append("/* ");
+       boolean inPrefix = true;
+       for(int i=2;i<sb.length()-2;i++) {
+               char c = sb.charAt(i);
+               if(inPrefix && Character.isWhitespace(c)) {
+                       continue;
+               }
+               if(Character.isDigit(c) || Character.isWhitespace(c) ||
+                       Character.isLetter(c) || c == '.' || c == '_' || c == 
'-') {
+                       // No @, no !, etc; IE has been known to do things with 
comments
+                       // in CSS, and other browsers may too
+                       sb.append(c);
+               }
+       }
+       while(Character.isWhitespace(sb.charAt(sb.length()-1)))
+               sb.deleteCharAt(sb.length()-1);
+       sb.append(" */");
+       w.write(sb.toString());
+       if(debug) log("Matched comment: "+s+" -> "+sb.toString());
+ }
+        case 326: break;
+        case 248: 
+        case 266: 
+        case 280: 
+          { 
+       String s = yytext();
        detectedCharset = s;
        if(debug) log("Matched and ignoring charset: "+s);
        // Ignore
  }
-        case 329: break;
+        case 327: break;
         case 1: 
         case 3: 
         case 7: 
@@ -1436,21 +1450,21 @@
        log("Matched anything: "+yytext()+" - ignoring");
        w.write("/* ignored unmatched char: "+c+" */"); // single char cannot 
break out of comment
  }
-        case 330: break;
-        case 227: 
+        case 328: break;
+        case 225: 
           { 
        String s = yytext();
        w.write(s);
        if(debug) log("Matched @font-face: "+s);
  }
-        case 331: break;
+        case 329: break;
         case 16: 
           { 
        String s = yytext();
        w.write(s);
        if(debug) log("Matched open braces: "+s);
  }
-        case 332: break;
+        case 330: break;
         case 6: 
         case 9: 
         case 12: 
@@ -1460,30 +1474,30 @@
        w.write(s);
        if(debug) log("Matched single char: "+s);
  }
-        case 333: break;
+        case 331: break;
         case 4: 
           { 
        String s = yytext();
        w.write(s);
        if(debug) log("Matched whitespace: "+s);
  }
-        case 334: break;
+        case 332: break;
         case 29: 
           { 
        String s = yytext();
        w.write(s);
        if(debug) log("Matched measurement: "+s);
  }
-        case 335: break;
+        case 333: break;
         case 58: 
           { 
        String s = yytext();
        w.write(s); 
        if(debug) log("Matched HTML comment: "+s);
  }
-        case 336: break;
+        case 334: break;
         default: 
-          if ((yy_input == YYEOF) && (yy_startRead == yy_currentPos)) {
+          if (yy_input == YYEOF && yy_startRead == yy_currentPos) {
             yy_atEOF = true;
             return null;
           } 

Modified: trunk/freenet/src/freenet/clients/http/filter/CSSTokenizerFilter.jflex
===================================================================
--- trunk/freenet/src/freenet/clients/http/filter/CSSTokenizerFilter.jflex      
2006-09-01 19:03:37 UTC (rev 10327)
+++ trunk/freenet/src/freenet/clients/http/filter/CSSTokenizerFilter.jflex      
2006-09-01 19:55:29 UTC (rev 10328)
@@ -294,8 +294,26 @@
 }
 "/*" ~"*/" {
        String s = yytext();
-       w.write(s);
-       if(debug) log("Matched comment: "+s);
+       StringBuffer sb = new StringBuffer(s.length());
+       sb.append("/* ");
+       boolean inPrefix = true;
+       for(int i=2;i<sb.length()-2;i++) {
+               char c = sb.charAt(i);
+               if(inPrefix && Character.isWhitespace(c)) {
+                       continue;
+               }
+               if(Character.isDigit(c) || Character.isWhitespace(c) ||
+                       Character.isLetter(c) || c == '.' || c == '_' || c == 
'-') {
+                       // No @, no !, etc; IE has been known to do things with 
comments
+                       // in CSS, and other browsers may too
+                       sb.append(c);
+               }
+       }
+       while(Character.isWhitespace(sb.charAt(sb.length()-1)))
+               sb.deleteCharAt(sb.length()-1);
+       sb.append(" */");
+       w.write(sb.toString());
+       if(debug) log("Matched comment: "+s+" -> "+sb.toString());
 }
 "<!--" { 
        String s = yytext();

Modified: 
trunk/freenet/src/freenet/clients/http/filter/UnsafeContentTypeException.java
===================================================================
--- 
trunk/freenet/src/freenet/clients/http/filter/UnsafeContentTypeException.java   
    2006-09-01 19:03:37 UTC (rev 10327)
+++ 
trunk/freenet/src/freenet/clients/http/filter/UnsafeContentTypeException.java   
    2006-09-01 19:55:29 UTC (rev 10328)
@@ -1,5 +1,7 @@
 package freenet.clients.http.filter;

+import java.io.IOException;
+
 import freenet.support.HTMLNode;

 /**
@@ -8,7 +10,7 @@
  * 
  * Base class for UnknownContentTypeException and 
KnownUnsafeContentTypeException.
  */
-public abstract class UnsafeContentTypeException extends Exception {
+public abstract class UnsafeContentTypeException extends IOException {

        /**
         * Get the contents of the error page.


Reply via email to