/* The following code was generated by JFlex 1.2.2 on 6/14/10 11:21 AM */

/*******************************************************************************
 * Copyright (c) 2004, 2010 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *     Frits Jalvingh - contributions for bug 150794
 *******************************************************************************/

package org.eclipse.jst.jsp.core.internal.parser.internal;

import java.io.CharArrayReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.eclipse.jst.jsp.core.internal.contenttype.BooleanStack;
import org.eclipse.jst.jsp.core.internal.Logger;
import org.eclipse.jst.jsp.core.internal.regions.DOMJSPRegionContexts;
import org.eclipse.wst.sse.core.internal.ltk.parser.BlockMarker;
import org.eclipse.wst.sse.core.internal.ltk.parser.BlockTokenizer;
import org.eclipse.wst.sse.core.internal.ltk.parser.TagMarker;
import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
import org.eclipse.wst.sse.core.internal.util.Debug;
import org.eclipse.wst.sse.core.utils.StringUtils;
import org.eclipse.wst.xml.core.internal.parser.ContextRegionContainer;
import org.eclipse.wst.xml.core.internal.parser.IntStack;


/**
 * This class is a scanner generated by 
 * <a href="http://www.informatik.tu-muenchen.de/~kleing/jflex/">JFlex</a> 1.2.2
 * on 6/14/10 11:21 AM from the specification file
 * <tt>file:/D:/dev/workspaces/wtp3.0.5p/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/devel/JSPTokenizer.jflex</tt>
 */
public class JSPTokenizer implements BlockTokenizer, DOMJSPRegionContexts {

  /** this character denotes the end of file */
  final public static int YYEOF = -1;

  /** lexical states */
  final public static int ST_JSP_VBL_DQUOTES = 52;
  final public static int ST_JSP_VBL_SQUOTES = 51;
  final public static int ST_JSP_VBL_SQUOTES_END = 53;
  final public static int ST_XML_COMMENT_END = 4;
  final public static int ST_JSP_DIRECTIVE_ATTRIBUTE_VALUE = 21;
  final public static int ST_JSP_EL_SQUOTES_END = 46;
  final public static int ST_JSP_EL_DQUOTES = 45;
  final public static int ST_JSP_EL = 43;
  final public static int ST_BLOCK_TAG_SCAN = 36;
  final public static int ST_JSP_EL_SQUOTES = 44;
  final public static int ST_DHTML_ATTRIBUTE_VALUE = 14;
  final public static int ST_XML_PI_ATTRIBUTE_NAME = 8;
  final public static int ST_DHTML_TAG_CLOSE = 15;
  final public static int ST_XML_ATTRIBUTE_VALUE_DQUOTED = 42;
  final public static int ST_DHTML_EQUALS = 13;
  final public static int ST_XML_PI_ATTRIBUTE_VALUE = 10;
  final public static int ST_XML_ATTRIBUTE_VALUE = 25;
  final public static int ST_JSP_VBL = 50;
  final public static int ST_JSP_SQUOTED_VBL = 56;
  final public static int ST_XML_ATTRIBUTE_VALUE_SQUOTED = 41;
  final public static int ST_XML_ATTRIBUTE_NAME = 23;
  final public static int ST_XML_EQUALS = 24;
  final public static int YYINITIAL = 0;
  final public static int ST_JSP_DIRECTIVE_ATTRIBUTE_NAME = 19;
  final public static int ST_JSP_CONTENT = 16;
  final public static int ST_XML_DOCTYPE_ID_SYSTEM = 31;
  final public static int ST_XML_ELEMENT_DECLARATION = 32;
  final public static int ST_XML_DECLARATION_CLOSE = 27;
  final public static int ST_JSP_DIRECTIVE_EQUALS = 20;
  final public static int ST_JSP_VBL_DQUOTES_END = 54;
  final public static int ST_JSP_DQUOTED_EL = 48;
  final public static int ST_XML_DOCTYPE_DECLARATION = 28;
  final public static int ST_CDATA_END = 2;
  final public static int ST_PI_WS = 6;
  final public static int ST_CDATA_TEXT = 1;
  final public static int ST_JSP_DIRECTIVE_NAME_WHITESPACE = 18;
  final public static int ST_XML_ELEMENT_DECLARATION_CONTENT = 33;
  final public static int ST_XML_ATTLIST_DECLARATION = 34;
  final public static int ST_JSP_EL_DQUOTES_END = 47;
  final public static int ST_JSP_SQUOTED_EL = 49;
  final public static int ST_JSP_COMMENT_END = 39;
  final public static int ST_XML_PI_EQUALS = 9;
  final public static int ST_XML_ATTLIST_DECLARATION_CONTENT = 35;
  final public static int ST_XML_DOCTYPE_ID_PUBLIC = 30;
  final public static int ST_JSP_DQUOTED_VBL = 55;
  final public static int ST_DHTML_ATTRIBUTE_NAME = 12;
  final public static int ST_ABORT_EMBEDDED = 37;
  final public static int ST_XML_DOCTYPE_EXTERNAL_ID = 29;
  final public static int ST_JSP_COMMENT = 38;
  final public static int ST_PI_CONTENT = 7;
  final public static int ST_BLOCK_TAG_INTERNAL_SCAN = 37;
  final public static int ST_PI = 5;
  final public static int ST_XML_DECLARATION = 26;
  final public static int ST_JSP_DIRECTIVE_NAME = 17;
  final public static int ST_XML_TAG_NAME = 22;
  final public static int ST_XML_PI_TAG_CLOSE = 11;
  final public static int ST_XML_COMMENT = 3;
  final public static int ST_JSP_ATTRIBUTE_VALUE = 40;

  /** 
   * Translates characters to character classes
   */
  final private static String yycmap_packed = 
    "\11\0\1\5\1\27\2\0\1\20\22\0\1\20\1\26\1\12\1\66"+
    "\1\15\1\23\1\13\1\14\1\25\1\25\1\25\1\25\1\25\1\7"+
    "\1\6\1\3\12\21\1\11\1\73\1\1\1\52\1\2\1\4\1\22"+
    "\1\41\1\74\1\37\1\40\1\56\1\71\1\63\1\63\1\64\1\63"+
    "\1\63\1\34\1\32\1\65\1\53\1\55\1\63\1\70\1\67\1\42"+
    "\1\72\2\63\1\30\1\54\1\63\1\36\1\17\1\24\1\0\1\10"+
    "\1\0\1\60\1\104\1\75\1\61\1\44\1\71\1\76\1\106\1\47"+
    "\1\101\1\63\1\35\1\33\1\51\1\50\1\102\1\63\1\45\1\46"+
    "\1\57\1\103\1\43\1\63\1\31\1\62\1\63\1\16\1\0\1\105"+
    "\71\0\1\100\10\0\27\77\1\0\37\77\1\0\72\77\2\0\13\77"+
    "\2\0\10\77\1\0\65\77\1\0\104\77\11\0\44\77\3\0\2\77"+
    "\4\0\36\77\70\0\131\77\22\0\7\77\16\0\2\100\56\0\106\100"+
    "\32\0\2\100\44\0\1\77\1\100\3\77\1\0\1\77\1\0\24\77"+
    "\1\0\54\77\1\0\7\77\3\0\1\77\1\0\1\77\1\0\1\77"+
    "\1\0\1\77\1\0\22\77\15\0\14\77\1\0\102\77\1\0\14\77"+
    "\1\0\44\77\1\0\4\100\11\0\65\77\2\0\2\77\2\0\2\77"+
    "\3\0\34\77\2\0\10\77\2\0\2\77\67\0\46\77\2\0\1\77"+
    "\7\0\46\77\12\0\21\100\1\0\27\100\1\0\3\100\1\0\1\100"+
    "\1\0\2\100\1\0\1\100\13\0\33\77\5\0\3\77\56\0\32\77"+
    "\5\0\1\100\12\77\10\100\15\0\12\100\6\0\1\100\107\77\2\0"+
    "\5\77\1\0\17\77\1\0\4\77\1\0\1\77\17\100\2\77\2\100"+
    "\1\0\4\100\2\0\12\100\u0207\0\3\100\1\0\65\77\2\0\1\100"+
    "\1\77\20\100\3\0\4\100\3\0\12\77\2\100\2\0\12\100\21\0"+
    "\3\100\1\0\10\77\2\0\2\77\2\0\26\77\1\0\7\77\1\0"+
    "\1\77\3\0\4\77\2\0\1\100\1\0\7\100\2\0\2\100\2\0"+
    "\3\100\11\0\1\100\4\0\2\77\1\0\3\77\2\100\2\0\12\100"+
    "\2\77\20\0\1\100\2\0\6\77\4\0\2\77\2\0\26\77\1\0"+
    "\7\77\1\0\2\77\1\0\2\77\1\0\2\77\2\0\1\100\1\0"+
    "\5\100\4\0\2\100\2\0\3\100\13\0\4\77\1\0\1\77\7\0"+
    "\12\100\2\100\3\77\14\0\3\100\1\0\7\77\1\0\1\77\1\0"+
    "\3\77\1\0\26\77\1\0\7\77\1\0\2\77\1\0\5\77\2\0"+
    "\1\100\1\77\10\100\1\0\3\100\1\0\3\100\22\0\1\77\5\0"+
    "\12\100\21\0\3\100\1\0\10\77\2\0\2\77\2\0\26\77\1\0"+
    "\7\77\1\0\2\77\2\0\4\77\2\0\1\100\1\77\6\100\3\0"+
    "\2\100\2\0\3\100\10\0\2\100\4\0\2\77\1\0\3\77\4\0"+
    "\12\100\22\0\2\100\1\0\6\77\3\0\3\77\1\0\4\77\3\0"+
    "\2\77\1\0\1\77\1\0\2\77\3\0\2\77\3\0\3\77\3\0"+
    "\10\77\1\0\3\77\4\0\5\100\3\0\3\100\1\0\4\100\11\0"+
    "\1\100\17\0\11\100\21\0\3\100\1\0\10\77\1\0\3\77\1\0"+
    "\27\77\1\0\12\77\1\0\5\77\4\0\7\100\1\0\3\100\1\0"+
    "\4\100\7\0\2\100\11\0\2\77\4\0\12\100\22\0\2\100\1\0"+
    "\10\77\1\0\3\77\1\0\27\77\1\0\12\77\1\0\5\77\4\0"+
    "\7\100\1\0\3\100\1\0\4\100\7\0\2\100\7\0\1\77\1\0"+
    "\2\77\4\0\12\100\22\0\2\100\1\0\10\77\1\0\3\77\1\0"+
    "\27\77\1\0\20\77\4\0\6\100\2\0\3\100\1\0\4\100\11\0"+
    "\1\100\10\0\2\77\4\0\12\100\221\0\56\77\1\0\1\77\1\100"+
    "\2\77\7\100\5\0\6\77\1\100\10\100\1\0\12\100\47\0\2\77"+
    "\1\0\1\77\2\0\2\77\1\0\1\77\2\0\1\77\6\0\4\77"+
    "\1\0\7\77\1\0\3\77\1\0\1\77\1\0\1\77\2\0\2\77"+
    "\1\0\2\77\1\0\1\77\1\100\2\77\6\100\1\0\2\100\1\77"+
    "\2\0\5\77\1\0\1\100\1\0\6\100\2\0\12\100\76\0\2\100"+
    "\6\0\12\100\13\0\1\100\1\0\1\100\1\0\1\100\4\0\2\100"+
    "\10\77\1\0\41\77\7\0\24\100\1\0\6\100\4\0\6\100\1\0"+
    "\1\100\1\0\25\100\3\0\7\100\1\0\1\100\346\0\46\77\12\0"+
    "\47\77\11\0\1\77\1\0\2\77\1\0\3\77\1\0\1\77\1\0"+
    "\2\77\1\0\5\77\51\0\1\77\1\0\1\77\1\0\1\77\13\0"+
    "\1\77\1\0\1\77\1\0\1\77\3\0\2\77\3\0\1\77\5\0"+
    "\3\77\1\0\1\77\1\0\1\77\1\0\1\77\1\0\1\77\3\0"+
    "\2\77\3\0\2\77\1\0\1\77\50\0\1\77\11\0\1\77\2\0"+
    "\1\77\2\0\2\77\7\0\2\77\1\0\1\77\1\0\7\77\50\0"+
    "\1\77\4\0\1\77\10\0\1\77\u0c06\0\234\77\4\0\132\77\6\0"+
    "\26\77\2\0\6\77\2\0\46\77\2\0\6\77\2\0\10\77\1\0"+
    "\1\77\1\0\1\77\1\0\1\77\1\0\37\77\2\0\65\77\1\0"+
    "\7\77\1\0\1\77\3\0\3\77\1\0\7\77\3\0\4\77\2\0"+
    "\6\77\4\0\15\77\5\0\3\77\1\0\7\77\323\0\15\100\4\0"+
    "\1\100\104\0\1\77\3\0\2\77\2\0\1\77\121\0\3\77\u0e82\0"+
    "\1\100\1\0\1\77\31\0\11\77\6\100\1\0\5\100\13\0\124\77"+
    "\4\0\2\100\2\0\2\100\2\0\132\77\1\0\3\100\6\0\50\77"+
    "\u1cd3\0\u51a6\77\u0c5a\0\u2ba4\77\134\0\u0800\0\u1ffe\0\2\0";

  /** 
   * Translates characters to character classes
   */
  final private static char [] yycmap = yy_unpack_cmap(yycmap_packed);

  /** 
   * Translates a state to a row index in the transition table
   */
  final private static int yy_rowMap [] = { 
        0,    71,   142,   213,   284,   355,   426,   497,   568,   639, 
      710,   781,   852,   923,   994,  1065,  1136,  1207,  1278,  1349, 
     1420,  1491,  1562,  1633,  1704,  1775,  1846,  1917,  1988,  2059, 
     2130,  2201,  2272,  2343,  2414,  2485,  2556,  2627,  2698,  2769, 
     2840,  2911,  2982,  3053,  3124,  3195,  3266,  3337,  3408,  3479, 
     3550,  3621,  3692,  3763,  3834,  3905,  3976,  4047,  4118,  4189, 
     4260,  4331,  4402,  4473,  4544,  4473,  4544,  4615,  4473,  4544, 
     4686,  4757,  4828,  4899,  4970,  5041,  5112,  5183,  4473,  4544, 
     5254,  5325,  5396,  4473,  5467,  5467,  5538,  5609,  5680,  5254, 
     4473,  5751,  5822,  4473,  5893,  5964,  6035,  6106,  4473,  4544, 
     6177,  6248,  6319,  6390,  6461,  6532,  4473,  6603,  6603,  6674, 
     6745,  6816,  6887,  6958,  4473,  7029,  7100,  7171,  7242,  7313, 
     7384,  4473,  7455,  7526,  7597,  7668,  7739,  7810,  7881,  7952, 
     4473,  8023,  8094,  8165,  8236,  8307,  8378,  8449,  8520,  8520, 
     8591,  8662,  8733,  8804,  8804,  8875,  8946,  9017,  9088,  9088, 
     9159,  9230,  9301,  9372,  4473,  9443,  9443,  9514,  9585,  9656, 
     9727,  4473,  4473,  4544,  4473,  4544,  9798,  9869,  7526,  9940, 
    10011, 10082, 10153, 10224, 10295, 10366, 10437,  4473, 10508, 10579, 
    10650, 10721,  4473, 10792, 10863, 10934, 11005,  4473,  4473, 11076, 
     4473, 11147, 11218, 11289, 11360,  4473,  4473, 11431, 11502,  4473, 
    11573,  4473, 11644, 11715, 11786, 11857, 11928,  4473,  4473, 11999, 
     4473, 12070, 12141, 12212, 12283,  4473,  4473, 12354, 12425, 12496, 
     4473, 12567, 12638, 12709,  4473,  4473, 12780, 12851, 12922, 12993, 
    13064, 13135, 13206, 13277, 13348, 13419, 13490, 13561, 13632,  4473, 
    13703, 13774, 13845,  4473,  4473,  5467,  5609,  4473, 13916,  5680, 
    13987,  5751,  5893,  5964, 14058,  6035,  4473, 14129, 14200,  6106, 
    14271,  4473, 12851,  4473,  6603,  6674,  4473, 14342,  6745, 14413, 
     4473, 14484, 14555,  7455, 14626,  7668,  4473, 14697,  7739, 14768, 
    14839, 14910, 14981, 15052, 15123,  8236,  4473, 15194, 15265,  8520, 
     8591,  4473, 15336, 15407, 15478, 15549, 15620,  8733,  8520,  8804, 
     8875,  4473,  8946,  9017,  8804,  9088,  9159,  4473, 15691, 15762, 
    15833, 15904, 15975, 16046, 16117,  9443,  9514,  4473, 16188, 16259, 
    16330, 16401, 16472, 16543, 16614, 16685,  9869, 10011,  4473, 16756, 
    16827, 10082, 16898, 16969, 17040, 17111,  4473, 17182,  4473,  4473, 
     4473,  4473, 17253, 17324, 17395, 17466, 11147,  4473, 17537, 17608, 
    11289,  4473, 17679, 17750, 17821, 17892, 17963, 18034, 18105, 18176, 
    18247, 11857, 12070,  4473, 18318, 18389, 12212,  4473, 18460, 18531, 
    18602, 18673, 18744, 18815, 18886, 18957, 19028,  4473,  4473,  4473, 
    19099, 19170, 19241, 19312, 19383,  4473, 19454, 19525, 19596,  4473, 
     4473,  4473, 19667,  4473,  4473,  4899, 19738, 19809, 19880, 19951, 
    20022, 20093, 20164, 20093, 20235, 20306, 20235, 20377, 20448, 20519, 
    20590, 20661, 20732, 20803, 20803, 20874, 20945, 20945, 21016,  9301, 
     9301,  9301, 21087, 21158, 21229, 21229, 21300,  9656,  9656,  9656, 
    21371, 21442, 10011, 10082, 21513, 21513, 21584, 21584, 17395, 21655, 
    10934, 10934, 10934, 21726, 21797, 11147, 11147, 11147, 21868, 21939, 
    11289, 11289, 11289, 22010, 22081, 11431, 11431, 11431, 17963, 22152, 
    22223, 11644, 11644, 11644, 18176, 22294, 22365, 11857, 11857, 11857, 
    22436, 12070, 12070, 12070, 22507, 22578, 12212, 12212, 12212, 22649, 
    22720, 12354, 12354, 12354, 18744, 22791, 22862, 12567, 12567, 12567, 
    18957, 22933,  4473,  4473, 23004, 23075,  4473, 23146, 23217, 23288, 
    23359,  7455,  4473,  4473, 23430, 23501, 23572, 23643, 23714, 15549, 
    15904,  9301, 23785, 16401,  9656, 23856,  4473,  9869, 10934, 11147, 
    23927, 11289, 23998, 11431, 24069,  4473, 11644, 24140, 11857, 12070, 
    24211, 12212, 24282, 12354, 24353,  4473, 12567, 24424, 24495, 24566, 
    24637, 24708, 24779, 24850, 24921, 24992, 25063, 25134, 25205, 25276, 
    25347, 25418, 25489, 25560, 25631, 25702, 25773, 25844, 25915, 25986, 
     4899, 26057, 26128, 26199, 26270, 26341,  4473,  4473, 26412, 26483, 
    26554, 26625, 17963, 18176, 26696, 26767, 18744, 18957, 26838, 26909, 
    26980, 27051,  4473,  4473,  4473, 27122, 27193, 27264, 27335, 27406, 
    27477, 27548, 27619,  7171, 27690, 27761, 27832, 27903, 27974, 28045, 
    28116,  4473, 28187, 28258,  9301,  9656, 11147, 11289, 12070, 12212, 
    28329, 28400, 28471, 28542, 28613, 28684, 28755, 28826,  4899, 28897, 
    28968, 29039, 29110, 29181, 29252, 29323, 29394, 29465, 29536, 29607, 
    29678, 29749, 29820, 29891, 29962, 30033, 30104, 30175, 30246, 30317, 
    30388, 30459, 30530, 30601, 30672, 30743, 30814, 30885, 30956, 31027, 
    31098, 31169, 31240, 31311, 31382,  4473, 31453, 31524, 31595, 31666, 
     7171, 31737, 31808, 31879, 31950, 32021, 32092, 32163, 32234, 32305, 
    32376, 32447, 32518, 32589, 32660
  };

