/* Generated By:JavaCC: Do not edit this line. FilterParserTokenManager.java */
package org.apache.sling.resource.filter.impl;
import java.util.ArrayList;
import java.util.List;
import org.apache.sling.resource.filter.impl.node.*;

/** Token Manager. */
public class FilterParserTokenManager implements FilterParserConstants
{

  /** Debug output. */
  public  java.io.PrintStream debugStream = System.out;
  /** Set debug output. */
  public  void setDebugStream(java.io.PrintStream ds) { debugStream = ds; }
private final int jjStopStringLiteralDfa_0(int pos, long active0)
{
   switch (pos)
   {
      case 0:
         if ((active0 & 0x200000000L) != 0L)
         {
            jjmatchedKind = 32;
            return -1;
         }
         if ((active0 & 0x10000000000L) != 0L)
         {
            jjmatchedKind = 43;
            return 168;
         }
         if ((active0 & 0xf000000000L) != 0L)
         {
            jjmatchedKind = 43;
            return 60;
         }
         if ((active0 & 0x4L) != 0L)
            return 60;
         if ((active0 & 0x80000000L) != 0L)
         {
            jjmatchedKind = 30;
            return -1;
         }
         if ((active0 & 0x20000800000L) != 0L)
         {
            jjmatchedKind = 43;
            return 58;
         }
         return -1;
      case 1:
         if ((active0 & 0x200000000L) != 0L)
         {
            if (jjmatchedPos == 0)
            {
               jjmatchedKind = 32;
               jjmatchedPos = 0;
            }
            return -1;
         }
         if ((active0 & 0x20000000000L) != 0L)
         {
            jjmatchedKind = 43;
            jjmatchedPos = 1;
            return 57;
         }
         if ((active0 & 0x10000000000L) != 0L)
            return 60;
         if ((active0 & 0x80000000L) != 0L)
         {
            if (jjmatchedPos == 0)
            {
               jjmatchedKind = 30;
               jjmatchedPos = 0;
            }
            return -1;
         }
         if ((active0 & 0xf000800000L) != 0L)
         {
            jjmatchedKind = 43;
            jjmatchedPos = 1;
            return 60;
         }
         return -1;
      case 2:
         if ((active0 & 0x20000000000L) != 0L)
         {
            jjmatchedKind = 43;
            jjmatchedPos = 2;
            return 56;
         }
         if ((active0 & 0xf000800000L) != 0L)
         {
            jjmatchedKind = 43;
            jjmatchedPos = 2;
            return 60;
         }
         return -1;
      case 3:
         if ((active0 & 0xf000000000L) != 0L)
         {
            jjmatchedKind = 43;
            jjmatchedPos = 3;
            return 60;
         }
         if ((active0 & 0x800000L) != 0L)
            return 60;
         if ((active0 & 0x20000000000L) != 0L)
         {
            if (jjmatchedPos < 2)
            {
               jjmatchedKind = 43;
               jjmatchedPos = 2;
            }
            return 55;
         }
         return -1;
      case 4:
         if ((active0 & 0xf000000000L) != 0L)
         {
            jjmatchedKind = 43;
            jjmatchedPos = 4;
            return 60;
         }
         if ((active0 & 0x20000000000L) != 0L)
         {
            if (jjmatchedPos < 2)
            {
               jjmatchedKind = 43;
               jjmatchedPos = 2;
            }
            return -1;
         }
         return -1;
      case 5:
         if ((active0 & 0x20000000000L) != 0L)
         {
            if (jjmatchedPos < 2)
            {
               jjmatchedKind = 43;
               jjmatchedPos = 2;
            }
            return -1;
         }
         if ((active0 & 0xf000000000L) != 0L)
         {
            jjmatchedKind = 43;
            jjmatchedPos = 5;
            return 60;
         }
         return -1;
      case 6:
         if ((active0 & 0xf000000000L) != 0L)
         {
            jjmatchedKind = 43;
            jjmatchedPos = 6;
            return 60;
         }
         return -1;
      case 7:
         if ((active0 & 0xf000000000L) != 0L)
            return 60;
         return -1;
      default :
         return -1;
   }
}
private final int jjStartNfa_0(int pos, long active0)
{
   return jjMoveNfa_0(jjStopStringLiteralDfa_0(pos, active0), pos + 1);
}
private int jjStopAtPos(int pos, int kind)
{
   jjmatchedKind = kind;
   jjmatchedPos = pos;
   return pos + 1;
}
private int jjMoveStringLiteralDfa0_0()
{
   switch(curChar)
   {
      case 9:
         return jjStartNfaWithStates_0(0, 2, 60);
      case 36:
         return jjStopAtPos(0, 42);
      case 40:
         return jjStopAtPos(0, 24);
      case 41:
         return jjStopAtPos(0, 25);
      case 44:
         return jjStopAtPos(0, 26);
      case 60:
         return jjMoveStringLiteralDfa1_0(0x200000000L);
      case 62:
         return jjMoveStringLiteralDfa1_0(0x80000000L);
      case 99:
         return jjMoveStringLiteralDfa1_0(0xf000000000L);
      case 105:
         return jjMoveStringLiteralDfa1_0(0x10000000000L);
      case 110:
         return jjMoveStringLiteralDfa1_0(0x20000800000L);
      default :
         return jjMoveNfa_0(0, 0);
   }
}
private int jjMoveStringLiteralDfa1_0(long active0)
{
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) {
      jjStopStringLiteralDfa_0(0, active0);
      return 1;
   }
   switch(curChar)
   {
      case 61:
         if ((active0 & 0x80000000L) != 0L)
            return jjStopAtPos(1, 31);
         else if ((active0 & 0x200000000L) != 0L)
            return jjStopAtPos(1, 33);
         break;
      case 110:
         if ((active0 & 0x10000000000L) != 0L)
            return jjStartNfaWithStates_0(1, 40, 60);
         break;
      case 111:
         return jjMoveStringLiteralDfa2_0(active0, 0x2f000000000L);
      case 117:
         return jjMoveStringLiteralDfa2_0(active0, 0x800000L);
      default :
         break;
   }
   return jjStartNfa_0(0, active0);
}
private int jjMoveStringLiteralDfa2_0(long old0, long active0)
{
   if (((active0 &= old0)) == 0L)
      return jjStartNfa_0(0, old0);
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) {
      jjStopStringLiteralDfa_0(1, active0);
      return 2;
   }
   switch(curChar)
   {
      case 108:
         return jjMoveStringLiteralDfa3_0(active0, 0x800000L);
      case 110:
         return jjMoveStringLiteralDfa3_0(active0, 0xf000000000L);
      case 116:
         return jjMoveStringLiteralDfa3_0(active0, 0x20000000000L);
      default :
         break;
   }
   return jjStartNfa_0(1, active0);
}
private int jjMoveStringLiteralDfa3_0(long old0, long active0)
{
   if (((active0 &= old0)) == 0L)
      return jjStartNfa_0(1, old0);
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) {
      jjStopStringLiteralDfa_0(2, active0);
      return 3;
   }
   switch(curChar)
   {
      case 32:
         return jjMoveStringLiteralDfa4_0(active0, 0x20000000000L);
      case 108:
         if ((active0 & 0x800000L) != 0L)
            return jjStartNfaWithStates_0(3, 23, 60);
         break;
      case 116:
         return jjMoveStringLiteralDfa4_0(active0, 0xf000000000L);
      default :
         break;
   }
   return jjStartNfa_0(2, active0);
}
private int jjMoveStringLiteralDfa4_0(long old0, long active0)
{
   if (((active0 &= old0)) == 0L)
      return jjStartNfa_0(2, old0);
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) {
      jjStopStringLiteralDfa_0(3, active0);
      return 4;
   }
   switch(curChar)
   {
      case 97:
         return jjMoveStringLiteralDfa5_0(active0, 0xf000000000L);
      case 105:
         return jjMoveStringLiteralDfa5_0(active0, 0x20000000000L);
      default :
         break;
   }
   return jjStartNfa_0(3, active0);
}
private int jjMoveStringLiteralDfa5_0(long old0, long active0)
{
   if (((active0 &= old0)) == 0L)
      return jjStartNfa_0(3, old0);
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) {
      jjStopStringLiteralDfa_0(4, active0);
      return 5;
   }
   switch(curChar)
   {
      case 105:
         return jjMoveStringLiteralDfa6_0(active0, 0xf000000000L);
      case 110:
         if ((active0 & 0x20000000000L) != 0L)
            return jjStopAtPos(5, 41);
         break;
      default :
         break;
   }
   return jjStartNfa_0(4, active0);
}
private int jjMoveStringLiteralDfa6_0(long old0, long active0)
{
   if (((active0 &= old0)) == 0L)
      return jjStartNfa_0(4, old0);
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) {
      jjStopStringLiteralDfa_0(5, active0);
      return 6;
   }
   switch(curChar)
   {
      case 110:
         return jjMoveStringLiteralDfa7_0(active0, 0xf000000000L);
      default :
         break;
   }
   return jjStartNfa_0(5, active0);
}
private int jjMoveStringLiteralDfa7_0(long old0, long active0)
{
   if (((active0 &= old0)) == 0L)
      return jjStartNfa_0(5, old0);
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) {
      jjStopStringLiteralDfa_0(6, active0);
      return 7;
   }
   switch(curChar)
   {
      case 115:
         if ((active0 & 0x1000000000L) != 0L)
         {
            jjmatchedKind = 36;
            jjmatchedPos = 7;
         }
         return jjMoveStringLiteralDfa8_0(active0, 0xe000000000L);
      default :
         break;
   }
   return jjStartNfa_0(6, active0);
}
private int jjMoveStringLiteralDfa8_0(long old0, long active0)
{
   if (((active0 &= old0)) == 0L)
      return jjStartNfa_0(6, old0);
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) {
      jjStopStringLiteralDfa_0(7, active0);
      return 8;
   }
   switch(curChar)
   {
      case 32:
         return jjMoveStringLiteralDfa9_0(active0, 0xe000000000L);
      default :
         break;
   }
   return jjStartNfa_0(7, active0);
}
private int jjMoveStringLiteralDfa9_0(long old0, long active0)
{
   if (((active0 &= old0)) == 0L)
      return jjStartNfa_0(7, old0);
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) {
      jjStopStringLiteralDfa_0(8, active0);
      return 9;
   }
   switch(curChar)
   {
      case 97:
         return jjMoveStringLiteralDfa10_0(active0, 0x4000000000L);
      case 110:
         return jjMoveStringLiteralDfa10_0(active0, 0xa000000000L);
      default :
         break;
   }
   return jjStartNfa_0(8, active0);
}
private int jjMoveStringLiteralDfa10_0(long old0, long active0)
{
   if (((active0 &= old0)) == 0L)
      return jjStartNfa_0(8, old0);
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) {
      jjStopStringLiteralDfa_0(9, active0);
      return 10;
   }
   switch(curChar)
   {
      case 110:
         return jjMoveStringLiteralDfa11_0(active0, 0x4000000000L);
      case 111:
         return jjMoveStringLiteralDfa11_0(active0, 0xa000000000L);
      default :
         break;
   }
   return jjStartNfa_0(9, active0);
}
private int jjMoveStringLiteralDfa11_0(long old0, long active0)
{
   if (((active0 &= old0)) == 0L)
      return jjStartNfa_0(9, old0);
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) {
      jjStopStringLiteralDfa_0(10, active0);
      return 11;
   }
   switch(curChar)
   {
      case 116:
         if ((active0 & 0x2000000000L) != 0L)
         {
            jjmatchedKind = 37;
            jjmatchedPos = 11;
         }
         return jjMoveStringLiteralDfa12_0(active0, 0x8000000000L);
      case 121:
         if ((active0 & 0x4000000000L) != 0L)
            return jjStopAtPos(11, 38);
         break;
      default :
         break;
   }
   return jjStartNfa_0(10, active0);
}
private int jjMoveStringLiteralDfa12_0(long old0, long active0)
{
   if (((active0 &= old0)) == 0L)
      return jjStartNfa_0(10, old0);
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) {
      jjStopStringLiteralDfa_0(11, active0);
      return 12;
   }
   switch(curChar)
   {
      case 32:
         return jjMoveStringLiteralDfa13_0(active0, 0x8000000000L);
      default :
         break;
   }
   return jjStartNfa_0(11, active0);
}
private int jjMoveStringLiteralDfa13_0(long old0, long active0)
{
   if (((active0 &= old0)) == 0L)
      return jjStartNfa_0(11, old0);
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) {
      jjStopStringLiteralDfa_0(12, active0);
      return 13;
   }
   switch(curChar)
   {
      case 97:
         return jjMoveStringLiteralDfa14_0(active0, 0x8000000000L);
      default :
         break;
   }
   return jjStartNfa_0(12, active0);
}
private int jjMoveStringLiteralDfa14_0(long old0, long active0)
{
   if (((active0 &= old0)) == 0L)
      return jjStartNfa_0(12, old0);
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) {
      jjStopStringLiteralDfa_0(13, active0);
      return 14;
   }
   switch(curChar)
   {
      case 110:
         return jjMoveStringLiteralDfa15_0(active0, 0x8000000000L);
      default :
         break;
   }
   return jjStartNfa_0(13, active0);
}
private int jjMoveStringLiteralDfa15_0(long old0, long active0)
{
   if (((active0 &= old0)) == 0L)
      return jjStartNfa_0(13, old0);
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) {
      jjStopStringLiteralDfa_0(14, active0);
      return 15;
   }
   switch(curChar)
   {
      case 121:
         if ((active0 & 0x8000000000L) != 0L)
            return jjStopAtPos(15, 39);
         break;
      default :
         break;
   }
   return jjStartNfa_0(14, active0);
}
private int jjStartNfaWithStates_0(int pos, int kind, int state)
{
   jjmatchedKind = kind;
   jjmatchedPos = pos;
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) { return pos + 1; }
   return jjMoveNfa_0(state, pos + 1);
}
static final long[] jjbitVec0 = {
   0xfffffffffffffffeL, 0xffffffffffffffffL, 0xffffffffffffffffL, 0xffffffffffffffffL
};
static final long[] jjbitVec2 = {
   0x0L, 0x0L, 0xffffffffffffffffL, 0xffffffffffffffffL
};
private int jjMoveNfa_0(int startState, int curPos)
{
   int startsAt = 0;
   jjnewStateCnt = 193;
   int i = 1;
   jjstateSet[0] = startState;
   int kind = 0x7fffffff;
   for (;;)
   {
      if (++jjround == 0x7fffffff)
         ReInitRounds();
      if (curChar < 64)
      {
         long l = 1L << curChar;
         do
         {
            switch(jjstateSet[--i])
            {
               case 57:
               case 60:
                  if ((0x8c00846affffffffL & l) == 0L)
                     break;
                  if (kind > 43)
                     kind = 43;
                  jjCheckNAdd(60);
                  break;
               case 0:
                  if ((0x8c00846affffffffL & l) != 0L)
                  {
                     if (kind > 43)
                        kind = 43;
                     jjCheckNAdd(60);
                  }
                  else if ((0x3ff000000000000L & l) != 0L)
                  {
                     if (kind > 13)
                        kind = 13;
                     jjCheckNAddStates(0, 14);
                  }
                  else if (curChar == 45)
                     jjCheckNAddStates(15, 22);
                  else if (curChar == 60)
                  {
                     if (kind > 32)
                        kind = 32;
                  }
                  else if (curChar == 62)
                  {
                     if (kind > 30)
                        kind = 30;
                  }
                  else if (curChar == 61)
                     jjstateSet[jjnewStateCnt++] = 32;
                  else if (curChar == 34)
                     jjCheckNAddStates(23, 25);
                  else if (curChar == 39)
                     jjCheckNAddStates(26, 28);
                  else if (curChar == 46)
                     jjCheckNAdd(1);
                  if (curChar == 33)
                     jjstateSet[jjnewStateCnt++] = 34;
                  else if (curChar == 38)
                     jjstateSet[jjnewStateCnt++] = 15;
                  break;
               case 168:
                  if ((0x8c00846affffffffL & l) == 0L)
                     break;
                  if (kind > 43)
                     kind = 43;
                  jjCheckNAdd(60);
                  break;
               case 56:
                  if ((0x8c00846affffffffL & l) != 0L)
                  {
                     if (kind > 43)
                        kind = 43;
                     jjCheckNAdd(60);
                  }
                  else if (curChar == 32)
                     jjstateSet[jjnewStateCnt++] = 55;
                  break;
               case 58:
                  if ((0x8c00846affffffffL & l) == 0L)
                     break;
                  if (kind > 43)
                     kind = 43;
                  jjCheckNAdd(60);
                  break;
               case 1:
                  if ((0x3ff000000000000L & l) == 0L)
                     break;
                  if (kind > 15)
                     kind = 15;
                  jjCheckNAdd(1);
                  break;
               case 3:
                  if ((0x280000000000L & l) != 0L)
                     jjCheckNAdd(4);
                  break;
               case 4:
                  if ((0x3ff000000000000L & l) == 0L)
                     break;
                  if (kind > 16)
                     kind = 16;
                  jjCheckNAdd(4);
                  break;
               case 5:
                  if (curChar == 39)
                     jjCheckNAddStates(26, 28);
                  break;
               case 7:
                  jjCheckNAddStates(26, 28);
                  break;
               case 8:
                  if ((0xffffff7fffffffffL & l) != 0L)
                     jjCheckNAddStates(26, 28);
                  break;
               case 9:
                  if (curChar == 39 && kind > 18)
                     kind = 18;
                  break;
               case 10:
                  if (curChar == 34)
                     jjCheckNAddStates(23, 25);
                  break;
               case 12:
                  jjCheckNAddStates(23, 25);
                  break;
               case 13:
                  if ((0xfffffffbffffffffL & l) != 0L)
                     jjCheckNAddStates(23, 25);
                  break;
               case 14:
                  if (curChar == 34 && kind > 18)
                     kind = 18;
                  break;
               case 15:
                  if (curChar == 38 && kind > 21)
                     kind = 21;
                  break;
               case 16:
                  if (curChar == 38)
                     jjstateSet[jjnewStateCnt++] = 15;
                  break;
               case 32:
                  if (curChar == 61 && kind > 28)
                     kind = 28;
                  break;
               case 33:
                  if (curChar == 61)
                     jjstateSet[jjnewStateCnt++] = 32;
                  break;
               case 34:
                  if (curChar == 61 && kind > 29)
                     kind = 29;
                  break;
               case 35:
                  if (curChar == 33)
                     jjstateSet[jjnewStateCnt++] = 34;
                  break;
               case 36:
                  if (curChar == 62 && kind > 30)
                     kind = 30;
                  break;
               case 41:
                  if (curChar == 32)
                     jjstateSet[jjnewStateCnt++] = 40;
                  break;
               case 49:
                  if (curChar == 60 && kind > 32)
                     kind = 32;
                  break;
               case 50:
                  if (curChar == 61 && kind > 34)
                     kind = 34;
                  break;
               case 63:
               case 64:
                  jjCheckNAddStates(29, 31);
                  break;
               case 66:
                  if (curChar == 45)
                     jjCheckNAddStates(15, 22);
                  break;
               case 67:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddTwoStates(68, 102);
                  break;
               case 68:
                  if (curChar == 45)
                     jjstateSet[jjnewStateCnt++] = 69;
                  break;
               case 69:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddTwoStates(70, 101);
                  break;
               case 70:
                  if (curChar == 45)
                     jjstateSet[jjnewStateCnt++] = 71;
                  break;
               case 71:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddTwoStates(72, 100);
                  break;
               case 72:
                  if (curChar == 45)
                     jjCheckNAdd(73);
                  break;
               case 73:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddTwoStates(73, 74);
                  break;
               case 74:
                  if (curChar == 45)
                     jjstateSet[jjnewStateCnt++] = 75;
                  break;
               case 75:
                  if ((0x3000000000000L & l) != 0L)
                     jjCheckNAddTwoStates(76, 77);
                  break;
               case 76:
                  if (curChar == 45)
                     jjCheckNAdd(77);
                  break;
               case 77:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddTwoStates(77, 78);
                  break;
               case 78:
                  if (curChar == 45)
                     jjstateSet[jjnewStateCnt++] = 79;
                  break;
               case 79:
                  if ((0xf000000000000L & l) != 0L)
                     jjstateSet[jjnewStateCnt++] = 80;
                  break;
               case 80:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjstateSet[jjnewStateCnt++] = 81;
                  break;
               case 82:
                  if ((0x7000000000000L & l) != 0L)
                     jjstateSet[jjnewStateCnt++] = 83;
                  break;
               case 83:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjstateSet[jjnewStateCnt++] = 84;
                  break;
               case 84:
                  if (curChar == 58)
                     jjstateSet[jjnewStateCnt++] = 85;
                  break;
               case 85:
                  if ((0x3f000000000000L & l) != 0L)
                     jjstateSet[jjnewStateCnt++] = 86;
                  break;
               case 86:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddTwoStates(87, 94);
                  break;
               case 87:
                  if (curChar == 58)
                     jjstateSet[jjnewStateCnt++] = 88;
                  break;
               case 88:
                  if ((0x3f000000000000L & l) != 0L)
                     jjstateSet[jjnewStateCnt++] = 89;
                  break;
               case 89:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddTwoStates(90, 94);
                  break;
               case 90:
                  if (curChar == 46)
                     jjstateSet[jjnewStateCnt++] = 91;
                  break;
               case 91:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjstateSet[jjnewStateCnt++] = 92;
                  break;
               case 92:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjstateSet[jjnewStateCnt++] = 93;
                  break;
               case 93:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAdd(94);
                  break;
               case 94:
                  if ((0x280000000000L & l) != 0L)
                     jjstateSet[jjnewStateCnt++] = 95;
                  break;
               case 95:
                  if ((0x7000000000000L & l) != 0L)
                     jjstateSet[jjnewStateCnt++] = 96;
                  break;
               case 96:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjstateSet[jjnewStateCnt++] = 97;
                  break;
               case 97:
                  if (curChar == 58)
                     jjstateSet[jjnewStateCnt++] = 98;
                  break;
               case 98:
                  if ((0x3f000000000000L & l) != 0L)
                     jjstateSet[jjnewStateCnt++] = 99;
                  break;
               case 99:
                  if ((0x3ff000000000000L & l) != 0L && kind > 10)
                     kind = 10;
                  break;
               case 100:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddStates(32, 35);
                  break;
               case 101:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddStates(36, 39);
                  break;
               case 102:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddStates(40, 43);
                  break;
               case 103:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddTwoStates(104, 132);
                  break;
               case 104:
                  if (curChar == 45)
                     jjstateSet[jjnewStateCnt++] = 105;
                  break;
               case 105:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddTwoStates(106, 131);
                  break;
               case 106:
                  if (curChar == 45)
                     jjstateSet[jjnewStateCnt++] = 107;
                  break;
               case 107:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddTwoStates(108, 130);
                  break;
               case 108:
                  if (curChar == 45)
                     jjCheckNAdd(109);
                  break;
               case 109:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddTwoStates(109, 110);
                  break;
               case 110:
                  if (curChar == 45)
                     jjstateSet[jjnewStateCnt++] = 111;
                  break;
               case 111:
                  if ((0x3000000000000L & l) != 0L)
                     jjCheckNAddTwoStates(112, 113);
                  break;
               case 112:
                  if (curChar == 45)
                     jjCheckNAdd(113);
                  break;
               case 113:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddTwoStates(113, 114);
                  break;
               case 114:
                  if (curChar == 45)
                     jjstateSet[jjnewStateCnt++] = 115;
                  break;
               case 115:
                  if ((0xf000000000000L & l) != 0L)
                     jjstateSet[jjnewStateCnt++] = 116;
                  break;
               case 116:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjstateSet[jjnewStateCnt++] = 117;
                  break;
               case 118:
                  if ((0x7000000000000L & l) != 0L)
                     jjstateSet[jjnewStateCnt++] = 119;
                  break;
               case 119:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjstateSet[jjnewStateCnt++] = 120;
                  break;
               case 120:
                  if (curChar == 58)
                     jjstateSet[jjnewStateCnt++] = 121;
                  break;
               case 121:
                  if ((0x3f000000000000L & l) != 0L)
                     jjstateSet[jjnewStateCnt++] = 122;
                  break;
               case 122:
                  if ((0x3ff000000000000L & l) == 0L)
                     break;
                  if (kind > 11)
                     kind = 11;
                  jjstateSet[jjnewStateCnt++] = 123;
                  break;
               case 123:
                  if (curChar == 58)
                     jjstateSet[jjnewStateCnt++] = 124;
                  break;
               case 124:
                  if ((0x3f000000000000L & l) != 0L)
                     jjstateSet[jjnewStateCnt++] = 125;
                  break;
               case 125:
                  if ((0x3ff000000000000L & l) == 0L)
                     break;
                  if (kind > 11)
                     kind = 11;
                  jjstateSet[jjnewStateCnt++] = 126;
                  break;
               case 126:
                  if (curChar == 46)
                     jjstateSet[jjnewStateCnt++] = 127;
                  break;
               case 127:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjstateSet[jjnewStateCnt++] = 128;
                  break;
               case 128:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjstateSet[jjnewStateCnt++] = 129;
                  break;
               case 129:
                  if ((0x3ff000000000000L & l) != 0L && kind > 11)
                     kind = 11;
                  break;
               case 130:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddStates(44, 47);
                  break;
               case 131:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddStates(48, 51);
                  break;
               case 132:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddStates(52, 55);
                  break;
               case 133:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddTwoStates(134, 149);
                  break;
               case 134:
                  if (curChar == 45)
                     jjstateSet[jjnewStateCnt++] = 135;
                  break;
               case 135:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddTwoStates(136, 148);
                  break;
               case 136:
                  if (curChar == 45)
                     jjstateSet[jjnewStateCnt++] = 137;
                  break;
               case 137:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddTwoStates(138, 147);
                  break;
               case 138:
                  if (curChar == 45)
                     jjCheckNAdd(139);
                  break;
               case 139:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddTwoStates(139, 140);
                  break;
               case 140:
                  if (curChar == 45)
                     jjstateSet[jjnewStateCnt++] = 141;
                  break;
               case 141:
                  if ((0x3000000000000L & l) != 0L)
                     jjCheckNAddTwoStates(142, 143);
                  break;
               case 142:
                  if (curChar == 45)
                     jjCheckNAdd(143);
                  break;
               case 143:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddTwoStates(143, 144);
                  break;
               case 144:
                  if (curChar == 45)
                     jjstateSet[jjnewStateCnt++] = 145;
                  break;
               case 145:
                  if ((0xf000000000000L & l) != 0L)
                     jjstateSet[jjnewStateCnt++] = 146;
                  break;
               case 146:
                  if ((0x3ff000000000000L & l) != 0L && kind > 12)
                     kind = 12;
                  break;
               case 147:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddStates(56, 59);
                  break;
               case 148:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddStates(60, 63);
                  break;
               case 149:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddStates(64, 67);
                  break;
               case 150:
                  if ((0x3ff000000000000L & l) == 0L)
                     break;
                  if (kind > 13)
                     kind = 13;
                  jjCheckNAdd(150);
                  break;
               case 151:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddTwoStates(151, 152);
                  break;
               case 152:
                  if (curChar == 46)
                     jjCheckNAdd(153);
                  break;
               case 153:
                  if ((0x3ff000000000000L & l) == 0L)
                     break;
                  if (kind > 13)
                     kind = 13;
                  jjCheckNAdd(153);
                  break;
               case 154:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddTwoStates(154, 155);
                  break;
               case 156:
                  if ((0x280000000000L & l) != 0L)
                     jjCheckNAdd(157);
                  break;
               case 157:
                  if ((0x3ff000000000000L & l) == 0L)
                     break;
                  if (kind > 13)
                     kind = 13;
                  jjCheckNAdd(157);
                  break;
               case 158:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddTwoStates(158, 159);
                  break;
               case 159:
                  if (curChar == 46)
                     jjCheckNAdd(160);
                  break;
               case 160:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddTwoStates(160, 161);
                  break;
               case 162:
                  if ((0x280000000000L & l) != 0L)
                     jjCheckNAdd(163);
                  break;
               case 163:
                  if ((0x3ff000000000000L & l) == 0L)
                     break;
                  if (kind > 13)
                     kind = 13;
                  jjCheckNAdd(163);
                  break;
               case 164:
                  if ((0x3ff000000000000L & l) == 0L)
                     break;
                  if (kind > 14)
                     kind = 14;
                  jjCheckNAdd(164);
                  break;
               case 165:
                  if ((0x3ff000000000000L & l) == 0L)
                     break;
                  if (kind > 13)
                     kind = 13;
                  jjCheckNAddStates(0, 14);
                  break;
               case 166:
                  if ((0x3ff000000000000L & l) == 0L)
                     break;
                  if (kind > 17)
                     kind = 17;
                  jjCheckNAdd(166);
                  break;
               case 172:
                  if (curChar == 32)
                     jjstateSet[jjnewStateCnt++] = 171;
                  break;
               case 179:
                  if (curChar == 32)
                     jjstateSet[jjnewStateCnt++] = 178;
                  break;
               case 189:
                  if (curChar == 32)
                     jjstateSet[jjnewStateCnt++] = 188;
                  break;
               default : break;
            }
         } while(i != startsAt);
      }
      else if (curChar < 128)
      {
         long l = 1L << (curChar & 077);
         do
         {
            switch(jjstateSet[--i])
            {
               case 57:
                  if ((0xffffffffd7ffffffL & l) != 0L)
                  {
                     if (kind > 43)
                        kind = 43;
                     jjCheckNAdd(60);
                  }
                  if (curChar == 116)
                     jjstateSet[jjnewStateCnt++] = 56;
                  break;
               case 0:
                  if ((0xffffffffd7ffffffL & l) != 0L)
                  {
                     if (kind > 43)
                        kind = 43;
                     jjCheckNAdd(60);
                  }
                  else if (curChar == 91)
                     jjCheckNAddStates(29, 31);
                  if ((0x2000000020L & l) != 0L)
                     jjAddStates(68, 69);
                  else if (curChar == 108)
                     jjAddStates(70, 72);
                  else if (curChar == 105)
                     jjAddStates(73, 74);
                  else if (curChar == 110)
                     jjstateSet[jjnewStateCnt++] = 58;
                  else if (curChar == 126)
                     jjstateSet[jjnewStateCnt++] = 50;
                  else if (curChar == 103)
                     jjstateSet[jjnewStateCnt++] = 47;
                  else if (curChar == 102)
                     jjstateSet[jjnewStateCnt++] = 30;
                  else if (curChar == 116)
                     jjstateSet[jjnewStateCnt++] = 26;
                  else if (curChar == 111)
                     jjstateSet[jjnewStateCnt++] = 22;
                  else if (curChar == 124)
                     jjstateSet[jjnewStateCnt++] = 20;
                  else if (curChar == 97)
                     jjstateSet[jjnewStateCnt++] = 18;
                  break;
               case 168:
                  if ((0xffffffffd7ffffffL & l) != 0L)
                  {
                     if (kind > 43)
                        kind = 43;
                     jjCheckNAdd(60);
                  }
                  if (curChar == 115)
                     jjstateSet[jjnewStateCnt++] = 172;
                  if (curChar == 115)
                  {
                     if (kind > 28)
                        kind = 28;
                  }
                  break;
               case 56:
               case 60:
                  if ((0xffffffffd7ffffffL & l) == 0L)
                     break;
                  if (kind > 43)
                     kind = 43;
                  jjCheckNAdd(60);
                  break;
               case 58:
                  if ((0xffffffffd7ffffffL & l) != 0L)
                  {
                     if (kind > 43)
                        kind = 43;
                     jjCheckNAdd(60);
                  }
                  if (curChar == 111)
                     jjstateSet[jjnewStateCnt++] = 57;
                  break;
               case 2:
                  if ((0x2000000020L & l) != 0L)
                     jjAddStates(68, 69);
                  break;
               case 6:
                  if (curChar == 92)
                     jjstateSet[jjnewStateCnt++] = 7;
                  break;
               case 7:
                  jjCheckNAddStates(26, 28);
                  break;
               case 8:
                  if ((0xffffffffefffffffL & l) != 0L)
                     jjCheckNAddStates(26, 28);
                  break;
               case 11:
                  if (curChar == 92)
                     jjstateSet[jjnewStateCnt++] = 12;
                  break;
               case 12:
                  jjCheckNAddStates(23, 25);
                  break;
               case 13:
                  if ((0xffffffffefffffffL & l) != 0L)
                     jjCheckNAddStates(23, 25);
                  break;
               case 17:
                  if (curChar == 100 && kind > 21)
                     kind = 21;
                  break;
               case 18:
                  if (curChar == 110)
                     jjstateSet[jjnewStateCnt++] = 17;
                  break;
               case 19:
                  if (curChar == 97)
                     jjstateSet[jjnewStateCnt++] = 18;
                  break;
               case 20:
                  if (curChar == 124 && kind > 22)
                     kind = 22;
                  break;
               case 21:
                  if (curChar == 124)
                     jjstateSet[jjnewStateCnt++] = 20;
                  break;
               case 22:
                  if (curChar == 114 && kind > 22)
                     kind = 22;
                  break;
               case 23:
                  if (curChar == 111)
                     jjstateSet[jjnewStateCnt++] = 22;
                  break;
               case 24:
                  if (curChar == 101 && kind > 27)
                     kind = 27;
                  break;
               case 25:
                  if (curChar == 117)
                     jjCheckNAdd(24);
                  break;
               case 26:
                  if (curChar == 114)
                     jjstateSet[jjnewStateCnt++] = 25;
                  break;
               case 27:
                  if (curChar == 116)
                     jjstateSet[jjnewStateCnt++] = 26;
                  break;
               case 28:
                  if (curChar == 115)
                     jjCheckNAdd(24);
                  break;
               case 29:
                  if (curChar == 108)
                     jjstateSet[jjnewStateCnt++] = 28;
                  break;
               case 30:
                  if (curChar == 97)
                     jjstateSet[jjnewStateCnt++] = 29;
                  break;
               case 31:
                  if (curChar == 102)
                     jjstateSet[jjnewStateCnt++] = 30;
                  break;
               case 37:
                  if (curChar == 110 && kind > 30)
                     kind = 30;
                  break;
               case 38:
                  if (curChar == 97)
                     jjstateSet[jjnewStateCnt++] = 37;
                  break;
               case 39:
                  if (curChar == 104)
                     jjstateSet[jjnewStateCnt++] = 38;
                  break;
               case 40:
                  if (curChar == 116)
                     jjstateSet[jjnewStateCnt++] = 39;
                  break;
               case 42:
                  if (curChar == 114)
                     jjstateSet[jjnewStateCnt++] = 41;
                  break;
               case 43:
                  if (curChar == 101)
                     jjstateSet[jjnewStateCnt++] = 42;
                  break;
               case 44:
                  if (curChar == 116)
                     jjstateSet[jjnewStateCnt++] = 43;
                  break;
               case 45:
                  if (curChar == 97)
                     jjstateSet[jjnewStateCnt++] = 44;
                  break;
               case 46:
                  if (curChar == 101)
                     jjstateSet[jjnewStateCnt++] = 45;
                  break;
               case 47:
                  if (curChar == 114)
                     jjstateSet[jjnewStateCnt++] = 46;
                  break;
               case 48:
                  if (curChar == 103)
                     jjstateSet[jjnewStateCnt++] = 47;
                  break;
               case 51:
                  if (curChar == 126)
                     jjstateSet[jjnewStateCnt++] = 50;
                  break;
               case 52:
                  if (curChar == 101 && kind > 35)
                     kind = 35;
                  break;
               case 53:
                  if (curChar == 107)
                     jjstateSet[jjnewStateCnt++] = 52;
                  break;
               case 54:
                  if (curChar == 105)
                     jjstateSet[jjnewStateCnt++] = 53;
                  break;
               case 55:
                  if (curChar == 108)
                     jjstateSet[jjnewStateCnt++] = 54;
                  break;
               case 59:
                  if (curChar == 110)
                     jjstateSet[jjnewStateCnt++] = 58;
                  break;
               case 61:
                  if (curChar == 91)
                     jjCheckNAddStates(29, 31);
                  break;
               case 62:
                  if (curChar == 92)
                     jjstateSet[jjnewStateCnt++] = 63;
                  break;
               case 63:
                  jjCheckNAddStates(29, 31);
                  break;
               case 64:
                  if ((0xffffffffcfffffffL & l) != 0L)
                     jjCheckNAddStates(29, 31);
                  break;
               case 65:
                  if (curChar == 93 && kind > 44)
                     kind = 44;
                  break;
               case 81:
                  if (curChar == 84)
                     jjstateSet[jjnewStateCnt++] = 82;
                  break;
               case 117:
                  if (curChar == 84)
                     jjstateSet[jjnewStateCnt++] = 118;
                  break;
               case 155:
                  if ((0x2000000020L & l) != 0L)
                     jjAddStates(75, 76);
                  break;
               case 161:
                  if ((0x2000000020L & l) != 0L)
                     jjAddStates(77, 78);
                  break;
               case 167:
                  if (curChar == 105)
                     jjAddStates(73, 74);
                  break;
               case 169:
                  if (curChar == 116 && kind > 29)
                     kind = 29;
                  break;
               case 170:
                  if (curChar == 111)
                     jjstateSet[jjnewStateCnt++] = 169;
                  break;
               case 171:
                  if (curChar == 110)
                     jjstateSet[jjnewStateCnt++] = 170;
                  break;
               case 173:
                  if (curChar == 115)
                     jjstateSet[jjnewStateCnt++] = 172;
                  break;
               case 174:
                  if (curChar == 108)
                     jjAddStates(70, 72);
                  break;
               case 175:
                  if (curChar == 110 && kind > 32)
                     kind = 32;
                  break;
               case 176:
                  if (curChar == 97)
                     jjstateSet[jjnewStateCnt++] = 175;
                  break;
               case 177:
                  if (curChar == 104)
                     jjstateSet[jjnewStateCnt++] = 176;
                  break;
               case 178:
                  if (curChar == 116)
                     jjstateSet[jjnewStateCnt++] = 177;
                  break;
               case 180:
                  if (curChar == 115)
                     jjstateSet[jjnewStateCnt++] = 179;
                  break;
               case 181:
                  if (curChar == 115)
                     jjstateSet[jjnewStateCnt++] = 180;
                  break;
               case 182:
                  if (curChar == 101)
                     jjstateSet[jjnewStateCnt++] = 181;
                  break;
               case 183:
                  if (curChar == 101 && kind > 34)
                     kind = 34;
                  break;
               case 184:
                  if (curChar == 107)
                     jjstateSet[jjnewStateCnt++] = 183;
                  break;
               case 185:
                  if (curChar == 105)
                     jjstateSet[jjnewStateCnt++] = 184;
                  break;
               case 186:
                  if (curChar == 116 && kind > 35)
                     kind = 35;
                  break;
               case 187:
                  if (curChar == 111)
                     jjstateSet[jjnewStateCnt++] = 186;
                  break;
               case 188:
                  if (curChar == 110)
                     jjstateSet[jjnewStateCnt++] = 187;
                  break;
               case 190:
                  if (curChar == 101)
                     jjstateSet[jjnewStateCnt++] = 189;
                  break;
               case 191:
                  if (curChar == 107)
                     jjstateSet[jjnewStateCnt++] = 190;
                  break;
               case 192:
                  if (curChar == 105)
                     jjstateSet[jjnewStateCnt++] = 191;
                  break;
               default : break;
            }
         } while(i != startsAt);
      }
      else
      {
         int hiByte = (int)(curChar >> 8);
         int i1 = hiByte >> 6;
         long l1 = 1L << (hiByte & 077);
         int i2 = (curChar & 0xff) >> 6;
         long l2 = 1L << (curChar & 077);
         do
         {
            switch(jjstateSet[--i])
            {
               case 57:
               case 60:
                  if (!jjCanMove_0(hiByte, i1, i2, l1, l2))
                     break;
                  if (kind > 43)
                     kind = 43;
                  jjCheckNAdd(60);
                  break;
               case 0:
                  if (!jjCanMove_0(hiByte, i1, i2, l1, l2))
                     break;
                  if (kind > 43)
                     kind = 43;
                  jjCheckNAdd(60);
                  break;
               case 168:
                  if (!jjCanMove_0(hiByte, i1, i2, l1, l2))
                     break;
                  if (kind > 43)
                     kind = 43;
                  jjCheckNAdd(60);
                  break;
               case 56:
                  if (!jjCanMove_0(hiByte, i1, i2, l1, l2))
                     break;
                  if (kind > 43)
                     kind = 43;
                  jjCheckNAdd(60);
                  break;
               case 58:
                  if (!jjCanMove_0(hiByte, i1, i2, l1, l2))
                     break;
                  if (kind > 43)
                     kind = 43;
                  jjCheckNAdd(60);
                  break;
               case 7:
               case 8:
                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
                     jjCheckNAddStates(26, 28);
                  break;
               case 12:
               case 13:
                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
                     jjCheckNAddStates(23, 25);
                  break;
               case 63:
               case 64:
                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
                     jjCheckNAddStates(29, 31);
                  break;
               default : break;
            }
         } while(i != startsAt);
      }
      if (kind != 0x7fffffff)
      {
         jjmatchedKind = kind;
         jjmatchedPos = curPos;
         kind = 0x7fffffff;
      }
      ++curPos;
      if ((i = jjnewStateCnt) == (startsAt = 193 - (jjnewStateCnt = startsAt)))
         return curPos;
      try { curChar = input_stream.readChar(); }
      catch(java.io.IOException e) { return curPos; }
   }
}
static final int[] jjnextStates = {
   68, 104, 134, 150, 151, 152, 154, 155, 158, 159, 164, 166, 149, 132, 102, 67, 
   103, 133, 150, 151, 154, 158, 164, 11, 13, 14, 6, 8, 9, 62, 64, 65, 
   72, 73, 74, 100, 70, 72, 100, 101, 68, 70, 101, 102, 108, 109, 110, 130, 
   106, 108, 130, 131, 104, 106, 131, 132, 138, 139, 140, 147, 136, 138, 147, 148, 
   134, 136, 148, 149, 3, 4, 182, 185, 192, 168, 173, 156, 157, 162, 163, 
};
private static final boolean jjCanMove_0(int hiByte, int i1, int i2, long l1, long l2)
{
   switch(hiByte)
   {
      case 0:
         return ((jjbitVec2[i2] & l2) != 0L);
      default :
         if ((jjbitVec0[i1] & l1) != 0L)
            return true;
         return false;
   }
}

