/* The following code was generated by JFlex 1.2.2 on 10/17/11 2:40 PM */

/*******************************************************************************
 * Copyright (c) 2004, 2011 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.Logger;
import org.eclipse.jst.jsp.core.internal.contenttype.IntStack;
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;


/**
 * This class is a scanner generated by 
 * <a href="http://www.informatik.tu-muenchen.de/~kleing/jflex/">JFlex</a> 1.2.2
 * on 10/17/11 2:40 PM from the specification file
 * <tt>file:/Users/dev/workspaces/indigo/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,  4615,  4544,  4615,  4686,  4544, 
     4544,  4615,  4757,  4828,  4899,  4970,  5041,  5112,  5183,  5254, 
     4544,  4615,  5325,  5396,  5467,  4544,  5538,  5538,  5609,  5680, 
     5751,  5325,  4544,  5822,  5893,  4544,  5964,  6035,  6106,  6177, 
     4544,  4615,  6248,  6319,  6390,  6461,  6532,  6603,  4544,  6674, 
     6674,  6745,  6816,  6887,  6958,  7029,  4544,  7100,  7171,  7242, 
     7313,  7384,  7455,  7526,  7597,  4544,  7668,  7739,  7810,  7881, 
     7952,  8023,  8094,  8165,  4544,  8236,  8307,  8378,  8449,  8520, 
     8591,  8662,  8733,  8733,  8804,  8875,  8946,  9017,  9017,  9088, 
     9159,  9230,  9301,  9301,  9372,  9443,  9514,  9585,  4544,  9656, 
     9656,  9727,  9798,  9869,  9940,  4544,  4544,  4615,  4544,  4615, 
    10011, 10082,  7739, 10153, 10224, 10295, 10366, 10437, 10508, 10579, 
    10650,  4544, 10721, 10792, 10863, 10934,  4544, 11005, 11076, 11147, 
    11218,  4544,  4544, 11289,  4544, 11360, 11431,  4544, 11360, 11502, 
    11573,  4544, 11502, 11644, 11715,  4544, 11786,  4544, 11857, 11928, 
    11999, 12070, 12141,  4544,  4544, 12212,  4544, 12283, 12354,  4544, 
    12283, 12425, 12496,  4544, 12425, 12567, 12638, 12709,  4544, 12780, 
    12851, 12922,  4544,  4544, 12993, 13064, 13135, 13206, 13277, 13348, 
    13419, 13490, 13561, 13632, 13703, 13774, 13845, 13916, 13987,  4544, 
    14058, 14129, 14200,  4544,  4544,  5538,  5680,  4544, 14271, 14342, 
     5751, 14413, 14484,  5822,  5964,  6035, 14555,  6106,  4544, 14626, 
    14697, 14768,  6177, 14839, 14910,  4544, 13064,  4544,  6674,  6745, 
     4544, 14981, 15052,  6816, 15123, 15194,  4544, 15265, 15336, 15407, 
    15478,  7668, 15549,  7881,  4544, 15620, 15691,  7952, 15762, 15833, 
    15904, 15975, 16046, 16117, 16188,  8449,  4544, 16259, 16330,  8733, 
     8804,  4544, 16401, 16472, 16543, 16614, 16685, 16756, 16827,  8946, 
     8733,  9017,  9088,  4544,  9159,  9230,  9017,  9301,  9372,  4544, 
    16898, 16969, 17040, 17111, 17182, 17253, 17324, 17395, 17466,  9656, 
     9727,  4544, 17537, 17608, 17679, 17750, 17821, 17892, 17963, 18034, 
    18105, 18176, 10082, 10224,  4544, 18247, 18318, 10295, 18389, 18460, 
    18531, 18602,  4544, 18673,  4544,  4544,  4544,  4544, 18744, 18815, 
    18886, 18957, 11360,  4544, 19028, 19099, 11502,  4544, 19170, 19241, 
    19312, 19383, 19454, 19525, 19596, 19667, 19738, 12070, 12283,  4544, 
    19809, 19880, 12425,  4544, 19951, 20022, 20093, 20164, 20235, 20306, 
    20377, 20448, 20519,  4544,  4544,  4544, 20590, 20661, 20732, 20803, 
    20874,  4544, 20945, 21016, 21087,  4544,  4544,  4544,  4544, 21158, 
     4544,  4544,  4970, 21229, 21300, 21371, 21442, 21513, 21584, 21655, 
    21726, 21797, 21868, 21939, 22010, 22081,  4544,  4544, 22152, 22223, 
    22294, 22365, 22294, 22436, 22507, 22436, 22578, 22649, 22720, 22791, 
    22862, 22933, 23004, 23075, 23075, 23146, 23217, 23288, 23359, 23359, 
    23430, 23501,  9514,  9514,  9514, 23572, 23643, 23714, 23785, 23785, 
    23856, 23927,  9869,  9869,  9869, 23998, 24069, 10224, 24140, 10295, 
    24211, 24282, 24282, 24353, 24353, 18886, 24424, 11147, 11147, 11147, 
    24495, 24566, 11360, 11360, 11360, 24637, 24708, 11502, 11502, 11502, 
    24779, 24850, 11644, 11644, 11644, 19454, 24921, 24992, 11857, 11857, 
    11857, 19667, 25063, 25134, 12070, 12070, 12070, 25205, 12283, 12283, 
    12283, 25276, 25347, 12425, 12425, 12425, 25418, 25489, 12567, 12567, 
    12567, 20235, 25560, 25631, 12780, 12780, 12780, 20448, 25702,  4544, 
     4544, 25773, 25844,  4544, 25915, 25986, 26057, 26128, 26199, 26270, 
     7668,  4544,  4544, 26341, 26412, 26483, 26554, 26625, 16685, 17182, 
     9514, 26696, 17821,  9869, 26767,  4544, 10082, 11147, 11360, 26838, 
    11502, 26909, 11644, 26980,  4544, 11857, 27051, 12070, 12283, 27122, 
    12425, 27193, 12567, 27264,  4544, 12780, 27335, 27406, 27477, 27548, 
    27619, 27690, 27761, 27832, 27903, 27974, 28045, 28116, 28187, 28258, 
    28329, 28400, 28471, 28542, 28613, 28684, 28755, 28826, 28897,  4970, 
    28968, 29039, 29110, 29181, 29252,  4544,  4544, 29323, 29394, 29465, 
    29536, 19454, 19667, 29607, 29678, 20235, 20448, 29749, 29820, 29891, 
    29962,  4544,  4544,  4544, 30033, 30104, 30175, 30246, 30317, 30388, 
    30459, 30530,  7242, 30601, 30672, 30743, 30814, 30885, 30956, 31027, 
     4544, 31098, 31169,  9514,  9869, 11360, 11502, 12283, 12425, 31240, 
    31311, 31382, 31453, 31524, 31595, 31666, 31737,  4970, 31808, 31879, 
    31950, 32021, 32092, 32163, 32234, 32305, 32376, 32447, 32518, 32589, 
    32660, 32731, 32802, 32873, 32944, 33015, 33086, 33157, 33228, 33299, 
    33370, 33441, 33512, 33583, 33654, 33725, 33796, 33867, 33938, 34009, 
    34080, 34151, 34222, 34293,  4544, 34364, 34435, 34506, 34577,  7242, 
    34648, 34719, 34790, 34861, 34932, 35003, 35074, 35145, 35216, 35287, 
    35358, 35429, 35500, 35571
  };

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

  /** 
   * 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[] = {
    "Unkown 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,  1, 
     9,  1,  9,  1,  1,  9,  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,  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,  9,  3,  3,  3,  9,  3,  1,  1,  9,  1,  9, 
     1,  1,  1,  1,  1,  9,  9,  1,  9,  3,  3,  9,  3,  3,  3,  9, 
     3,  1,  1,  1,  9,  1,  1,  1,  9,  9,  1,  1,  0,  1,  0,  1, 
     2,  0,  1,  1,  2,  1,  0,  0,  0,  9,  1,  1,  1,  9,  9,  0, 
     0,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  9,  1,  1,  0, 
     0,  1,  1,  9,  0,  9,  0,  0,  9,  0,  0,  0,  0,  0,  9,  1, 
     1,  2,  2,  0,  1,  0,  9,  0,  0,  0,  0,  0,  1,  1,  0,  0, 
     0,  0,  9,  0,  0,  0,  0,  9,  0,  0,  0,  0,  1,  0,  0,  0, 
     1,  0,  0,  9,  0,  0,  1,  0,  0,  9,  0,  0,  0,  0,  1,  0, 
     0,  1,  1,  0,  0,  9,  0,  0,  0,  0,  1,  0,  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,  9, 13,  1,  9,  9,  1,  1,  1,  0,  0,  0,  0,  1,  0,  0, 
     1,  0,  0,  1, 13, 13,  0,  0,  3,  2,  2,  3,  2,  2,  0,  0, 
     0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  1,  0,  0,  1,  1,  1, 
     1,  1,  0,  0,  1,  0,  0,  1,  1,  1,  1,  1,  0,  1,  0,  1, 
     0,  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,  0,  0,  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;

  /** 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;
	
	// 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();

	// Is the embedded tag a JSP tag
	private boolean fEmbeddedTag = false;
	// Is the non-embedded tag a JSP tag
	private boolean fContainerTag = false;
	// Is the tokenizer in a non-embedded tag (between < and >)
	private boolean fInTagContainer = false;
	// Is the tokenizer in an embedded tag (between < and >)
	private boolean fInTagEmbedded = false;

	/**
	 * 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);
		}
		int initialLength = fEmbeddedContainer.getRegions().size();
		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 (endTagName != null && endTagName.length() == 0){
						endTagName = internalTagName;
					}
					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
				internalContext = primGetNextToken();
				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);
					internalContext = primGetNextToken();
				}
			} 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;
			ITextRegionList embeddedList = fEmbeddedContainer.getRegions();
			if(!isEndingType) {
				// check for ending context
				if (endTagName == null) {
					for (int i = 0; i < endTypes.length; i++) {
						isEndingType = isEndingType || (internalContext == endTypes[i]) || (embeddedList.size() - initialLength) >= 2 && (embeddedList.get(embeddedList.size()-1)).getType() == endTypes[i];
					}
				}
				else {
					isEndingType = ((isInEndTag && internalContext == XML_TAG_CLOSE) || (isInFirstTag && internalContext == XML_EMPTY_TAG_CLOSE)) && internalTagName != null && internalTagName.equals(endTagName);
				}
			}
			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) {
						String jspContext = primGetNextToken();
						yybegin(resumeState);
						return jspContext;
					}
					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) {
						String jspContext = primGetNextToken();
						yybegin(resumeState);
						return jspContext;
					}
					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) {
						String jspContext = primGetNextToken();
						yybegin(resumeState);
						return jspContext;
					}
					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 = primGetNextToken();
					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 && same; i++) {
							if(fIsCaseSensitiveBlocking)
								same = yy_buffer[i + yy_currentPos - searchStringLength] == searchString.charAt(i);
							else
								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);
				return primGetNextToken();
			}
		}
		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)
			return primGetNextToken();
		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 {
			context = primGetNextToken();
			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
		f_context = primGetNextToken();
		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$
		}
		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();
	
		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 (fContainerTag && fEmbeddedContainer != null) || (fContainerTag && fInTagContainer) || (fEmbeddedTag && fInTagEmbedded);
	}


  /**
   * 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[35642];
    int i = 0;  /* index in packed string  */
    int j = 0;  /* index in unpacked array */
    while (i < 9512) {
      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 occured while scanning - from the SED JFlex skeleton
   *
   * @param   errorCode  the code of the errormessage to display
   */
  private void yy_ScanError(int errorCode) {
    try {
      Logger.log(Logger.ERROR, YY_ERROR_MSG[errorCode]);
    }
    catch (ArrayIndexOutOfBoundsException e) {
      Logger.log(Logger.ERROR, YY_ERROR_MSG[YY_UNKNOWN_ERROR]);
    }
    // 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 126: 
        case 131: 
        case 132: 
        case 294: 
        case 300: 
        case 301: 
        case 440: 
        case 443: 
        case 550: 
          {  /* 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 725: break;
        case 171: 
        case 176: 
        case 177: 
        case 354: 
        case 360: 
        case 361: 
        case 477: 
        case 479: 
        case 481: 
        case 483: 
        case 566: 
          {  /* 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 726: break;
        case 692: 
        case 697: 
        case 704: 
        case 709: 
          { 
	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 727: break;
        case 667: 
          { 
	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 728: break;
        case 650: 
        case 653: 
        case 654: 
        case 655: 
        case 656: 
        case 657: 
        case 658: 
          { 
	if(Debug.debugTokenizer)
		dump("\nCDATA start");//$NON-NLS-1$
	fStateStack.push(yystate());
	yybegin(ST_CDATA_TEXT);
	return XML_CDATA_OPEN;
 }
        case 729: break;
        case 642: 
          { 
	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 730: break;
        case 633: 
          { 
	if(Debug.debugTokenizer)
		dump("element");//$NON-NLS-1$
	yybegin(ST_XML_ELEMENT_DECLARATION);
	return XML_ELEMENT_DECLARATION;
 }
        case 731: break;
        case 632: 
          { 
	if(Debug.debugTokenizer)
		dump("attlist");//$NON-NLS-1$
	yybegin(ST_XML_ATTLIST_DECLARATION);
	return XML_ATTLIST_DECLARATION;
 }
        case 732: break;
        case 631: 
          { 
	if(Debug.debugTokenizer)
		dump("doctype");//$NON-NLS-1$
	yybegin(ST_XML_DOCTYPE_DECLARATION);
	return XML_DOCTYPE_DECLARATION;
 }
        case 733: break;
        case 616: 
          { 
	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 734: break;
        case 615: 
          { 
	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 735: break;
        case 609: 
          { 
	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 736: break;
        case 584: 
        case 625: 
        case 626: 
          { 
	return JSP_VBL_QUOTED_CONTENT;
 }
        case 737: break;
        case 574: 
        case 621: 
        case 622: 
          { 
	return JSP_EL_QUOTED_CONTENT;
 }
        case 738: break;
        case 565: 
          { 
	if(Debug.debugTokenizer)
		dump("\nJSP comment close");//$NON-NLS-1$
	yybegin(YYINITIAL);
	return JSP_COMMENT_CLOSE;
 }
        case 739: break;
        case 552: 
          { 
	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 740: break;
        case 551: 
          { 
	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 741: break;
        case 543: 
          { 
	if(Debug.debugTokenizer)
		dump("\nCharRef");//$NON-NLS-1$
	return XML_CHAR_REFERENCE;
 }
        case 742: break;
        case 540: 
          { 
	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 743: break;
        case 539: 
        case 560: 
        case 563: 
        case 567: 
        case 568: 
        case 570: 
        case 572: 
        case 575: 
        case 577: 
        case 578: 
        case 580: 
        case 582: 
        case 585: 
          { 
	/* 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 744: break;
        case 437: 
          { 
	yybegin(ST_JSP_VBL);
	if(yylength() > 2)
		yypushback(yylength() - 2);
	fELlevel++;
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
	assembleEmbeddedContainer(JSP_VBL_OPEN, JSP_VBL_CLOSE);
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	yybegin(ST_XML_ATTRIBUTE_NAME);
	return PROXY_CONTEXT;
 }
        case 745: break;
        case 436: 
          { 
	yybegin(ST_JSP_EL);
	if(yylength() > 2)
		yypushback(yylength() - 2);
	fELlevel++;
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
	assembleEmbeddedContainer(JSP_EL_OPEN, JSP_EL_CLOSE);
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	yybegin(ST_XML_ATTRIBUTE_NAME);
	return PROXY_CONTEXT;
 }
        case 746: break;
        case 422: 
        case 423: 
          { 
	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 747: break;
        case 421: 
          { 
	if(Debug.debugTokenizer)
		dump("comment end");//$NON-NLS-1$
	fEmbeddedHint = UNDEFINED;
	yybegin(YYINITIAL);
	return XML_COMMENT_CLOSE;
 }
        case 748: break;
        case 420: 
          { 
	if(Debug.debugTokenizer)
		dump("CDATA end");//$NON-NLS-1$
	yybegin(fStateStack.pop());
	return XML_CDATA_CLOSE;
 }
        case 749: break;
        case 418: 
          { 
	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 750: break;
        case 417: 
          { 
	if(Debug.debugTokenizer)
		dump("\nPEReference");//$NON-NLS-1$
	return XML_PE_REFERENCE;
 }
        case 751: break;
        case 415: 
          { 
	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 752: break;
        case 411: 
          { 
	if(Debug.debugTokenizer)
		dump("\nEntityRef");//$NON-NLS-1$
	return XML_ENTITY_REFERENCE;
 }
        case 753: break;
        case 405: 
        case 464: 
        case 474: 
        case 489: 
        case 494: 
        case 499: 
        case 504: 
        case 510: 
        case 516: 
        case 520: 
        case 525: 
        case 530: 
        case 536: 
          { 
	/* 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 754: break;
        case 404: 
        case 463: 
        case 473: 
        case 488: 
        case 493: 
        case 498: 
        case 503: 
        case 509: 
        case 515: 
        case 519: 
        case 524: 
        case 529: 
        case 535: 
          { 
	/* 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 755: break;
        case 403: 
        case 462: 
        case 472: 
        case 487: 
        case 492: 
        case 497: 
        case 502: 
        case 508: 
        case 514: 
        case 518: 
        case 523: 
        case 528: 
        case 534: 
          { 
	/* 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 756: break;
        case 393: 
          { 
	yybegin(ST_JSP_VBL_DQUOTES_END);
	return JSP_VBL_QUOTED_CONTENT;
 }
        case 757: break;
        case 389: 
          { 
	yybegin(ST_JSP_VBL_SQUOTES_END);
	return JSP_VBL_QUOTED_CONTENT;
 }
        case 758: break;
        case 387: 
          { 
	fELlevel++;
	if(fELlevel == 1) {
		return JSP_VBL_OPEN;
	}
 }
        case 759: break;
        case 377: 
          { 
	yybegin(ST_JSP_EL_DQUOTES_END);
	return JSP_EL_QUOTED_CONTENT;
 }
        case 760: break;
        case 373: 
          { 
	yybegin(ST_JSP_EL_SQUOTES_END);
	return JSP_EL_QUOTED_CONTENT;
 }
        case 761: break;
        case 371: 
          { 
	//System.out.println(JSP_EL_CONTENT+ ":[" + yytext() + "]");
	return JSP_EL_CONTENT;
 }
        case 762: break;
        case 370: 
          { 
	fELlevel++;
	if(fELlevel == 1) {
		return JSP_EL_OPEN;
	}
 }
        case 763: break;
        case 367: 
          { 
	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 764: break;
        case 366: 
          { 
	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 765: break;
        case 365: 
          { 
	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 766: break;
        case 364: 
          { 
	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 767: break;
        case 362: 
          { 
	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 768: break;
        case 306: 
        case 320: 
        case 326: 
          { 
	return XML_DOCTYPE_INTERNAL_SUBSET;
 }
        case 769: break;
        case 292: 
          { 
	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 770: break;
        case 288: 
          { 
	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 771: break;
        case 286: 
          { 
        yybegin(YYINITIAL);
	fEmbeddedHint = UNDEFINED;
	if(Debug.debugTokenizer)
		dump("empty tag close");//$NON-NLS-1$

	if (fEmbeddedContainer != null)
		fInTagEmbedded = false;
	else
		fInTagContainer = false;

	return XML_EMPTY_TAG_CLOSE;
 }
        case 772: break;
        case 277: 
          { 
	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 773: break;
        case 275: 
          { 
	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 774: break;
        case 254: 
          { 
	if(Debug.debugTokenizer)
		dump("XML processing instruction end");//$NON-NLS-1$
	fEmbeddedHint = UNDEFINED;
        yybegin(YYINITIAL);
        return XML_PI_CLOSE;
 }
        case 775: break;
        case 127: 
          { 
	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 776: break;
        case 125: 
          { 
	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 777: break;
        case 122: 
          { 
	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 778: break;
        case 118: 
        case 119: 
        case 120: 
        case 287: 
        case 435: 
        case 549: 
        case 590: 
        case 591: 
        case 610: 
        case 611: 
        case 629: 
        case 630: 
        case 643: 
        case 652: 
        case 660: 
        case 662: 
        case 664: 
        case 666: 
        case 669: 
        case 675: 
        case 676: 
        case 677: 
        case 678: 
        case 679: 
        case 685: 
        case 686: 
        case 687: 
        case 688: 
        case 689: 
        case 695: 
        case 696: 
        case 698: 
        case 699: 
        case 705: 
        case 706: 
        case 707: 
        case 708: 
        case 714: 
        case 715: 
        case 716: 
        case 717: 
        case 720: 
        case 721: 
        case 723: 
          { 
	if(Debug.debugTokenizer)
		dump("tag name");//$NON-NLS-1$
    String tagname = yytext();
    boolean jspTag = tagname.indexOf(':') != -1;
	if (fEmbeddedContainer != null) {
    	fEmbeddedTag = jspTag;
		fInTagEmbedded = true;
    }
	else {
		fContainerTag = jspTag;
		fInTagContainer = true;
	}
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_EQUALS;
        yybegin(ST_XML_ATTRIBUTE_NAME);
        return XML_TAG_NAME;
 }
        case 779: break;
        case 116: 
          { 
	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 (fEmbeddedContainer != null)
		fInTagEmbedded = false;
	else
		fInTagContainer = false;

	return XML_TAG_CLOSE;
 }
        case 780: break;
        case 109: 
        case 113: 
        case 280: 
          { 
	if(Debug.debugTokenizer)
		dump("attr value");//$NON-NLS-1$
        yybegin(ST_JSP_DIRECTIVE_ATTRIBUTE_NAME);
        return XML_TAG_ATTRIBUTE_VALUE;
 }
        case 781: break;
        case 108: 
          { 
	if(Debug.debugTokenizer)
		dump("equals");//$NON-NLS-1$
        yybegin(ST_JSP_DIRECTIVE_ATTRIBUTE_VALUE);
        return XML_TAG_ATTRIBUTE_EQUALS;
 }
        case 782: break;
        case 107: 
          { 
	if(Debug.debugTokenizer)
		dump("attr name");//$NON-NLS-1$
        yybegin(ST_JSP_DIRECTIVE_EQUALS);
        return XML_TAG_ATTRIBUTE_NAME;
 }
        case 783: break;
        case 104: 
          { 
	if(Debug.debugTokenizer)
		dump("JSP directive name");//$NON-NLS-1$
	yybegin(ST_JSP_DIRECTIVE_NAME_WHITESPACE);
	return JSP_DIRECTIVE_NAME;
 }
        case 784: break;
        case 100: 
        case 101: 
        case 102: 
          { 
	if(Debug.debugTokenizer)
		dump("JSP code content");//$NON-NLS-1$
	return doScan("%>", false, false, false, JSP_CONTENT, ST_JSP_CONTENT, ST_JSP_CONTENT);
 }
        case 785: break;
        case 96: 
        case 98: 
        case 99: 
        case 268: 
        case 269: 
        case 270: 
        case 273: 
        case 274: 
        case 429: 
        case 432: 
          { 
	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 786: break;
        case 95: 
          { 
	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 787: break;
        case 94: 
          { 
	if(Debug.debugTokenizer)
		dump("DHTML processing instruction attribute name");//$NON-NLS-1$
        yybegin(ST_DHTML_EQUALS);
        return XML_TAG_ATTRIBUTE_NAME;
 }
        case 788: break;
        case 92: 
          { 
	if(Debug.debugTokenizer)
		dump("DHTML processing instruction end");//$NON-NLS-1$
	fEmbeddedHint = UNDEFINED;
        yybegin(YYINITIAL);
        return XML_PI_CLOSE;
 }
        case 789: break;
        case 86: 
        case 88: 
        case 257: 
          { 
	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 790: break;
        case 85: 
          { 
	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 791: break;
        case 84: 
          { 
	if(Debug.debugTokenizer)
		dump("XML processing instruction attribute name");//$NON-NLS-1$
        yybegin(ST_XML_PI_EQUALS);
        return XML_TAG_ATTRIBUTE_NAME;
 }
        case 792: break;
        case 50: 
        case 211: 
        case 212: 
        case 215: 
        case 225: 
        case 226: 
        case 229: 
        case 230: 
        case 398: 
        case 401: 
        case 513: 
        case 527: 
        case 533: 
          { 
	return JSP_VBL_CONTENT;
 }
        case 793: break;
        case 43: 
        case 189: 
        case 190: 
        case 193: 
        case 203: 
        case 204: 
        case 208: 
        case 209: 
        case 368: 
        case 382: 
        case 385: 
        case 485: 
        case 486: 
        case 501: 
        case 507: 
          { 
	return JSP_EL_CONTENT;
 }
        case 794: break;
        case 35: 
        case 163: 
        case 164: 
        case 350: 
        case 471: 
        case 475: 
        case 564: 
        case 598: 
        case 618: 
        case 635: 
        case 645: 
          { 
	if(Debug.debugTokenizer)
		dump("attlist contentspec");//$NON-NLS-1$
	return XML_ATTLIST_DECL_CONTENT;
 }
        case 795: break;
        case 33: 
        case 156: 
        case 157: 
        case 338: 
        case 461: 
        case 465: 
        case 561: 
        case 597: 
        case 617: 
        case 634: 
        case 644: 
          { 
	if(Debug.debugTokenizer)
		dump("elementdecl contentspec");//$NON-NLS-1$
	return XML_ELEMENT_DECL_CONTENT;
 }
        case 796: break;
        case 22: 
        case 114: 
          { 
	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);
		char c = yy_buffer[yy_markedPos - 1];
		if (fStateStack.peek()==ST_XML_ATTRIBUTE_VALUE_DQUOTED && c == '\"') {
			return isJspTag() ? JSP_TAG_ATTRIBUTE_VALUE_DQUOTE : XML_TAG_ATTRIBUTE_VALUE_DQUOTE;
		}		
		if (fStateStack.peek()==ST_XML_ATTRIBUTE_VALUE_SQUOTED && c == '\'') {
			return isJspTag() ? JSP_TAG_ATTRIBUTE_VALUE_SQUOTE : XML_TAG_ATTRIBUTE_VALUE_SQUOTE;
		}
		yypushback(yylength()-1);
		return XML_TAG_ATTRIBUTE_VALUE;
	}
	yybegin(YYINITIAL);
        return XML_CONTENT;
 }
        case 797: break;
        case 18: 
        case 106: 
          { 
	if(Debug.debugTokenizer)
		dump("white space");//$NON-NLS-1$
	yybegin(ST_JSP_DIRECTIVE_ATTRIBUTE_NAME);
	return WHITE_SPACE;
 }
        case 798: 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 74: 
        case 180: 
        case 185: 
          { 
	if(Debug.debugTokenizer)
		dump("white space");//$NON-NLS-1$
        return WHITE_SPACE;
 }
        case 799: break;
        case 0: 
        case 57: 
        case 60: 
        case 61: 
        case 63: 
        case 237: 
        case 239: 
        case 242: 
        case 245: 
        case 408: 
        case 409: 
        case 410: 
        case 414: 
        case 416: 
        case 419: 
        case 542: 
          { 
	if(Debug.debugTokenizer)
		dump("\nXML content");//$NON-NLS-1$
	return XML_CONTENT;
 }
        case 800: break;
        case 58: 
        case 103: 
        case 115: 
        case 121: 
        case 133: 
          { 
	if(Debug.debugTokenizer)
		dump("\nstart tag open");//$NON-NLS-1$
	if (!fStateStack.empty() && fStateStack.peek()== ST_XML_COMMENT){
		fStateStack.pop();
		fEmbeddedHint = XML_COMMENT_TEXT;
		yybegin(ST_XML_TAG_NAME);
		String tagName = "";
		assembleEmbeddedTagSequence(XML_TAG_OPEN, tagName); // ?
		return PROXY_CONTEXT;
	}
	fEmbeddedHint = XML_TAG_NAME;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
        yybegin(ST_XML_TAG_NAME);
        return XML_TAG_OPEN;
 }
        case 801: break;
        case 59: 
        case 66: 
        case 67: 
        case 68: 
        case 72: 
        case 73: 
        case 83: 
        case 87: 
        case 89: 
        case 90: 
        case 91: 
        case 93: 
        case 97: 
        case 105: 
        case 110: 
        case 111: 
        case 112: 
        case 117: 
        case 123: 
        case 124: 
        case 128: 
        case 135: 
        case 136: 
        case 137: 
        case 138: 
        case 140: 
        case 141: 
        case 143: 
        case 144: 
        case 145: 
        case 148: 
        case 149: 
        case 150: 
        case 153: 
        case 154: 
        case 155: 
        case 160: 
        case 161: 
        case 162: 
        case 170: 
        case 172: 
        case 173: 
        case 195: 
        case 196: 
        case 199: 
        case 200: 
        case 206: 
        case 210: 
        case 217: 
        case 218: 
        case 221: 
        case 222: 
        case 227: 
        case 231: 
          { 
	if (Debug.debugTokenizer)
		System.out.println("!!!unexpected!!!: \"" + yytext() + "\":" + //$NON-NLS-2$//$NON-NLS-1$
			yychar + "-" + (yychar + yylength()));//$NON-NLS-1$
	return UNDEFINED;
 }
        case 802: break;
        case 62: 
        case 243: 
          { 
	if(Debug.debugTokenizer)
		dump("non-reference %");//$NON-NLS-1$
	return XML_CONTENT;
 }
        case 803: break;
        case 64: 
        case 65: 
          { 
	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 804: break;
        case 69: 
        case 198: 
        case 202: 
        case 220: 
        case 224: 
          { 
	if(Debug.debugTokenizer)
		dump("LINE FEED");//$NON-NLS-1$
	return WHITE_SPACE;
 }
        case 805: break;
        case 70: 
        case 71: 
          { 
	if(Debug.debugTokenizer)
		dump("comment content");//$NON-NLS-1$
	return scanXMLCommentText();
 }
        case 806: break;
        case 75: 
        case 76: 
        case 77: 
        case 78: 
        case 250: 
        case 251: 
        case 252: 
        case 424: 
        case 545: 
        case 546: 
        case 588: 
        case 589: 
        case 608: 
        case 628: 
        case 641: 
        case 651: 
        case 659: 
        case 661: 
        case 663: 
        case 665: 
          { 
	if(Debug.debugTokenizer)
		dump("processing instruction target");//$NON-NLS-1$
	fEmbeddedHint = XML_CONTENT;
        yybegin(ST_PI_WS);
        return XML_TAG_NAME;
 }
        case 807: break;
        case 79: 
          { 
        yybegin(ST_PI_CONTENT);
        return WHITE_SPACE;
 }
        case 808: break;
        case 80: 
        case 81: 
        case 82: 
          { 
		// 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 809: break;
        case 129: 
        case 174: 
          { 
	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 810: break;
        case 130: 
        case 175: 
          { 
	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 811: break;
        case 134: 
          { 
	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 812: break;
        case 139: 
          { 
	if(Debug.debugTokenizer)
		dump("doctype type");//$NON-NLS-1$
	yybegin(ST_XML_DOCTYPE_EXTERNAL_ID);
	return XML_DOCTYPE_NAME;
 }
        case 813: break;
        case 142: 
        case 146: 
        case 311: 
        case 316: 
        case 453: 
          { 
	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 814: break;
        case 147: 
        case 151: 
        case 323: 
          { 
	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 815: break;
        case 152: 
        case 329: 
        case 334: 
        case 458: 
          { 
	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 816: break;
        case 158: 
          { 
	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 817: break;
        case 159: 
        case 341: 
        case 346: 
        case 468: 
          { 
	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 818: break;
        case 165: 
          { 
	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 819: break;
        case 168: 
        case 169: 
          { 
	if(Debug.debugTokenizer)
		dump("\nJSP comment text");//$NON-NLS-1$
	return scanJSPCommentText();
 }
        case 820: break;
        case 178: 
        case 182: 
        case 183: 
        case 184: 
        case 187: 
        case 188: 
        case 363: 
          { 
	return XML_TAG_ATTRIBUTE_VALUE;
 }
        case 821: break;
        case 179: 
          { 
	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 822: break;
        case 181: 
          { 
	return isJspTag() ? JSP_TAG_ATTRIBUTE_VALUE_SQUOTE : XML_TAG_ATTRIBUTE_VALUE_SQUOTE;
 }
        case 823: break;
        case 186: 
          { 
	return isJspTag()? JSP_TAG_ATTRIBUTE_VALUE_DQUOTE : XML_TAG_ATTRIBUTE_VALUE_DQUOTE;
 }
        case 824: break;
        case 191: 
          { 
	yybegin(ST_JSP_EL_DQUOTES);
	return JSP_EL_DQUOTE;
 }
        case 825: break;
        case 192: 
          { 
	yybegin(ST_JSP_EL_SQUOTES);
	return JSP_EL_SQUOTE;
 }
        case 826: break;
        case 194: 
          { 
	fELlevel--;
	if(fELlevel == 0) {
		yybegin(YYINITIAL);
		return JSP_EL_CLOSE;
	}
	return JSP_EL_CONTENT;
 }
        case 827: break;
        case 197: 
          { 
	yybegin(ST_JSP_EL);
	return JSP_EL_SQUOTE;
 }
        case 828: break;
        case 201: 
          { 
	yybegin(ST_JSP_EL);
	return JSP_EL_DQUOTE;
 }
        case 829: break;
        case 205: 
          { 
	return isJspTag() ? JSP_TAG_ATTRIBUTE_VALUE_DQUOTE: XML_TAG_ATTRIBUTE_VALUE_DQUOTE;
 }
        case 830: break;
        case 207: 
          { 
	return JSP_EL_CLOSE;
 }
        case 831: break;
        case 213: 
          { 
	yybegin(ST_JSP_VBL_DQUOTES);
	return JSP_VBL_DQUOTE;
 }
        case 832: break;
        case 214: 
          { 
	yybegin(ST_JSP_VBL_SQUOTES);
	return JSP_VBL_SQUOTE;
 }
        case 833: break;
        case 216: 
          { 
	fELlevel--;
	if(fELlevel == 0) {
		yybegin(YYINITIAL);
		return JSP_VBL_CLOSE;
	}
	return JSP_VBL_CONTENT;
 }
        case 834: break;
        case 219: 
          { 
	yybegin(ST_JSP_VBL);
	return JSP_VBL_SQUOTE;
 }
        case 835: break;
        case 223: 
          { 
	yybegin(ST_JSP_VBL);
	return JSP_VBL_DQUOTE;
 }
        case 836: break;
        case 228: 
          { 
	return JSP_VBL_CLOSE;
 }
        case 837: break;
        case 232: 
          { 
	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 838: break;
        case 233: 
          { 
	if(Debug.debugTokenizer)
		dump("\nprocessing instruction start");//$NON-NLS-1$
	yybegin(ST_PI);
        return XML_PI_OPEN;
 }
        case 839: break;
        case 234: 
        case 337: 
        case 349: 
        case 369: 
        case 374: 
        case 378: 
        case 381: 
        case 384: 
        case 386: 
        case 390: 
        case 394: 
        case 397: 
        case 400: 
          { 
	/* 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 840: break;
        case 235: 
          { 
	fStateStack.push(yystate());
	if(Debug.debugTokenizer)
		dump("\ndeclaration start");//$NON-NLS-1$
        yybegin(ST_XML_DECLARATION);
	return XML_DECLARATION_OPEN;
 }
        case 841: break;
        case 249: 
          { 
	if(Debug.debugTokenizer)
		dump("processing instruction end");//$NON-NLS-1$
	fEmbeddedHint = UNDEFINED;
        yybegin(YYINITIAL);
        return XML_PI_CLOSE;
 }
        case 842: break;
        case 253: 
          { 
		// ended with nothing inside
		fEmbeddedHint = UNDEFINED;
        yybegin(YYINITIAL);
        return XML_PI_CLOSE;
 }
        case 843: break;
        case 166: 
        case 167: 
          { 
		return doBlockTagScan();
	 }
        case 844: break;
        default: 
          if (yy_input == YYEOF && yy_startRead == yy_currentPos) {
            yy_atEOF = true;
            yy_do_eof();
              return null;
          } 
          else {
            yy_ScanError(YY_NO_MATCH);
          }
      }
    }
  }    


}