  /** 
   * The packed transition table of the DFA
   */
  final private static String yy_packed = 
    "\1\72\1\73\11\72\1\74\1\72\1\75\5\72\1\76"+
    "\42\72\1\77\20\72\1\100\1\101\105\100\1\102\1\103"+
    "\22\102\1\104\62\102\1\105\1\106\105\105\1\102\1\103"+
    "\5\102\1\107\100\102\1\103\2\102\1\110\1\111\2\102"+
    "\2\112\6\102\1\111\6\102\1\111\1\113\1\114\4\112"+
    "\1\102\10\112\1\115\2\112\1\102\11\112\1\115\1\112"+
    "\1\102\4\112\1\102\4\112\1\102\4\112\1\102\1\112"+
    "\1\102\1\103\2\102\1\110\1\116\12\102\1\116\6\102"+
    "\1\116\57\102\1\117\1\120\2\117\1\121\22\117\1\102"+
    "\57\117\1\102\1\103\2\102\1\122\1\111\2\102\2\123"+
    "\6\102\1\111\6\102\1\111\6\123\1\102\13\123\1\102"+
    "\13\123\1\102\4\123\1\102\4\123\1\102\4\123\1\102"+
    "\1\123\1\102\1\103\2\102\1\122\1\111\2\102\2\123"+
    "\6\102\1\111\6\102\1\111\6\123\1\102\13\123\1\124"+
    "\13\123\1\102\4\123\1\102\4\123\1\102\4\123\1\102"+
    "\1\123\1\125\1\103\1\102\1\126\1\127\1\111\4\125"+
    "\1\130\1\125\1\131\3\125\1\111\6\125\1\111\57\125"+
    "\1\102\1\103\2\102\1\132\103\102\1\103\1\133\1\134"+
    "\1\102\1\111\2\102\2\135\6\102\1\111\6\102\1\111"+
    "\6\135\1\102\13\135\1\102\13\135\1\102\4\135\1\102"+
    "\4\135\1\102\4\135\1\102\1\135\1\102\1\103\1\133"+
    "\1\134\1\102\1\111\2\102\2\135\6\102\1\111\6\102"+
    "\1\111\6\135\1\102\13\135\1\136\13\135\1\102\4\135"+
    "\1\102\4\135\1\102\4\135\1\102\1\135\1\137\1\103"+
    "\1\133\1\140\1\137\1\111\4\137\1\141\1\137\1\142"+
    "\3\137\1\111\6\137\1\111\57\137\1\102\1\103\3\102"+
    "\1\111\12\102\1\111\6\102\1\111\57\102\1\143\1\144"+
    "\21\143\1\145\63\143\1\102\1\146\3\102\1\111\2\102"+
    "\2\147\6\102\1\111\2\102\1\150\3\102\1\111\6\147"+
    "\1\102\13\147\1\102\13\147\1\102\4\147\1\102\4\147"+
    "\1\102\4\147\1\102\1\147\1\102\1\146\3\102\1\151"+
    "\12\102\1\151\2\102\1\150\3\102\1\151\60\102\1\146"+
    "\3\102\1\111\2\102\2\152\6\102\1\111\2\102\1\150"+
    "\3\102\1\111\6\152\1\102\13\152\1\102\13\152\1\102"+
    "\4\152\1\102\4\152\1\102\4\152\1\102\1\152\1\102"+
    "\1\146\3\102\1\111\2\102\2\152\6\102\1\111\2\102"+
    "\1\150\3\102\1\111\6\152\1\102\13\152\1\153\13\152"+
    "\1\102\4\152\1\102\4\152\1\102\4\152\1\102\1\152"+
    "\1\154\1\146\1\102\1\155\1\154\1\111\4\154\1\156"+
    "\1\154\1\157\3\154\1\111\2\154\1\160\3\154\1\111"+
    "\57\154\1\161\1\162\1\163\1\164\4\161\2\165\16\161"+
    "\6\166\1\161\13\166\1\161\13\166\1\161\4\166\1\161"+
    "\4\166\1\161\1\167\3\166\1\161\1\166\1\102\1\170"+
    "\1\163\1\164\1\102\1\111\2\102\2\171\6\102\1\111"+
    "\6\102\1\111\6\171\1\102\13\171\1\102\13\171\1\102"+
    "\4\171\1\102\4\171\1\102\4\171\1\102\1\171\1\102"+
    "\1\170\1\163\1\164\1\102\1\111\2\102\2\171\6\102"+
    "\1\111\6\102\1\111\6\171\1\102\13\171\1\172\13\171"+
    "\1\102\4\171\1\102\4\171\1\102\4\171\1\102\1\171"+
    "\1\173\1\174\1\163\1\175\1\173\1\111\4\173\1\176"+
    "\1\173\1\177\1\200\2\173\1\111\6\173\1\111\36\173"+
    "\1\201\20\173\1\102\1\202\1\203\2\102\1\111\12\102"+
    "\1\111\6\102\1\111\10\102\1\204\1\205\2\102\1\206"+
    "\11\102\1\206\1\102\1\205\1\204\26\102\1\103\1\203"+
    "\2\102\1\111\12\102\1\111\6\102\1\111\6\102\1\207"+
    "\51\102\1\103\1\203\2\102\1\111\2\102\2\210\6\102"+
    "\1\111\6\102\1\111\6\210\1\207\13\210\1\102\13\210"+
    "\1\102\4\210\1\102\4\210\1\102\4\210\1\102\1\210"+
    "\1\102\1\103\1\203\2\102\1\111\12\102\1\111\6\102"+
    "\1\111\6\102\1\207\7\102\1\211\6\102\1\212\11\102"+
    "\1\211\12\102\1\212\4\102\1\213\1\103\1\203\1\214"+
    "\1\213\1\111\4\213\1\215\1\213\1\216\3\213\1\111"+
    "\6\213\1\111\6\213\1\217\50\213\1\220\1\103\1\203"+
    "\1\221\1\220\1\111\4\220\1\222\1\220\1\223\3\220"+
    "\1\111\6\220\1\111\6\220\1\224\50\220\1\225\1\103"+
    "\1\203\1\226\1\225\1\111\4\225\1\227\1\225\1\230"+
    "\3\225\1\111\6\225\1\111\57\225\1\231\1\232\1\233"+
    "\104\231\1\234\1\103\1\203\1\235\1\234\1\111\4\234"+
    "\1\236\1\234\1\237\3\234\1\111\6\234\1\111\57\234"+
    "\1\240\1\241\1\242\104\240\1\243\1\244\105\243\1\102"+
    "\1\103\105\102\1\245\1\246\105\245\1\102\1\103\5\102"+
    "\1\247\77\102\1\250\1\251\1\163\1\252\1\250\1\111"+
    "\4\250\1\253\1\250\1\254\1\255\2\250\1\111\6\250"+
    "\1\111\36\250\1\256\20\250\1\257\1\260\3\257\1\261"+
    "\6\257\1\262\1\263\2\257\1\261\6\257\1\261\36\257"+
    "\1\264\20\257\1\265\1\260\3\265\1\266\4\265\1\267"+
    "\2\265\1\270\2\265\1\266\6\265\1\266\36\265\1\271"+
    "\20\265\1\272\1\273\10\272\1\274\1\272\1\275\1\276"+
    "\67\272\1\277\1\272\1\300\1\301\12\300\1\102\72\300"+
    "\1\302\1\303\10\302\1\102\74\302\1\102\1\103\12\102"+
    "\1\304\73\102\1\103\10\102\1\305\74\102\1\306\1\307"+
    "\10\306\1\310\4\306\1\311\65\306\1\312\1\306\1\313"+
    "\1\314\12\313\1\262\2\313\1\315\65\313\1\312\1\313"+
    "\1\316\1\317\10\316\1\320\1\316\1\321\51\316\1\322"+
    "\16\316\1\323\1\316\1\324\1\325\12\324\1\102\72\324"+
    "\1\326\1\327\10\326\1\102\74\326\1\102\1\103\12\102"+
    "\1\330\73\102\1\103\10\102\1\331\74\102\1\332\1\333"+
    "\10\332\1\310\4\332\1\334\65\332\1\335\1\332\1\336"+
    "\1\337\12\336\1\262\2\336\1\340\65\336\1\335\1\336"+
    "\1\72\1\0\11\72\1\0\1\72\1\0\5\72\1\0"+
    "\42\72\1\0\20\72\3\0\1\341\1\342\16\0\1\343"+
    "\2\0\1\344\65\0\1\345\2\0\2\346\6\0\1\345"+
    "\6\0\1\345\6\346\1\0\13\346\1\0\13\346\1\347"+
    "\4\346\1\0\4\346\1\0\4\346\1\0\1\346\1\72"+
    "\1\0\11\72\1\0\1\72\1\350\1\351\4\72\1\0"+
    "\63\72\5\0\1\345\2\0\2\352\6\0\1\345\6\0"+
    "\1\345\6\352\1\0\13\352\1\0\13\352\1\0\4\352"+
    "\1\0\4\352\1\0\4\352\1\0\1\352\1\72\1\0"+
    "\11\72\1\0\2\72\1\353\4\72\1\0\42\72\1\354"+
    "\20\72\132\0\1\343\2\0\1\355\104\0\1\356\71\0"+
    "\1\357\101\0\1\360\111\0\1\111\12\0\1\111\6\0"+
    "\1\111\65\0\4\112\7\0\1\112\6\0\6\112\1\0"+
    "\13\112\1\0\13\112\1\0\4\112\1\0\11\112\1\0"+
    "\1\112\6\0\4\112\7\0\1\112\6\0\2\112\2\361"+
    "\2\112\1\0\13\112\1\0\13\112\1\0\4\112\1\0"+
    "\11\112\1\0\1\112\6\0\4\112\7\0\1\112\6\0"+
    "\2\112\1\361\1\362\2\112\1\0\13\112\1\0\13\112"+
    "\1\0\4\112\1\0\11\112\1\0\1\112\6\0\4\112"+
    "\7\0\1\112\6\0\2\112\2\363\2\112\1\0\13\112"+
    "\1\0\13\112\1\0\4\112\1\0\11\112\1\0\1\112"+
    "\5\0\1\116\12\0\1\116\6\0\1\116\61\0\1\364"+
    "\106\0\1\365\112\0\4\123\7\0\1\123\6\0\6\123"+
    "\1\0\13\123\1\0\13\123\1\0\4\123\1\0\11\123"+
    "\1\0\1\123\1\125\2\0\1\366\1\125\1\0\4\125"+
    "\1\0\1\125\1\0\3\125\1\0\6\125\1\0\60\125"+
    "\1\0\1\365\1\366\1\125\1\0\4\125\1\0\1\125"+
    "\1\0\3\125\1\0\6\125\1\0\57\125\1\367\1\0"+
    "\10\367\1\370\2\367\1\371\50\367\1\371\20\367\1\372"+
    "\1\0\12\372\1\370\1\373\50\372\1\373\20\372\2\0"+
    "\1\133\1\374\111\0\4\135\7\0\1\135\6\0\6\135"+
    "\1\0\13\135\1\0\13\135\1\0\4\135\1\0\11\135"+
    "\1\0\1\135\1\137\2\0\1\375\1\137\1\0\4\137"+
    "\1\0\1\137\1\0\3\137\1\0\6\137\1\0\60\137"+
    "\1\0\1\133\1\376\1\137\1\0\4\137\1\0\1\137"+
    "\1\0\3\137\1\0\6\137\1\0\57\137\1\141\1\0"+
    "\1\377\1\u0100\1\141\1\377\4\141\1\u0101\1\141\1\377"+
    "\1\u0102\2\141\1\377\6\141\1\377\36\141\1\u0102\20\141"+
    "\1\142\1\0\1\u0103\1\u0104\1\142\1\u0103\4\142\1\u0103"+
    "\1\142\1\u0101\1\u0105\2\142\1\u0103\6\142\1\u0103\36\142"+
    "\1\u0105\20\142\2\0\1\u0106\127\0\1\343\2\0\1\u0107"+
    "\66\0\4\147\7\0\1\147\6\0\6\147\1\0\13\147"+
    "\1\0\13\147\1\0\4\147\1\0\11\147\1\0\1\147"+
    "\2\0\1\u0108\111\0\1\151\12\0\1\151\6\0\1\151"+
    "\65\0\4\152\7\0\1\152\6\0\6\152\1\0\13\152"+
    "\1\0\13\152\1\0\4\152\1\0\11\152\1\0\1\152"+
    "\1\154\2\0\1\u0109\1\154\1\0\4\154\1\0\1\154"+
    "\1\0\3\154\1\0\6\154\1\0\57\154\1\u010a\1\0"+
    "\10\u010a\1\u010b\2\u010a\1\u010c\50\u010a\1\u010c\20\u010a\1\u010d"+
    "\1\0\12\u010d\1\u010b\1\u010e\50\u010d\1\u010e\20\u010d\1\154"+
    "\1\0\1\u0108\1\u0109\1\154\1\0\4\154\1\0\1\154"+
    "\1\0\3\154\1\0\6\154\1\0\57\154\1\161\3\0"+
    "\24\161\6\0\1\161\13\0\1\161\13\0\1\161\4\0"+
    "\1\161\4\0\1\161\4\0\1\161\4\0\1\341\17\0"+
    "\1\343\2\0\1\344\62\0\1\u010f\104\0\1\161\3\0"+
    "\2\161\4\165\7\161\1\165\6\161\6\166\1\161\13\166"+
    "\1\161\13\166\1\161\4\166\1\161\4\166\1\165\4\166"+
    "\1\161\1\166\6\0\4\166\7\0\1\166\6\0\6\166"+
    "\1\0\13\166\1\0\13\166\1\0\4\166\1\0\11\166"+
    "\1\0\1\166\6\0\4\166\7\0\1\166\6\0\6\166"+
    "\1\0\7\166\1\u0110\3\166\1\0\13\166\1\0\4\166"+
    "\1\0\11\166\1\0\1\166\3\0\1\341\4\0\2\u0111"+
    "\11\0\1\343\2\0\1\344\1\0\6\u0111\1\0\13\u0111"+
    "\1\0\13\u0111\1\0\4\u0111\1\0\4\u0111\1\0\4\u0111"+
    "\1\0\1\u0111\6\0\4\171\7\0\1\171\6\0\6\171"+
    "\1\0\13\171\1\0\13\171\1\0\4\171\1\0\11\171"+
    "\1\0\1\171\1\173\2\0\1\u0112\1\173\1\0\4\173"+
    "\1\0\1\173\1\0\3\173\1\0\6\173\1\0\57\173"+
    "\3\0\1\341\4\0\2\u0113\11\0\1\343\2\0\1\344"+
    "\1\0\6\u0113\1\0\13\u0113\1\0\13\u0113\1\0\4\u0113"+
    "\1\0\4\u0113\1\0\4\u0113\1\0\1\u0113\1\173\1\0"+
    "\1\u010f\1\u0112\1\173\1\0\4\173\1\0\1\173\1\0"+
    "\3\173\1\0\6\173\1\0\57\173\1\u0114\1\0\10\u0114"+
    "\1\u0115\2\u0114\1\u0116\50\u0114\1\u0116\20\u0114\1\u0117\1\0"+
    "\12\u0117\1\u0115\1\u0118\50\u0117\1\u0118\20\u0117\1\173\2\0"+
    "\1\u0112\1\173\1\0\4\173\1\0\1\173\1\0\1\173"+
    "\1\u0119\1\173\1\0\6\173\1\0\60\173\2\0\1\u0112"+
    "\1\173\1\0\4\173\1\0\1\173\1\0\1\173\1\u011a"+
    "\1\173\1\0\6\173\1\0\57\173\3\0\1\341\17\0"+
    "\1\343\2\0\1\u0107\130\0\1\u011b\2\0\1\u011b\75\0"+
    "\1\u011c\14\0\1\u011c\63\0\2\u011d\51\0\24\u011e\1\u011f"+
    "\62\u011e\6\0\4\210\7\0\1\210\6\0\6\210\1\0"+
    "\13\210\1\0\13\210\1\0\4\210\1\0\11\210\1\0"+
    "\1\210\54\0\1\u0120\5\0\1\u0120\116\0\1\u0121\10\0"+
    "\1\u0121\3\0\1\213\2\0\1\u0122\1\213\1\0\4\213"+
    "\1\0\1\213\1\0\3\213\1\0\6\213\1\0\57\213"+
    "\1\u0123\1\0\10\u0123\1\u0124\2\u0123\1\u0125\50\u0123\1\u0125"+
    "\20\u0123\1\u0126\1\0\1\u0126\2\u0127\1\u0126\4\u0127\2\u0126"+
    "\1\u0128\1\u0129\2\u0126\4\u0127\1\u0126\11\u0127\1\u0126\27\u0127"+
    "\1\u0129\10\u0127\2\u0126\4\u0127\1\u0126\1\u0127\1\217\2\u011e"+
    "\1\u012a\1\217\1\u011e\4\217\1\u011e\1\217\1\u011e\3\217"+
    "\1\u011e\3\217\1\u012b\2\217\1\u011e\57\217\1\220\2\0"+
    "\1\u012c\1\220\1\0\4\220\1\0\1\220\1\0\3\220"+
    "\1\0\6\220\1\0\57\220\12\u012d\1\u012e\74\u012d\14\u012f"+
    "\1\u012e\72\u012f\1\224\2\u011e\1\u0130\1\224\1\u011e\4\224"+
    "\1\u011e\1\224\1\u011e\3\224\1\u011e\3\224\1\u0131\2\224"+
    "\1\u011e\57\224\1\225\2\0\1\u0132\1\225\1\0\4\225"+
    "\1\0\1\225\1\0\3\225\1\0\6\225\1\0\57\225"+
    "\1\u0133\1\0\10\u0133\1\u0134\2\u0133\1\u0135\50\u0133\1\u0135"+
    "\20\u0133\1\u0136\1\0\1\u0136\2\u0137\1\u0136\4\u0137\2\u0136"+
    "\1\u0138\1\u0139\2\u0136\4\u0137\1\u0136\11\u0137\1\u0136\27\u0137"+
    "\1\u0139\10\u0137\2\u0136\4\u0137\1\u0136\1\u0137\2\231\1\0"+
    "\106\231\1\0\20\231\1\u013a\2\231\1\u013b\60\231\1\234"+
    "\2\0\1\u013c\1\234\1\0\4\234\1\0\1\234\1\0"+
    "\3\234\1\0\6\234\1\0\57\234\1\u013d\1\0\10\u013d"+
    "\1\u013e\2\u013d\1\u013f\50\u013d\1\u013f\20\u013d\1\u0140\1\0"+
    "\1\u0140\2\u0141\1\u0140\4\u0141\2\u0140\1\u0142\1\u0143\2\u0140"+
    "\4\u0141\1\u0140\11\u0141\1\u0140\27\u0141\1\u0143\10\u0141\2\u0140"+
    "\4\u0141\1\u0140\1\u0141\2\240\1\0\106\240\1\0\20\240"+
    "\1\u0144\2\240\1\u0145\60\240\7\0\1\u0146\77\0\1\250"+
    "\2\0\1\u0147\1\250\1\0\4\250\1\0\1\250\1\0"+
    "\3\250\1\0\6\250\1\0\60\250\1\0\1\u010f\1\u0147"+
    "\1\250\1\0\4\250\1\0\1\250\1\0\3\250\1\0"+
    "\6\250\1\0\57\250\1\u0148\1\0\10\u0148\1\u0149\2\u0148"+
    "\1\u014a\1\u0148\1\u014b\46\u0148\1\u014a\20\u0148\1\u014c\1\0"+
    "\12\u014c\1\u0149\1\u014d\1\u014c\1\u014e\46\u014c\1\u014d\20\u014c"+
    "\1\250\2\0\1\u0147\1\250\1\0\4\250\1\0\1\250"+
    "\1\0\1\250\1\u014f\1\250\1\0\6\250\1\0\60\250"+
    "\2\0\1\u0147\1\250\1\0\4\250\1\0\1\250\1\0"+
    "\1\250\1\u0150\1\250\1\0\6\250\1\0\57\250\1\257"+
    "\1\0\12\257\2\0\50\257\1\0\20\257\3\0\1\u0151"+
    "\17\0\1\343\2\0\1\355\60\0\1\257\1\0\3\257"+
    "\1\261\6\257\2\0\2\257\1\261\6\257\1\261\36\257"+
    "\1\0\20\257\5\0\1\u0152\10\0\1\u0153\1\0\1\u0152"+
    "\6\0\1\u0152\64\0\1\u0152\10\0\1\u0154\1\0\1\u0152"+
    "\6\0\1\u0152\57\0\1\265\1\0\10\265\1\0\2\265"+
    "\1\0\50\265\1\0\21\265\1\0\3\265\1\266\4\265"+
    "\1\0\2\265\1\0\2\265\1\266\6\265\1\266\36\265"+
    "\1\0\20\265\5\0\1\u0152\10\0\1\u0155\1\0\1\u0152"+
    "\6\0\1\u0152\64\0\1\u0152\10\0\1\u0156\1\0\1\u0152"+
    "\6\0\1\u0152\57\0\12\272\1\0\1\272\1\0\1\u0157"+
    "\67\272\1\0\13\272\1\0\1\272\1\0\1\u0157\5\272"+
    "\1\u0158\61\272\1\0\13\272\1\0\1\272\1\0\1\272"+
    "\1\u0159\66\272\1\u015a\1\272\14\u015b\1\u015c\106\u015b\1\u015c"+
    "\6\u015b\1\u015d\2\u015b\1\u015e\60\u015b\12\u015f\1\u0160\106\u015f"+
    "\1\u0160\10\u015f\1\u0161\2\u015f\1\u0162\60\u015f\12\306\1\0"+
    "\4\306\1\u0163\65\306\1\0\13\306\1\0\4\306\1\u0163"+
    "\3\306\1\u0164\61\306\1\0\13\306\1\u0165\74\306\14\313"+
    "\1\0\2\313\1\u0166\65\313\1\0\15\313\1\0\2\313"+
    "\1\u0166\3\313\1\u0167\61\313\1\0\15\313\1\u0168\72\313"+
    "\12\316\1\0\1\316\1\0\70\316\1\0\13\316\1\0"+
    "\1\316\1\0\6\316\1\u0169\61\316\1\0\13\316\1\0"+
    "\1\316\1\0\1\316\1\u016a\66\316\1\0\1\316\14\u016b"+
    "\1\u016c\106\u016b\1\u016c\6\u016b\1\u016d\2\u016b\1\u016e\60\u016b"+
    "\12\u016f\1\u0170\106\u016f\1\u0170\10\u016f\1\u0171\2\u016f\1\u0172"+
    "\60\u016f\12\332\1\0\4\332\1\u0173\65\332\1\0\13\332"+
    "\1\0\4\332\1\u0173\3\332\1\u0174\61\332\1\0\13\332"+
    "\1\u0175\74\332\14\336\1\0\2\336\1\u0176\65\336\1\0"+
    "\15\336\1\0\2\336\1\u0176\3\336\1\u0177\61\336\1\0"+
    "\15\336\1\u0178\72\336\7\0\1\u0179\12\0\1\u017a\3\0"+
    "\1\u017b\23\0\1\u017c\43\0\1\u017d\26\0\1\u017e\55\0"+
    "\1\345\2\0\2\u017f\6\0\1\345\6\0\1\345\6\u017f"+
    "\1\0\13\u017f\1\0\13\u017f\1\0\4\u017f\1\0\4\u017f"+
    "\1\0\4\u017f\1\0\1\u017f\1\u0180\1\0\3\u0180\1\u0181"+
    "\4\346\1\u0180\1\0\4\u0180\1\u0181\1\346\1\u0180\1\0"+
    "\3\u0180\1\u0181\6\346\1\u0180\13\346\1\u0180\13\346\1\u0180"+
    "\4\346\1\u0182\11\346\1\u0180\1\346\21\0\1\u0183\7\0"+
    "\1\u0184\55\0\1\72\1\0\11\72\1\0\1\72\1\u0185"+
    "\5\72\1\0\42\72\1\0\20\72\105\351\1\u0186\1\351"+
    "\1\u0180\1\0\3\u0180\1\u0181\4\352\1\u0180\1\0\4\u0180"+
    "\1\u0181\1\352\1\u0180\1\0\3\u0180\1\u0181\6\352\1\u0180"+
    "\13\352\1\u0180\13\352\1\u0180\4\352\1\u0187\11\352\1\u0180"+
    "\1\352\105\353\1\u0188\1\353\1\72\1\0\11\72\1\0"+
    "\1\72\1\0\5\72\1\0\42\72\1\u0189\20\72\36\0"+
    "\1\u017e\52\0\1\u018a\106\0\1\u018b\112\0\4\112\7\0"+
    "\1\112\6\0\4\112\2\u018c\1\0\13\112\1\0\13\112"+
    "\1\0\4\112\1\0\11\112\1\0\1\112\6\0\4\112"+
    "\7\0\1\112\6\0\4\112\1\u018c\1\u018d\1\0\13\112"+
    "\1\0\13\112\1\0\4\112\1\0\11\112\1\0\1\112"+
    "\6\0\4\112\7\0\1\112\6\0\6\112\1\0\13\112"+
    "\1\0\2\112\1\u018e\10\112\1\0\4\112\1\0\6\112"+
    "\1\u018e\2\112\1\0\1\112\12\367\1\370\3\367\1\0"+
    "\70\367\14\372\1\370\1\372\1\0\70\372\1\377\1\0"+
    "\10\377\1\u0101\2\377\1\u018f\50\377\1\u018f\20\377\1\141"+
    "\2\377\1\u0100\1\141\1\377\4\141\1\u0101\1\141\1\377"+
    "\1\141\1\137\1\141\1\377\6\141\1\377\57\141\1\u0103"+
    "\1\0\12\u0103\1\u0101\1\u0190\50\u0103\1\u0190\20\u0103\1\142"+
    "\2\u0103\1\u0104\1\142\1\u0103\4\142\1\u0103\1\142\1\u0101"+
    "\1\142\1\137\1\142\1\u0103\6\142\1\u0103\57\142\12\u010a"+
    "\1\u010b\3\u010a\1\0\70\u010a\14\u010d\1\u010b\1\u010d\1\0"+
    "\70\u010d\6\0\4\166\7\0\1\166\6\0\6\166\1\0"+
    "\13\166\1\0\13\166\1\0\4\166\1\0\6\166\1\u0191"+
    "\2\166\1\0\1\166\6\0\4\u0111\7\0\1\u0111\6\0"+
    "\6\u0111\1\0\13\u0111\1\0\13\u0111\1\0\4\u0111\1\0"+
    "\11\u0111\1\0\1\u0111\6\0\4\u0113\7\0\1\u0113\6\0"+
    "\6\u0113\1\0\13\u0113\1\0\13\u0113\1\0\4\u0113\1\0"+
    "\11\u0113\1\0\1\u0113\12\u0114\1\u0115\3\u0114\1\0\70\u0114"+
    "\14\u0117\1\u0115\1\u0117\1\0\70\u0117\1\u0192\2\u0193\1\u0194"+
    "\1\u0192\1\u0193\4\u0192\1\u0193\1\u0192\1\u0193\3\u0192\1\u0193"+
    "\6\u0192\1\u0193\55\u0192\1\173\1\u0192\1\u0195\2\u0196\1\u0197"+
    "\1\u0195\1\u0196\4\u0195\1\u0196\1\u0195\1\u0196\3\u0195\1\u0196"+
    "\6\u0195\1\u0196\55\u0195\1\173\1\u0195\37\0\1\u0198\35\0"+
    "\1\u0198\53\0\1\u0199\14\0\1\u0199\73\0\1\u019a\11\0"+
    "\1\u019a\76\0\1\u019b\20\0\1\u019b\113\0\1\u019c\7\0"+
    "\1\u019c\2\0\12\u0123\1\u0124\3\u0123\1\0\70\u0123\1\u0126"+
    "\1\0\12\u0126\1\u0124\1\u019d\50\u0126\1\u019d\21\u0126\1\0"+
    "\12\u0126\1\u019e\1\u019d\50\u0126\1\u019d\20\u0126\14\0\1\u019f"+
    "\72\0\14\u0126\1\u019e\1\u0126\1\0\70\u0126\12\u0133\1\u0134"+
    "\3\u0133\1\0\70\u0133\1\u0136\1\0\12\u0136\1\u0134\1\u01a0"+
    "\50\u0136\1\u01a0\21\u0136\1\0\12\u0136\1\u01a1\1\u01a0\50\u0136"+
    "\1\u01a0\20\u0136\14\0\1\u01a2\72\0\14\u0136\1\u01a1\1\u0136"+
    "\1\0\70\u0136\2\231\1\0\4\231\1\u01a3\12\231\1\u01a4"+
    "\3\231\1\u01a5\23\231\1\u01a6\36\231\1\0\33\231\1\u01a7"+
    "\50\231\12\u013d\1\u013e\3\u013d\1\0\70\u013d\1\u0140\1\0"+
    "\12\u0140\1\u013e\1\u01a8\50\u0140\1\u01a8\21\u0140\1\0\12\u0140"+
    "\1\u01a9\1\u01a8\50\u0140\1\u01a8\20\u0140\14\0\1\u01aa\72\0"+
    "\14\u0140\1\u01a9\1\u0140\1\0\70\u0140\2\240\1\0\4\240"+
    "\1\u01ab\12\240\1\u01ac\3\240\1\u01ad\23\240\1\u01ae\36\240"+
    "\1\0\33\240\1\u01af\50\240\23\0\1\u01b0\63\0\12\u0148"+
    "\1\u0149\3\u0148\1\0\71\u0148\1\0\10\u0148\1\u01b1\2\u0148"+
    "\1\u014a\1\u0148\1\u014b\46\u0148\1\u014a\20\u0148\14\u014c\1\u0149"+
    "\1\u014c\1\0\71\u014c\1\0\12\u014c\1\u01b2\1\u014d\1\u014c"+
    "\1\u014e\46\u014c\1\u014d\20\u014c\1\u01b3\2\u0193\1\u01b4\1\u01b3"+
    "\1\u0193\4\u01b3\1\u0193\1\u01b3\1\u0193\3\u01b3\1\u0193\6\u01b3"+
    "\1\u0193\55\u01b3\1\250\1\u01b3\1\u01b5\2\u0196\1\u01b6\1\u01b5"+
    "\1\u0196\4\u01b5\1\u0196\1\u01b5\1\u0196\3\u01b5\1\u0196\6\u01b5"+
    "\1\u0196\55\u01b5\1\250\1\u01b5\5\0\1\u0152\12\0\1\u0152"+
    "\6\0\1\u0152\57\0\12\272\1\0\1\272\1\0\1\272"+
    "\1\u01b7\66\272\1\u015a\10\272\1\u01b8\2\272\1\0\1\272"+
    "\1\0\1\u0157\4\272\1\u01b9\3\272\1\u01ba\23\272\1\u01bb"+
    "\32\272\1\0\1\272\12\u01b7\1\0\1\u01b7\1\0\70\u01b7"+
    "\1\0\1\u01b7\12\u015a\1\0\1\u015a\1\0\1\u01bc\67\u015a"+
    "\1\0\1\u015a\7\u015b\1\u01bd\4\u015b\1\u015c\5\u015b\1\u01be"+
    "\3\u015b\1\u01bf\23\u015b\1\u01c0\50\u015b\1\u015c\21\u015b\1\u01c1"+
    "\50\u015b\7\u015f\1\u01c2\2\u015f\1\u0160\7\u015f\1\u01c3\3\u015f"+
    "\1\u01c4\23\u015f\1\u01c5\46\u015f\1\u0160\23\u015f\1\u01c6\50\u015f"+
    "\12\306\1\0\103\306\1\u01c7\2\306\1\0\4\306\1\u0163"+
    "\2\306\1\u01c8\3\306\1\u01c9\23\306\1\u01ca\32\306\1\0"+
    "\1\306\17\u01cb\1\u01cc\67\u01cb\14\313\1\0\101\313\1\u01cd"+
    "\4\313\1\0\2\313\1\u0166\2\313\1\u01ce\3\313\1\u01cf"+
    "\23\313\1\u01d0\32\313\1\0\1\313\17\u01d1\1\u01d2\67\u01d1"+
    "\7\316\1\u01d3\2\316\1\0\1\316\1\0\5\316\1\u01d4"+
    "\3\316\1\u01d5\23\316\1\u01d6\32\316\1\0\1\316\7\u016b"+
    "\1\u01d7\4\u016b\1\u016c\5\u016b\1\u01d8\3\u016b\1\u01d9\23\u016b"+
    "\1\u01da\50\u016b\1\u016c\21\u016b\1\u01db\50\u016b\7\u016f\1\u01dc"+
    "\2\u016f\1\u0170\7\u016f\1\u01dd\3\u016f\1\u01de\23\u016f\1\u01df"+
    "\46\u016f\1\u0170\23\u016f\1\u01e0\50\u016f\12\332\1\0\103\332"+
    "\1\u01e1\2\332\1\0\4\332\1\u0173\2\332\1\u01e2\3\332"+
    "\1\u01e3\23\332\1\u01e4\32\332\1\0\1\332\17\u01e5\1\u01e6"+
    "\67\u01e5\14\336\1\0\101\336\1\u01e7\4\336\1\0\2\336"+
    "\1\u0176\2\336\1\u01e8\3\336\1\u01e9\23\336\1\u01ea\32\336"+
    "\1\0\1\336\17\u01eb\1\u01ec\67\u01eb\7\0\1\u01ed\106\0"+
    "\1\u01ee\136\0\1\u01ef\47\0\1\u017f\1\0\11\u017f\1\0"+
    "\7\u017f\1\0\63\u017f\1\u0180\1\0\11\u0180\1\0\7\u0180"+
    "\1\0\47\u0180\1\0\14\u0180\1\0\3\u0180\1\u0181\5\u0180"+
    "\1\0\4\u0180\1\u0181\2\u0180\1\0\3\u0180\1\u0181\43\u0180"+
    "\1\u01f0\13\u0180\21\0\1\u0183\51\0\1\u01f1\34\0\1\u01f2"+
    "\15\0\3\u01f2\2\0\1\u01f2\11\0\1\u01f2\1\0\2\u01f2"+
    "\7\0\1\u01f2\2\0\2\u01f2\6\0\1\u01f2\17\0\1\u0185"+
    "\157\0\1\u0189\26\0\1\112\1\u01f3\2\112\7\0\1\112"+
    "\6\0\6\112\1\0\13\112\1\0\13\112\1\0\4\112"+
    "\1\0\11\112\1\0\1\112\6\0\4\112\7\0\1\112"+
    "\6\0\6\112\1\0\11\112\1\u01f4\1\112\1\0\1\u01f4"+
    "\12\112\1\0\4\112\1\0\11\112\1\0\1\112\12\377"+
    "\1\u0101\3\377\1\0\70\377\14\u0103\1\u0101\1\u0103\1\0"+
    "\70\u0103\6\0\3\166\1\u01f5\7\0\1\166\6\0\6\166"+
    "\1\0\13\166\1\0\13\166\1\0\4\166\1\0\11\166"+
    "\1\0\1\166\1\u0192\2\u0193\1\u0194\1\u0192\1\u0193\4\u0192"+
    "\1\u0193\1\u0192\1\u0193\3\u0192\1\u0193\6\u0192\1\u0193\55\u0192"+
    "\1\u01f6\1\u0192\105\u0193\1\u01f7\1\u0193\1\u0195\2\u0196\1\u0197"+
    "\1\u0195\1\u0196\4\u0195\1\u0196\1\u0195\1\u0196\3\u0195\1\u0196"+
    "\6\u0195\1\u0196\55\u0195\1\u01f6\1\u0195\105\u0196\1\u01f8\1\u0196"+
    "\42\0\1\u01f9\14\0\1\u01f9\63\0\2\u01fa\103\0\2\u01fb"+
    "\115\0\1\u01fc\14\0\1\u01fc\63\0\2\u01fd\51\0\14\u0126"+
    "\1\u0124\1\u0126\1\0\70\u0126\3\0\2\u01fe\1\0\4\u01fe"+
    "\2\0\1\u0128\1\u01fe\2\0\4\u01fe\1\0\11\u01fe\1\0"+
    "\40\u01fe\2\0\4\u01fe\1\0\1\u01fe\14\u0136\1\u0134\1\u0136"+
    "\1\0\70\u0136\3\0\2\u01ff\1\0\4\u01ff\2\0\1\u0138"+
    "\1\u01ff\2\0\4\u01ff\1\0\11\u01ff\1\0\40\u01ff\2\0"+
    "\4\u01ff\1\0\1\u01ff\2\231\1\0\4\231\1\u0200\101\231"+
    "\1\0\34\231\1\u0201\47\231\14\u0140\1\u013e\1\u0140\1\0"+
    "\70\u0140\3\0\2\u0202\1\0\4\u0202\2\0\1\u0142\1\u0202"+
    "\2\0\4\u0202\1\0\11\u0202\1\0\40\u0202\2\0\4\u0202"+
    "\1\0\1\u0202\2\240\1\0\4\240\1\u0203\101\240\1\0"+
    "\34\240\1\u0204\47\240\2\0\1\u0205\104\0\1\u01b3\2\u0193"+
    "\1\u01b4\1\u01b3\1\u0193\4\u01b3\1\u0193\1\u01b3\1\u0193\3\u01b3"+
    "\1\u0193\6\u01b3\1\u0193\55\u01b3\1\u0206\1\u01b3\1\u01b5\2\u0196"+
    "\1\u01b6\1\u01b5\1\u0196\4\u01b5\1\u0196\1\u01b5\1\u0196\3\u01b5"+
    "\1\u0196\6\u01b5\1\u0196\55\u01b5\1\u0206\1\u01b5\7\272\1\u0207"+
    "\2\272\1\0\1\272\1\0\1\u0157\67\272\1\0\1\272"+
    "\12\u015a\1\0\1\u015a\1\0\1\u015a\1\0\70\u015a\7\u015b"+
    "\1\u0208\4\u015b\1\u015c\106\u015b\1\u015c\22\u015b\1\u0209\47\u015b"+
    "\7\u015f\1\u020a\2\u015f\1\u0160\106\u015f\1\u0160\24\u015f\1\u020b"+
    "\47\u015f\7\306\1\u020c\2\306\1\0\4\306\1\u0163\65\306"+
    "\1\0\1\306\12\u020d\1\u020e\72\u020d\1\0\1\u020d\7\313"+
    "\1\u020f\4\313\1\0\2\313\1\u0166\65\313\1\0\1\313"+
    "\14\u0210\1\u020e\70\u0210\1\0\1\u0210\7\316\1\u0211\2\316"+
    "\1\0\1\316\1\0\70\316\1\0\1\316\7\u016b\1\u0212"+
    "\4\u016b\1\u016c\106\u016b\1\u016c\22\u016b\1\u0213\47\u016b\7\u016f"+
    "\1\u0214\2\u016f\1\u0170\106\u016f\1\u0170\24\u016f\1\u0215\47\u016f"+
    "\7\332\1\u0216\2\332\1\0\4\332\1\u0173\65\332\1\0"+
    "\1\332\12\u0217\1\u0218\72\u0217\1\0\1\u0217\7\336\1\u0219"+
    "\4\336\1\0\2\336\1\u0176\65\336\1\0\1\336\14\u021a"+
    "\1\u0218\70\u021a\1\0\1\u021a\40\0\1\u021b\141\0\1\u01f0"+
    "\34\0\1\u01f2\15\0\3\u01f2\2\0\1\u01f2\11\0\1\u01f2"+
    "\1\0\2\u01f2\7\0\1\u01f2\1\0\1\u01f1\2\u01f2\6\0"+
    "\1\u01f2\10\0\4\112\7\0\1\112\6\0\6\112\1\0"+
    "\7\112\1\u021c\3\112\1\0\13\112\1\0\4\112\1\0"+
    "\11\112\1\0\1\112\6\0\4\112\7\0\1\112\6\0"+
    "\6\112\1\0\6\112\1\u021d\4\112\1\0\13\112\1\0"+
    "\1\112\1\u021d\2\112\1\0\11\112\1\0\1\112\6\0"+
    "\4\166\7\0\1\166\6\0\6\166\1\0\6\166\1\u021e"+
    "\4\166\1\0\6\166\1\u021f\4\166\1\0\4\166\1\0"+
    "\11\166\1\0\1\166\54\0\1\u0220\5\0\1\u0220\73\0"+
    "\1\u0221\14\0\1\u0221\66\0\1\u0222\11\0\1\u0222\74\0"+
    "\1\u0223\11\0\1\u0223\77\0\1\u0224\14\0\1\u0224\22\0"+
    "\2\231\1\0\35\231\1\u0225\46\231\2\240\1\0\35\240"+
    "\1\u0226\46\240\14\u015b\1\u015c\23\u015b\1\u0227\46\u015b\12\u015f"+
    "\1\u0160\25\u015f\1\u0228\46\u015f\12\u020d\1\u01cb\4\u020d\1\u0229"+
    "\65\u020d\1\u01cb\1\u020d\14\u0210\1\u01d1\2\u0210\1\u022a\65\u0210"+
    "\1\u01d1\1\u0210\14\u016b\1\u016c\23\u016b\1\u022b\46\u016b\12\u016f"+
    "\1\u0170\25\u016f\1\u022c\46\u016f\12\u0217\1\u01e5\4\u0217\1\u022d"+
    "\65\u0217\1\u01e5\1\u0217\14\u021a\1\u01eb\2\u021a\1\u022e\65\u021a"+
    "\1\u01eb\1\u021a\41\0\1\u022f\53\0\4\112\7\0\1\112"+
    "\6\0\6\112\1\0\13\112\1\0\4\112\1\u0230\6\112"+
    "\1\0\4\112\1\0\11\112\1\0\1\112\6\0\4\112"+
    "\7\0\1\112\6\0\6\112\1\0\3\112\1\u0231\7\112"+
    "\1\0\4\112\1\u0231\6\112\1\0\4\112\1\0\11\112"+
    "\1\0\1\112\6\0\4\166\7\0\1\166\6\0\6\166"+
    "\1\0\11\166\1\u0232\1\166\1\0\13\166\1\0\4\166"+
    "\1\0\11\166\1\0\1\166\6\0\4\166\7\0\1\166"+
    "\6\0\6\166\1\0\10\166\1\u0233\2\166\1\0\13\166"+
    "\1\0\4\166\1\0\11\166\1\0\1\166\55\0\1\u0234"+
    "\24\0\1\u0234\52\0\1\u0235\20\0\1\u0235\70\0\1\u0236"+
    "\13\0\1\u0236\53\0\2\u0237\112\0\1\u0238\35\0\1\u0238"+
    "\11\0\2\231\1\0\36\231\1\u0239\45\231\2\240\1\0"+
    "\36\240\1\u023a\45\240\14\u015b\1\u015c\24\u015b\1\u023b\45\u015b"+
    "\12\u015f\1\u0160\26\u015f\1\u023c\45\u015f\12\u020d\1\u023d\4\u020d"+
    "\1\u0229\65\u020d\1\u01cb\1\u020d\14\u0210\1\u023e\2\u0210\1\u022a"+
    "\65\u0210\1\u01d1\1\u0210\14\u016b\1\u016c\24\u016b\1\u023f\45\u016b"+
    "\12\u016f\1\u0170\26\u016f\1\u0240\45\u016f\12\u0217\1\u0241\4\u0217"+
    "\1\u022d\65\u0217\1\u01e5\1\u0217\14\u021a\1\u0242\2\u021a\1\u022e"+
    "\65\u021a\1\u01eb\1\u021a\42\0\1\u0243\52\0\4\112\7\0"+
    "\1\112\6\0\6\112\1\0\13\112\1\0\7\112\1\u0244"+
    "\3\112\1\0\4\112\1\0\11\112\1\0\1\112\6\0"+
    "\4\166\7\0\1\166\6\0\6\166\1\0\11\166\1\u0245"+
    "\1\166\1\0\13\166\1\0\4\166\1\0\11\166\1\0"+
    "\1\166\6\0\4\166\7\0\1\166\6\0\6\166\1\0"+
    "\6\166\1\u0246\4\166\1\0\13\166\1\0\4\166\1\0"+
    "\11\166\1\0\1\166\44\0\1\u0247\11\0\1\u0247\72\0"+
    "\1\u0248\14\0\1\u0248\71\0\1\u0249\14\0\1\u0249\27\0"+
    "\2\231\1\0\37\231\1\u024a\44\231\2\240\1\0\37\240"+
    "\1\u024b\44\240\14\u015b\1\u015c\25\u015b\1\u024c\44\u015b\12\u015f"+
    "\1\u0160\27\u015f\1\u024d\44\u015f\14\u016b\1\u016c\25\u016b\1\u024e"+
    "\44\u016b\12\u016f\1\u0170\27\u016f\1\u024f\44\u016f\41\0\1\u0250"+
    "\53\0\4\112\7\0\1\112\6\0\5\112\1\u0251\1\0"+
    "\13\112\1\0\13\112\1\0\4\112\1\0\11\112\1\0"+
    "\1\112\6\0\4\166\7\0\1\166\6\0\6\166\1\0"+
    "\13\166\1\0\4\166\1\u0252\6\166\1\0\4\166\1\0"+
    "\11\166\1\0\1\166\6\0\4\166\7\0\1\166\6\0"+
    "\6\166\1\0\5\166\1\u0253\5\166\1\0\13\166\1\0"+
    "\4\166\1\0\11\166\1\0\1\166\2\231\1\0\36\231"+
    "\1\u0254\45\231\2\240\1\0\36\240\1\u0255\45\240\14\u015b"+
    "\1\u015c\24\u015b\1\u0256\45\u015b\12\u015f\1\u0160\26\u015f\1\u0257"+
    "\45\u015f\14\u016b\1\u016c\24\u016b\1\u0258\45\u016b\12\u016f\1\u0170"+
    "\26\u016f\1\u0259\45\u016f\36\0\1\u025a\56\0\4\112\7\0"+
    "\1\112\6\0\6\112\1\0\5\112\1\u025b\5\112\1\0"+
    "\13\112\1\0\4\112\1\0\11\112\1\0\1\112\6\0"+
    "\4\166\7\0\1\166\6\0\6\166\1\0\13\166\1\0"+
    "\13\166\1\0\4\166\1\0\1\166\1\u025c\7\166\1\0"+
    "\1\166\2\231\1\0\33\231\1\u025d\50\231\2\240\1\0"+
    "\33\240\1\u025e\50\240\14\u015b\1\u015c\21\u015b\1\u025f\50\u015b"+
    "\12\u015f\1\u0160\23\u015f\1\u0260\50\u015f\14\u016b\1\u016c\21\u016b"+
    "\1\u0261\50\u016b\12\u016f\1\u0170\23\u016f\1\u0262\50\u016f\6\0"+
    "\4\112\7\0\1\112\6\0\6\112\1\0\7\112\1\u0263"+
    "\3\112\1\0\13\112\1\0\4\112\1\0\11\112\1\0"+
    "\1\112\6\0\4\166\7\0\1\166\6\0\6\166\1\0"+
    "\13\166\1\0\4\166\1\u0264\6\166\1\0\4\166\1\0"+
    "\11\166\1\0\1\166\6\0\4\112\7\0\1\112\6\0"+
    "\6\112\1\0\13\112\1\0\13\112\1\0\4\112\1\0"+
    "\11\112\1\0\1\u0265\6\0\4\166\7\0\1\166\6\0"+
    "\6\166\1\0\10\166\1\u0266\2\166\1\0\13\166\1\0"+
    "\4\166\1\0\11\166\1\0\1\166\6\0\4\112\7\0"+
    "\1\112\6\0\6\112\1\0\5\112\1\u0267\5\112\1\0"+
    "\13\112\1\0\4\112\1\0\11\112\1\0\1\112\6\0"+
    "\4\166\7\0\1\166\6\0\6\166\1\0\4\166\1\u0268"+
    "\6\166\1\0\13\166\1\0\4\166\1\0\11\166\1\0"+
    "\1\166\6\0\4\112\7\0\1\112\6\0\6\112\1\0"+
    "\5\112\1\u0269\5\112\1\0\13\112\1\0\4\112\1\0"+
    "\11\112\1\0\1\112\6\0\4\166\7\0\1\166\6\0"+
    "\6\166\1\0\5\166\1\u026a\5\166\1\0\13\166\1\0"+
    "\4\166\1\0\11\166\1\0\1\166\6\0\4\112\7\0"+
    "\1\112\6\0\6\112\1\0\13\112\1\0\4\112\1\u026b"+
    "\6\112\1\0\4\112\1\0\11\112\1\0\1\112\6\u026c"+
    "\4\u026d\7\u026c\1\u026d\5\u026c\1\0\6\u026d\1\u026c\13\u026d"+
    "\1\u026c\13\u026d\1\u026c\4\u026d\1\u026c\11\u026d\1\u026c\1\u026d"+
    "\43\0\1\u026e\3\0\1\u026f\7\0\1\u0270\1\u0271\21\0"+
    "\1\u0272\12\0\4\166\7\0\1\166\6\0\6\166\1\0"+
    "\4\166\1\u0273\3\166\1\u0274\2\166\1\0\4\166\1\u0275"+
    "\1\u0276\5\166\1\0\4\166\1\0\6\166\1\u0277\2\166"+
    "\1\0\1\166\60\0\1\u0278\77\0\1\u0279\115\0\1\u027a"+
    "\105\0\1\u027b\107\0\1\u027c\34\0\4\166\7\0\1\166"+
    "\6\0\6\166\1\0\13\166\1\0\5\166\1\u027d\5\166"+
    "\1\0\4\166\1\0\11\166\1\0\1\166\6\0\4\166"+
    "\7\0\1\166\6\0\6\166\1\0\12\166\1\u027e\1\0"+
    "\13\166\1\0\4\166\1\0\11\166\1\0\1\166\6\0"+
    "\4\166\7\0\1\166\6\0\6\166\1\0\13\166\1\0"+
    "\5\166\1\u027f\5\166\1\0\4\166\1\0\11\166\1\0"+
    "\1\166\6\0\4\166\7\0\1\166\6\0\6\166\1\0"+
    "\13\166\1\0\4\166\1\u0280\6\166\1\0\4\166\1\0"+
    "\11\166\1\0\1\166\6\0\4\166\7\0\1\166\6\0"+
    "\6\166\1\0\13\166\1\0\5\166\1\u0281\5\166\1\0"+
    "\4\166\1\0\11\166\1\0\1\166\45\0\1\u0282\136\0"+
    "\1\u0283\107\0\1\u0284\67\0\1\u0285\125\0\1\u0286\16\0"+
    "\4\166\7\0\1\166\6\0\6\166\1\0\6\166\1\u0287"+
    "\4\166\1\0\13\166\1\0\4\166\1\0\11\166\1\0"+
    "\1\166\6\0\4\166\7\0\1\166\6\0\6\166\1\0"+
    "\13\166\1\0\13\166\1\0\4\166\1\0\1\166\1\u0288"+
    "\7\166\1\0\1\166\6\0\4\166\7\0\1\166\6\0"+
    "\6\166\1\0\13\166\1\0\13\166\1\0\4\166\1\0"+
    "\2\166\1\u0289\6\166\1\0\1\166\6\0\4\166\7\0"+
    "\1\166\6\0\6\166\1\0\13\166\1\0\4\166\1\u028a"+
    "\6\166\1\0\4\166\1\0\11\166\1\0\1\166\6\0"+
    "\4\166\7\0\1\166\6\0\6\166\1\0\13\166\1\0"+
    "\13\166\1\0\4\166\1\0\2\166\1\u028b\6\166\1\0"+
    "\1\166\47\0\1\u028c\74\0\1\u028d\106\0\1\u028e\116\0"+
    "\1\u028f\105\0\1\u0290\50\0\4\166\7\0\1\166\6\0"+
    "\6\166\1\0\10\166\1\u0291\2\166\1\0\13\166\1\0"+
    "\4\166\1\0\11\166\1\0\1\166\6\0\4\166\7\0"+
    "\1\166\6\0\5\166\1\u0292\1\0\13\166\1\0\13\166"+
    "\1\0\4\166\1\0\11\166\1\0\1\166\6\0\4\166"+
    "\7\0\1\166\6\0\5\166\1\u0293\1\0\13\166\1\0"+
    "\13\166\1\0\4\166\1\0\11\166\1\0\1\166\6\0"+
    "\4\166\7\0\1\166\6\0\6\166\1\0\6\166\1\u0294"+
    "\4\166\1\0\13\166\1\0\4\166\1\0\11\166\1\0"+
    "\1\166\6\0\4\166\7\0\1\166\6\0\6\166\1\0"+
    "\5\166\1\u0295\5\166\1\0\13\166\1\0\4\166\1\0"+
    "\11\166\1\0\1\166\60\0\1\u0296\131\0\1\u0297\52\0"+
    "\1\u0298\106\0\1\u0299\45\0\4\166\7\0\1\166\6\0"+
    "\6\166\1\0\13\166\1\0\5\166\1\u029a\5\166\1\0"+
    "\4\166\1\0\11\166\1\0\1\166\6\0\4\166\7\0"+
    "\1\166\6\0\6\166\1\0\13\166\1\0\13\166\1\0"+
    "\4\166\1\0\7\166\1\u029b\1\166\1\0\1\166\6\0"+
    "\4\166\7\0\1\166\6\0\6\166\1\0\10\166\1\u029c"+
    "\2\166\1\0\13\166\1\0\4\166\1\0\11\166\1\0"+
    "\1\166\6\0\4\166\7\0\1\166\6\0\6\166\1\0"+
    "\10\166\1\u029d\2\166\1\0\13\166\1\0\4\166\1\0"+
    "\11\166\1\0\1\166\104\0\1\u029e\63\0\1\u0286\131\0"+
    "\1\u0290\106\0\1\u029f\10\0\4\166\7\0\1\166\6\0"+
    "\6\166\1\0\13\166\1\0\13\166\1\0\4\166\1\0"+
    "\10\166\1\u02a0\1\0\1\166\6\0\4\166\7\0\1\166"+
    "\6\0\6\166\1\0\13\166\1\0\6\166\1\u028b\4\166"+
    "\1\0\4\166\1\0\11\166\1\0\1\166\6\0\4\166"+
    "\7\0\1\166\6\0\6\166\1\0\13\166\1\0\13\166"+
    "\1\0\4\166\1\0\10\166\1\u0295\1\0\1\166\6\0"+
    "\4\166\7\0\1\166\6\0\6\166\1\0\13\166\1\0"+
    "\13\166\1\0\4\166\1\0\10\166\1\u02a1\1\0\1\166"+
    "\35\0\1\u0286\154\0\1\u02a2\11\0\4\166\7\0\1\166"+
    "\6\0\5\166\1\u028b\1\0\13\166\1\0\13\166\1\0"+
    "\4\166\1\0\11\166\1\0\1\166\6\0\4\166\7\0"+
    "\1\166\6\0\6\166\1\0\13\166\1\0\13\166\1\0"+
    "\4\166\1\0\7\166\1\u02a3\1\166\1\0\1\166\57\0"+
    "\1\u0286\35\0\4\166\7\0\1\166\6\0\6\166\1\0"+
    "\13\166\1\0\4\166\1\u028b\6\166\1\0\4\166\1\0"+
    "\11\166\1\0\1\166";