/** Token literal values. */
public static final String[] jjstrLiteralImages = {
"", null, null, null, null, null, null, null, null, null, null, null, null, 
null, null, null, null, null, null, null, null, null, null, "\156\165\154\154", 
"\50", "\51", "\54", null, null, null, null, "\76\75", null, "\74\75", null, null, 
"\143\157\156\164\141\151\156\163", "\143\157\156\164\141\151\156\163\40\156\157\164", 
"\143\157\156\164\141\151\156\163\40\141\156\171", "\143\157\156\164\141\151\156\163\40\156\157\164\40\141\156\171", "\151\156", 
"\156\157\164\40\151\156", "\44", null, null, null, };

/** Lexer state names. */
public static final String[] lexStateNames = {
   "DEFAULT",
};
static final long[] jjtoToken = {
   0x3fffffe7fc01L, 
};
static final long[] jjtoSkip = {
   0x6L, 
};
protected SimpleCharStream input_stream;
private final int[] jjrounds = new int[193];
private final int[] jjstateSet = new int[386];
private final StringBuilder jjimage = new StringBuilder();
private StringBuilder image = jjimage;
private int jjimageLen;
private int lengthOfMatch;
protected char curChar;
/** Constructor. */
public FilterParserTokenManager(SimpleCharStream stream){
   if (SimpleCharStream.staticFlag)
      throw new Error("ERROR: Cannot use a static CharStream class with a non-static lexical analyzer.");
   input_stream = stream;
}

