/* The following code was generated by JFlex 1.6.1 */

/*******************************************************************************
 * Copyright (c) 2019 Zend Corporation and IBM Corporation.
 *
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *   Zend and IBM - Initial implementation
 *******************************************************************************/

package org.eclipse.php.core.ast.scanner.php74;

import java.io.IOException;
import java.util.LinkedList;
import java.util.Stack;

import org.eclipse.php.core.PHPVersion;
import org.eclipse.php.core.ast.nodes.AST;
import org.eclipse.php.core.ast.nodes.Comment;
import org.eclipse.php.core.ast.nodes.IDocumentorLexer;
import org.eclipse.php.internal.core.util.collections.StateStack;

import java_cup.sym;
import java_cup.runtime.Symbol;

@SuppressWarnings({"unused", "nls"})


/**
 * This class is a scanner generated by 
 * <a href="http://www.jflex.de/">JFlex</a> 1.6.1
 * from the specification file <tt>ast_scanner.flex</tt>
 */
public class PHPAstLexer implements org.eclipse.php.internal.core.ast.scanner.AstLexer {

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

	/** initial size of the lookahead buffer */
  private static final int ZZ_BUFFERSIZE = 16384;

	/** lexical states */
  public static final int YYINITIAL = 0;
  public static final int ST_IN_SCRIPTING = 2;
  public static final int ST_DOUBLE_QUOTES = 4;
  public static final int ST_SINGLE_QUOTE = 6;
  public static final int ST_BACKQUOTE = 8;
  public static final int ST_HEREDOC = 10;
  public static final int ST_NOWDOC = 12;
  public static final int ST_START_HEREDOC = 14;
  public static final int ST_START_NOWDOC = 16;
  public static final int ST_END_HEREDOC = 18;
  public static final int ST_LOOKING_FOR_PROPERTY = 20;
  public static final int ST_LOOKING_FOR_VARNAME = 22;
  public static final int ST_VAR_OFFSET = 24;
  public static final int ST_COMMENT = 26;
  public static final int ST_DOCBLOCK = 28;
  public static final int ST_ONE_LINE_COMMENT = 30;

  /**
   * ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l
   * ZZ_LEXSTATE[l+1] is the state in the DFA for the lexical state l
   *                  at the beginning of a line
   * l is of the form l = 2*k, k a non negative integer
   */
  private static final int ZZ_LEXSTATE[] = { 
     0,  0,  1,  1,  2,  2,  3,  3,  4,  4,  5,  5,  6,  6,  7,  7, 
     8,  8,  9,  9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15
  };

  /** 
   * Translates characters to character classes
   */
  private static final String ZZ_CMAP_PACKED = 
    "\11\0\1\15\1\14\2\0\1\16\22\0\1\15\1\57\1\20\1\100"+
    "\1\17\1\63\1\64\1\77\1\52\1\53\1\61\1\5\1\71\1\46"+
    "\1\3\1\62\1\6\1\12\10\1\1\50\1\70\1\60\1\56\1\47"+
    "\1\67\1\75\1\10\1\11\1\32\1\26\1\4\1\27\1\44\1\41"+
    "\1\24\1\54\1\43\1\37\1\40\1\31\1\33\1\45\1\55\1\35"+
    "\1\34\1\25\1\30\1\51\1\42\1\7\1\36\1\13\1\72\1\21"+
    "\1\73\1\66\1\2\1\22\1\10\1\11\1\32\1\26\1\4\1\27"+
    "\1\44\1\41\1\24\1\54\1\43\1\37\1\40\1\31\1\33\1\45"+
    "\1\55\1\35\1\34\1\25\1\30\1\51\1\42\1\7\1\36\1\13"+
    "\1\23\1\65\1\76\1\74\1\0\260\13\2\24\115\13\1\34\u1faa\13"+
    "\1\43\uded5\13\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\20\0";