  /** 
   * The transition table of the DFA
   */
  final private static int yytrans [] = yy_unpack(yy_packed);


  /* error codes */
  final private static int YY_UNKNOWN_ERROR = 0;
  // final private static int YY_ILLEGAL_STATE = 1;
  final private static int YY_NO_MATCH = 2;
  final private static int YY_PUSHBACK_2BIG = 3;

  /* error messages for the codes above */
  final private static String YY_ERROR_MSG[] = {
    "Unknown internal scanner error",		//$NON-NLS-1$
    "Internal error: unknown state",		//$NON-NLS-1$
    "Error: could not match input",		//$NON-NLS-1$
    "Error: pushback value was too large"	//$NON-NLS-1$
  };

  /**
   * YY_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
   */
  private final static byte YY_ATTRIBUTE[] = {
     1,  0,  0,  0,  0,  1,  0,  0,  1,  1,  1,  0,  1,  1,  1,  1, 
     0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 
     1,  1,  1,  1,  0,  0,  0,  0,  1,  1,  1,  1,  0,  0,  0,  0, 
     0,  0,  1,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  1,  9, 
     1,  9,  1,  1,  9,  1,  1,  1,  1,  1,  1,  1,  1,  1,  9,  1, 
     1,  1,  1,  9,  1,  1,  1,  1,  1,  1,  9,  1,  1,  9,  1,  1, 
     1,  1,  9,  1,  1,  1,  1,  1,  1,  1,  9,  1,  1,  1,  1,  1, 
     1,  1,  9,  1,  1,  1,  1,  1,  1,  9,  1,  1,  1,  1,  1,  1, 
     1,  1,  9,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  9,  1,  1,  1,  1,  1, 
     1,  9,  9,  1,  9,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 
     1,  9,  1,  1,  1,  1,  9,  1,  1,  1,  1,  9,  9,  1,  9,  3, 
     3,  3,  3,  9,  9,  1,  1,  9,  1,  9,  1,  1,  1,  1,  1,  9, 
     9,  1,  9,  3,  3,  3,  3,  9,  9,  1,  1,  1,  9,  1,  1,  1, 
     9,  9,  1,  1,  0,  1,  0,  1,  2,  1,  2,  1,  0,  0,  0,  9, 
     1,  1,  1,  9,  9,  0,  0,  9,  0,  0,  0,  0,  0,  0,  0,  0, 
     9,  1,  0,  0,  1,  9,  0,  9,  0,  0,  9,  0,  0,  0,  9,  1, 
     1,  0,  1,  0,  9,  0,  0,  0,  1,  1,  0,  0,  0,  0,  9,  0, 
     0,  0,  0,  9,  0,  0,  0,  1,  0,  0,  1,  0,  0,  9,  0,  0, 
     1,  0,  0,  9,  0,  0,  0,  1,  0,  1,  1,  0,  0,  9,  0,  0, 
     0,  1,  0,  1,  1,  0,  0,  0,  9,  0,  0,  0,  0,  0,  1,  1, 
     9,  1,  9,  9,  9,  9,  1,  1,  1,  1,  2, 13,  3,  2,  2, 13, 
     3,  2,  0,  1,  1,  0,  1,  1,  1,  1,  2, 13,  3,  2,  2, 13, 
     3,  2,  0,  1,  1,  0,  1,  1,  0,  9,  9,  9,  0,  0,  1,  1, 
     1,  9,  0,  0,  1, 13,  9, 13,  1,  9,  9,  1,  1,  1,  0,  0, 
     1,  3,  2,  2,  3,  2,  2,  0,  0,  0,  0,  0,  0,  1,  0,  0, 
     1,  0,  1,  1,  1,  1,  1,  0,  1,  0,  1,  1,  1,  1,  1,  0, 
     1,  1,  3,  2,  3,  2,  1,  1,  1,  1,  1,  0,  2,  3,  3,  3, 
     2,  2,  3,  3,  3,  2,  1,  1,  1,  1,  0,  0,  1,  1,  1,  1, 
     0,  0,  1,  1,  1,  1,  2,  3,  3,  3,  2,  2,  3,  3,  3,  2, 
     1,  1,  1,  1,  0,  0,  1,  1,  1,  1,  0,  0,  9,  9,  0,  1, 
     9,  0,  1,  1,  1,  5, 13, 13,  0,  0,  0,  0,  0,  0,  0,  1, 
     1,  0,  1,  1,  9,  5,  1,  3,  2,  3,  2,  1,  0,  9,  1,  0, 
     1,  3,  2,  3,  2,  1,  0,  9,  1,  0,  0,  1,  1,  1,  1,  0, 
     0,  0,  0,  0,  1,  1,  2,  2,  0,  0,  2,  2,  0,  0,  0,  1, 
     1,  1,  1,  0,  0,  0,  9,  9,  1,  1,  2,  2,  1,  1,  2,  2, 
     1,  1,  0,  1,  1,  1,  9,  9,  9,  1,  1,  2,  2,  2,  2,  0, 
     1,  1,  1,  1,  1,  2,  2,  2,  2,  9,  1,  1,  1,  1,  3,  3, 
     3,  3,  1,  1,  1,  1,  1,  1,  1,  1,  1,  0,  1,  0,  0,  0, 
     0,  0,  1,  1,  1,  1,  1,  0,  0,  0,  0,  0,  1,  1,  1,  1, 
     1,  0,  0,  1,  0,  0,  1,  1,  1,  1,  1,  0,  0,  0,  0,  9, 
     1,  1,  1,  1,  1,  0,  0,  0,  0,  1,  1,  1,  1,  0,  0,  1, 
     1,  0,  1
  };