/** Constructor. */
public FilterParserTokenManager(SimpleCharStream stream, int lexState){
   this(stream);
   SwitchTo(lexState);
}

/** Reinitialise parser. */
public void ReInit(SimpleCharStream stream)
{
   jjmatchedPos = jjnewStateCnt = 0;
   curLexState = defaultLexState;
   input_stream = stream;
   ReInitRounds();
}
private void ReInitRounds()
{
   int i;
   jjround = 0x80000001;
   for (i = 193; i-- > 0;)
      jjrounds[i] = 0x80000000;
}

/** Reinitialise parser. */
public void ReInit(SimpleCharStream stream, int lexState)
{
   ReInit(stream);
   SwitchTo(lexState);
}

/** Switch to specified lex state. */
public void SwitchTo(int lexState)
{
   if (lexState >= 1 || lexState < 0)
      throw new TokenMgrError("Error: Ignoring invalid lexical state : " + lexState + ". State unchanged.", TokenMgrError.INVALID_LEXICAL_STATE);
   else
      curLexState = lexState;
}

protected Token jjFillToken()
{
   final Token t;
   final String curTokenImage;
   final int beginLine;
   final int endLine;
   final int beginColumn;
   final int endColumn;
   String im = jjstrLiteralImages[jjmatchedKind];
   curTokenImage = (im == null) ? input_stream.GetImage() : im;
   beginLine = input_stream.getBeginLine();
   beginColumn = input_stream.getBeginColumn();
   endLine = input_stream.getEndLine();
   endColumn = input_stream.getEndColumn();
   t = Token.newToken(jjmatchedKind, curTokenImage);

   t.beginLine = beginLine;
   t.endLine = endLine;
   t.beginColumn = beginColumn;
   t.endColumn = endColumn;

   return t;
}