  /** 
   * Translates characters to character classes
   */
  private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);

  /** 
   * Translates DFA states to action switch labels.
   */
  private static final int [] ZZ_ACTION = zzUnpackAction();

  private static final String ZZ_ACTION_PACKED_0 =
    "\5\0\2\1\11\0\2\2\1\3\1\4\1\5\1\6"+
    "\1\5\1\7\1\4\4\5\1\10\1\11\1\12\1\13"+
    "\1\14\1\15\17\5\1\16\1\17\1\20\1\5\1\21"+
    "\1\22\1\23\1\24\1\25\1\26\1\27\1\30\1\31"+
    "\1\32\1\33\1\34\1\35\1\36\1\37\1\40\1\41"+
    "\1\42\1\43\1\44\1\45\1\1\1\3\1\46\2\3"+
    "\1\47\1\3\1\50\1\1\2\3\1\51\1\3\2\1"+
    "\3\3\1\1\1\52\1\53\1\52\1\54\1\55\1\54"+
    "\1\56\1\57\1\60\1\57\1\61\1\62\1\63\1\6"+
    "\1\7\1\63\1\64\1\65\1\66\1\67\1\16\1\17"+
    "\1\20\1\21\1\23\1\24\1\25\1\26\1\27\1\30"+
    "\1\31\1\32\1\33\1\34\1\70\1\71\1\10\1\72"+
    "\3\10\3\73\2\72\1\0\1\74\1\75\1\0\1\76"+
    "\1\0\1\5\1\76\1\0\1\77\6\5\1\100\1\101"+
    "\2\0\3\5\1\102\2\5\2\0\1\103\2\0\1\104"+
    "\2\0\1\105\7\5\1\106\2\5\1\107\10\5\1\110"+
    "\12\5\1\111\1\112\1\113\1\114\1\115\1\116\1\5"+
    "\12\0\1\117\1\120\2\121\1\122\1\123\1\0\1\124"+
    "\1\125\1\126\1\127\1\130\1\131\1\132\1\133\1\134"+
    "\1\135\1\136\1\137\1\140\4\0\1\103\2\141\1\142"+
    "\1\143\1\141\1\0\1\144\3\0\2\141\3\0\1\145"+
    "\2\141\1\146\2\0\1\147\3\0\1\125\1\150\1\151"+
    "\1\152\1\153\1\0\1\76\1\0\7\5\1\0\1\154"+
    "\7\5\1\76\1\155\1\156\1\5\1\157\2\5\1\0"+
    "\6\5\1\160\3\5\1\161\2\5\1\162\1\5\1\163"+
    "\1\164\23\5\1\165\1\166\12\0\1\167\1\170\1\171"+
    "\1\172\2\0\1\173\1\0\1\174\1\0\1\175\1\0"+
    "\1\176\2\63\1\0\16\5\1\177\1\200\1\5\1\201"+
    "\23\5\1\202\12\5\1\203\1\5\1\204\5\5\16\0"+
    "\1\205\3\0\11\5\1\206\5\5\1\207\1\5\1\210"+
    "\1\211\4\5\1\212\1\5\1\213\1\214\3\5\1\215"+
    "\2\5\1\216\1\5\1\217\2\5\1\220\1\221\1\222"+
    "\4\5\1\223\1\224\2\5\1\225\2\5\5\0\1\226"+
    "\6\0\2\227\4\0\1\230\2\231\12\5\1\232\2\5"+
    "\1\233\7\5\1\234\7\5\1\235\1\236\1\237\1\5"+
    "\1\0\1\240\1\241\2\5\4\0\1\242\5\0\1\243"+
    "\3\0\1\244\7\5\1\245\6\5\1\246\3\5\1\247"+
    "\1\250\1\251\1\5\1\252\3\5\1\253\1\0\1\254"+
    "\1\5\1\255\3\0\1\256\3\0\1\257\3\5\1\260"+
    "\5\5\1\261\1\262\5\5\1\263\1\5\1\264\1\265"+
    "\1\5\1\0\1\5\1\266\1\267\4\0\2\5\1\270"+
    "\4\5\1\271\1\272\1\5\1\273\2\5\1\274\1\5"+
    "\1\0\1\275\2\0\2\5\1\276\1\5\1\277\1\300"+
    "\1\5\1\301\1\302\1\5\1\303\2\0\5\5\3\0"+
    "\1\304\2\5\1\305\1\306\2\0\1\307\1\5\1\310"+
    "\1\5\1\311";

  private static int [] zzUnpackAction() {
    int [] result = new int[688];
    int offset = 0;
    offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
    return result;
  }

  private static int zzUnpackAction(String packed, int offset, int [] result) {
    int i = 0;       /* index in packed string  */
    int j = offset;  /* index in unpacked array */
    int l = packed.length();
    while (i < l) {
      int count = packed.charAt(i++);
      int value = packed.charAt(i++);
      do result[j++] = value; while (--count > 0);
    }
    return j;
  }


  /** 
   * Translates a state to a row index in the transition table
   */
  private static final int [] ZZ_ROWMAP = zzUnpackRowMap();

  private static final String ZZ_ROWMAP_PACKED_0 =
    "\0\0\0\101\0\202\0\303\0\u0104\0\u0145\0\u0186\0\u01c7"+
    "\0\u0208\0\u0249\0\u028a\0\u02cb\0\u030c\0\u034d\0\u038e\0\u03cf"+
    "\0\u0410\0\u0451\0\u0492\0\u04d3\0\u0514\0\u0555\0\u0596\0\u05d7"+
    "\0\u0618\0\u0659\0\u069a\0\u06db\0\u071c\0\u075d\0\u079e\0\u07df"+
    "\0\u0492\0\u0492\0\u0492\0\u0820\0\u0861\0\u08a2\0\u08e3\0\u0924"+
    "\0\u0965\0\u09a6\0\u09e7\0\u0a28\0\u0a69\0\u0aaa\0\u0aeb\0\u0b2c"+
    "\0\u0b6d\0\u0bae\0\u0bef\0\u0c30\0\u0c71\0\u0cb2\0\u0cf3\0\u0492"+
    "\0\u0d34\0\u0d75\0\u0db6\0\u0df7\0\u0e38\0\u0e79\0\u0eba\0\u0efb"+
    "\0\u0f3c\0\u0f7d\0\u0492\0\u0492\0\u0492\0\u0492\0\u0492\0\u0492"+
    "\0\u0492\0\u0fbe\0\u0492\0\u0fff\0\u1040\0\u0492\0\u1081\0\u10c2"+
    "\0\u1103\0\u1144\0\u0492\0\u1185\0\u11c6\0\u1207\0\u0492\0\u1248"+
    "\0\u1289\0\u12ca\0\u130b\0\u134c\0\u138d\0\u13ce\0\u0492\0\u140f"+
    "\0\u1450\0\u0492\0\u1491\0\u14d2\0\u1513\0\u0492\0\u1554\0\u1595"+
    "\0\u0492\0\u15d6\0\u1617\0\u0492\0\u0492\0\u1658\0\u0492\0\u0492"+
    "\0\u0492\0\u0492\0\u0492\0\u0492\0\u0492\0\u0492\0\u0492\0\u0492"+
    "\0\u0492\0\u1699\0\u0492\0\u0492\0\u0492\0\u0492\0\u0492\0\u0492"+
    "\0\u0492\0\u0492\0\u16da\0\u171b\0\u0492\0\u175c\0\u179d\0\u17de"+
    "\0\u0492\0\u181f\0\u0492\0\u1860\0\u18a1\0\u18e2\0\u1923\0\u1964"+
    "\0\u19a5\0\u19e6\0\u1a27\0\u1a68\0\u1aa9\0\u0492\0\u1aea\0\u1b2b"+
    "\0\u1b6c\0\u1bad\0\u1bee\0\u1c2f\0\u0492\0\u0492\0\u1c70\0\u1cb1"+
    "\0\u1cf2\0\u1d33\0\u1d74\0\u071c\0\u1db5\0\u1df6\0\u1e37\0\u0fbe"+
    "\0\u1e78\0\u07df\0\u1eb9\0\u0492\0\u1efa\0\u1f3b\0\u071c\0\u1f7c"+
    "\0\u1fbd\0\u1ffe\0\u203f\0\u2080\0\u20c1\0\u2102\0\u071c\0\u2143"+
    "\0\u2184\0\u071c\0\u21c5\0\u2206\0\u2247\0\u2288\0\u22c9\0\u230a"+
    "\0\u234b\0\u238c\0\u071c\0\u23cd\0\u240e\0\u244f\0\u2490\0\u24d1"+
    "\0\u2512\0\u2553\0\u2594\0\u25d5\0\u2616\0\u0492\0\u0492\0\u0492"+
    "\0\u2657\0\u0492\0\u0492\0\u2698\0\u26d9\0\u271a\0\u0cf3\0\u275b"+
    "\0\u279c\0\u27dd\0\u281e\0\u285f\0\u28a0\0\u28e1\0\u0492\0\u2922"+
    "\0\u2963\0\u0492\0\u29a4\0\u29e5\0\u2a26\0\u0492\0\u2a67\0\u0492"+
    "\0\u2aa8\0\u0492\0\u0492\0\u0492\0\u0492\0\u0492\0\u0492\0\u0492"+
    "\0\u0492\0\u2ae9\0\u2b2a\0\u2b6b\0\u1081\0\u2bac\0\u2bed\0\u2b6b"+
    "\0\u0492\0\u0492\0\u0492\0\u2bac\0\u2c2e\0\u0492\0\u2c6f\0\u1207"+
    "\0\u2cb0\0\u2c6f\0\u2cb0\0\u2cf1\0\u134c\0\u2d32\0\u2d73\0\u2cf1"+
    "\0\u2d32\0\u2db4\0\u1450\0\u14d2\0\u0492\0\u2df5\0\u2e36\0\u2e77"+
    "\0\u0492\0\u0492\0\u0492\0\u0492\0\u0492\0\u2eb8\0\u2ef9\0\u2f3a"+
    "\0\u2f7b\0\u2fbc\0\u2ffd\0\u303e\0\u307f\0\u30c0\0\u3101\0\u3142"+
    "\0\u0492\0\u3183\0\u31c4\0\u3205\0\u3246\0\u3287\0\u32c8\0\u3309"+
    "\0\u334a\0\u338b\0\u071c\0\u33cc\0\u071c\0\u340d\0\u344e\0\u348f"+
    "\0\u34d0\0\u3511\0\u3552\0\u3593\0\u35d4\0\u3615\0\u071c\0\u3656"+
    "\0\u3697\0\u36d8\0\u071c\0\u3719\0\u375a\0\u379b\0\u37dc\0\u071c"+
    "\0\u071c\0\u381d\0\u385e\0\u389f\0\u38e0\0\u3921\0\u3962\0\u39a3"+
    "\0\u39e4\0\u3a25\0\u3a66\0\u3aa7\0\u3ae8\0\u3b29\0\u3b6a\0\u3bab"+
    "\0\u3bec\0\u3c2d\0\u3c6e\0\u3caf\0\u0492\0\u071c\0\u3cf0\0\u3d31"+
    "\0\u3d72\0\u3db3\0\u3df4\0\u3e35\0\u3e76\0\u3eb7\0\u3ef8\0\u3f39"+
    "\0\u0492\0\u0492\0\u0492\0\u0492\0\u3f7a\0\u3fbb\0\u0492\0\u3ffc"+
    "\0\u403d\0\u407e\0\u0492\0\u40bf\0\u0492\0\u4100\0\u4141\0\u4182"+
    "\0\u41c3\0\u4204\0\u4245\0\u4286\0\u42c7\0\u4308\0\u4349\0\u438a"+
    "\0\u43cb\0\u440c\0\u444d\0\u448e\0\u44cf\0\u4510\0\u071c\0\u4551"+
    "\0\u4592\0\u071c\0\u45d3\0\u4614\0\u4655\0\u4696\0\u46d7\0\u4718"+
    "\0\u4759\0\u479a\0\u47db\0\u481c\0\u485d\0\u489e\0\u48df\0\u4920"+
    "\0\u4961\0\u49a2\0\u49e3\0\u4a24\0\u4a65\0\u071c\0\u4aa6\0\u4ae7"+
    "\0\u4b28\0\u4b69\0\u4baa\0\u4beb\0\u4c2c\0\u4c6d\0\u4cae\0\u4cef"+
    "\0\u071c\0\u4d30\0\u071c\0\u4d71\0\u4db2\0\u4df3\0\u4e34\0\u4e75"+
    "\0\u4eb6\0\u4ef7\0\u4f38\0\u4f79\0\u4fba\0\u4ffb\0\u503c\0\u507d"+
    "\0\u50be\0\u50ff\0\u5140\0\u5181\0\u51c2\0\u5203\0\u0492\0\u5244"+
    "\0\u5285\0\u52c6\0\u5307\0\u5348\0\u5389\0\u53ca\0\u540b\0\u544c"+
    "\0\u548d\0\u54ce\0\u550f\0\u071c\0\u5550\0\u5591\0\u55d2\0\u5613"+
    "\0\u5654\0\u071c\0\u5695\0\u071c\0\u071c\0\u56d6\0\u5717\0\u5758"+
    "\0\u5799\0\u071c\0\u57da\0\u071c\0\u071c\0\u581b\0\u585c\0\u589d"+
    "\0\u58de\0\u591f\0\u5960\0\u071c\0\u59a1\0\u071c\0\u59e2\0\u5a23"+
    "\0\u071c\0\u071c\0\u071c\0\u5a64\0\u5aa5\0\u5ae6\0\u5b27\0\u5b68"+
    "\0\u071c\0\u5ba9\0\u5bea\0\u071c\0\u5c2b\0\u5c6c\0\u5cad\0\u5cee"+
    "\0\u5d2f\0\u5d70\0\u5db1\0\u0492\0\u5df2\0\u5e33\0\u5e74\0\u5eb5"+
    "\0\u5ef6\0\u5f37\0\u0492\0\u5f78\0\u5fb9\0\u5ffa\0\u603b\0\u607c"+
    "\0\u0492\0\u0492\0\u60bd\0\u60fe\0\u613f\0\u6180\0\u61c1\0\u6202"+
    "\0\u6243\0\u6284\0\u62c5\0\u6306\0\u6347\0\u6388\0\u63c9\0\u640a"+
    "\0\u071c\0\u644b\0\u648c\0\u64cd\0\u650e\0\u654f\0\u6590\0\u65d1"+
    "\0\u071c\0\u6612\0\u6653\0\u6694\0\u66d5\0\u6716\0\u6757\0\u6798"+
    "\0\u071c\0\u071c\0\u071c\0\u67d9\0\u681a\0\u071c\0\u071c\0\u685b"+
    "\0\u689c\0\u68dd\0\u691e\0\u695f\0\u69a0\0\u0492\0\u69e1\0\u6a22"+
    "\0\u6a63\0\u6aa4\0\u6ae5\0\u0492\0\u6b26\0\u6b67\0\u6ba8\0\u071c"+
    "\0\u6be9\0\u6c2a\0\u6c6b\0\u6cac\0\u6ced\0\u6d2e\0\u6d6f\0\u071c"+
    "\0\u6db0\0\u6df1\0\u6e32\0\u6e73\0\u6eb4\0\u6ef5\0\u6f36\0\u6f77"+
    "\0\u6fb8\0\u6ff9\0\u071c\0\u071c\0\u071c\0\u703a\0\u071c\0\u707b"+
    "\0\u70bc\0\u70fd\0\u713e\0\u717f\0\u071c\0\u71c0\0\u0492\0\u7201"+
    "\0\u7242\0\u7283\0\u0492\0\u72c4\0\u7305\0\u7346\0\u071c\0\u7387"+
    "\0\u73c8\0\u7409\0\u071c\0\u744a\0\u748b\0\u74cc\0\u750d\0\u754e"+
    "\0\u071c\0\u071c\0\u758f\0\u75d0\0\u7611\0\u7652\0\u7693\0\u071c"+
    "\0\u76d4\0\u071c\0\u071c\0\u7715\0\u7756\0\u7797\0\u0492\0\u0492"+
    "\0\u77d8\0\u7819\0\u785a\0\u789b\0\u78dc\0\u791d\0\u071c\0\u795e"+
    "\0\u799f\0\u79e0\0\u7a21\0\u071c\0\u071c\0\u7a62\0\u071c\0\u7aa3"+
    "\0\u7ae4\0\u071c\0\u7b25\0\u7b66\0\u071c\0\u7ba7\0\u7be8\0\u7c29"+
    "\0\u7c6a\0\u071c\0\u7cab\0\u071c\0\u071c\0\u7cec\0\u071c\0\u071c"+
    "\0\u7d2d\0\u0492\0\u7d6e\0\u7daf\0\u7df0\0\u7e31\0\u7e72\0\u7eb3"+
    "\0\u7ef4\0\u7f35\0\u7f76\0\u7fb7\0\u071c\0\u7ff8\0\u8039\0\u071c"+
    "\0\u071c\0\u807a\0\u80bb\0\u071c\0\u80fc\0\u0492\0\u813d\0\u071c";

  private static int [] zzUnpackRowMap() {
    int [] result = new int[688];
    int offset = 0;
    offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
    return result;
  }

  private static int zzUnpackRowMap(String packed, int offset, int [] result) {
    int i = 0;  /* index in packed string  */
    int j = offset;  /* index in unpacked array */
    int l = packed.length();
    while (i < l) {
      int high = packed.charAt(i++) << 16;
      result[j++] = high | packed.charAt(i++);
    }
    return j;
  }

  /** 
   * The transition table of the DFA
   */
  private static final int [] ZZ_TRANS = zzUnpackTrans();

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

  private static int [] zzUnpackTrans() {
    int [] result = new int[33150];
    int offset = 0;
    offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
    return result;
  }

  private static int zzUnpackTrans(String packed, int offset, int [] result) {
    int i = 0;       /* index in packed string  */
    int j = offset;  /* index in unpacked array */
    int l = packed.length();
    while (i < l) {
      int count = packed.charAt(i++);
      int value = packed.charAt(i++);
      value--;
      do result[j++] = value; while (--count > 0);
    }
    return j;
  }


	/* error codes */
	private static final int ZZ_UNKNOWN_ERROR = 0;
	private static final int ZZ_NO_MATCH = 1;
	private static final int ZZ_PUSHBACK_2BIG = 2;

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

  /**
   * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
   */
  private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();

  private static final String ZZ_ATTRIBUTE_PACKED_0 =
    "\5\0\2\1\11\0\2\1\1\11\15\1\3\11\24\1"+
    "\1\11\12\1\7\11\1\1\1\11\2\1\1\11\4\1"+
    "\1\11\3\1\1\11\7\1\1\11\2\1\1\11\3\1"+
    "\1\11\2\1\1\11\2\1\2\11\1\1\13\11\1\1"+
    "\10\11\2\1\1\11\3\1\1\11\1\1\1\11\1\1"+
    "\1\0\2\1\1\0\1\1\1\0\2\1\1\0\1\11"+
    "\6\1\2\11\2\0\6\1\2\0\1\1\2\0\1\11"+
    "\2\0\37\1\3\11\1\1\2\11\1\1\12\0\1\11"+
    "\2\1\1\11\2\1\1\0\1\11\1\1\1\11\1\1"+
    "\10\11\1\1\4\0\2\1\3\11\1\1\1\0\1\11"+
    "\3\0\2\1\3\0\4\1\2\0\1\11\3\0\5\11"+
    "\1\0\1\1\1\0\7\1\1\0\1\11\16\1\1\0"+
    "\44\1\1\11\1\1\12\0\4\11\2\0\1\11\1\0"+
    "\1\1\1\0\1\11\1\0\1\11\2\1\1\0\70\1"+
    "\16\0\1\11\3\0\64\1\5\0\1\11\6\0\1\11"+
    "\1\1\4\0\2\11\42\1\1\0\4\1\4\0\1\11"+
    "\5\0\1\11\3\0\34\1\1\0\2\1\1\11\3\0"+
    "\1\11\3\0\26\1\1\0\1\1\2\11\4\0\17\1"+
    "\1\0\1\1\2\0\12\1\1\11\2\0\5\1\3\0"+
    "\5\1\2\0\2\1\1\11\2\1";

  private static int [] zzUnpackAttribute() {
    int [] result = new int[688];
    int offset = 0;
    offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
    return result;
  }

  private static int zzUnpackAttribute(String packed, int offset, int [] result) {
    int i = 0;       /* index in packed string  */
    int j = offset;  /* index in unpacked array */
    int l = packed.length();
    while (i < l) {
      int count = packed.charAt(i++);
      int value = packed.charAt(i++);
      do result[j++] = value; while (--count > 0);
    }
    return j;
  }

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

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

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

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

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

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

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

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

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

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

	/** zzAtEOF == true <=> the scanner is at the EOF */
	private boolean zzAtEOF;

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

	/**
	 * The number of occupied positions in zzBuffer beyond zzEndRead.
	 * When a lead/high surrogate has been read from the input stream
	 * into the final zzBuffer position, this will have a value of 1;
	 * otherwise, it will have a value of 0.
	 */
	private int zzFinalHighSurrogate = 0;

  /* user code: */
	private final LinkedList<Object> commentList = new LinkedList<>();
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=514632
	// stores nested HEREDOC and NOWDOC ids
	private final Stack<String> heredocIds = new Stack<>();
	private boolean asp_tags = false;
	private boolean short_tags_allowed = true;
	// XXX: "heredocIds" and "stack" are never reset
	private final StateStack stack = new StateStack();
	protected int commentStartPosition;
	protected String lastHeredocIndentation;

	private AST ast;

	public void setAST(AST ast) {
		this.ast = ast;
	}

	@Override
	public PHPVersion getPHPVersion() {
		return PHPVersion.PHP7_4;
	}

	@Override
	public void setInScriptingState() {
		yybegin(ST_IN_SCRIPTING);
	}

	@Override
	public void resetCommentList() {
		commentList.clear();
	}

	/**
	 * Will only be filled when ast != null
	 */
	@Override
	public LinkedList<Object> getCommentList() {
		return commentList;
	}

	/**
	 * Will only be added when ast != null
	 */
	protected void addComment(int type) {
		if (ast != null) {
			int leftPosition = getTokenStartPosition();
			Comment comment = new Comment(commentStartPosition, leftPosition + getTokenLength(), ast, type);
			commentList.add(comment);
		}
	}

	@Override
	public void setUseAspTagsAsPHP(boolean useAspTagsAsPhp) {
		asp_tags = useAspTagsAsPhp;
	}

	@Override
	public void setUseShortTags(boolean useShortTags) {
		short_tags_allowed = useShortTags;
	}

	private void pushState(int state) {
		stack.pushStack(zzLexicalState);
		yybegin(state);
	}

	private void popState() {
		yybegin(stack.popStack());
	}

	@Override
	public int getCurrentLine() {
		return yyline;
	}

	protected int getTokenStartPosition() {
		return zzStartRead - _zzPushbackPos;
	}

	protected int getTokenLength() {
		return zzMarkedPos - zzStartRead;
	}

	@Override
	public int getLength() {
		return zzEndRead - _zzPushbackPos;
	}

	private void handleCommentStart() {
		commentStartPosition = getTokenStartPosition();
	}

	private void handleLineCommentEnd() {
		addComment(Comment.TYPE_SINGLE_LINE);
	}

	private void handleMultilineCommentEnd() {
		addComment(Comment.TYPE_MULTILINE);
	}

	private void handlePHPDocEnd() {
		addComment(Comment.TYPE_PHPDOC);
	}

	protected void handleVarComment() {
		addComment(Comment.TYPE_MULTILINE);
	}

	protected Symbol createFullSymbol(int symbolNumber) {
		Symbol symbol = createSymbol(symbolNumber);
		symbol.value = yytext();
		return symbol;
	}

	protected Symbol createSymbol(int symbolNumber) {
		int leftPosition = getTokenStartPosition();
		return new Symbol(symbolNumber, leftPosition, leftPosition + getTokenLength());
	}

	public int[] getParameters() {
		return new int[] { zzMarkedPos, _zzPushbackPos, zzCurrentPos,
				zzStartRead, zzEndRead, yyline, zzAtBOL ? 1 : 0,
				zzAtEOF ? 1 : 0, zzEOFDone ? 1 : 0, zzFinalHighSurrogate };
	}

	/**
	 * Parses a PHPDoc block comment. Underlying reader (zzReader) can be closed
	 * in the process (when EOF is reached).
	 *
	 * @return true when PHPDoc was parsed, false otherwise (false also implies
	 *         that underlying lexer was unavailable)
	 */
	protected boolean parsePHPDoc() {
		final IDocumentorLexer documentorLexer = getDocumentorLexer(zzReader);
		if (documentorLexer == null) {
			return false;
		}
		yypushback(zzMarkedPos - zzStartRead);
		int[] parameters = getParameters();
		documentorLexer.reset(zzReader, zzBuffer, parameters);
		Object phpDocBlock = documentorLexer.parse();
		commentList.add(phpDocBlock);
		reset(zzReader, documentorLexer.getBuffer(), documentorLexer.getParameters());
		return true;
	}

	protected IDocumentorLexer getDocumentorLexer(java.io.Reader reader) {
		return null;
	}

	/**
	 * Resets the {@code PhpAstLexer} properties to previous values, but leaves
	 * the lexical state unchanged. Be careful, method {@link #next_token()}
	 * also caches those properties using internal variables (zzCurrentPosL,
	 * zzMarkedPosL, zzBufferL, zzEndReadL) that should be accordingly resetted
	 * by the lexical rules calling
	 * {@link #reset(java.io.Reader, char[], int[])}. Also be careful that those
	 * internal variables could change from one version of JFlex to another.
	 *
	 * @param reader
	 * @param buffer
	 * @param parameters
	 */
	public void reset(java.io.Reader reader, char[] buffer, int[] parameters) {
		this.zzReader = reader;
		this.zzBuffer = buffer;
		this.zzMarkedPos = parameters[0];
		this._zzPushbackPos = parameters[1];
		this.zzCurrentPos = parameters[2];
		this.zzStartRead = parameters[3];
		this.zzEndRead = parameters[4];
		this.yyline = parameters[5];
		this.yychar = this.zzStartRead - this._zzPushbackPos;
		// XXX: never used
		this.yycolumn = 0;
		this.zzAtEOF = parameters[7] != 0;
		this.zzEOFDone = parameters[8] != 0;
		this.zzFinalHighSurrogate = parameters[9];
		// XXX: check if there's no side-effect to reset zzAtBOL
		// when zzAtEOF is false and zzMarkedPos is equal to zzStartRead.
		// One possible case would be that IDocumentorLexer#parse() matches
		// no text at all without being at EOF (i.e. the document lexer returns
		// a zero-length token), which of course would be totally broken...
		this.zzAtBOL = this.zzAtEOF ? false : (parameters[6] != 0);
	}


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

	/* The following fields are added in order to support the change in zzRefill */
	private String oldString = null;
	private boolean useOldString = false;
	private int startPos = 0;

  /**
   * Creates a new scanner
   *
   * @param   in  the java.io.Reader to read input from.
   */
  public PHPAstLexer(java.io.Reader in) {
    this.zzReader = in;
  }


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


	/**
	 * Refills the input buffer.
	 *
	 * @return      <code>false</code>, iff there was new input.
	 *
	 * @exception   java.io.IOException  if any I/O-Error occurs
	 */
	private boolean zzRefill() throws java.io.IOException {

		if (useOldString) {
			String saveOldString = oldString;
			oldString = new String(zzBuffer, startPos, zzMarkedPos - startPos);
			if (saveOldString != null) {
				oldString = saveOldString + oldString;
			}
		}

		/* first: make room (if you can) */
		if (zzStartRead > 0) {
			zzEndRead += zzFinalHighSurrogate;
			zzFinalHighSurrogate = 0;
			System.arraycopy(zzBuffer, zzStartRead,
							zzBuffer, 0,
							zzEndRead-zzStartRead);

			/* translate stored positions */
			zzEndRead-= zzStartRead;
			zzCurrentPos-= zzStartRead;
			zzMarkedPos-= zzStartRead;
			_zzPushbackPos-= zzStartRead;
			startPos = 0;
			zzStartRead = 0;
		}

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

		/* fill the buffer with new input */
		int requested = zzBuffer.length - zzEndRead;
		int numRead = zzReader.read(zzBuffer, zzEndRead, requested);

		/* not supposed to occur according to specification of java.io.Reader */
		if (numRead == 0) {
			throw new java.io.IOException("Reader returned 0 characters.");
		}
		if (numRead > 0) {
			zzEndRead += numRead;
			/* If numRead == requested, we might have requested to few chars to
			   encode a full Unicode character. We assume that a Reader would
			   otherwise never return half characters. */
			if (numRead == requested) {
				if (Character.isHighSurrogate(zzBuffer[zzEndRead - 1])) {
					--zzEndRead;
					zzFinalHighSurrogate = 1;
				}
			}
			/* potentially more input available */
			return false;
		}

		/* numRead < 0 ==> end of stream */
		return true;
	}


	/**
	 * 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 (zzCurrentPos < zzEndRead) return zzBuffer[zzCurrentPos++];

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

		/* otherwise: need to refill the buffer */

		String saveOldString = oldString;
		oldString = null;

		/* first: make room (if you can) */
		if (zzRefill()) {
			oldString = saveOldString;
			return YYEOF;
		}

		oldString = saveOldString;

		return zzBuffer[zzCurrentPos++];
	}


	/**
	 * Closes the input stream.
	 */
	public final void yyclose() throws java.io.IOException {
		zzAtEOF = true;            /* indicate end of file */
		zzEndRead = zzStartRead;  /* invalidate buffer    */

		if (zzReader != null)
			zzReader.close();
	}


	/**
	 * Resets the scanner to read from a new input stream.
	 * Does not close the old reader.
	 *
	 * All internal variables are reset, the old input stream
	 * <b>cannot</b> be reused (internal buffer is discarded and lost).
	 * Lexical state is set to <tt>ZZ_INITIAL</tt>.
	 *
	 * Internal scan buffer is resized down to its initial length, if it has grown.
	 *
	 * @param reader   the new input stream
	 */
	public final void yyreset(java.io.Reader reader) {
		zzReader = reader;
		zzAtBOL  = true;
		zzAtEOF  = false;
		zzEOFDone = false;
		zzEndRead = zzStartRead = 0;
		zzCurrentPos = zzMarkedPos = _zzPushbackPos = startPos = 0;
		zzFinalHighSurrogate = 0;
		oldString = null;
		yyline = yychar = yycolumn = 0;
		zzLexicalState = YYINITIAL;
		if (zzBuffer.length > ZZ_BUFFERSIZE)
			zzBuffer = new char[ZZ_BUFFERSIZE];
	}


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


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


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


	/**
	 * Returns the character at position <tt>pos</tt> from the
	 * matched text.
	 *
	 * It is equivalent to yytext().charAt(pos), but faster
	 *
	 * @param pos the position of the character to fetch.
	 *            A value from 0 to yylength()-1.
	 *
	 * @return the character at position pos
	 */
	public final char yycharat(int pos) {
		return zzBuffer[zzStartRead+pos];
	}


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


	/**
	 * Reports an error that occured while scanning.
	 *
	 * In a wellformed scanner (no or only correct usage of
	 * yypushback(int) and a match-all fallback rule) this method
	 * will only be called with things that "Can't Possibly Happen".
	 * If this method is called, something is seriously wrong
	 * (e.g. a JFlex bug producing a faulty scanner etc.).
	 *
	 * Usual syntax/scanner level error handling should be done
	 * in error fallback rules.
	 *
	 * @param   errorCode  the code of the errormessage to display
	 */
  private void zzScanError(int errorCode) {
		String message;
		try {
			message = ZZ_ERROR_MSG[errorCode];
		}
		catch (ArrayIndexOutOfBoundsException e) {
			message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
		}

    throw new Error(message);
	}


	/**
	 * 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()!
	 */
  public void yypushback(int number)  {
		if ( number > yylength() )
			zzScanError(ZZ_PUSHBACK_2BIG);

		zzMarkedPos -= number;
	}


	/**
	 * user method - common.sse
	 */
	private void updateStartPos() {
		updateStartPos(zzMarkedPos);
	}


	/**
	 * user method - common.sse
	 */
	private void updateStartPos(int position) {
		startPos = position;
		oldString = null;
	}


	/**
	 * user method - common.sse
	 */
	public final boolean isEOF() {
		return zzAtEOF;
	}


  /**
   * Contains user EOF-code, which will be executed exactly once,
   * when the end of file is reached
   */
  private void zzDoEOF() throws java.io.IOException {
    if (!zzEOFDone) {
      zzEOFDone = true;
      yyclose();
    }
  }


	/**
	 * 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   java.io.IOException  if any I/O-Error occurs
	 */
  public java_cup.runtime.Symbol next_token() throws java.io.IOException {
	int zzInput;
	int zzAction;

	// cached fields:
	int zzCurrentPosL;
	int zzMarkedPosL;
	int zzEndReadL = zzEndRead;
	char [] zzBufferL = zzBuffer;
	char [] zzCMapL = ZZ_CMAP;

    int [] zzTransL = ZZ_TRANS;
    int [] zzRowMapL = ZZ_ROWMAP;
    int [] zzAttrL = ZZ_ATTRIBUTE;

	while (true) {
		zzMarkedPosL = zzMarkedPos;

      boolean zzR = false;
      int zzCh;
      int zzCharCount;
      for (zzCurrentPosL = zzStartRead  ;
           zzCurrentPosL < zzMarkedPosL ;
           zzCurrentPosL += zzCharCount ) {
        zzCh = Character.codePointAt(zzBufferL, zzCurrentPosL, zzMarkedPosL);
        zzCharCount = Character.charCount(zzCh);
        switch (zzCh) {
        case '\u000B':
        case '\u000C':
        case '\u0085':
        case '\u2028':
        case '\u2029':
          yyline++;
          zzR = false;
          break;
        case '\r':
          yyline++;
          zzR = true;
          break;
        case '\n':
          if (zzR)
            zzR = false;
          else {
            yyline++;
          }
          break;
        default:
          zzR = false;
        }
      }

      if (zzR) {
        // peek one character ahead if it is \n (if we have counted one line too much)
        boolean zzPeek;
        if (zzMarkedPosL < zzEndReadL)
          zzPeek = zzBufferL[zzMarkedPosL] == '\n';
        else if (zzAtEOF)
          zzPeek = false;
        else {
          boolean eof = zzRefill();
          zzEndReadL = zzEndRead;
          zzMarkedPosL = zzMarkedPos;
          zzBufferL = zzBuffer;
          if (eof) 
            zzPeek = false;
          else 
            zzPeek = zzBufferL[zzMarkedPosL] == '\n';
        }
        if (zzPeek) yyline--;
      }
		zzAction = -1;

		zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;

      zzState = ZZ_LEXSTATE[zzLexicalState];

      // set up zzAction for empty match case:
      int zzAttributes = zzAttrL[zzState];
      if ( (zzAttributes & 1) == 1 ) {
        zzAction = zzState;
      }


		zzForAction: {
			while (true) {

          if (zzCurrentPosL < zzEndReadL) {
            zzInput = Character.codePointAt(zzBufferL, zzCurrentPosL, zzEndReadL);
            zzCurrentPosL += Character.charCount(zzInput);
          }
          else if (zzAtEOF) {
            zzInput = YYEOF;
            break zzForAction;
          }
          else {
            // store back cached positions
            zzCurrentPos  = zzCurrentPosL;
            zzMarkedPos   = zzMarkedPosL;
            boolean eof = zzRefill();
            // get translated positions and possibly new buffer
            zzCurrentPosL  = zzCurrentPos;
            zzMarkedPosL   = zzMarkedPos;
            zzBufferL      = zzBuffer;
            zzEndReadL     = zzEndRead;
            if (eof) {
              zzInput = YYEOF;
              break zzForAction;
            }
            else {
              zzInput = Character.codePointAt(zzBufferL, zzCurrentPosL, zzEndReadL);
              zzCurrentPosL += Character.charCount(zzInput);
            }
          }
          int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];
          if (zzNext == -1) break zzForAction;
          zzState = zzNext;

          zzAttributes = zzAttrL[zzState];
          if ( (zzAttributes & 1) == 1 ) {
				zzAction = zzState;
				zzMarkedPosL = zzCurrentPosL;
            if ( (zzAttributes & 8) == 8 ) break zzForAction;
				}

			}
		}

			// store back cached position
			zzMarkedPos = zzMarkedPosL;

			if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
				zzAtEOF = true;
            zzDoEOF();
          { 	return createSymbol(sym.EOF);
 }
			}
			else {
        switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
          case 1: 
            { return createFullSymbol(ParserConstants.T_ENCAPSED_AND_WHITESPACE);
            }
          case 202: break;
          case 2: 
            { return createSymbol(ParserConstants.T_INLINE_HTML);
            }
          case 203: break;
          case 3: 
            { // do nothing
            }
          case 204: break;
          case 4: 
            { return createFullSymbol(ParserConstants.T_LNUMBER);
            }
          case 205: break;
          case 5: 
            { return createFullSymbol(ParserConstants.T_STRING);
            }
          case 206: break;
          case 6: 
            { return createSymbol(ParserConstants.T_NEKUDA);
            }
          case 207: break;
          case 7: 
            { return createSymbol(ParserConstants.T_PLUS);
            }
          case 208: break;
          case 8: 
            { 
            }
          case 209: break;
          case 9: 
            { return createSymbol(ParserConstants.T_DOLLAR);
            }
          case 210: break;
          case 10: 
            { yybegin(ST_DOUBLE_QUOTES);
	return createSymbol(ParserConstants.T_QUATE);
            }
          case 211: break;
          case 11: 
            { return createSymbol(ParserConstants.T_NS_SEPARATOR);
            }
          case 212: break;
          case 12: 
            { yybegin(ST_BACKQUOTE);
	return createSymbol(ParserConstants.T_BACKQUATE);
            }
          case 213: break;
          case 13: 
            { pushState(ST_IN_SCRIPTING);
	return createSymbol(ParserConstants.T_CURLY_OPEN);
            }
          case 214: break;
          case 14: 
            { return createSymbol(ParserConstants.T_MINUS);
            }
          case 215: break;
          case 15: 
            { return createSymbol(ParserConstants.T_LGREATER);
            }
          case 216: break;
          case 16: 
            { return createSymbol(ParserConstants.T_NEKUDOTAIM);
            }
          case 217: break;
          case 17: 
            { return createSymbol(ParserConstants.T_OPEN_PARENTHESE);
            }
          case 218: break;
          case 18: 
            { return createSymbol(ParserConstants.T_CLOSE_PARENTHESE);
            }
          case 219: break;
          case 19: 
            { return createSymbol(ParserConstants.T_EQUAL);
            }
          case 220: break;
          case 20: 
            { return createSymbol(ParserConstants.T_NOT);
            }
          case 221: break;
          case 21: 
            { return createSymbol(ParserConstants.T_RGREATER);
            }
          case 222: break;
          case 22: 
            { return createSymbol(ParserConstants.T_TIMES);
            }
          case 223: break;
          case 23: 
            { return createSymbol(ParserConstants.T_DIV);
            }
          case 224: break;
          case 24: 
            { return createSymbol(ParserConstants.T_PRECENT);
            }
          case 225: break;
          case 25: 
            { return createSymbol(ParserConstants.T_REFERENCE);
            }
          case 226: break;
          case 26: 
            { return createSymbol(ParserConstants.T_OR);
            }
          case 227: break;
          case 27: 
            { return createSymbol(ParserConstants.T_KOVA);
            }
          case 228: break;
          case 28: 
            { return createSymbol(ParserConstants.T_QUESTION_MARK);
            }
          case 229: break;
          case 29: 
            { return createSymbol(ParserConstants.T_SEMICOLON);
            }
          case 230: break;
          case 30: 
            { return createSymbol(ParserConstants.T_COMMA);
            }
          case 231: break;
          case 31: 
            { return createSymbol(ParserConstants.T_OPEN_RECT);
            }
          case 232: break;
          case 32: 
            { return createSymbol(ParserConstants.T_CLOSE_RECT);
            }
          case 233: break;
          case 33: 
            { return createSymbol(ParserConstants.T_TILDA);
            }
          case 234: break;
          case 34: 
            { return createSymbol(ParserConstants.T_AT);
            }
          case 235: break;
          case 35: 
            { if (!stack.isEmpty()) {
		popState();
	}
	return createSymbol(ParserConstants.T_CURLY_CLOSE);
            }
          case 236: break;
          case 36: 
            { yybegin(ST_SINGLE_QUOTE);
	return createSymbol(ParserConstants.T_SINGLE_QUATE);
            }
          case 237: break;
          case 37: 
            { handleCommentStart();
	yybegin(ST_ONE_LINE_COMMENT);
	// yymore();
            }
          case 238: break;
          case 38: 
            { yybegin(ST_IN_SCRIPTING);
	return createSymbol(ParserConstants.T_QUATE);
            }
          case 239: break;
          case 39: 
            { return createSymbol(ParserConstants.T_ENCAPSED_AND_WHITESPACE);
            }
          case 240: break;
          case 40: 
            { yybegin(ST_IN_SCRIPTING);
	return createSymbol(ParserConstants.T_SINGLE_QUATE);
            }
          case 241: break;
          case 41: 
            { yybegin(ST_IN_SCRIPTING);
	return createSymbol(ParserConstants.T_BACKQUATE);
            }
          case 242: break;
          case 42: 
            { yypushback(1);
	yybegin(ST_HEREDOC);
            }
          case 243: break;
          case 43: 
            { String yytext = yytext();
	int textLength = yytext.length();
	String heredoc = heredocIds.peek();
	int heredocLength = heredoc.length();
	if (textLength > heredocLength && yytext.substring(textLength - heredocLength, textLength).equals(heredoc)) {
		char c = yytext.charAt(textLength - heredocLength - 1);
		if (c == ' ' || c == '\t') {
			lastHeredocIndentation = yytext.substring(0, textLength - heredocLength);
			// we need to remove the closing label from the symbol value
			yypushback(heredocLength);
			yybegin(ST_END_HEREDOC);
			return createFullSymbol(ParserConstants.T_ENCAPSED_AND_WHITESPACE);
		}
	}
	if (textLength == heredocLength && yytext.equals(heredoc)) {
		lastHeredocIndentation = ""; //$NON-NLS-1$
		heredocIds.pop();
		yybegin(ST_IN_SCRIPTING);
		return createFullSymbol(ParserConstants.T_END_HEREDOC);
	}
	yybegin(ST_HEREDOC);
            }
          case 244: break;
          case 44: 
            { yypushback(1);
	yybegin(ST_NOWDOC);
            }
          case 245: break;
          case 45: 
            { String yytext = yytext();
	int textLength = yytext.length();
	String nowdoc = heredocIds.peek();
	int nowdocLength = nowdoc.length();
	if (textLength > nowdocLength && yytext.substring(textLength - nowdocLength, textLength).equals(nowdoc)) {
		char c = yytext.charAt(textLength - nowdocLength - 1);
		if (c == ' ' || c == '\t') {
			lastHeredocIndentation = yytext.substring(0, textLength - nowdocLength);
			// we need to remove the closing label from the symbol value
			yypushback(nowdocLength);
			yybegin(ST_END_HEREDOC);
			return createFullSymbol(ParserConstants.T_ENCAPSED_AND_WHITESPACE);
		}
	}
	if (textLength == nowdocLength && yytext.equals(nowdoc)) {
		lastHeredocIndentation = ""; //$NON-NLS-1$
		heredocIds.pop();
		yybegin(ST_IN_SCRIPTING);
		return createFullSymbol(ParserConstants.T_END_HEREDOC);
	}
	yybegin(ST_NOWDOC);
            }
          case 246: break;
          case 46: 
            { heredocIds.pop();
	yybegin(ST_IN_SCRIPTING);
	return createFullSymbol(ParserConstants.T_END_HEREDOC);
            }
          case 247: break;
          case 47: 
            { yypushback(1);
	popState();
            }
          case 248: break;
          case 48: 
            { popState();
	return createFullSymbol(ParserConstants.T_STRING);
            }
          case 249: break;
          case 49: 
            { yypushback(1);
	yybegin(ST_IN_SCRIPTING);
            }
          case 250: break;
          case 50: 
            { yybegin(ST_IN_SCRIPTING);
	return createFullSymbol(ParserConstants.T_STRING_VARNAME);
            }
          case 251: break;
          case 51: 
            { /* treat numbers (almost) as strings inside encapsulated strings */
	return createFullSymbol(ParserConstants.T_NUM_STRING);
            }
          case 252: break;
          case 52: 
            { yypushback(1);
	popState();
	return createSymbol(ParserConstants.T_ENCAPSED_AND_WHITESPACE);
            }
          case 253: break;
          case 53: 
            { return createSymbol(ParserConstants.T_QUATE);
            }
          case 254: break;
          case 54: 
            { return createSymbol(ParserConstants.T_BACKQUATE);
            }
          case 255: break;
          case 55: 
            { return createSymbol(ParserConstants.T_CURLY_OPEN);
            }
          case 256: break;
          case 56: 
            { popState();
	return createSymbol(ParserConstants.T_CLOSE_RECT);
            }
          case 257: break;
          case 57: 
            { return createSymbol(ParserConstants.T_CURLY_CLOSE);
            }
          case 258: break;
          case 58: 
            { // yymore();
            }
          case 259: break;
          case 59: 
            { String yytext = yytext();
	switch (yytext.charAt(yytext.length() - 1)) {
		case '?':
		case '%':
		case '>':
			yypushback(1);
			break;
		default:
			handleLineCommentEnd();
			yybegin(ST_IN_SCRIPTING);
	}
	// yymore();
            }
          case 260: break;
          case 60: 
            { if (asp_tags) {
		yybegin(ST_IN_SCRIPTING);
		//return T_OPEN_TAG;
	} else {
		return createSymbol(ParserConstants.T_INLINE_HTML);
	}
            }
          case 261: break;
          case 61: 
            { if (short_tags_allowed) {
		yybegin(ST_IN_SCRIPTING);
		//return T_OPEN_TAG;
	} else {
		return createSymbol(ParserConstants.T_INLINE_HTML);
	}
            }
          case 262: break;
          case 62: 
            { return createFullSymbol(ParserConstants.T_DNUMBER);
            }
          case 263: break;
          case 63: 
            { return createSymbol(ParserConstants.T_CONCAT_EQUAL);
            }
          case 264: break;
          case 64: 
            { return createSymbol(ParserConstants.T_INC);
            }
          case 265: break;
          case 65: 
            { return createSymbol(ParserConstants.T_PLUS_EQUAL);
            }
          case 266: break;
          case 66: 
            { return createFullSymbol(ParserConstants.T_AS);
            }
          case 267: break;
          case 67: 
            { return createFullSymbol(ParserConstants.T_VARIABLE);
            }
          case 268: break;
          case 68: 
            { return createFullSymbol(ParserConstants.T_CONSTANT_ENCAPSED_STRING);
            }
          case 269: break;
          case 69: 
            { return createFullSymbol(ParserConstants.T_IF);
            }
          case 270: break;
          case 70: 
            { return createFullSymbol(ParserConstants.T_DO);
            }
          case 271: break;
          case 71: 
            { return createFullSymbol(ParserConstants.T_FN);
            }
          case 272: break;
          case 72: 
            { return createFullSymbol(ParserConstants.T_LOGICAL_OR);
            }
          case 273: break;
          case 73: 
            { return createSymbol(ParserConstants.T_DEC);
            }
          case 274: break;
          case 74: 
            { pushState(ST_LOOKING_FOR_PROPERTY);
	return createSymbol(ParserConstants.T_OBJECT_OPERATOR);
            }
          case 275: break;
          case 75: 
            { return createSymbol(ParserConstants.T_MINUS_EQUAL);
            }
          case 276: break;
          case 76: 
            { return createSymbol(ParserConstants.T_SR);
            }
          case 277: break;
          case 77: 
            { return createSymbol(ParserConstants.T_IS_GREATER_OR_EQUAL);
            }
          case 278: break;
          case 78: 
            { return createSymbol(ParserConstants.T_PAAMAYIM_NEKUDOTAYIM);
            }
          case 279: break;
          case 79: 
            { return createSymbol(ParserConstants.T_DOUBLE_ARROW);
            }
          case 280: break;
          case 80: 
            { return createSymbol(ParserConstants.T_IS_EQUAL);
            }
          case 281: break;
          case 81: 
            { return createSymbol(ParserConstants.T_IS_NOT_EQUAL);
            }
          case 282: break;
          case 82: 
            { return createSymbol(ParserConstants.T_IS_SMALLER_OR_EQUAL);
            }
          case 283: break;
          case 83: 
            { return createSymbol(ParserConstants.T_SL);
            }
          case 284: break;
          case 84: 
            { return createSymbol(ParserConstants.T_MUL_EQUAL);
            }
          case 285: break;
          case 85: 
            { return createSymbol(ParserConstants.T_POW);
            }
          case 286: break;
          case 86: 
            { return createSymbol(ParserConstants.T_DIV_EQUAL);
            }
          case 287: break;
          case 87: 
            { handleCommentStart();
	yybegin(ST_COMMENT);
            }
          case 288: break;
          case 88: 
            { if (asp_tags) {
		yybegin(YYINITIAL);
		return createSymbol(ParserConstants.T_SEMICOLON); /* implicit ';' at php-end tag */
	} else {
		return createSymbol(ParserConstants.T_INLINE_HTML);
	}
            }
          case 289: break;
          case 89: 
            { return createSymbol(ParserConstants.T_MOD_EQUAL);
            }
          case 290: break;
          case 90: 
            { return createSymbol(ParserConstants.T_AND_EQUAL);
            }
          case 291: break;
          case 91: 
            { return createSymbol(ParserConstants.T_BOOLEAN_AND);
            }
          case 292: break;
          case 92: 
            { return createSymbol(ParserConstants.T_OR_EQUAL);
            }
          case 293: break;
          case 93: 
            { return createSymbol(ParserConstants.T_BOOLEAN_OR);
            }
          case 294: break;
          case 94: 
            { return createSymbol(ParserConstants.T_XOR_EQUAL);
            }
          case 295: break;
          case 95: 
            { yybegin(YYINITIAL);
	return createSymbol(ParserConstants.T_SEMICOLON); /* implicit ';' at php-end tag */
            }
          case 296: break;
          case 96: 
            { return createSymbol(ParserConstants.T_COALESCE);
            }
          case 297: break;
          case 97: 
            { yypushback(1);
	return createFullSymbol(ParserConstants.T_ENCAPSED_AND_WHITESPACE);
            }
          case 298: break;
          case 98: 
            { pushState(ST_LOOKING_FOR_VARNAME);
	return createSymbol(ParserConstants.T_DOLLAR_OPEN_CURLY_BRACES);
            }
          case 299: break;
          case 99: 
            { pushState(ST_IN_SCRIPTING);
	yypushback(yylength() - 1);
	return createSymbol(ParserConstants.T_CURLY_OPEN_WITH_DOLAR);
            }
          case 300: break;
          case 100: 
            { return createSymbol(ParserConstants.T_CHARACTER);
            }
          case 301: break;
          case 101: 
            { String yytext = yytext();
	int textLength = yytext.length();
	String heredoc = heredocIds.peek();
	int heredocLength = heredoc.length();
	if (textLength > heredocLength && yytext.substring(textLength - heredocLength, textLength).equals(heredoc)) {
		int pos = textLength - heredocLength - 1;
		char c = yytext.charAt(pos);
		if (c == ' ' || c == '\t') {
			while (pos > 0) {
				char c2 = yytext.charAt(pos - 1);
				if (c2 != ' ' && c2 != '\t') {
					break;
				}
				pos--;
			}
			lastHeredocIndentation = yytext.substring(pos, textLength - heredocLength);
			// we need to remove the closing label from the symbol value
			yypushback(heredocLength);
			yybegin(ST_END_HEREDOC);
			return createFullSymbol(ParserConstants.T_ENCAPSED_AND_WHITESPACE);
		} else if (c == '\n' || c == '\r') {
			lastHeredocIndentation = ""; //$NON-NLS-1$
			// we need to remove the closing label from the symbol value
			yypushback(heredocLength);
			yybegin(ST_END_HEREDOC);
			return createFullSymbol(ParserConstants.T_ENCAPSED_AND_WHITESPACE);
		}
	}
            }
          case 302: break;
          case 102: 
            { String yytext = yytext();
	int textLength = yytext.length();
	String nowdoc = heredocIds.peek();
	int nowdocLength = nowdoc.length();
	if (textLength > nowdocLength && yytext.substring(textLength - nowdocLength, textLength).equals(nowdoc)) {
		int pos = textLength - nowdocLength - 1;
		char c = yytext.charAt(pos);
		if (c == ' ' || c == '\t') {
			while (pos > 0) {
				char c2 = yytext.charAt(pos - 1);
				if (c2 != ' ' && c2 != '\t') {
					break;
				}
				pos--;
			}
			lastHeredocIndentation = yytext.substring(pos, textLength - nowdocLength);
			// we need to remove the closing label from the symbol value
			yypushback(nowdocLength);
			yybegin(ST_END_HEREDOC);
			return createFullSymbol(ParserConstants.T_ENCAPSED_AND_WHITESPACE);
		} else if (c == '\n' || c == '\r') {
			lastHeredocIndentation = ""; //$NON-NLS-1$
			// we need to remove the closing label from the symbol value
			yypushback(nowdocLength);
			yybegin(ST_END_HEREDOC);
			return createFullSymbol(ParserConstants.T_ENCAPSED_AND_WHITESPACE);
		}
	}
            }
          case 303: break;
          case 103: 
            { return createSymbol(ParserConstants.T_OBJECT_OPERATOR);
            }
          case 304: break;
          case 104: 
            { handleMultilineCommentEnd();
	yybegin(ST_IN_SCRIPTING);
            }
          case 305: break;
          case 105: 
            { handlePHPDocEnd();
	yybegin(ST_IN_SCRIPTING);
            }
          case 306: break;
          case 106: 
            { if (asp_tags || yytext().charAt(0) != '%') { /* asp comment? */
		handleLineCommentEnd();
		yypushback(yylength());
		yybegin(ST_IN_SCRIPTING);
	}
            }
          case 307: break;
          case 107: 
            { String yytext = yytext();
	if ((yytext.charAt(1) == '%' && asp_tags)
		|| (yytext.charAt(1) == '?')) {
		yybegin(ST_IN_SCRIPTING);
		return createSymbol(ParserConstants.T_OPEN_TAG_WITH_ECHO);
	} else {
		return createSymbol(ParserConstants.T_INLINE_HTML);
	}
            }
          case 308: break;
          case 108: 
            { return createSymbol(ParserConstants.T_ELLIPSIS);
            }
          case 309: break;
          case 109: 
            { return createFullSymbol(ParserConstants.T_BNUMBER);
            }
          case 310: break;
          case 110: 
            { return createFullSymbol(ParserConstants.T_LOGICAL_XOR);
            }
          case 311: break;
          case 111: 
            { return createFullSymbol(ParserConstants.T_LOGICAL_AND);
            }
          case 312: break;
          case 112: 
            { return createFullSymbol(ParserConstants.T_TRY);
            }
          case 313: break;
          case 113: 
            { return createFullSymbol(ParserConstants.T_EXIT);
            }
          case 314: break;
          case 114: 
            { return createFullSymbol(ParserConstants.T_FOR);
            }
          case 315: break;
          case 115: 
            { return createFullSymbol(ParserConstants.T_USE);
            }
          case 316: break;
          case 116: 
            { return createFullSymbol(ParserConstants.T_NEW);
            }
          case 317: break;
          case 117: 
            { return createSymbol(ParserConstants.T_SR_EQUAL);
            }
          case 318: break;
          case 118: 
            { return createFullSymbol(ParserConstants.T_VAR);
            }
          case 319: break;
          case 119: 
            { return createSymbol(ParserConstants.T_IS_IDENTICAL);
            }
          case 320: break;
          case 120: 
            { return createSymbol(ParserConstants.T_IS_NOT_IDENTICAL);
            }
          case 321: break;
          case 121: 
            { return createSymbol(ParserConstants.T_SPACESHIP);
            }
          case 322: break;
          case 122: 
            { return createSymbol(ParserConstants.T_SL_EQUAL);
            }
          case 323: break;
          case 123: 
            { return createSymbol(ParserConstants.T_POW_EQUAL);
            }
          case 324: break;
          case 124: 
            { if (parsePHPDoc()) {
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=316077
	// Reset the internal variables caching the values
	// previously resetted by parsePHPDoc().
	// Actually it would be enough to only reset zzEndReadL,
	// but do it cleanly...
	// Also be careful that those internal variables could
	// change from one version of JFlex to another.
	zzCurrentPosL = zzCurrentPos;
	zzMarkedPosL = zzMarkedPos;
	zzBufferL = zzBuffer;
	zzEndReadL = zzEndRead;
} else {
	handleCommentStart();
	yybegin(ST_DOCBLOCK);
}
            }
          case 325: break;
          case 125: 
            { return createSymbol(ParserConstants.T_COALESCE_EQUAL);
            }
          case 326: break;
          case 126: 
            { yypushback(1);
	pushState(ST_VAR_OFFSET);
	return createFullSymbol(ParserConstants.T_VARIABLE);
            }
          case 327: break;
          case 127: 
            { return createFullSymbol(ParserConstants.T_ECHO);
            }
          case 328: break;
          case 128: 
            { return createFullSymbol(ParserConstants.T_ELSE);
            }
          case 329: break;
          case 129: 
            { return createFullSymbol(ParserConstants.T_EVAL);
            }
          case 330: break;
          case 130: 
            { return createFullSymbol(ParserConstants.T_CASE);
            }
          case 331: break;
          case 131: 
            { return createFullSymbol(ParserConstants.T_LIST);
            }
          case 332: break;
          case 132: 
            { return createFullSymbol(ParserConstants.T_GOTO);
            }
          case 333: break;
          case 133: 
            { handleCommentStart();
	handleMultilineCommentEnd();
            }
          case 334: break;
          case 134: 
            { return createFullSymbol(ParserConstants.T_ENDIF);
            }
          case 335: break;
          case 135: 
            { return createFullSymbol(ParserConstants.T_EMPTY);
            }
          case 336: break;
          case 136: 
            { return createFullSymbol(ParserConstants.T_ARRAY);
            }
          case 337: break;
          case 137: 
            { return createFullSymbol(ParserConstants.T_BREAK);
            }
          case 338: break;
          case 138: 
            { return createFullSymbol(ParserConstants.T_ISSET);
            }
          case 339: break;
          case 139: 
            { return createFullSymbol(ParserConstants.T_TRAIT);
            }
          case 340: break;
          case 140: 
            { return createFullSymbol(ParserConstants.T_THROW);
            }
          case 341: break;
          case 141: 
            { return createFullSymbol(ParserConstants.T_FINAL);
            }
          case 342: break;
          case 142: 
            { return createFullSymbol(ParserConstants.T_UNSET);
            }
          case 343: break;
          case 143: 
            { return createFullSymbol(ParserConstants.T_CATCH);
            }
          case 344: break;
          case 144: 
            { return createFullSymbol(ParserConstants.T_CONST);
            }
          case 345: break;
          case 145: 
            { return createFullSymbol(ParserConstants.T_CLASS);
            }
          case 346: break;
          case 146: 
            { return createFullSymbol(ParserConstants.T_CLONE);
            }
          case 347: break;
          case 147: 
            { return createFullSymbol(ParserConstants.T_YIELD);
            }
          case 348: break;
          case 148: 
            { return createFullSymbol(ParserConstants.T_WHILE);
            }
          case 349: break;
          case 149: 
            { return createFullSymbol(ParserConstants.T_PRINT);
            }
          case 350: break;
          case 150: 
            { return createSymbol(ParserConstants.T_INT_CAST);
            }
          case 351: break;
          case 151: 
            { String yytext = yytext();
	int removeChars = (yytext.charAt(0) == 'b') ? 4 : 3;
	String hereOrNowDoc = yytext.substring(removeChars).trim();    // for 'b<<<' or '<<<'
	int heredoc_len = hereOrNowDoc.length();

	Symbol sym = createFullSymbol(ParserConstants.T_START_HEREDOC);
	sym.value = hereOrNowDoc;

	if (hereOrNowDoc.charAt(0) == '\'') {
		heredocIds.push(hereOrNowDoc.substring(1, heredoc_len - 1));
		yybegin(ST_START_NOWDOC);
	} else if (hereOrNowDoc.charAt(0) == '"') {
		heredocIds.push(hereOrNowDoc.substring(1, heredoc_len - 1));
		yybegin(ST_START_HEREDOC);
	} else {
		heredocIds.push(hereOrNowDoc);
		yybegin(ST_START_HEREDOC);
	}
	return sym;
            }
          case 352: break;
          case 152: 
            { yypushback(3);
	pushState(ST_LOOKING_FOR_PROPERTY);
	return createFullSymbol(ParserConstants.T_VARIABLE);
            }
          case 353: break;
          case 153: 
            { yybegin(ST_IN_SCRIPTING);
	//return T_OPEN_TAG;
            }
          case 354: break;
          case 154: 
            { return createFullSymbol(ParserConstants.T_ENDFOR);
            }
          case 355: break;
          case 155: 
            { return createFullSymbol(ParserConstants.T_ELSEIF);
            }
          case 356: break;
          case 156: 
            { /* not a keyword, used to recognize constants.*/
	return createFullSymbol(ParserConstants.T_DEFINE);
            }
          case 357: break;
          case 157: 
            { return createFullSymbol(ParserConstants.T_STATIC);
            }
          case 358: break;
          case 158: 
            { return createFullSymbol(ParserConstants.T_SWITCH);
            }
          case 359: break;
          case 159: 
            { return createFullSymbol(ParserConstants.T_RETURN);
            }
          case 360: break;
          case 160: 
            { return createFullSymbol(ParserConstants.T_GLOBAL);
            }
          case 361: break;
          case 161: 
            { return createFullSymbol(ParserConstants.T_PUBLIC);
            }
          case 362: break;
          case 162: 
            { return createSymbol(ParserConstants.T_BOOL_CAST);
            }
          case 363: break;
          case 163: 
            { return createSymbol(ParserConstants.T_DOUBLE_CAST);
            }
          case 364: break;
          case 164: 
            { return createSymbol(ParserConstants.T_DIR);
            }
          case 365: break;
          case 165: 
            { return createFullSymbol(ParserConstants.T_EXTENDS);
            }
          case 366: break;
          case 166: 
            { return createFullSymbol(ParserConstants.T_INCLUDE);
            }
          case 367: break;
          case 167: 
            { return createFullSymbol(ParserConstants.T_DEFAULT);
            }
          case 368: break;
          case 168: 
            { return createFullSymbol(ParserConstants.T_DECLARE);
            }
          case 369: break;
          case 169: 
            { return createFullSymbol(ParserConstants.T_FINALLY);
            }
          case 370: break;
          case 170: 
            { return createFullSymbol(ParserConstants.T_FOREACH);
            }
          case 371: break;
          case 171: 
            { return createFullSymbol(ParserConstants.T_REQUIRE);
            }
          case 372: break;
          case 172: 
            { return createFullSymbol(ParserConstants.T_PRIVATE);
            }
          case 373: break;
          case 173: 
            { return createSymbol(ParserConstants.T_ARRAY_CAST);
            }
          case 374: break;
          case 174: 
            { return createSymbol(ParserConstants.T_UNSET_CAST);
            }
          case 375: break;
          case 175: 
            { return createSymbol(ParserConstants.T_FILE);
            }
          case 376: break;
          case 176: 
            { return createSymbol(ParserConstants.T_LINE);
            }
          case 377: break;
          case 177: 
            { return createFullSymbol(ParserConstants.T_ENDWHILE);
            }
          case 378: break;
          case 178: 
            { return createFullSymbol(ParserConstants.T_ABSTRACT);
            }
          case 379: break;
          case 179: 
            { return createFullSymbol(ParserConstants.T_FUNCTION);
            }
          case 380: break;
          case 180: 
            { return createFullSymbol(ParserConstants.T_CALLABLE);
            }
          case 381: break;
          case 181: 
            { return createFullSymbol(ParserConstants.T_CONTINUE);
            }
          case 382: break;
          case 182: 
            { return createSymbol(ParserConstants.T_STRING_CAST);
            }
          case 383: break;
          case 183: 
            { return createSymbol(ParserConstants.T_OBJECT_CAST);
            }
          case 384: break;
          case 184: 
            { return createSymbol(ParserConstants.T_CLASS_C);
            }
          case 385: break;
          case 185: 
            { return createFullSymbol(ParserConstants.T_ENDSWITCH);
            }
          case 386: break;
          case 186: 
            { return createFullSymbol(ParserConstants.T_INTERFACE);
            }
          case 387: break;
          case 187: 
            { return createFullSymbol(ParserConstants.T_INSTEADOF);
            }
          case 388: break;
          case 188: 
            { return createFullSymbol(ParserConstants.T_NAMESPACE);
            }
          case 389: break;
          case 189: 
            { return createFullSymbol(ParserConstants.T_PROTECTED);
            }
          case 390: break;
          case 190: 
            { return createSymbol(ParserConstants.T_METHOD_C);
            }
          case 391: break;
          case 191: 
            { return createFullSymbol(ParserConstants.T_ENDDECLARE);
            }
          case 392: break;
          case 192: 
            { return createFullSymbol(ParserConstants.T_ENDFOREACH);
            }
          case 393: break;
          case 193: 
            { return createFullSymbol(ParserConstants.T_INSTANCEOF);
            }
          case 394: break;
          case 194: 
            { return createFullSymbol(ParserConstants.T_IMPLEMENTS);
            }
          case 395: break;
          case 195: 
            { return createSymbol(ParserConstants.T_YIELD_FROM);
            }
          case 396: break;
          case 196: 
            { return createSymbol(ParserConstants.T_FUNC_C);
            }
          case 397: break;
          case 197: 
            { return createFullSymbol(ParserConstants.T_INCLUDE_ONCE);
            }
          case 398: break;
          case 198: 
            { return createFullSymbol(ParserConstants.T_REQUIRE_ONCE);
            }
          case 399: break;
          case 199: 
            { return createSymbol(ParserConstants.T_NS_C);
            }
          case 400: break;
          case 200: 
            { handleCommentStart();
	handleVarComment();
	//return createFullSymbol(ParserConstants.T_VAR_COMMENT);
            }
          case 401: break;
          case 201: 
            { return createSymbol(ParserConstants.T_HALT_COMPILER);
            }
          case 402: break;
		default:
            zzScanError(ZZ_NO_MATCH);
				}
			}
		}
	}

  /**
   * Runs the scanner on input files.
   *
   * This is a standalone scanner, it will print any unmatched
   * text to System.out unchanged.
   *
   * @param argv   the command line, contains the filenames to run
   *               the scanner on.
   */
  public static void main(String argv[]) {
    if (argv.length == 0) {
      System.out.println("Usage : java PHPAstLexer [ --encoding <name> ] <inputfile(s)>");
    }
    else {
      int firstFilePos = 0;
      String encodingName = "UTF-8";
      if (argv[0].equals("--encoding")) {
        firstFilePos = 2;
        encodingName = argv[1];
        try {
          java.nio.charset.Charset.forName(encodingName); // Side-effect: is encodingName valid? 
        } catch (Exception e) {
          System.out.println("Invalid encoding '" + encodingName + "'");
          return;
        }
      }
      for (int i = firstFilePos; i < argv.length; i++) {
        PHPAstLexer scanner = null;
        try {
          java.io.FileInputStream stream = new java.io.FileInputStream(argv[i]);
          java.io.Reader reader = new java.io.InputStreamReader(stream, encodingName);
          scanner = new PHPAstLexer(reader);
          while ( !scanner.zzAtEOF ) scanner.next_token();
        }
        catch (java.io.FileNotFoundException e) {
          System.out.println("File not found : \""+argv[i]+"\"");
        }
        catch (java.io.IOException e) {
          System.out.println("IO error scanning file \""+argv[i]+"\"");
          System.out.println(e);
        }
        catch (Exception e) {
          System.out.println("Unexpected exception:");
          e.printStackTrace();
        }
      }
    }
  }


}