  /** the input device */
  private java.io.Reader yy_reader;

  /** the current state of the DFA */
  private int yy_state;

  /** the current lexical state */
  private int yy_lexical_state = YYINITIAL;

  /** this buffer contains the current text to be matched and is
      the source of the yytext() string */
  private char yy_buffer[] = new char[16384];

  /** the textposition at the last accepting state */
  private int yy_markedPos;

  /** the textposition at the last state to be included in yytext */
  private int yy_pushbackPos;

  /** the current text position in the buffer */
  private int yy_currentPos;

  /** startRead marks the beginning of the yytext() string in the buffer */
  private int yy_startRead;

  /** endRead marks the last character in the buffer, that has been read
      from input */
  private int yy_endRead;

  /** number of newlines encountered up to the start of the matched text */
  //private int yyline;

  /** the number of characters up to the start of the matched text */
  private int yychar;

  /**
   * the number of characters from the last newline up to the start of the 
   * matched text
   */
  // private int yycolumn; 

  /** 
   * yy_atBOL == true <=> the scanner is currently at the beginning of a line
   */
  // private boolean yy_atBOL;

  /** yy_atEOF == true <=> the scanner has returned a value for EOF */
  private boolean yy_atEOF;

  // records the number of times we've set up new input to be parsed
  private long fInputStamp = -1;
  // records the last input iteration for which we reported an error
  private long fErroredInputstamp = -1;

  /** denotes if the user-EOF-code has already been executed */
  private boolean yy_eof_done;

  /* user code: */
	private int fTokenCount = 0;
 
	// required holders for white-space compacting
	private boolean fShouldLoadBuffered = false;
	private String fBufferedContext = null;
	private int fBufferedStart = 1;
	private int fBufferedLength = 0;
	private ITextRegion fBufferedEmbeddedContainer = null;
	private ITextRegion fProxyUnknownRegion = null;
	private String f_context = null;

	// state stack for handling embedded regions
	private IntStack fStateStack = new IntStack();
	// a "hint" as to what an embedded region should be evaluated
	private String fEmbeddedHint = UNDEFINED;
	// a "hint" as to what state to enter once an embedded region has
	//   been completed
	private int fEmbeddedPostState = YYINITIAL;
	
	private BooleanStack fJspTagStack = new BooleanStack();
	
	// the container used to create embedded regions
	private ContextRegionContainer fEmbeddedContainer = null;
	private static final String PROXY_CONTEXT = "PROXY_CONTEXT";
	private static final String PROXY_UNKNOWN_CONTEXT = "PROXY_UNKNOWN_CONTEXT";

	private String context = null;
	private int start = 0;
	private int textLength = 0;
	private int length = 0;

	// offset for tracking position specific block tags
	private int fOffset = 0;
	
	// the name of the current tag being opened
	private String fCurrentTagName = null;

	// the name of the current tag inside of an embedded region
	private String internalTagName = null;
	private String internalContext = null;

	// the list of tag name BlockMarkers
	private List fBlockMarkers = new ArrayList(0);
	private List fNestablePrefixes = new ArrayList(1);
	
	// where the last internal container block was found
	private int fLastInternalBlockStart = -1;

	// required to not seek text blocks on an end tag
	private boolean fIsBlockingEnabled = false;
	private boolean fIsCaseSensitiveBlocking = true;

	private static final boolean fForbidJSP = false;
	
	private int fELlevel = 0;

	private JSPParserRegionFactory fRegionFactory = new JSPParserRegionFactory();