int curLexState = 0;
int defaultLexState = 0;
int jjnewStateCnt;
int jjround;
int jjmatchedPos;
int jjmatchedKind;

/** Get the next Token. */
public Token getNextToken() 
{
  Token matchedToken;
  int curPos = 0;

  EOFLoop :
  for (;;)
  {
   try
   {
      curChar = input_stream.BeginToken();
   }
   catch(java.io.IOException e)
   {
      jjmatchedKind = 0;
      matchedToken = jjFillToken();
      return matchedToken;
   }
   image = jjimage;
   image.setLength(0);
   jjimageLen = 0;

   try { input_stream.backup(0);
      while (curChar <= 32 && (0x100000000L & (1L << curChar)) != 0L)
         curChar = input_stream.BeginToken();
   }
   catch (java.io.IOException e1) { continue EOFLoop; }
   jjmatchedKind = 0x7fffffff;
   jjmatchedPos = 0;
   curPos = jjMoveStringLiteralDfa0_0();
   if (jjmatchedPos == 0 && jjmatchedKind > 45)
   {
      jjmatchedKind = 45;
   }
   if (jjmatchedKind != 0x7fffffff)
   {
      if (jjmatchedPos + 1 < curPos)
         input_stream.backup(curPos - jjmatchedPos - 1);
      if ((jjtoToken[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
      {
         matchedToken = jjFillToken();
         TokenLexicalActions(matchedToken);
         return matchedToken;
      }
      else
      {
         continue EOFLoop;
      }
   }
   int error_line = input_stream.getEndLine();
   int error_column = input_stream.getEndColumn();
   String error_after = null;
   boolean EOFSeen = false;
   try { input_stream.readChar(); input_stream.backup(1); }
   catch (java.io.IOException e1) {
      EOFSeen = true;
      error_after = curPos <= 1 ? "" : input_stream.GetImage();
      if (curChar == '\n' || curChar == '\r') {
         error_line++;
         error_column = 0;
      }
      else
         error_column++;
   }
   if (!EOFSeen) {
      input_stream.backup(1);
      error_after = curPos <= 1 ? "" : input_stream.GetImage();
   }
   throw new TokenMgrError(EOFSeen, curLexState, error_line, error_column, error_after, curChar, TokenMgrError.LEXICAL_ERROR);
  }
}

void TokenLexicalActions(Token matchedToken)
{
   switch(jjmatchedKind)
   {
      case 18 :
        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
                                       matchedToken.image = image.substring(1, lengthOfMatch - 1);
         break;
      case 44 :
        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
                                                        matchedToken.image = image.substring(1, lengthOfMatch - 1);
         break;
      default :
         break;
   }
}
private void jjCheckNAdd(int state)
{
   if (jjrounds[state] != jjround)
   {
      jjstateSet[jjnewStateCnt++] = state;
      jjrounds[state] = jjround;
   }
}
private void jjAddStates(int start, int end)
{
   do {
      jjstateSet[jjnewStateCnt++] = jjnextStates[start];
   } while (start++ != end);
}
private void jjCheckNAddTwoStates(int state1, int state2)
{
   jjCheckNAdd(state1);
   jjCheckNAdd(state2);
}

private void jjCheckNAddStates(int start, int end)
{
   do {
      jjCheckNAdd(jjnextStates[start]);
   } while (start++ != end);
}

}