	/**
	 * user method 
	 */
	public final void addBlockMarker(BlockMarker marker) {
		if(containsTagName(marker.getTagName()))
			return;
		fBlockMarkers.add(marker);
	}
	/**
	 * user method
	 */
	public final void addNestablePrefix(TagMarker marker) {
		fNestablePrefixes.add(marker);
	}
	/* user method */
	public List getNestablePrefixes() {
		return fNestablePrefixes;
	}
	/**
	 * user method
	 */
	private boolean isNestable(String tagName) {
		//Iterator blocks = fNestablePrefixes.iterator();
		//while(blocks.hasNext()) {
		//	TagMarker marker = (TagMarker)blocks.next();
		//	String markerName = marker.getTagName();
		//	if(tagName.length() > markerName.length() + 1 && tagName.startsWith(markerName) && tagName.charAt(markerName.length()) == ':') {
		//		return marker.isGlobal() || getOffset() >= marker.getMarker().getStart();
		//	}
		//}
		//return false;
		return true;
	}
	/**
	 * user method 
	 */
	public final void removeNestablePrefix(String name) {
		if (fNestablePrefixes != null) {
			Iterator nestables = fNestablePrefixes.iterator();
			while (nestables.hasNext()) {
				if (((TagMarker) nestables.next()).getTagName().equalsIgnoreCase(name))
					nestables.remove();
			}
		}
	}
	/**
	 * user method 
	 */
	public final void removeBlockMarker(BlockMarker marker) {
		fBlockMarkers.remove(marker);
	}
	/**
	 * user method 
	 */
	public final void removeBlockMarker(String tagname) {
		if (fBlockMarkers != null) {
			Iterator blocks = fBlockMarkers.iterator();
			while (blocks.hasNext()) {
				if (((BlockMarker) blocks.next()).getTagName().equals(tagname))
					blocks.remove();
			}
		}
	}
	/* user method */
	private final void assembleEmbeddedTagSequence(String startType, String endTagName) {
		assembleEmbeddedContainer(startType, null, endTagName);
	}
	/* user method */
	private final void assembleEmbeddedContainer(String startType, String[] endTypes) {
		assembleEmbeddedContainer(startType, endTypes, null);
	}
	/* user method */
	private final void assembleEmbeddedContainer(String startType, String endType) {
		assembleEmbeddedContainer(startType, new String[]{endType}, null);
	}
	/**
	 *  user method 
	 * 
	 * Assembles an embedded container beginning with the given startType as
	 * the first ContextRegion within it and of the type fEmbeddedHint.  The
	 * endTypes[] array contains the context types that will cause a successful
	 * exit.  Use of the endTagName parameter alters this behavior to force an
	 * exit on an XML_TAG_CLOSE after seeing an XML_TAG_NAME whose significant
	 * text matches the endTagName String.  All contents in between are
	 * insignificant, and yes, this means comments are allowed inside.
	 **/
	private final void assembleEmbeddedContainer(String startType, String[] endTypes, String endTagName) {
		// the context of the region being added to the embedded container
		internalContext = startType;
		// keep track of where this container began; to provide relative indeces for the regions
		int containerStart = yychar;
		boolean notFinished = true;
		// keep track of where we seem to be so that the endTagName can be checked
		boolean isInEndTag = false;
		boolean isInFirstTag = true;
		// create the embedded container and setup its "type"
		if (fEmbeddedContainer == null) {
			fEmbeddedContainer = new ContextRegionContainer();
			fEmbeddedContainer.setType(fEmbeddedHint);
			fEmbeddedContainer.setStart(containerStart);
			// TODO: parent region needs to be set .... but not sure where to get it from 
			//		fEmbeddedContainer.setParent(parentRegion);
		}
		containerStart = fEmbeddedContainer.getStart();
		while (notFinished) {
			// add the region to the container
			if (internalContext != null && internalContext != PROXY_CONTEXT) {
				ITextRegion newToken = fRegionFactory.createToken(internalContext, yychar - containerStart, yylength(), yylength());
				fEmbeddedContainer.getRegions().add(newToken);
				fEmbeddedContainer.setLength(fEmbeddedContainer.getLength() + yylength());
				fEmbeddedContainer.setTextLength(fEmbeddedContainer.getTextLength() + yylength());
				// DW, 4/16/2003 token regions no longer have parents
				//newToken.setParent(fEmbeddedContainer);
			}
			try {
				// longscan determines whether to attempt a blockTagScan within the embedded container
				boolean longscan = false;
				// save the tokenizer state in case of a block tag scan
				int previousState = yystate();
				String previousCurrentTagName = fCurrentTagName;
				int previousPostState = fEmbeddedPostState;
				String previousEmbeddedHint = fEmbeddedHint;
				// determine if a block tag scan is necessary
				if (internalContext == XML_TAG_NAME) {
					internalTagName = yytext();
					if(!isNestable(internalTagName)) {
						internalTagName = null;
						// snagged a tag name we shouldn't have
						fEmbeddedPostState = ST_ABORT_EMBEDDED;
						notFinished = false;
					}
				}
				else if (internalContext == XML_TAG_OPEN || internalContext == XML_END_TAG_OPEN) {
					internalTagName = null;
				}
				// do upkeep for endTagName usage; must be here since the next token could be the close
				if (internalContext == XML_END_TAG_OPEN) {
					isInEndTag = true;
				} else if (internalContext == XML_TAG_CLOSE) {
					isInFirstTag = isInEndTag = false;
				} else {
				 	ITextRegionList embeddedRegions = fEmbeddedContainer.getRegions();
					if (embeddedRegions.size() > 2 && (embeddedRegions.get(embeddedRegions.size()-1)).getType() == XML_TAG_CLOSE && (embeddedRegions.get(embeddedRegions.size() - 3)).getType() == XML_TAG_OPEN && internalTagName != null) {
						if (containsTagName(internalTagName)) {
							longscan = true;
							yybegin(ST_BLOCK_TAG_SCAN);
						}
					}
				}
				if (longscan)
					fCurrentTagName = internalTagName;
				// read the next region and context
				try {
					internalContext = primGetNextToken();
				}
				catch(IllegalStateException e) {
					start = yychar;
					while(yy_advance() != YYEOF){}
					textLength = length = yylength();
					yybegin(ST_ABORT_EMBEDDED);
					longscan = false;
				}
				if (longscan) {
					// Returning from a block tag scan requires restoring some state variables
					// as well as handling the block region and setting up for normal scanning
					// inside the embedded container
					ITextRegion newToken = fRegionFactory.createToken(internalContext, yychar - containerStart, yylength(), yylength());
					fEmbeddedContainer.getRegions().add(newToken);
					fEmbeddedContainer.setLength(fEmbeddedContainer.getLength() + yylength());
					fEmbeddedContainer.setTextLength(fEmbeddedContainer.getTextLength() + yylength());
					// DW, 4/16/2003 token regions no longer have parents
					// newToken.setParent(fEmbeddedContainer);
					longscan = false;
					fEmbeddedPostState = previousPostState;
					fEmbeddedHint = previousEmbeddedHint;
					fCurrentTagName = previousCurrentTagName;
					yybegin(previousState);
					try {
						internalContext = primGetNextToken();
					}
					catch(IllegalStateException e) {
						start = yychar;
						while(yy_advance() != YYEOF){}
						textLength = length = yylength();
						yybegin(ST_ABORT_EMBEDDED);
					}
				}
			} catch (IOException e) {
				// primGetNextToken() calls may throw an IOException
				// catch and do nothing since the isEOF check below
				// will properly exit if the input was too short
			} catch (Exception f) {
				// some other exception happened; never should
				Logger.logException(f);
			}
			boolean isEndingType = yystate() == ST_ABORT_EMBEDDED;
			if(!isEndingType) {
				// check for ending context
				if (endTagName == null) {
					for (int i = 0; i < endTypes.length; i++) {
						isEndingType = isEndingType || (internalContext == endTypes[i]);
					}
				}
				else {
					isEndingType = ((isInEndTag && internalContext == XML_TAG_CLOSE) || (isInFirstTag && internalContext == XML_EMPTY_TAG_CLOSE)) && internalTagName != null && internalTagName.equals(endTagName);
				}
			}
			ITextRegionList embeddedList = fEmbeddedContainer.getRegions();
			notFinished = notFinished && ((!isEndingType) && !isEOF() && (endTagName != null || internalContext != UNDEFINED) && !(internalContext == PROXY_CONTEXT && (embeddedList.get(embeddedList.size()-1)).getType() == UNDEFINED));
		}
		// finish adding the last context
		if (internalContext != null && internalContext != PROXY_CONTEXT) {
			ITextRegion newToken = fRegionFactory.createToken(internalContext, yychar - containerStart, yylength(), yylength());
			fEmbeddedContainer.getRegions().add(newToken);
			// DW, 4/16/2003 token regions no longer have parents
			//newToken.setParent(fEmbeddedContainer);
			fEmbeddedContainer.setLength(yychar - containerStart + yylength());
			fEmbeddedContainer.setTextLength(yychar - containerStart + yylength());
		}
		yybegin(fEmbeddedPostState);
	}
	/* user method */
	public final boolean isCaseSensitiveBlocking() {
		return fIsCaseSensitiveBlocking;
	}
	/* user method */
	public final void setCaseSensitiveBlocking(boolean newValue) {
		fIsCaseSensitiveBlocking = newValue;
	}
	/* user method */
	public boolean getBlockMarkerAllowsJSP() {
		return getBlockMarkerAllowsJSP(fCurrentTagName);
	}
	/* user method */
	public boolean getBlockMarkerAllowsJSP(String name) {
		Iterator iterator = fBlockMarkers.iterator();
		while(iterator.hasNext()) {
			BlockMarker marker = (BlockMarker)iterator.next();
			boolean casesensitive = marker.isCaseSensitive();
			if(casesensitive && marker.getTagName().equals(name))
				return marker.allowsJSP();
			else if(!casesensitive && marker.getTagName().equalsIgnoreCase(name))
				return marker.allowsJSP();
		}
		return true;
	}
	/* user method */
	public boolean getBlockMarkerCaseSensitivity() {
		return getBlockMarkerCaseSensitivity(fCurrentTagName);
	}
	public boolean getBlockMarkerCaseSensitivity(String name) {
		Iterator iterator = fBlockMarkers.iterator();
		while(iterator.hasNext()) {
			BlockMarker marker = (BlockMarker)iterator.next();
			boolean casesensitive = marker.isCaseSensitive();
			if(casesensitive && marker.getTagName().equals(name))
				return casesensitive;
			else if(!casesensitive && marker.getTagName().equalsIgnoreCase(name))
				return casesensitive;
		}
		return true;
	}
	/* user method */
	public String getBlockMarkerContext() {
		return getBlockMarkerContext(fCurrentTagName);
	}
	/* user method */
	public String getBlockMarkerContext(String name) {
		Iterator iterator = fBlockMarkers.iterator();
		while(iterator.hasNext()) {
			BlockMarker marker = (BlockMarker)iterator.next();
			if(marker.getTagName().equals(name))
				return marker.getContext();
		}
		return BLOCK_TEXT;
	}
	/* user method */
	public List getBlockMarkers() {
		return fBlockMarkers;
	}
	/* user method */
	public final int getOffset() {
		return fOffset + yychar;
	}
	private final boolean isBlockMarker() {
		return isBlockMarker(fCurrentTagName);
	}
	private final boolean isBlockMarker(String tagName) {
		if (!fIsBlockingEnabled)
			return false;
		return containsTagName(tagName);
	}
	/**
	 * user method
	 */
	public final void beginBlockTagScan(String newTagName) {
		beginBlockMarkerScan(newTagName, BLOCK_TEXT);
	}
	/**
	 * user method
	 *
	 * Special tokenizer setup.  Allows tokenization to be initiated at the
	 * start of a text block within a "newTagName" tag.
	 *
	 * Example: 
	 *	Tokenizer toker = new Tokenizer();
	 *	toker.setCaseSensitiveBlocking(false);
	 *	toker.reset(new java.io.StringReader("afiuhqwkejhtasihgalkwhtq</scripter></scr></script>asgdasga"));
	 *	toker.beginBlockMarkerScan("script", BLOCK_TEXT);
	 *	toker.getRegions(); 
	 *
	 * Returns:
	 *	BLOCK_TEXT: 0-40
	 *	XML_END_TAG_OPEN: 41-42
	 *	XML_TAG_NAME: 43-48
	 *	XML_TAG_CLOSE: 49-49
	 *	XML_CONTENT: 50-57
	 *
	 */
	public final void beginBlockMarkerScan(String newTagName, String blockcontext) {
		yybegin(ST_BLOCK_TAG_SCAN);
		fCurrentTagName = newTagName;
	}

/**
 * Method doScan.
 * 
 * Returns a context region for all of the text from the current position upto the end of input or
 * to right *before* the first occurence of searchString
 * 
 * @param searchString - target string to search for ex.: "-->", "</tagname"
 * @param requireTailSeparator - whether the target must be immediately followed by whitespace or '>'
 * @param allowJSP - check for and allow for JSP markup <%%>
 * @param context - the context of the scanned region if non-zero length
 * @param exitState - the state to go to if the region was of non-zero length
 * @param abortState - the state to go to if the searchString was found immediately
 * @return String - the context found: the desired context on a non-zero length match, the abortContext on immediate success
 * @throws IOException
 */
private final String doScan(String searchString, boolean requireTailSeparator, boolean allowJSP, boolean allowCDATA, String searchContext, int exitState, int immediateFallbackState) throws IOException {
	boolean stillSearching = true;
	boolean wasBlockingEnabled = fIsBlockingEnabled;
	try {
	// Disable further block (probably)
	fIsBlockingEnabled = false;
	int searchStringLength = searchString.length();
	int n = 0;
	char lastCheckChar;
	int i;
	boolean same = false;
	// Check for JSP starts ("<%") if the tag is global like SCRIPT or STYLE
	boolean checkJSPs = allowJSP && !fForbidJSP;
	boolean checkedForJSPsOnce = !checkJSPs;
	boolean checkedJSPsAtStartOnce = false;
	
	while (stillSearching) {
		n = 0;
		// Ensure that enough data from the input exists to compare against the search String.
		n = yy_advance();
		while(n != YYEOF && yy_currentPos < searchStringLength)
			n = yy_advance();
//		c = (char) n;
		// If the input was too short or we've exhausted the input, stop immediately.
		if (n == YYEOF && checkedForJSPsOnce) {
			stillSearching = false;
		}
		else {
			/**
			 * Look for starting JSPs "<%"
			 */
			checkedForJSPsOnce = true;
			// 1) yy_currentPos - searchStringLength : There's at least searchStringLength of input available; once that's read, check for JSPs
			// ---
			// Look for a JSP beginning at current-searchStringLength; if so, backup and switch scanner states to handle it.
			// Ensure that we've not encountered a complete block (<%%>) that was *shorter* than the closeTagString and
			// thus found twice at current-targetLength [since the first scan would have come out this far anyway].
			if(checkJSPs && yy_currentPos > searchStringLength && yy_currentPos - searchStringLength != fLastInternalBlockStart && 
				yy_buffer[yy_currentPos - searchStringLength] == '<' && yy_buffer[yy_currentPos - searchStringLength + 1] == '%') {
				fLastInternalBlockStart = yy_markedPos = yy_currentPos - searchStringLength;
				yy_currentPos = yy_markedPos + 1;
				int resumeState = yystate();
				yybegin(ST_BLOCK_TAG_INTERNAL_SCAN);
				if(yy_markedPos == yy_startRead) {
					try {
						String jspContext = primGetNextToken();
						yybegin(resumeState);
						return jspContext;
					}
					catch(IllegalStateException e) {
						start = yychar;
						while(yy_advance() != YYEOF){}
						textLength = length = yylength();
					}
					yybegin(resumeState);
					return UNDEFINED;
				}
				return searchContext;
			}
			// 2) yy_currentPos - jspstarter.length : There's not searchStringLength of input available; check for a JSP 2 spots back in what we could read
			// ---
			// Look for a JSP beginning at the current position; this case wouldn't be handled by the preceding section
			// since it relies upon *having* closeTagStringLength amount of input to work as designed.  Must be sure we don't
			// spill over the end of the buffer while checking.
			else if(checkJSPs && yy_startRead != fLastInternalBlockStart && yy_currentPos > 0 && yy_currentPos < yy_buffer.length - 1 &&
					yy_buffer[yy_currentPos - 1] == '<' && yy_buffer[yy_currentPos] == '%') {
				fLastInternalBlockStart = yy_markedPos = yy_currentPos - 1;
				yy_currentPos = yy_markedPos + 1;
				int resumeState = yystate();
				yybegin(ST_BLOCK_TAG_INTERNAL_SCAN);
				if(yy_markedPos == yy_startRead) {
					try {
						String jspContext = primGetNextToken();
						yybegin(resumeState);
						return jspContext;
					}
					catch(IllegalStateException e) {
						start = yychar;
						while(yy_advance() != YYEOF){}
						textLength = length = yylength();
					}
					yybegin(resumeState);
					return UNDEFINED;
				}
				return searchContext;
			}
			// 3) yy_currentPos..(yy_currentPos+jspStartlength-1) : Check at the start of the block one time
			// ---
			// Look for a JSP beginning immediately in the block area; this case wouldn't be handled by the preceding section
			// since it relies upon yy_currentPos equaling exactly the previous end +1 to work as designed.
			else if(checkJSPs && !checkedJSPsAtStartOnce && yy_startRead != fLastInternalBlockStart && yy_startRead > 0 &&
					yy_startRead < yy_buffer.length - 1 && yy_buffer[yy_startRead] == '<' && yy_buffer[yy_startRead + 1] == '%') {
				checkedJSPsAtStartOnce = true;
				fLastInternalBlockStart = yy_markedPos = yy_startRead;
				yy_currentPos = yy_markedPos + 1;
				int resumeState = yystate();
				yybegin(ST_BLOCK_TAG_INTERNAL_SCAN);
				if(yy_markedPos == yy_startRead) {
					try {
						String jspContext = primGetNextToken();
						yybegin(resumeState);
						return jspContext;
					}
					catch(IllegalStateException e) {
						start = yychar;
						while(yy_advance() != YYEOF){}
						textLength = length = yylength();
					}
					yybegin(resumeState);
					return UNDEFINED;
				}
				return searchContext;
			}


			/**
			 * Look for starting CDATA "<![CDATA["
			 */
			// 1) yy_currentPos - searchStringLength: There's at least searchStringLength of input available; once that's read, check for CDATA
			// ---
			// Look for a CDATA beginning at current-searchStringLength; if so, backup and switch scanner states to handle it.
			// Ensure that we've not encountered a complete block (<[!CDATA[]]>) that was *shorter* than the closeTagString and
			// thus found twice at current-targetLength [since the first scan would have come out this far anyway].
/*			if(checkCDATA && yy_currentPos > searchStringLength && yy_currentPos + searchStringLength < yy_buffer.length && yy_currentPos - searchStringLength != fLastInternalBlockStart && 
				charsMatch(cdataStarter, yy_buffer, 0, yy_currentPos - searchStringLength)) {
				fLastInternalBlockStart = yy_markedPos = yy_currentPos - searchStringLength;
				yy_currentPos = yy_markedPos + 1;
				int resumeState = yystate();
				// go to a state where CDATA can be found
				if (fEmbeddedContainer == null) {
					fEmbeddedContainer = new ContextRegionContainer();
					fEmbeddedContainer.setType(searchContext);
					fEmbeddedContainer.setStart(yychar);
				}
				ITextRegion newToken = fRegionFactory.createToken(searchContext, yychar, yylength(), yylength());
				fEmbeddedContainer.getRegions().add(newToken);
				fEmbeddedContainer.setLength(fEmbeddedContainer.getLength() + yylength());
				fEmbeddedContainer.setTextLength(fEmbeddedContainer.getTextLength() + yylength());
				yybegin(YYINITIAL);
				String context = null;
				try {
					context = primGetNextToken();
				}
				catch(IllegalStateException e) {
					start = yychar;
					while(yy_advance() != YYEOF){}
					textLength = length = yylength();
					recoverInternals();
					yybegin(YYINITIAL);
					return UNDEFINED;
				}
				if(context.equals(XMLRegionContexts.XML_CDATA_OPEN)) {
					assembleEmbeddedContainer(XMLRegionContexts.XML_CDATA_OPEN, XMLRegionContexts.XML_CDATA_CLOSE);
				}
				yybegin(resumeState);
				return searchContext;
			}
*//*
			// 2) yy_currentPos - cdataStarter.length: There's not searchStringLength of input available; check for a CDATA right here spots back in what we could read
			// ---
			// Look for a JSP beginning at the current position; this case wouldn't be handled by the preceding section
			// since it relies upon *having* closeTagStringLength amount of input to work as designed.  Must be sure we don't
			// spill over the end of the buffer while checking.
			else if(checkCDATA && yy_startRead != fLastInternalBlockStart && yy_currentPos > 0 && yy_currentPos < yy_buffer.length - 1 &&
					yy_buffer[yy_currentPos - 1] == '<' && yy_buffer[yy_currentPos] == '%') {
				fLastInternalBlockStart = yy_markedPos = yy_currentPos - 1;
				yy_currentPos = yy_markedPos + 1;
				int resumeState = yystate();
				yybegin(ST_BLOCK_TAG_INTERNAL_SCAN);
				if(yy_markedPos == yy_startRead) {
					String jspContext = primGetNextToken();
					yybegin(resumeState);
					return jspContext;
				}
				return searchContext;
			}
			// 3) yy_currentPos : Check at the start of the block one time
			// ---
			// Look for a JSP beginning immediately in the block area; this case wouldn't be handled by the preceding section
			// since it relies upon yy_currentPos equaling exactly the previous end +1 to work as designed.
			else if(checkCDATA && !checkedForCDATAOnce && yy_startRead != fLastInternalBlockStart && yy_startRead > 0 &&
					yy_startRead < yy_buffer.length - 1 && yy_buffer[yy_startRead] == '<' && yy_buffer[yy_startRead + 1] == '%') {
				checkedForCDATAOnce = true;
				fLastInternalBlockStart = yy_markedPos = yy_startRead;
				yy_currentPos = yy_markedPos + 1;
				int resumeState = yystate();
				yybegin(ST_BLOCK_TAG_INTERNAL_SCAN);
				if(yy_markedPos == yy_startRead) {
					String jspContext = primGetNextToken();
					yybegin(resumeState);
					return jspContext;
				}
				return searchContext;
			}
*/
			// Check the characters in the target versus the last targetLength characters read from the buffer
			// and see if it matches
			if (n == YYEOF) {
				stillSearching = false;
			}
			else {
				same = true;
				// safety check for array accesses
				if(yy_currentPos >= searchStringLength && yy_currentPos <= yy_buffer.length) {
					for(i = 0; i < searchStringLength; i++) {
						if(same && fIsCaseSensitiveBlocking)
							same = yy_buffer[i + yy_currentPos - searchStringLength] == searchString.charAt(i);
						else if(same && !fIsCaseSensitiveBlocking)
							same = Character.toLowerCase(yy_buffer[i + yy_currentPos - searchStringLength]) == Character.toLowerCase(searchString.charAt(i));
					}
				}
				// safety check failed; no match is possible right now
				else {
					same = false;
				}
			}
			if (same && requireTailSeparator && yy_currentPos < yy_buffer.length) {
				// Additional check for close tags to ensure that targetString="</script" doesn't match
				// "</scriptS"
				lastCheckChar = yy_buffer[yy_currentPos];
				// Succeed on "</script>" and "</script "
				if(lastCheckChar == '>' || Character.isWhitespace(lastCheckChar))
					stillSearching = false;
			}
			else {
				stillSearching = !same || (yy_currentPos < yy_startRead + searchStringLength);
			}
		}
	}
	if (n != YYEOF || same) {
		// We've stopped short of the end or definitely found a match
		yy_markedPos = yy_currentPos - searchStringLength;
		yy_currentPos = yy_markedPos + 1;
		// If the searchString occurs at the very beginning of what would have
		// been a Block, resume scanning normally immediately
		if (yy_markedPos == yy_startRead) {
			yybegin(immediateFallbackState);
			try {
				return primGetNextToken();
			}
			catch(IllegalStateException e) {
				start = yychar;
				while(yy_advance() != YYEOF){}
				textLength = length = yylength();
				recoverInternals();
				yybegin(YYINITIAL);
			}
			return UNDEFINED;
		}
	}
	else {
		// We ran through the rest of the input
		yy_markedPos = yy_currentPos;
		yy_currentPos++;
	}
	yybegin(exitState);
	// If the ending occurs at the very beginning of what would have
	// been a Block, resume scanning normally immediately
	if(yy_markedPos == yy_startRead) {
		try {
			return primGetNextToken();
		}
		catch(IllegalStateException e) {
			start = yychar;
			while(yy_advance() != YYEOF){}
			textLength = length = yylength();
				recoverInternals();
				yybegin(YYINITIAL);
		}
		return UNDEFINED;
	}
	return searchContext;
	}
	finally {
		fIsBlockingEnabled = wasBlockingEnabled;
	}
}
/**
 * user method 
 * does a lookahead for the current tag name
 */
private final String doBlockTagScan() throws IOException {
	fIsCaseSensitiveBlocking = getBlockMarkerCaseSensitivity();
	return doScan("</" + fCurrentTagName, true, getBlockMarkerAllowsJSP(), true, getBlockMarkerContext(fCurrentTagName), YYINITIAL, YYINITIAL);
}
	/**
	 * user method
	 *
	 * Converts the raw context String returned by the primGetNextToken()
	 * method into a full ITextRegion by pulling in values for the
	 * current offset within the scanning text.
	 *
	 * Returns null when EOF is encountered and attaches intermittently
	 * discovered whitespace onto the end of useful regions.
	 *
	 * Note that this algorithm caches the token following the one being returned
	 * so that whitespace can be collapsed.
	 */
	public final ITextRegion getNextToken() throws IOException {
		fEmbeddedContainer = null;
		// load the starting non-whitespace token (assume that it is so)
		if (fShouldLoadBuffered) {
			if (fBufferedEmbeddedContainer != null) {
				ITextRegion container = fBufferedEmbeddedContainer;
				fBufferedEmbeddedContainer = null;
				fShouldLoadBuffered = false;
				return container;
			}
			context = fBufferedContext;
			start = fBufferedStart;
			textLength = length = fBufferedLength;
			fShouldLoadBuffered = false;
		} else {
			try {
				context = primGetNextToken();
			}
			catch(IllegalStateException e) {
				start = yychar;
				while(yy_advance() != YYEOF){}
				textLength = length = yylength();
				recoverInternals();
				yybegin(YYINITIAL);
				return fRegionFactory.createToken(UNDEFINED, start, textLength, length, null, null);
			}
			if (context == PROXY_CONTEXT) {
				return fEmbeddedContainer;
			} else if (context == XML_TAG_NAME || f_context == JSP_ROOT_TAG_NAME || f_context == JSP_DIRECTIVE_NAME) {
				if(containsTagName(yy_buffer, yy_startRead, yy_markedPos-yy_startRead))
					fCurrentTagName = yytext();
				else
					fCurrentTagName = null;
			} else if (context == XML_TAG_OPEN) {
				fIsBlockingEnabled = true;
			} else if (context == XML_END_TAG_OPEN) {
				fIsBlockingEnabled = false;
			}
			start = yychar;
			textLength = length = yylength();
			if (yy_atEOF) {
				fTokenCount++;
				return null;
			}
		}
		// store the next token
		try {
			f_context = primGetNextToken();
		}
		catch(IllegalStateException e) {
			start = yychar;
			while(yy_advance() != YYEOF){}
			textLength = length = yylength();
			recoverInternals();
			yybegin(YYINITIAL);
			return fRegionFactory.createToken(UNDEFINED, start, textLength, length, null, null);
		}
		if (f_context == PROXY_CONTEXT) {
			fBufferedEmbeddedContainer = fEmbeddedContainer;
			fShouldLoadBuffered = true;
		} else if (f_context == XML_TAG_NAME || f_context == JSP_ROOT_TAG_NAME || f_context == JSP_DIRECTIVE_NAME) {
			if(containsTagName(yy_buffer, yy_startRead, yy_markedPos-yy_startRead))
				fCurrentTagName = yytext();
			else
				fCurrentTagName = null;
		} else if (f_context == XML_TAG_OPEN) {
			fIsBlockingEnabled = true;
		} else if (f_context == XML_END_TAG_OPEN) {
			fIsBlockingEnabled = false;
		} else if (f_context == PROXY_UNKNOWN_CONTEXT) {
			fBufferedEmbeddedContainer = fProxyUnknownRegion;
		}
		fBufferedContext = f_context;
		fBufferedStart = yychar;
		fBufferedLength = yylength();
		fShouldLoadBuffered = true;
		if (fBufferedContext == WHITE_SPACE) {
			fShouldLoadBuffered = false;
			length += fBufferedLength;
		}
		if (context == null) {
			// EOF
			if (Debug.debugTokenizer) {
				System.out.println(getClass().getName() + " discovered " + fTokenCount + " tokens."); //$NON-NLS-2$//$NON-NLS-1$
			}
			return null;
		}
		fTokenCount++;
		return fRegionFactory.createToken(context, start, textLength, length, null, fCurrentTagName);
	}
	/* user method */
	public JSPTokenizer(){
		super();
	}
	/* user method */
	public JSPTokenizer(char[] charArray){
			this(new CharArrayReader(charArray));
	}
	/* user method */
	public void reset(char[] charArray) {
		reset(new CharArrayReader(charArray), 0);
	}
	/* user method */
	public void reset(char[] charArray, int newOffset) {
		reset(new CharArrayReader(charArray), newOffset);
	}
	/* user method */
	public void reset(java.io.InputStream in) {
		reset(new java.io.InputStreamReader(in), 0);
	}
	/* user method */
	public void reset(java.io.InputStream in, int newOffset) {
		reset(new java.io.InputStreamReader(in), newOffset);
	}
	/* user method */
	public void reset(java.io.Reader in) {
		reset(in, 0);
	}
	/**
	 * user method *
	 *
	 * Reset internal counters and vars to "newly created" values, in the hopes
	 * that resetting a pre-existing tokenizer is faster than creating a new one.
	 *
	 * This method contains code blocks that were essentially duplicated from the
	 * <em>generated</em> output of this specification before this method was
	 * added.  Those code blocks were under the above copyright.
	 */
	public void reset(java.io.Reader in, int newOffset) {
		if (Debug.debugTokenizer) {
			System.out.println("resetting tokenizer");//$NON-NLS-1$
		}
		fInputStamp++;
		fOffset = newOffset;
	
		/* the input device */
		yy_reader = in;
	
		/* the current state of the DFA */
		yy_state = 0;
	
		/* the current lexical state */
		yy_lexical_state = YYINITIAL;
	
		/* this buffer contains the current text to be matched and is
		the source of the yytext() string */
		java.util.Arrays.fill(yy_buffer, (char)0);
	
		/* the textposition at the last accepting state */
		yy_markedPos = 0;
	
		/* the textposition at the last state to be included in yytext */
		yy_pushbackPos = 0;
	
		/* the current text position in the buffer */
		yy_currentPos = 0;
	
		/* startRead marks the beginning of the yytext() string in the buffer */
		yy_startRead = 0;
	
		/** 
		 * endRead marks the last character in the buffer, that has been read
		 * from input 
		 */
		yy_endRead = 0;
	
		/* number of newlines encountered up to the start of the matched text */
		//yyline = 0;
	
		/* the number of characters up to the start of the matched text */
		yychar = 0;
	
		/* yy_atEOF == true <=> the scanner has returned a value for EOF */
		yy_atEOF = false;
	
		/* denotes if the user-EOF-code has already been executed */
		yy_eof_done = false;
	
	
		/* user vars: */
		fTokenCount = 0;
	 
		fShouldLoadBuffered = false;
		fBufferedContext = null;
		fBufferedStart = 1;
		fBufferedLength = 0;
		fStateStack = new IntStack();
		fJspTagStack.clear();
	
		fLastInternalBlockStart = -1;
	
		context = null;
		start = 0;
		textLength = 0;
		length = 0;
	
		fEmbeddedContainer = null;
		
		fELlevel = 0;
	}
	/**
	 * user method
	 *
	 */
	public BlockTokenizer newInstance() {
		JSPTokenizer newInstance = new JSPTokenizer();
		// global tagmarkers can be shared; they have no state and 
		// are never destroyed (e.g. 'release')
		for(int i = 0; i < fBlockMarkers.size(); i++) {
			BlockMarker blockMarker = (BlockMarker) fBlockMarkers.get(i);
			if(blockMarker.isGlobal())
				newInstance.addBlockMarker(blockMarker);
		}
		for(int i = 0; i < fNestablePrefixes.size(); i++) {
			TagMarker marker = (TagMarker) fNestablePrefixes.get(i);
			if(marker.isGlobal())
				newInstance.addNestablePrefix(marker);
		}
		return newInstance;
	}
	/* user method */
	private final String scanXMLCommentText() throws IOException {
		// Scan for '-->' and return the text up to that point as
		//   XML_COMMENT_TEXT unless the string occurs IMMEDIATELY, in which
		//  case change to the ST_XML_COMMENT_END state and return the next
		//  context as usual.
		return doScan("-->", false, true, true, XML_COMMENT_TEXT, ST_XML_COMMENT_END, ST_XML_COMMENT_END);
	}
	/* user method */
	private final String scanJSPCommentText() throws IOException {
		// Scan for '--%>' and return the text up to that point as
		//   JSP_COMMENT_TEXT unless the string occurs IMMEDIATELY, in which
		//  case change to the ST_JSP_COMMENT_END state and return the next
		//  context as usual.
		return doScan("--%>", false, false, true, JSP_COMMENT_TEXT, ST_JSP_COMMENT_END, ST_JSP_COMMENT_END);
	}
	
	/* user method */
	private boolean isJspTag() {
	  return fJspTagStack.empty() ? false : fJspTagStack.peek();
	}
	/* user method */
	private void recoverInternals() {
		fShouldLoadBuffered = false;
		fBufferedContext = null;
		fBufferedStart = 1;
		fBufferedLength = 0;
		fStateStack = new IntStack();
		fJspTagStack.clear();
	
		fLastInternalBlockStart = -1;
	
		context = null;	
		fEmbeddedContainer = null;
		
		fELlevel = 0;
	}



  /**
   * Creates a new scanner
   * There is also a java.io.InputStream version of this constructor.
   *
   * @param   in  the java.io.Reader to read input from.
   */
  public JSPTokenizer(java.io.Reader in) {
    this.yy_reader = in;
  }

  /**
   * Creates a new scanner.
   * There is also java.io.Reader version of this constructor.
   *
   * @param   in  the java.io.Inputstream to read input from.
   */
  public JSPTokenizer(java.io.InputStream in) {
    this(new java.io.InputStreamReader(in));
  }

  /** 
   * Unpacks the compressed DFA transition table.
   *
   * @param packed   the packed transition table
   * @return         the unpacked transition table
   */
  private static int [] yy_unpack(String packed) {
    int [] trans = new int[32731];
    int i = 0;  /* index in packed string  */
    int j = 0;  /* index in unpacked array */
    while (i < 8694) {
      int count = packed.charAt(i++);
      int value = packed.charAt(i++);
      value--;
      do trans[j++] = value; while (--count > 0);
    }
    return trans;
  }

  /** 
   * Unpacks the compressed character translation table.
   *
   * @param packed   the packed character translation table
   * @return         the unpacked character translation table
   */
  private static char [] yy_unpack_cmap(String packed) {
    char [] map = new char[0x10000];
    int i = 0;  /* index in packed string  */
    int j = 0;  /* index in unpacked array */
    while (i < 1376) {
      int  count = packed.charAt(i++);
      char value = packed.charAt(i++);
      do map[j++] = value; while (--count > 0);
    }
    return map;
  }


  /**
   * Gets the next input character.
   *
   * @return      the next character of the input stream, EOF if the
   *              end of the stream is reached.
   * @exception   IOException  if any I/O-Error occurs
   */
  private int yy_advance() throws java.io.IOException {

    /* standard case */
    if (yy_currentPos < yy_endRead) return yy_buffer[yy_currentPos++];

    /* if the eof is reached, we don't need to work hard */ 
    if (yy_atEOF) return YYEOF;

    /* otherwise: need to refill the buffer */

    /* first: make room (if you can) */
    if (yy_startRead > 0) {
      System.arraycopy(yy_buffer, yy_startRead, 
                       yy_buffer, 0, 
                       yy_endRead-yy_startRead);

      /* translate stored positions */
      yy_endRead-= yy_startRead;
      yy_currentPos-= yy_startRead;
      yy_markedPos-= yy_startRead;
      yy_pushbackPos-= yy_startRead;
      yy_startRead = 0;
    }

    /* is the buffer big enough? */
    if (yy_currentPos >= yy_buffer.length) {
      /* if not: blow it up */
      char newBuffer[] = new char[yy_currentPos*2];
      System.arraycopy(yy_buffer, 0, newBuffer, 0, yy_buffer.length);
      yy_buffer = newBuffer;
    }

    /* finally: fill the buffer with new input */
    int numRead = yy_reader.read(yy_buffer, yy_endRead, 
                                            yy_buffer.length-yy_endRead);

    if ( numRead == -1 ) return YYEOF;

    yy_endRead+= numRead;

    return yy_buffer[yy_currentPos++];
  }

    
  /**
   * Closes the input stream.
   */
  final public void yyclose() throws java.io.IOException {
    yy_atEOF = true;            /* indicate end of file */
    yy_endRead = yy_startRead;  /* invalidate buffer    */
    yy_reader.close();
  }


  /**
   * Returns the current lexical state.
   */
  final public int yystate() {
    return yy_lexical_state;
  }

  /**
   * Enters a new lexical state
   *
   * @param newState the new lexical state
   */
  final public void yybegin(int newState) {
    yy_lexical_state = newState;
  }


  /**
   * Returns the text matched by the current regular expression.
   */
  final public String yytext() {
    return new String( yy_buffer, yy_startRead, yy_markedPos-yy_startRead );
  }

  /**
   * Returns the length of the matched text region.
   */
  final public int yylength() {
    return yy_markedPos-yy_startRead;
  }


  /**
   * Reports an error that occurred while scanning - method from the SSE custom JFlex skeleton
   *
   * @param   errorCode  the code of the error message to display
   */
  private void yy_ScanError(int errorCode) {
	if (fErroredInputstamp != fInputStamp) {
			// must update count before throwing the exception
			fErroredInputstamp = fInputStamp;
			// attempt to capture and report the next 20 characters
			StringBuffer next = new StringBuffer();
			if(errorCode == YY_NO_MATCH) {
				for (int i = 0; i < 20; i++) {
					try {
						int c = yy_advance();
						if (c != YYEOF)
							next.append((char) c);
					}
					catch (IOException e1) {
					}
				}
				yypushback(next.length());
			}
			IllegalStateException e = new IllegalStateException("Instance:" + System.identityHashCode(this) + " Input:" + fInputStamp + " offset:" + (fOffset + yychar) + " state:" + yystate() + " stack:" + fStateStack + " next:" + next);
			try {
				Logger.logException(YY_ERROR_MSG[errorCode], e);
				throw (e);
			}
			catch (ArrayIndexOutOfBoundsException e2) {
				Logger.logException(YY_ERROR_MSG[YY_UNKNOWN_ERROR], e2);
			}
		}

		// DO NOT EXIT the VM on an error
		// System.exit(1);
  } 


  /**
   * Pushes the specified amount of characters back into the input stream.
   *
   * They will be read again by then next call of the scanning method
   *
   * @param number  the number of characters to be read again.
   *                This number must not be greater than yylength()!
   */
  void yypushback(int number) {
    if ( number > yylength() )
      yy_ScanError(YY_PUSHBACK_2BIG);

    yy_markedPos -= number;
  }

	/**
	 * user method - skeleton.sed
	 */
	protected final boolean containsTagName(char[] markerTagName, int offset, int tagnameLength) {
		for(int j = 0; j < fBlockMarkers.size(); j++) {
			BlockMarker marker = (BlockMarker)fBlockMarkers.get(j);
			if(marker.getTagName().length() == tagnameLength) {
				boolean matchesSoFar = true;
				for(int i = 0; i < tagnameLength && matchesSoFar; i++) {
					if(marker.isCaseSensitive()) {
						if(marker.getTagName().charAt(i) != markerTagName[i + offset])
							matchesSoFar = false;
					}
					else {
						if(Character.toLowerCase(marker.getTagName().charAt(i)) != Character.toLowerCase(markerTagName[i + offset]))
							matchesSoFar = false;
					}
				}
				if(matchesSoFar)
					return true;
			}
		}
		return false;
	}

	/**
	 * user method - skeleton.sed
	 *
	 * Return ALL of the regions scannable within the remaining text
	 * Note: for verification use
	 */
	public final List getRegions() {
		List tokens = new ArrayList();
		ITextRegion region = null;
		try {
			region = getNextToken();
			while(region != null) {
				if (region != null) {
					tokens.add(region);
				}
				region = getNextToken();
			}
		}
		catch (StackOverflowError e) {
			Logger.logException(getClass().getName()+": input could not be tokenized correctly at position " + getOffset(), e);//$NON-NLS-1$
			throw e;
		}
		catch (Exception e) {
			// Since this is convenience method and NOT the recommended 
			// way of getting tokens, many errors are simply hidden
			Logger.logException("Exception not handled retrieving regions: " + e.getLocalizedMessage(), e);//$NON-NLS-1$
		}
		return tokens;
	}
	/**
	 * user method - skeleton.sed
	 */
	private final void dump(String s) {
		if (Debug.debugTokenizer) {
			System.out.println(s + " (" + yychar + "-" + //$NON-NLS-2$//$NON-NLS-1$
				(yylength() + yychar) + "):\'" +//$NON-NLS-1$
					StringUtils.escape(yytext()) + "\'");//$NON-NLS-1$
		}
	}
	/* user method  - skeleton.sed */
	public final boolean isEOF() {
		return yy_atEOF;
	}
/* user method - skeleton.sed */
protected final boolean containsTagName(String markerTagName) {
	Iterator blocks = fBlockMarkers.iterator();
	while(blocks.hasNext()) {
		BlockMarker marker = (BlockMarker)blocks.next();
		if(marker.isCaseSensitive()) {
			if(marker.getTagName().equals(markerTagName))
				return true;
		}
		else {
			if(marker.getTagName().equalsIgnoreCase(markerTagName))
				return true;
		}
	}
	return false;
}

  /**
   * Contains user EOF-code, which will be executed exactly once,
   * when the end of file is reached
   */
  private void yy_do_eof() {
    if (!yy_eof_done) {
      yy_eof_done = true;
    // do nothing, this is the downstream parser's job

    }
  }


  /**
   * Resumes scanning until the next regular expression is matched,
   * the end of input is encountered or an I/O-Error occurs.
   *
   * @return      the next token
   * @exception   IOException  if any I/O-Error occurs
   */
  public String primGetNextToken() throws java.io.IOException {
    int yy_input;
    int yy_action;

    yy_pushbackPos = -1;
    boolean yy_was_pushback;

    while (true) {

      yychar+= yylength();

      yy_action = -1;

      yy_currentPos = yy_startRead = yy_markedPos;

      yy_state = yy_lexical_state;

      yy_was_pushback = false;

      yy_forAction: {
        while (true) {
    
          yy_input = yy_advance();

          if ( yy_input == YYEOF ) break yy_forAction;

          int yy_next = yytrans[ yy_rowMap[yy_state] + yycmap[yy_input] ];
          if (yy_next == -1) break yy_forAction;
          yy_state = yy_next;

          int yy_attributes = YY_ATTRIBUTE[yy_state];
          if ( (yy_attributes & 2) > 0 )
            yy_pushbackPos = yy_currentPos;

          if ( (yy_attributes & 1) > 0 ) {
            yy_was_pushback = (yy_attributes & 4) > 0;
            yy_action = yy_state; 
            yy_markedPos = yy_currentPos; 
            if ( (yy_attributes & 8) > 0 ) break yy_forAction;
          }

        }
      }

      if (yy_was_pushback)
        yy_markedPos = yy_pushbackPos;

      switch (yy_action) {    

        case 122: 
        case 127: 
        case 128: 
        case 276: 
        case 280: 
        case 281: 
        case 401: 
        case 404: 
        case 501: 
          {  /* only allow for non-JSP tags for this does not obey JSP quoting rules */
	if(Debug.debugTokenizer)
		dump("attr value");//$NON-NLS-1$
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_EQUALS;
        yybegin(ST_XML_ATTRIBUTE_NAME);
        return XML_TAG_ATTRIBUTE_VALUE;
 }
        case 676: break;
        case 167: 
        case 172: 
        case 173: 
        case 328: 
        case 334: 
        case 335: 
        case 432: 
        case 433: 
        case 434: 
        case 436: 
        case 517: 
          {  /* JSP attribute values have escape semantics */
	if(Debug.debugTokenizer)
		dump("jsp attr value");//$NON-NLS-1$
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_EQUALS;
	yybegin(ST_XML_ATTRIBUTE_NAME);
	return XML_TAG_ATTRIBUTE_VALUE;
 }
        case 677: break;
        case 643: 
        case 648: 
        case 655: 
        case 660: 
          { 
	if(Debug.debugTokenizer)
		dump("jsp directive tag name");//$NON-NLS-1$
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_EQUALS;
        yybegin(ST_XML_ATTRIBUTE_NAME);
        return JSP_DIRECTIVE_NAME;
 }
        case 678: break;
        case 618: 
          { 
	if(Debug.debugTokenizer)
		dump("XSL processing instruction target");//$NON-NLS-1$
	fEmbeddedPostState = ST_XML_EQUALS;
        yybegin(ST_XML_PI_ATTRIBUTE_NAME);
        return XML_TAG_NAME;
 }
        case 679: break;
        case 601: 
        case 604: 
        case 605: 
        case 606: 
        case 607: 
        case 608: 
        case 609: 
          { 
	if(Debug.debugTokenizer)
		dump("\nCDATA start");//$NON-NLS-1$
	fStateStack.push(yystate());
	yybegin(ST_CDATA_TEXT);
	return XML_CDATA_OPEN;
 }
        case 680: break;
        case 593: 
          { 
	if(Debug.debugTokenizer)
		dump("jsp:root tag name");//$NON-NLS-1$
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_EQUALS;
        yybegin(ST_XML_ATTRIBUTE_NAME);
        return JSP_ROOT_TAG_NAME;
 }
        case 681: break;
        case 584: 
          { 
	if(Debug.debugTokenizer)
		dump("element");//$NON-NLS-1$
	yybegin(ST_XML_ELEMENT_DECLARATION);
	return XML_ELEMENT_DECLARATION;
 }
        case 682: break;
        case 583: 
          { 
	if(Debug.debugTokenizer)
		dump("attlist");//$NON-NLS-1$
	yybegin(ST_XML_ATTLIST_DECLARATION);
	return XML_ATTLIST_DECLARATION;
 }
        case 683: break;
        case 582: 
          { 
	if(Debug.debugTokenizer)
		dump("doctype");//$NON-NLS-1$
	yybegin(ST_XML_DOCTYPE_DECLARATION);
	return XML_DOCTYPE_DECLARATION;
 }
        case 684: break;
        case 567: 
          { 
	if(Debug.debugTokenizer)
		dump("doctype external id");//$NON-NLS-1$
	fEmbeddedHint = XML_DOCTYPE_EXTERNAL_ID_PUBREF;
	yybegin(ST_XML_DOCTYPE_ID_PUBLIC);
	return XML_DOCTYPE_EXTERNAL_ID_PUBLIC;
 }
        case 685: break;
        case 566: 
          { 
	if(Debug.debugTokenizer)
		dump("doctype external id");//$NON-NLS-1$
	fEmbeddedHint = XML_DOCTYPE_EXTERNAL_ID_SYSREF;
	yybegin(ST_XML_DOCTYPE_ID_SYSTEM);
	return XML_DOCTYPE_EXTERNAL_ID_SYSTEM;
 }
        case 686: break;
        case 560: 
          { 
	if(Debug.debugTokenizer)
		dump("DHTML processing instruction target");//$NON-NLS-1$
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_EQUALS;
        yybegin(ST_DHTML_ATTRIBUTE_NAME);
        return XML_TAG_NAME;
 }
        case 687: break;
        case 535: 
        case 576: 
        case 577: 
          { 
	return JSP_VBL_QUOTED_CONTENT;
 }
        case 688: break;
        case 525: 
        case 572: 
        case 573: 
          { 
	return JSP_EL_QUOTED_CONTENT;
 }
        case 689: break;
        case 516: 
          { 
	if(Debug.debugTokenizer)
		dump("\nJSP comment close");//$NON-NLS-1$
	yybegin(YYINITIAL);
	return JSP_COMMENT_CLOSE;
 }
        case 690: break;
        case 503: 
          { 
	if (Debug.debugTokenizer) {
		System.out.println("begin embedded region: " + fEmbeddedHint+", el-unquoted");//$NON-NLS-1$
	}
	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
	fStateStack.push(yystate());
	if(yylength() > 2)
		yypushback(yylength() -2);
	if(Debug.debugTokenizer)
		dump("VBL in attr value");//$NON-NLS-1$
	yybegin(ST_JSP_VBL);
	fELlevel++;
	assembleEmbeddedContainer(JSP_VBL_OPEN, new String[]{JSP_VBL_CLOSE});
	fStateStack.pop();
	yybegin(ST_XML_ATTRIBUTE_NAME);
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_EQUALS;
	return PROXY_CONTEXT;
 }
        case 691: break;
        case 502: 
          { 
	if (Debug.debugTokenizer) {
		System.out.println("begin embedded region: " + fEmbeddedHint+", el-unquoted");//$NON-NLS-1$
	}
	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
	fStateStack.push(yystate());
	if(yylength() > 2)
		yypushback(yylength() -2);
	if(Debug.debugTokenizer)
		dump("EL in attr value");//$NON-NLS-1$
	yybegin(ST_JSP_EL);
	fELlevel++;
	assembleEmbeddedContainer(JSP_EL_OPEN, new String[]{JSP_EL_CLOSE});
	fStateStack.pop();
	yybegin(ST_XML_ATTRIBUTE_NAME);
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_EQUALS;
	return PROXY_CONTEXT;
 }
        case 692: break;
        case 496: 
          { 
	if(Debug.debugTokenizer)
		dump("\nCharRef");//$NON-NLS-1$
	return XML_CHAR_REFERENCE;
 }
        case 693: break;
        case 493: 
          { 
	if(Debug.debugTokenizer)
		dump("\ncomment start");//$NON-NLS-1$
	fEmbeddedHint = XML_COMMENT_TEXT;
	fEmbeddedPostState = ST_XML_COMMENT;
	yybegin(ST_XML_COMMENT);
	return XML_COMMENT_OPEN;
 }
        case 694: break;
        case 492: 
        case 511: 
        case 514: 
        case 518: 
        case 519: 
        case 521: 
        case 523: 
        case 526: 
        case 528: 
        case 529: 
        case 531: 
        case 533: 
        case 536: 
          { 
	/* JSP comment begun (anywhere)
	 * A consequence of the start anywhere possibility is that the
	 *  incoming state must be checked to see if it's erroneous
	 *  due to the order of precedence generated
	 */
	// begin sanity checks
	if(yystate() == ST_JSP_CONTENT) {
		// at the beginning?!
		yypushback(3);
		return JSP_CONTENT;
	}
	else if(yystate() == ST_BLOCK_TAG_SCAN) {
		yypushback(4);
		return doBlockTagScan();
	}
	else if(yystate() == ST_XML_COMMENT) {
		yypushback(4);
		return scanXMLCommentText();
	}
	else if(yystate() == ST_JSP_COMMENT) {
		yypushback(4);
		return scanJSPCommentText();
	}
	else if(yystate() == ST_BLOCK_TAG_INTERNAL_SCAN)  {
		yybegin(ST_JSP_COMMENT);
		assembleEmbeddedContainer(JSP_COMMENT_OPEN, JSP_COMMENT_CLOSE);
		if(yystate() == ST_BLOCK_TAG_INTERNAL_SCAN)
			yybegin(ST_BLOCK_TAG_SCAN);
		return PROXY_CONTEXT;
	}
	// finished sanity checks
	if(yystate()==YYINITIAL) {
		// the simple case, just a regular scriptlet out in content
		if(Debug.debugTokenizer)
			dump("\nJSP comment start");//$NON-NLS-1$
		yybegin(ST_JSP_COMMENT);
		return JSP_COMMENT_OPEN;
	}
	else {
		if (Debug.debugTokenizer) {
			System.out.println("begin embedded region: " + fEmbeddedHint+", jspCommentStart");//$NON-NLS-1$
		}
		if(Debug.debugTokenizer)
			dump("JSP comment start");//$NON-NLS-1$
		if(yystate() == ST_XML_ATTRIBUTE_VALUE_DQUOTED)
			fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_DQUOTED;
		else if(yystate() == ST_XML_ATTRIBUTE_VALUE_SQUOTED)
			fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_SQUOTED;
		else if(yystate() == ST_CDATA_TEXT) {
			fEmbeddedPostState = ST_CDATA_TEXT;
			fEmbeddedHint = XML_CDATA_TEXT;
		}
		yybegin(ST_JSP_COMMENT);
		// the comment container itself will act as comment text
		fEmbeddedHint = JSP_COMMENT_TEXT;
		assembleEmbeddedContainer(JSP_COMMENT_OPEN, JSP_COMMENT_CLOSE);
		if(yystate() == ST_BLOCK_TAG_INTERNAL_SCAN) {
			yybegin(ST_BLOCK_TAG_SCAN);
			return BLOCK_TEXT;
		}
		/*
		 * required help for successive embedded regions; mark this one as a
		 * comment so it will be otherwise ignored but preserved (which is why
		 * we can't use white-space)
		 */
		if(yystate() == ST_XML_TAG_NAME) {
			fEmbeddedHint = XML_TAG_NAME;
			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
		}
		else if((yystate() == ST_XML_ATTRIBUTE_NAME || yystate() == ST_XML_EQUALS)) {
			fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
			fEmbeddedPostState = ST_XML_EQUALS;
		}
		else if(yystate() == ST_XML_ATTRIBUTE_VALUE) {
			fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
		}
		else if(yystate() == ST_JSP_ATTRIBUTE_VALUE) {
			fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
		}
		return PROXY_CONTEXT;
	}
 }
        case 695: break;
        case 395: 
        case 396: 
          { 
	if(Debug.debugTokenizer)
		dump("XML processing instruction target");//$NON-NLS-1$
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_EQUALS;
        yybegin(ST_XML_PI_ATTRIBUTE_NAME);
        return XML_TAG_NAME;
 }
        case 696: break;
        case 394: 
          { 
	if(Debug.debugTokenizer)
		dump("comment end");//$NON-NLS-1$
	fEmbeddedHint = UNDEFINED;
	yybegin(YYINITIAL);
	return XML_COMMENT_CLOSE;
 }
        case 697: break;
        case 393: 
          { 
	if(Debug.debugTokenizer)
		dump("CDATA end");//$NON-NLS-1$
	yybegin(fStateStack.pop());
	return XML_CDATA_CLOSE;
 }
        case 698: break;
        case 391: 
          { 
	yybegin(ST_JSP_VBL);
	if(yylength() > 2)
		yypushback(yylength() - 2);
	fELlevel++;
	fEmbeddedHint = XML_CONTENT;
	fEmbeddedPostState = YYINITIAL;
	assembleEmbeddedContainer(JSP_VBL_OPEN, JSP_VBL_CLOSE);
	fEmbeddedHint = XML_CONTENT;
	yybegin(YYINITIAL);
	return PROXY_CONTEXT;
 }
        case 699: break;
        case 390: 
          { 
	if(Debug.debugTokenizer)
		dump("\nPEReference");//$NON-NLS-1$
	return XML_PE_REFERENCE;
 }
        case 700: break;
        case 389: 
          { 
	yybegin(ST_JSP_EL);
	if(yylength() > 2)
		yypushback(yylength() - 2);
	fELlevel++;
	fEmbeddedHint = XML_CONTENT;
	fEmbeddedPostState = YYINITIAL;
	assembleEmbeddedContainer(JSP_EL_OPEN, JSP_EL_CLOSE);
	fEmbeddedHint = XML_CONTENT;
	yybegin(YYINITIAL);
	return PROXY_CONTEXT;
 }
        case 701: break;
        case 385: 
          { 
	if(Debug.debugTokenizer)
		dump("\nEntityRef");//$NON-NLS-1$
	return XML_ENTITY_REFERENCE;
 }
        case 702: break;
        case 379: 
        case 421: 
        case 429: 
        case 442: 
        case 447: 
        case 452: 
        case 457: 
        case 463: 
        case 469: 
        case 473: 
        case 478: 
        case 483: 
        case 489: 
          { 
	/* JSP expression begun (anywhere)
	 * A consequence of the start anywhere possibility is that the
	 *  incoming state must be checked to see if it's erroneous
	 *  due to the order of precedence generated
	 */
	// begin sanity checks
	if(yystate() == ST_JSP_CONTENT) {
		// at the beginning?!
		yypushback(2);
		return JSP_CONTENT;
	}
	else if(yystate() == ST_BLOCK_TAG_SCAN) {
		yypushback(3);
		return doBlockTagScan();
	}
	else if(yystate() == ST_XML_COMMENT) {
		yypushback(3);
		return scanXMLCommentText();
	}
	else if(yystate() == ST_JSP_COMMENT) {
		yypushback(3);
		return scanJSPCommentText();
	}
	// end sanity checks
	fStateStack.push(yystate());
	if(fStateStack.peek()==YYINITIAL) {
		// the simple case, just an expression out in content
		if(Debug.debugTokenizer)
			dump("\nJSP expression start");//$NON-NLS-1$
		yybegin(ST_JSP_CONTENT);
		return JSP_EXPRESSION_OPEN;
	}
	else {
		if (Debug.debugTokenizer) {
			System.out.println("begin embedded region: " + fEmbeddedHint+", jspExpressionStart");//$NON-NLS-1$
		}
		if(Debug.debugTokenizer)
			dump("JSP expression start");//$NON-NLS-1$
		if(yystate() == ST_XML_ATTRIBUTE_VALUE_DQUOTED)
			fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_DQUOTED;
		else if(yystate() == ST_XML_ATTRIBUTE_VALUE_SQUOTED)
			fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_SQUOTED;
		else if(yystate() == ST_CDATA_TEXT) {
			fEmbeddedPostState = ST_CDATA_TEXT;
			fEmbeddedHint = XML_CDATA_TEXT;
		}
		yybegin(ST_JSP_CONTENT);
		assembleEmbeddedContainer(JSP_EXPRESSION_OPEN, JSP_CLOSE);
		if(yystate() == ST_BLOCK_TAG_INTERNAL_SCAN) {
			yybegin(ST_BLOCK_TAG_SCAN);
			return BLOCK_TEXT;
		}
		// required help for successive embedded regions
		if(yystate() == ST_XML_TAG_NAME) {
			fEmbeddedHint = XML_TAG_NAME;
			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
		}
		else if((yystate() == ST_XML_ATTRIBUTE_NAME || yystate() == ST_XML_EQUALS)) {
			fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
			fEmbeddedPostState = ST_XML_EQUALS;
		}
		else if(yystate() == ST_XML_ATTRIBUTE_VALUE) {
			fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
		}
		else if(yystate() == ST_JSP_ATTRIBUTE_VALUE) {
			fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
		}
		
		return PROXY_CONTEXT;
	}
 }
        case 703: break;
        case 378: 
        case 420: 
        case 428: 
        case 441: 
        case 446: 
        case 451: 
        case 456: 
        case 462: 
        case 468: 
        case 472: 
        case 477: 
        case 482: 
        case 488: 
          { 
	/* JSP declaration begun (anywhere)
	 * A consequence of the start anywhere possibility is that the
	 *  incoming state must be checked to see if it's erroneous
	 *  due to the order of precedence generated
	 */
	// begin sanity checks
	if(yystate() == ST_JSP_CONTENT) {
		// at the beginning?!
		yypushback(2);
		return JSP_CONTENT;
	}
	else if(yystate() == ST_BLOCK_TAG_SCAN) {
		yypushback(3);
		return doBlockTagScan();
	}
	else if(yystate() == ST_XML_COMMENT) {
		yypushback(3);
		return scanXMLCommentText();
	}
	else if(yystate() == ST_JSP_COMMENT) {
		yypushback(3);
		return scanJSPCommentText();
	}
	// end sanity checks
	fStateStack.push(yystate());
	if(fStateStack.peek()==YYINITIAL) {
		// the simple case, just a declaration out in content
		if(Debug.debugTokenizer)
			dump("\nJSP declaration start");//$NON-NLS-1$
		yybegin(ST_JSP_CONTENT);
		return JSP_DECLARATION_OPEN;
	}
	else {
		if (Debug.debugTokenizer) {
			System.out.println("begin embedded region: " + fEmbeddedHint+", jspDeclarationStart");//$NON-NLS-1$
		}
		if(Debug.debugTokenizer)
			dump("JSP declaration start");//$NON-NLS-1$
		if(yystate() == ST_XML_ATTRIBUTE_VALUE_DQUOTED)
			fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_DQUOTED;
		else if(yystate() == ST_XML_ATTRIBUTE_VALUE_SQUOTED)
			fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_SQUOTED;
		else if(yystate() == ST_CDATA_TEXT) {
			fEmbeddedPostState = ST_CDATA_TEXT;
			fEmbeddedHint = XML_CDATA_TEXT;
		}
		yybegin(ST_JSP_CONTENT);
		assembleEmbeddedContainer(JSP_DECLARATION_OPEN, JSP_CLOSE);
		if(yystate() == ST_BLOCK_TAG_INTERNAL_SCAN) {
			yybegin(ST_BLOCK_TAG_SCAN);
			return BLOCK_TEXT;
		}
		// required help for successive embedded regions
		if(yystate() == ST_XML_TAG_NAME) {
			fEmbeddedHint = XML_TAG_NAME;
			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
		}
		else if((yystate() == ST_XML_ATTRIBUTE_NAME || yystate() == ST_XML_EQUALS)) {
			fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
			fEmbeddedPostState = ST_XML_EQUALS;
		}
		else if(yystate() == ST_XML_ATTRIBUTE_VALUE) {
			fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
		}
		else if(yystate() == ST_JSP_ATTRIBUTE_VALUE) {
			fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
		}
		return PROXY_CONTEXT;
	}
 }
        case 704: break;
        case 377: 
        case 419: 
        case 427: 
        case 440: 
        case 445: 
        case 450: 
        case 455: 
        case 461: 
        case 467: 
        case 471: 
        case 476: 
        case 481: 
        case 487: 
          { 
	/* JSP directive begun (anywhere)
	 * A consequence of the start anywhere possibility is that the
	 *  incoming state must be checked to see if it's erroneous
	 *  due to the order of precedence generated
	 */
	// begin sanity checks
	if(yystate() == ST_JSP_CONTENT) {
		// at the beginning?!
		yypushback(2);
		return JSP_CONTENT;
	}
	else if(yystate() == ST_BLOCK_TAG_SCAN) {
		yypushback(3);
		return doBlockTagScan();
	}
	else if(yystate() == ST_XML_COMMENT) {
		yypushback(3);
		return scanXMLCommentText();
	}
	else if(yystate() == ST_JSP_COMMENT) {
		yypushback(3);
		return scanJSPCommentText();
	}
	// end sanity checks
	fStateStack.push(yystate());
	if(fStateStack.peek()==YYINITIAL) {
		// the simple case, just a declaration out in content
		if(Debug.debugTokenizer)
			dump("\nJSP directive start");//$NON-NLS-1$
		yybegin(ST_JSP_DIRECTIVE_NAME);
		return JSP_DIRECTIVE_OPEN;
	}
	else {
		if (Debug.debugTokenizer) {
			System.out.println("begin embedded region: " + fEmbeddedHint+", jspDirectiveStart");//$NON-NLS-1$
		}
		if(Debug.debugTokenizer)
			dump("JSP declaration start");//$NON-NLS-1$
		if(yystate() == ST_XML_ATTRIBUTE_VALUE_DQUOTED)
			fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_DQUOTED;
		else if(yystate() == ST_XML_ATTRIBUTE_VALUE_SQUOTED)
			fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_SQUOTED;
		else if(yystate() == ST_CDATA_TEXT) {
			fEmbeddedPostState = ST_CDATA_TEXT;
			fEmbeddedHint = XML_CDATA_TEXT;
		}
		yybegin(ST_JSP_DIRECTIVE_NAME);
		assembleEmbeddedContainer(JSP_DIRECTIVE_OPEN, new String[]{JSP_DIRECTIVE_CLOSE, JSP_CLOSE});
		if(yystate() == ST_BLOCK_TAG_INTERNAL_SCAN) {
			yybegin(ST_BLOCK_TAG_SCAN);
			return BLOCK_TEXT;
		}
		// required help for successive embedded regions
		if(yystate() == ST_XML_TAG_NAME) {
			fEmbeddedHint = XML_TAG_NAME;
			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
		}
		else if((yystate() == ST_XML_ATTRIBUTE_NAME || yystate() == ST_XML_EQUALS)) {
			fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
			fEmbeddedPostState = ST_XML_EQUALS;
		}
		else if(yystate() == ST_XML_ATTRIBUTE_VALUE) {
			fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
		}
		return PROXY_CONTEXT;
	}
 }
        case 705: break;
        case 367: 
          { 
	yybegin(ST_JSP_VBL_DQUOTES_END);
	return JSP_VBL_QUOTED_CONTENT;
 }
        case 706: break;
        case 363: 
          { 
	yybegin(ST_JSP_VBL_SQUOTES_END);
	return JSP_VBL_QUOTED_CONTENT;
 }
        case 707: break;
        case 361: 
          { 
	fELlevel++;
	if(fELlevel == 1) {
		return JSP_VBL_OPEN;
	}
 }
        case 708: break;
        case 351: 
          { 
	yybegin(ST_JSP_EL_DQUOTES_END);
	return JSP_EL_QUOTED_CONTENT;
 }
        case 709: break;
        case 347: 
          { 
	yybegin(ST_JSP_EL_SQUOTES_END);
	return JSP_EL_QUOTED_CONTENT;
 }
        case 710: break;
        case 345: 
          { 
	//System.out.println(JSP_EL_CONTENT+ ":[" + yytext() + "]");
	return JSP_EL_CONTENT;
 }
        case 711: break;
        case 344: 
          { 
	fELlevel++;
	if(fELlevel == 1) {
		return JSP_EL_OPEN;
	}
 }
        case 712: break;
        case 341: 
          { 
	int enterState = yystate();
	yybegin(ST_JSP_DQUOTED_VBL);
	assembleEmbeddedContainer(JSP_VBL_OPEN, new String[]{JSP_VBL_CLOSE, XML_TAG_ATTRIBUTE_VALUE_DQUOTE, JSP_TAG_ATTRIBUTE_VALUE_DQUOTE});
	// abort early when an unescaped double quote is found in the VBL
	if(fEmbeddedContainer.getLastRegion().getType().equals(XML_TAG_ATTRIBUTE_VALUE_DQUOTE) || fEmbeddedContainer.getLastRegion().getType().equals(JSP_TAG_ATTRIBUTE_VALUE_DQUOTE)) {
		yybegin(ST_ABORT_EMBEDDED);
		fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
	}
	else {
		yybegin(enterState);
	}
	return PROXY_CONTEXT;
 }
        case 713: break;
        case 340: 
          { 
	int enterState = yystate();
	yybegin(ST_JSP_DQUOTED_EL);
	assembleEmbeddedContainer(JSP_EL_OPEN, new String[]{JSP_EL_CLOSE, XML_TAG_ATTRIBUTE_VALUE_DQUOTE, JSP_TAG_ATTRIBUTE_VALUE_DQUOTE});
	// abort early when an unescaped double quote is found in the EL
	if(fEmbeddedContainer.getLastRegion().getType().equals(XML_TAG_ATTRIBUTE_VALUE_DQUOTE) || fEmbeddedContainer.getLastRegion().getType().equals(JSP_TAG_ATTRIBUTE_VALUE_DQUOTE)) {
		yybegin(ST_ABORT_EMBEDDED);
		fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
	}
	else {
		yybegin(enterState);
	}
	return PROXY_CONTEXT;
 }
        case 714: break;
        case 339: 
          { 
	int enterState = yystate();
	yybegin(ST_JSP_SQUOTED_VBL);
	assembleEmbeddedContainer(JSP_VBL_OPEN, new String[]{JSP_VBL_CLOSE, XML_TAG_ATTRIBUTE_VALUE_SQUOTE, JSP_TAG_ATTRIBUTE_VALUE_SQUOTE});
	// abort early when an unescaped single quote is found in the VBL
	if(fEmbeddedContainer.getLastRegion().getType().equals(XML_TAG_ATTRIBUTE_VALUE_SQUOTE) || fEmbeddedContainer.getLastRegion().getType().equals(JSP_TAG_ATTRIBUTE_VALUE_SQUOTE)) {
		yybegin(ST_ABORT_EMBEDDED);
		fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
	}
	else {
		yybegin(enterState);
	}
	return PROXY_CONTEXT;
 }
        case 715: break;
        case 338: 
          { 
	int enterState = yystate();
	yybegin(ST_JSP_SQUOTED_EL);
	assembleEmbeddedContainer(JSP_EL_OPEN, new String[]{JSP_EL_CLOSE, XML_TAG_ATTRIBUTE_VALUE_SQUOTE, JSP_TAG_ATTRIBUTE_VALUE_SQUOTE});
	// abort early when an unescaped single quote is found in the EL
	if(fEmbeddedContainer.getLastRegion().getType().equals(XML_TAG_ATTRIBUTE_VALUE_SQUOTE) || fEmbeddedContainer.getLastRegion().getType().equals(JSP_TAG_ATTRIBUTE_VALUE_SQUOTE)) {
		yybegin(ST_ABORT_EMBEDDED);
		fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
	}
	else {
		yybegin(enterState);
	}
	return PROXY_CONTEXT;
 }
        case 716: break;
        case 336: 
          { 
	if (Debug.debugTokenizer) {
		System.out.println("begin embedded region: " + fEmbeddedHint+", genericEndTagOpen");//$NON-NLS-1$
	}
	int incomingState = yystate();
	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
	if(Debug.debugTokenizer)
		dump("JSP attribute value start - end tag");//$NON-NLS-1$
	yybegin(ST_XML_TAG_NAME);
	assembleEmbeddedContainer(XML_END_TAG_OPEN, new String[]{XML_TAG_CLOSE,XML_EMPTY_TAG_CLOSE});
	if(yystate() != ST_ABORT_EMBEDDED)
        yybegin(incomingState);
	return PROXY_CONTEXT;
 }
        case 717: break;
        case 286: 
        case 298: 
        case 304: 
          { 
	return XML_DOCTYPE_INTERNAL_SUBSET;
 }
        case 718: break;
        case 274: 
          { 
	String tagName = yytext().substring(1);
	// pushback to just after the opening bracket
	yypushback(yylength() - 1);
	/*
	 * If this tag can not be nested or we're already searching for an
	 * attribute name, equals, or value, return immediately.
	 */
	if (!isNestable(tagName) || (!fStateStack.empty() && (fStateStack.peek() == ST_XML_ATTRIBUTE_NAME || fStateStack.peek() == ST_XML_EQUALS || fStateStack.peek() == ST_XML_ATTRIBUTE_VALUE || fStateStack.peek() == ST_JSP_ATTRIBUTE_VALUE))) {
		yybegin(ST_XML_TAG_NAME);
		return XML_TAG_OPEN;
	}
	if(Debug.debugTokenizer)
		dump("tag in place of attr value");//$NON-NLS-1$
	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
	fStateStack.push(yystate());
	// embedded container should be looking for the name (again) next
	yybegin(ST_XML_TAG_NAME);
	assembleEmbeddedTagSequence(XML_TAG_OPEN, tagName); // ?
	fStateStack.pop();
	yybegin(ST_XML_ATTRIBUTE_NAME);
	return PROXY_CONTEXT;
 }
        case 719: break;
        case 272: 
          { 
	String tagName = yytext().substring(1);
	// pushback to just after the opening bracket
	yypushback(yylength() - 1);
	/*
	 * If this tag can not be nested or we're already searching for an
	 * attribute name, equals, or value, return immediately.
	 */
	if (!isNestable(tagName) || (!fStateStack.empty() && (fStateStack.peek() == ST_XML_ATTRIBUTE_NAME || fStateStack.peek() == ST_XML_EQUALS || fStateStack.peek() == ST_XML_ATTRIBUTE_VALUE || fStateStack.peek() == ST_JSP_ATTRIBUTE_VALUE))) {
		yybegin(ST_XML_TAG_NAME);
		return XML_TAG_OPEN;
	}
	if(Debug.debugTokenizer)
		dump("tag in place of attr name");//$NON-NLS-1$
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
	fStateStack.push(yystate());
	// embedded container should be looking for the name (again) next
	yybegin(ST_XML_TAG_NAME);
	assembleEmbeddedTagSequence(XML_TAG_OPEN, tagName); // ?
	fStateStack.pop();
	yybegin(ST_XML_EQUALS);
	return PROXY_CONTEXT;
 }
        case 720: break;
        case 270: 
          { 
        yybegin(YYINITIAL);
	fEmbeddedHint = UNDEFINED;
	if(Debug.debugTokenizer)
		dump("empty tag close");//$NON-NLS-1$
		if (!fJspTagStack.empty())
			fJspTagStack.pop();
        return XML_EMPTY_TAG_CLOSE;
 }
        case 721: break;
        case 263: 
          { 
	if(Debug.debugTokenizer)
		dump("JSP end");//$NON-NLS-1$
	if (Debug.debugTokenizer) {
		if(fStateStack.peek()!=YYINITIAL)
			System.out.println("end embedded region");//$NON-NLS-1$
	}
	yybegin(fStateStack.pop());
	return JSP_DIRECTIVE_CLOSE;
 }
        case 722: break;
        case 126: 
        case 171: 
          { 
	String type = yy_lexical_state == ST_XML_ATTRIBUTE_VALUE ? XML_TAG_ATTRIBUTE_VALUE_SQUOTE : JSP_TAG_ATTRIBUTE_VALUE_SQUOTE;
	if (Debug.debugTokenizer) {
		System.out.println("begin embedded region: " + fEmbeddedHint+", "+type);//$NON-NLS-1$
	}
	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_SQUOTED;
	yybegin(ST_XML_ATTRIBUTE_VALUE_SQUOTED);
	fStateStack.push(yystate());
	if(Debug.debugTokenizer)
		dump("JSP attribute value start - complex single quoted");//$NON-NLS-1$
	assembleEmbeddedContainer(type, type);
	fStateStack.pop();
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_EQUALS;
        yybegin(ST_XML_ATTRIBUTE_NAME);
    if (fEmbeddedContainer.getLastRegion().getType() == UNDEFINED) {
		fProxyUnknownRegion = fRegionFactory.createToken(XML_TAG_ATTRIBUTE_VALUE, fEmbeddedContainer.getStart(), fEmbeddedContainer.getTextLength(), fEmbeddedContainer.getLength());
		return PROXY_UNKNOWN_CONTEXT;
	}
	return PROXY_CONTEXT;
 }
        case 723: break;
        case 125: 
        case 170: 
          { 
	String type = yy_lexical_state == ST_XML_ATTRIBUTE_VALUE ? XML_TAG_ATTRIBUTE_VALUE_DQUOTE : JSP_TAG_ATTRIBUTE_VALUE_DQUOTE;

	if (Debug.debugTokenizer) {
		System.out.println("begin embedded region: " + fEmbeddedHint+", "+type);//$NON-NLS-1$
	}
	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_DQUOTED;
	yybegin(ST_XML_ATTRIBUTE_VALUE_DQUOTED);
	fStateStack.push(yystate());
	if(Debug.debugTokenizer)
		dump("JSP attribute value start - complex double quoted");//$NON-NLS-1$
	assembleEmbeddedContainer(type, type);
	fStateStack.pop();
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_EQUALS;
	yybegin(ST_XML_ATTRIBUTE_NAME);
	if (fEmbeddedContainer.getLastRegion().getType() == UNDEFINED) {
		fProxyUnknownRegion = fRegionFactory.createToken(XML_TAG_ATTRIBUTE_VALUE, fEmbeddedContainer.getStart(), fEmbeddedContainer.getTextLength(), fEmbeddedContainer.getLength());
		return PROXY_UNKNOWN_CONTEXT;
	}
	return PROXY_CONTEXT;
 }
        case 724: break;
        case 123: 
          { 
	if (Debug.debugTokenizer) {
		System.out.println("begin embedded region: " + fEmbeddedHint+", unquoted genericTagOpen");//$NON-NLS-1$
	}
	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
	fStateStack.push(yystate());
	if(Debug.debugTokenizer)
		dump("JSP tag embedded name start - start tag");//$NON-NLS-1$
	yybegin(ST_XML_TAG_NAME);
	assembleEmbeddedContainer(XML_TAG_OPEN, new String[]{XML_TAG_CLOSE,XML_EMPTY_TAG_CLOSE});
	fStateStack.pop();
        yybegin(ST_XML_ATTRIBUTE_NAME);
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_EQUALS;
	return PROXY_CONTEXT;
 }
        case 725: break;
        case 121: 
          { 
	if(Debug.debugTokenizer)
		dump("equals");//$NON-NLS-1$
	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
        yybegin(isJspTag() ? ST_JSP_ATTRIBUTE_VALUE : ST_XML_ATTRIBUTE_VALUE);
        return XML_TAG_ATTRIBUTE_EQUALS;
 }
        case 726: break;
        case 120: 
          { 
	if(Debug.debugTokenizer)
		dump("attr name");//$NON-NLS-1$
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
        yybegin(ST_XML_EQUALS);
        return XML_TAG_ATTRIBUTE_NAME;
 }
        case 727: break;
        case 116: 
        case 117: 
        case 118: 
        case 271: 
        case 400: 
        case 500: 
        case 541: 
        case 542: 
        case 561: 
        case 562: 
        case 580: 
        case 581: 
        case 594: 
        case 603: 
        case 611: 
        case 613: 
        case 615: 
        case 617: 
        case 620: 
        case 626: 
        case 627: 
        case 628: 
        case 629: 
        case 630: 
        case 636: 
        case 637: 
        case 638: 
        case 639: 
        case 640: 
        case 646: 
        case 647: 
        case 649: 
        case 650: 
        case 656: 
        case 657: 
        case 658: 
        case 659: 
        case 665: 
        case 666: 
        case 667: 
        case 668: 
        case 671: 
        case 672: 
        case 674: 
          { 
	if(Debug.debugTokenizer)
		dump("tag name");//$NON-NLS-1$
    String tagname = yytext();
	fJspTagStack.push(tagname.indexOf(':') != -1);
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_EQUALS;
        yybegin(ST_XML_ATTRIBUTE_NAME);
        return XML_TAG_NAME;
 }
        case 728: break;
        case 114: 
          { 
	if(Debug.debugTokenizer)
		dump("tag close");//$NON-NLS-1$
	fEmbeddedHint = UNDEFINED;
	if(isBlockMarker()) {
		fEmbeddedHint = getBlockMarkerContext();
		fEmbeddedPostState = ST_BLOCK_TAG_SCAN;
        	yybegin(ST_BLOCK_TAG_SCAN);
	}
	else
        	yybegin(YYINITIAL);
        if (!fJspTagStack.empty())
			fJspTagStack.pop();
        return XML_TAG_CLOSE;
 }
        case 729: break;
        case 107: 
        case 111: 
        case 266: 
          { 
	if(Debug.debugTokenizer)
		dump("attr value");//$NON-NLS-1$
        yybegin(ST_JSP_DIRECTIVE_ATTRIBUTE_NAME);
        return XML_TAG_ATTRIBUTE_VALUE;
 }
        case 730: break;
        case 106: 
          { 
	if(Debug.debugTokenizer)
		dump("equals");//$NON-NLS-1$
        yybegin(ST_JSP_DIRECTIVE_ATTRIBUTE_VALUE);
        return XML_TAG_ATTRIBUTE_EQUALS;
 }
        case 731: break;
        case 105: 
          { 
	if(Debug.debugTokenizer)
		dump("attr name");//$NON-NLS-1$
        yybegin(ST_JSP_DIRECTIVE_EQUALS);
        return XML_TAG_ATTRIBUTE_NAME;
 }
        case 732: break;
        case 102: 
          { 
	if(Debug.debugTokenizer)
		dump("JSP directive name");//$NON-NLS-1$
	yybegin(ST_JSP_DIRECTIVE_NAME_WHITESPACE);
	return JSP_DIRECTIVE_NAME;
 }
        case 733: break;
        case 98: 
        case 99: 
        case 100: 
          { 
	if(Debug.debugTokenizer)
		dump("JSP code content");//$NON-NLS-1$
	return doScan("%>", false, false, false, JSP_CONTENT, ST_JSP_CONTENT, ST_JSP_CONTENT);
 }
        case 734: break;
        case 94: 
        case 96: 
        case 97: 
        case 256: 
        case 257: 
        case 260: 
          { 
	if(Debug.debugTokenizer)
		dump("DHTML processing instruction attribute value");//$NON-NLS-1$
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_EQUALS;
        yybegin(ST_DHTML_ATTRIBUTE_NAME);
        return XML_TAG_ATTRIBUTE_VALUE;
 }
        case 735: break;
        case 93: 
          { 
	if(Debug.debugTokenizer)
		dump("DHTML processing instruction '='");//$NON-NLS-1$
	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
        yybegin(ST_DHTML_ATTRIBUTE_VALUE);
        return XML_TAG_ATTRIBUTE_EQUALS;
 }
        case 736: break;
        case 92: 
          { 
	if(Debug.debugTokenizer)
		dump("DHTML processing instruction attribute name");//$NON-NLS-1$
        yybegin(ST_DHTML_EQUALS);
        return XML_TAG_ATTRIBUTE_NAME;
 }
        case 737: break;
        case 90: 
          { 
	if(Debug.debugTokenizer)
		dump("DHTML processing instruction end");//$NON-NLS-1$
	fEmbeddedHint = UNDEFINED;
        yybegin(YYINITIAL);
        return XML_PI_CLOSE;
 }
        case 738: break;
        case 84: 
        case 86: 
        case 247: 
          { 
	if(Debug.debugTokenizer)
		dump("XML processing instruction attribute value");//$NON-NLS-1$
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_EQUALS;
        yybegin(ST_XML_PI_ATTRIBUTE_NAME);
        return XML_TAG_ATTRIBUTE_VALUE;
 }
        case 739: break;
        case 50: 
        case 205: 
        case 206: 
        case 209: 
        case 217: 
        case 218: 
        case 221: 
        case 222: 
        case 372: 
        case 375: 
        case 466: 
        case 480: 
        case 486: 
          { 
	return JSP_VBL_CONTENT;
 }
        case 740: break;
        case 43: 
        case 185: 
        case 186: 
        case 189: 
        case 197: 
        case 198: 
        case 202: 
        case 203: 
        case 342: 
        case 356: 
        case 359: 
        case 438: 
        case 439: 
        case 454: 
        case 460: 
          { 
	return JSP_EL_CONTENT;
 }
        case 741: break;
        case 35: 
        case 159: 
        case 160: 
        case 324: 
        case 426: 
        case 430: 
        case 515: 
        case 549: 
        case 569: 
        case 586: 
        case 596: 
          { 
	if(Debug.debugTokenizer)
		dump("attlist contentspec");//$NON-NLS-1$
	return XML_ATTLIST_DECL_CONTENT;
 }
        case 742: break;
        case 33: 
        case 152: 
        case 153: 
        case 314: 
        case 418: 
        case 422: 
        case 512: 
        case 548: 
        case 568: 
        case 585: 
        case 595: 
          { 
	if(Debug.debugTokenizer)
		dump("elementdecl contentspec");//$NON-NLS-1$
	return XML_ELEMENT_DECL_CONTENT;
 }
        case 743: break;
        case 22: 
        case 112: 
          { 
	if(Debug.debugTokenizer)
		dump("inappropriate tag name");//$NON-NLS-1$
	if(!fStateStack.empty() && (fStateStack.peek()==ST_XML_ATTRIBUTE_VALUE_SQUOTED||fStateStack.peek()==ST_XML_ATTRIBUTE_VALUE_DQUOTED)) {
		yybegin(ST_ABORT_EMBEDDED);
		//yypushback(yylength()-1);
		return UNDEFINED;
	}
	yybegin(YYINITIAL);
        return XML_CONTENT;
 }
        case 744: break;
        case 18: 
        case 104: 
          { 
	if(Debug.debugTokenizer)
		dump("white space");//$NON-NLS-1$
	yybegin(ST_JSP_DIRECTIVE_ATTRIBUTE_NAME);
	return WHITE_SPACE;
 }
        case 745: break;
        case 5: 
        case 8: 
        case 9: 
        case 10: 
        case 12: 
        case 13: 
        case 14: 
        case 15: 
        case 17: 
        case 19: 
        case 20: 
        case 21: 
        case 23: 
        case 24: 
        case 25: 
        case 26: 
        case 27: 
        case 28: 
        case 29: 
        case 30: 
        case 31: 
        case 32: 
        case 34: 
        case 40: 
        case 41: 
        case 42: 
        case 72: 
        case 176: 
        case 181: 
          { 
	if(Debug.debugTokenizer)
		dump("white space");//$NON-NLS-1$
        return WHITE_SPACE;
 }
        case 746: break;
        case 0: 
        case 57: 
        case 60: 
        case 62: 
        case 229: 
        case 231: 
        case 233: 
        case 235: 
        case 382: 
        case 383: 
        case 384: 
        case 388: 
        case 392: 
        case 495: 
          { 
	if(Debug.debugTokenizer)
		dump("\nXML content");//$NON-NLS-1$
	return XML_CONTENT;
 }
        case 747: break;
        case 58: 
        case 101: 
        case 113: 
        case 119: 
        case 129: 
          { 
	if(Debug.debugTokenizer)
		dump("\nstart tag open");//$NON-NLS-1$
	fEmbeddedHint = XML_TAG_NAME;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
        yybegin(ST_XML_TAG_NAME);
        return XML_TAG_OPEN;
 }
        case 748: break;
        case 59: 
        case 61: 
        case 65: 
        case 66: 
        case 67: 
        case 70: 
        case 71: 
        case 81: 
        case 85: 
        case 87: 
        case 88: 
        case 89: 
        case 91: 
        case 95: 
        case 103: 
        case 108: 
        case 109: 
        case 110: 
        case 115: 
        case 124: 
        case 131: 
        case 132: 
        case 133: 
        case 134: 
        case 136: 
        case 137: 
        case 139: 
        case 140: 
        case 141: 
        case 144: 
        case 145: 
        case 146: 
        case 149: 
        case 150: 
        case 151: 
        case 156: 
        case 157: 
        case 158: 
        case 166: 
        case 168: 
        case 169: 
        case 191: 
        case 192: 
        case 193: 
        case 194: 
        case 200: 
        case 204: 
        case 211: 
        case 212: 
        case 213: 
        case 214: 
        case 219: 
        case 223: 
          { 
	if (Debug.debugTokenizer)
		System.out.println("!!!unexpected!!!: \"" + yytext() + "\":" + //$NON-NLS-2$//$NON-NLS-1$
			yychar + "-" + (yychar + yylength()));//$NON-NLS-1$
	return UNDEFINED;
 }
        case 749: break;
        case 63: 
        case 64: 
          { 
	if(Debug.debugTokenizer)
		dump("CDATA text");//$NON-NLS-1$
	fEmbeddedPostState = ST_CDATA_TEXT;
	fEmbeddedHint = XML_CDATA_TEXT;
	String returnedContext = doScan("]]>", false, true, true, XML_CDATA_TEXT, ST_CDATA_END,  ST_CDATA_END);//$NON-NLS-1$
	if(returnedContext == XML_CDATA_TEXT)
		yybegin(ST_CDATA_END);
	return returnedContext;
 }
        case 750: break;
        case 68: 
        case 69: 
          { 
	if(Debug.debugTokenizer)
		dump("comment content");//$NON-NLS-1$
	return scanXMLCommentText();
 }
        case 751: break;
        case 73: 
        case 74: 
        case 75: 
        case 76: 
        case 240: 
        case 241: 
        case 242: 
        case 397: 
        case 498: 
        case 499: 
        case 539: 
        case 540: 
        case 559: 
        case 579: 
        case 592: 
        case 602: 
        case 610: 
        case 612: 
        case 614: 
        case 616: 
          { 
	if(Debug.debugTokenizer)
		dump("processing instruction target");//$NON-NLS-1$
	fEmbeddedHint = XML_CONTENT;
        yybegin(ST_PI_WS);
        return XML_TAG_NAME;
 }
        case 752: break;
        case 77: 
          { 
        yybegin(ST_PI_CONTENT);
        return WHITE_SPACE;
 }
        case 753: break;
        case 78: 
        case 79: 
        case 80: 
          { 
		// block scan until close is found
	return doScan("?>", false, false, false, XML_PI_CONTENT, ST_XML_PI_TAG_CLOSE, ST_XML_PI_TAG_CLOSE);
 }
        case 754: break;
        case 82: 
          { 
	if(Debug.debugTokenizer)
		dump("XML processing instruction attribute name");//$NON-NLS-1$
        yybegin(ST_XML_PI_EQUALS);
        return XML_TAG_ATTRIBUTE_NAME;
 }
        case 755: break;
        case 83: 
          { 
	if(Debug.debugTokenizer)
		dump("XML processing instruction '='");//$NON-NLS-1$
	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
        yybegin(ST_XML_PI_ATTRIBUTE_VALUE);
        return XML_TAG_ATTRIBUTE_EQUALS;
 }
        case 756: break;
        case 130: 
          { 
	if(Debug.debugTokenizer)
		dump("declaration end");//$NON-NLS-1$
	if (Debug.debugTokenizer) {
		if(fStateStack.peek()!=YYINITIAL)
			System.out.println("end embedded region");//$NON-NLS-1$
	}
	yybegin(fStateStack.pop());
	return XML_DECLARATION_CLOSE;
 }
        case 757: break;
        case 135: 
          { 
	if(Debug.debugTokenizer)
		dump("doctype type");//$NON-NLS-1$
	yybegin(ST_XML_DOCTYPE_EXTERNAL_ID);
	return XML_DOCTYPE_NAME;
 }
        case 758: break;
        case 138: 
        case 142: 
        case 291: 
        case 295: 
        case 413: 
          { 
	if(Debug.debugTokenizer)
		dump("doctype public reference");//$NON-NLS-1$
	fEmbeddedHint = UNDEFINED;
	fEmbeddedPostState = YYINITIAL;
	yybegin(ST_XML_DOCTYPE_ID_SYSTEM);
	return XML_DOCTYPE_EXTERNAL_ID_PUBREF;
 }
        case 759: break;
        case 143: 
        case 147: 
        case 301: 
          { 
	if(Debug.debugTokenizer)
		dump("doctype system reference");//$NON-NLS-1$
	fEmbeddedHint = UNDEFINED;
	fEmbeddedPostState = YYINITIAL;
	yybegin(ST_XML_DECLARATION_CLOSE);
	return XML_DOCTYPE_EXTERNAL_ID_SYSREF;
 }
        case 760: break;
        case 148: 
        case 307: 
        case 311: 
        case 416: 
          { 
	if(Debug.debugTokenizer)
		dump("elementdecl name");//$NON-NLS-1$
	fEmbeddedHint = UNDEFINED;
	fEmbeddedPostState = YYINITIAL;
	yybegin(ST_XML_ELEMENT_DECLARATION_CONTENT);
	return XML_ELEMENT_DECL_NAME;
 }
        case 761: break;
        case 154: 
          { 
	if(Debug.debugTokenizer)
		dump("elementdecl close");//$NON-NLS-1$
	if (Debug.debugTokenizer) {
		if(fStateStack.peek()!=YYINITIAL)
			System.out.println("end embedded region");//$NON-NLS-1$
	}
	yybegin(fStateStack.pop());
	return XML_DECLARATION_CLOSE;
 }
        case 762: break;
        case 155: 
        case 317: 
        case 321: 
        case 424: 
          { 
	if(Debug.debugTokenizer)
		dump("attlist name");//$NON-NLS-1$
	fEmbeddedHint = UNDEFINED;
	fEmbeddedPostState = YYINITIAL;
	yybegin(ST_XML_ATTLIST_DECLARATION_CONTENT);
	return XML_ATTLIST_DECL_NAME;
 }
        case 763: break;
        case 161: 
          { 
	if(Debug.debugTokenizer)
		dump("attlist close");//$NON-NLS-1$
	if (Debug.debugTokenizer) {
		if(fStateStack.peek()!=YYINITIAL)
			System.out.println("end embedded region");//$NON-NLS-1$
	}
	yybegin(fStateStack.pop());
	return XML_DECLARATION_CLOSE;
 }
        case 764: break;
        case 164: 
        case 165: 
          { 
	if(Debug.debugTokenizer)
		dump("\nJSP comment text");//$NON-NLS-1$
	return scanJSPCommentText();
 }
        case 765: break;
        case 174: 
        case 178: 
        case 179: 
        case 180: 
        case 183: 
        case 184: 
        case 337: 
          { 
	return XML_TAG_ATTRIBUTE_VALUE;
 }
        case 766: break;
        case 175: 
          { 
	if (Debug.debugTokenizer) {
		System.out.println("begin embedded region: " + fEmbeddedHint+", genericTagOpen");//$NON-NLS-1$
	}
	int incomingState = yystate();
	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
	if(Debug.debugTokenizer)
		dump("tag inside of JSP attribute value start");//$NON-NLS-1$
	yybegin(ST_XML_TAG_NAME);
	assembleEmbeddedContainer(XML_TAG_OPEN, new String[]{XML_TAG_CLOSE,XML_EMPTY_TAG_CLOSE});
	if(yystate() != ST_ABORT_EMBEDDED)
        yybegin(incomingState);
	return PROXY_CONTEXT;
 }
        case 767: break;
        case 177: 
          { 
	return isJspTag() ? JSP_TAG_ATTRIBUTE_VALUE_SQUOTE : XML_TAG_ATTRIBUTE_VALUE_SQUOTE;
 }
        case 768: break;
        case 182: 
          { 
	return isJspTag()? JSP_TAG_ATTRIBUTE_VALUE_DQUOTE : XML_TAG_ATTRIBUTE_VALUE_DQUOTE;
 }
        case 769: break;
        case 187: 
          { 
	yybegin(ST_JSP_EL_DQUOTES);
	return JSP_EL_DQUOTE;
 }
        case 770: break;
        case 188: 
          { 
	yybegin(ST_JSP_EL_SQUOTES);
	return JSP_EL_SQUOTE;
 }
        case 771: break;
        case 190: 
          { 
	fELlevel--;
	if(fELlevel == 0) {
		yybegin(YYINITIAL);
		return JSP_EL_CLOSE;
	}
	return JSP_EL_CONTENT;
 }
        case 772: break;
        case 195: 
          { 
	yybegin(ST_JSP_EL);
	return JSP_EL_SQUOTE;
 }
        case 773: break;
        case 196: 
          { 
	yybegin(ST_JSP_EL);
	return JSP_EL_DQUOTE;
 }
        case 774: break;
        case 199: 
          { 
	return isJspTag() ? JSP_TAG_ATTRIBUTE_VALUE_DQUOTE: XML_TAG_ATTRIBUTE_VALUE_DQUOTE;
 }
        case 775: break;
        case 201: 
          { 
	return JSP_EL_CLOSE;
 }
        case 776: break;
        case 207: 
          { 
	yybegin(ST_JSP_VBL_DQUOTES);
	return JSP_VBL_DQUOTE;
 }
        case 777: break;
        case 208: 
          { 
	yybegin(ST_JSP_VBL_SQUOTES);
	return JSP_VBL_SQUOTE;
 }
        case 778: break;
        case 210: 
          { 
	fELlevel--;
	if(fELlevel == 0) {
		yybegin(YYINITIAL);
		return JSP_VBL_CLOSE;
	}
	return JSP_VBL_CONTENT;
 }
        case 779: break;
        case 215: 
          { 
	yybegin(ST_JSP_VBL);
	return JSP_VBL_SQUOTE;
 }
        case 780: break;
        case 216: 
          { 
	yybegin(ST_JSP_VBL);
	return JSP_VBL_DQUOTE;
 }
        case 781: break;
        case 220: 
          { 
	return JSP_VBL_CLOSE;
 }
        case 782: break;
        case 224: 
          { 
	if(Debug.debugTokenizer)
		dump("\nend tag open");//$NON-NLS-1$
	fEmbeddedHint = XML_TAG_NAME;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
        yybegin(ST_XML_TAG_NAME);
        return XML_END_TAG_OPEN;
 }
        case 783: break;
        case 225: 
          { 
	if(Debug.debugTokenizer)
		dump("\nprocessing instruction start");//$NON-NLS-1$
	yybegin(ST_PI);
        return XML_PI_OPEN;
 }
        case 784: break;
        case 226: 
        case 313: 
        case 323: 
        case 343: 
        case 348: 
        case 352: 
        case 355: 
        case 358: 
        case 360: 
        case 364: 
        case 368: 
        case 371: 
        case 374: 
          { 
	/* JSP scriptlet begun (anywhere)
	 * A consequence of the start anywhere possibility is that the
	 *  incoming state must be checked to see if it's erroneous
	 *  due to the order of precedence generated
	 */
	// begin sanity checks
	if(yystate() == ST_JSP_CONTENT) {
		// at the beginning?!
		yypushback(1);
		return JSP_CONTENT;
	}
	else if(yystate() == ST_BLOCK_TAG_SCAN) {
		yypushback(2);
		return doBlockTagScan();
	}
	else if(yystate() == ST_XML_COMMENT) {
		yypushback(2);
		return scanXMLCommentText();
	}
	else if(yystate() == ST_JSP_COMMENT) {
		yypushback(2);
		return scanJSPCommentText();
	}
	// finished sanity checks
	fStateStack.push(yystate());
	if(fStateStack.peek()==YYINITIAL) {
		// the simple case, just a regular scriptlet out in content
		if(Debug.debugTokenizer)
			dump("\nJSP scriptlet start");//$NON-NLS-1$
		yybegin(ST_JSP_CONTENT);
		return JSP_SCRIPTLET_OPEN;
	}
	else {
		if (Debug.debugTokenizer) {
			System.out.println("begin embedded region: " + fEmbeddedHint+", jspScriptletStart");//$NON-NLS-1$
		}
		if(Debug.debugTokenizer)
			dump("JSP scriptlet start");//$NON-NLS-1$
		if(yystate() == ST_XML_ATTRIBUTE_VALUE_DQUOTED)
			fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_DQUOTED;
		else if(yystate() == ST_XML_ATTRIBUTE_VALUE_SQUOTED)
			fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_SQUOTED;
		else if(yystate() == ST_CDATA_TEXT) {
			fEmbeddedPostState = ST_CDATA_TEXT;
			fEmbeddedHint = XML_CDATA_TEXT;
		}
		yybegin(ST_JSP_CONTENT);
		assembleEmbeddedContainer(JSP_SCRIPTLET_OPEN, JSP_CLOSE);
		if(yystate() == ST_BLOCK_TAG_INTERNAL_SCAN) {
			yybegin(ST_BLOCK_TAG_SCAN);
			return BLOCK_TEXT;
		}
		// required help for successive embedded regions
		if(yystate() == ST_XML_TAG_NAME) {
			fEmbeddedHint = XML_TAG_NAME;
			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
		}
		else if((yystate() == ST_XML_ATTRIBUTE_NAME || yystate() == ST_XML_EQUALS)) {
			fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
			fEmbeddedPostState = ST_XML_EQUALS;
		}
		else if(yystate() == ST_XML_ATTRIBUTE_VALUE) {
			fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
		}
        else if(yystate() == ST_JSP_ATTRIBUTE_VALUE) {
            fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
            fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
        }
		
		return PROXY_CONTEXT;
	}
 }
        case 785: break;
        case 227: 
          { 
	fStateStack.push(yystate());
	if(Debug.debugTokenizer)
		dump("\ndeclaration start");//$NON-NLS-1$
        yybegin(ST_XML_DECLARATION);
	return XML_DECLARATION_OPEN;
 }
        case 786: break;
        case 239: 
          { 
	if(Debug.debugTokenizer)
		dump("processing instruction end");//$NON-NLS-1$
	fEmbeddedHint = UNDEFINED;
        yybegin(YYINITIAL);
        return XML_PI_CLOSE;
 }
        case 787: break;
        case 243: 
          { 
		// ended with nothing inside
		fEmbeddedHint = UNDEFINED;
        yybegin(YYINITIAL);
        return XML_PI_CLOSE;
 }
        case 788: break;
        case 244: 
          { 
	if(Debug.debugTokenizer)
		dump("XML processing instruction end");//$NON-NLS-1$
	fEmbeddedHint = UNDEFINED;
        yybegin(YYINITIAL);
        return XML_PI_CLOSE;
 }
        case 789: break;
        case 261: 
          { 
	if(Debug.debugTokenizer)
		dump("JSP end");//$NON-NLS-1$
	if (Debug.debugTokenizer) {
		if(fStateStack.peek()!=YYINITIAL)
			System.out.println("end embedded region");//$NON-NLS-1$
	}
	yybegin(fStateStack.pop());
	return JSP_CLOSE;
 }
        case 790: break;
        case 162: 
        case 163: 
          { 
		return doBlockTagScan();
	 }
        case 791: break;
        default: 
          if (yy_input == YYEOF && yy_startRead == yy_currentPos) {
            yy_atEOF = true;
            yy_do_eof();
              return null;
          } 
          else {
            yy_ScanError(YY_NO_MATCH);
          }
      }
    }
  }    


}
