view tests/agcl/examples/good/jrc.cpp @ 24:a4899cdfc2d6 default tip

Obfuscate the regexps to strip off the IBM compiler's copyright banners. I don't want bots scanning github to think they're real copyright notices because that could cause real problems.
author David A. Holland
date Mon, 13 Jun 2022 00:40:23 -0400
parents 13d2b8934445
children
line wrap: on
line source

/*

    Copyright (C) 1989,1990 James A. Roskind, All rights reserved.

    This grammar was developed  and  written  by  James  A.  Roskind.
    Copying  of  this  grammar  description, as a whole, is permitted
    providing this notice is intact and applicable  in  all  complete
    copies.   Translations as a whole to other parser generator input
    languages  (or  grammar  description  languages)   is   permitted
    provided  that  this  notice is intact and applicable in all such
    copies,  along  with  a  disclaimer  that  the  contents  are   a
    translation.   The reproduction of derived text, such as modified
    versions of this grammar, or the output of parser generators,  is
    permitted,  provided  the  resulting  work includes the copyright
    notice "Portions Copyright (c)  1989,  1990  James  A.  Roskind".
    Derived products, such as compilers, translators, browsers, etc.,
    that  use  this  grammar,  must also provide the notice "Portions
    Copyright  (c)  1989,  1990  James  A.  Roskind"  in   a   manner
    appropriate  to  the  utility,  and in keeping with copyright law
    (e.g.: EITHER displayed when first invoked/executed; OR displayed
    continuously on display terminal; OR via placement in the  object
    code  in  form  readable in a printout, with or near the title of
    the work, or at the end of the file).  No royalties, licenses  or
    commissions  of  any  kind are required to copy this grammar, its
    translations, or derivative products, when the copies are made in
    compliance with this notice. Persons or corporations that do make
    copies in compliance with this notice may charge  whatever  price
    is  agreeable  to  a  buyer, for such copies or derivative works.
    THIS GRAMMAR IS PROVIDED ``AS IS'' AND  WITHOUT  ANY  EXPRESS  OR
    IMPLIED  WARRANTIES,  INCLUDING,  WITHOUT LIMITATION, THE IMPLIED
    WARRANTIES  OF  MERCHANTABILITY  AND  FITNESS  FOR  A  PARTICULAR
    PURPOSE.

    James A. Roskind
    Independent Consultant
    516 Latania Palm Drive
    Indialantic FL, 32903
    (407)729-4348
    jar@ileaf.com
    or ...!uunet!leafusa!jar


 ******************************************************************************

 Translation to AnaGram and Interfacing
 Copyright 1993 Parsifal Software. All rights reserved.

 This software is provided 'as-is', without any express or implied
 warranty.  In no event will the authors be held liable for any damages
 arising from the use of this software.

 Permission is granted to anyone to use this software for any purpose,
 including commercial applications, and to alter it and redistribute it
 freely, subject to the following restrictions:

 1. The origin of this software must not be misrepresented; you must not
    claim that you wrote the original software. If you use this software
    in a product, an acknowledgment in the product documentation would be
    appreciated but is not required.
 2. Altered source versions must be plainly marked as such, and must not be
    misrepresented as being the original software.
 3. This notice may not be removed or altered from any source distribution.

 ******************************************************************************

*/

#include "mpp.h"


/*
 * AnaGram, A System for Syntax Directed Programming
 * File generated by: ...
 *
 * AnaGram Parsing Engine
 * Copyright 1993-2002 Parsifal Software. All Rights Reserved.
 *
 * This software is provided 'as-is', without any express or implied
 * warranty.  In no event will the authors be held liable for any damages
 * arising from the use of this software.
 *
 * Permission is granted to anyone to use this software for any purpose,
 * including commercial applications, and to alter it and redistribute it
 * freely, subject to the following restrictions:
 *
 * 1. The origin of this software must not be misrepresented; you must not
 *    claim that you wrote the original software. If you use this software
 *    in a product, an acknowledgment in the product documentation would be
 *    appreciated but is not required.
 * 2. Altered source versions must be plainly marked as such, and must not be
 *    misrepresented as being the original software.
 * 3. This notice may not be removed or altered from any source distribution.
 */

#ifndef JRC_H
#include "jrc.h"
#endif

#ifndef JRC_H
#error Mismatched header file
#endif

#include <ctype.h>
#include <stdio.h>

#define RULE_CONTEXT (&((PCB).cs[(PCB).ssx]))
#define ERROR_CONTEXT ((PCB).cs[(PCB).error_frame_ssx])
#define CONTEXT ((PCB).cs[(PCB).ssx])



cc_pcb_type cc_pcb;
#define PCB cc_pcb
#define CHANGE_REDUCTION(x) cc_change_reduction(cc_##x##_token)
int cc_change_reduction(cc_token_type);

#define INPUT_VALUE(type) *(type *) &(PCB).input_value

#line - "jrc.syn"
                                           // Embedded C

#define SYNTAX_ERROR syntax_error(PCB.error_message)
#define INPUT_CODE(T) (T).id

static int typedef_flag = 0;
static int use_count = 0;

symbol_type_enum symbol_table[N_SYMBOLS];


static void do_typedef(token t) {
  if (typedef_flag == 0) return;
  typedef_flag = 0;
  symbol_table[t.handle] = typedef_name;
}

static token check_typedef(token t) {
  if (symbol_table[t.handle] == typedef_name)
    CHANGE_REDUCTION(TYPEDEFname);
  return t;
}

// Member Functions for Class c_parser

// Constructor

/*
  This parser has no provisions for multiple simultaneous parses or for
  recursion. The purpose of use_count is to make sure that there is only one
  copy of the parser active at any time.
*/


c_parser::c_parser() {
  assert(use_count == 0);
  use_count++;
  typedef_flag = 0;
  memset(symbol_table, 0, sizeof(symbol_table));
  init_cc();                                // init parse
}


// Destructor

c_parser::~c_parser() {
  use_count--;                              // Makes parser available
}


// Reset Parser

c_parser &reset(c_parser &c) {
  typedef_flag = 0;
  memset(symbol_table, 0, sizeof(symbol_table));
  init_cc();                                // init parse
  return c;
}


// Transmit token to c_parser

/*
  The overloaded operator "<<" is used to transmit data to a parser.
  Newline tokens are filtered out, since they are passed along by the
  token scanner only in case text output of the preprocessor is
  required.

  If the parser has encountered an error, there is no point in giving
  it any further input.

  Otherwise, the input_code and input_value fields of the pcb are set
  up and cc() is called to deal with the token.
*/

token_sink &c_parser::operator << (token c) {
  if (PCB.exit_flag != AG_RUNNING_CODE || (int) c.id == '\n') return *this;
  PCB.input_code = c.id;
  PCB.input_value = c;
  cc();
  return *this;
}

token_sink &c_parser::operator << (token *s) {
  while (s->id != END_OF_FILE && PCB.exit_flag == AG_RUNNING_CODE) {
    if ((int) s->id == 10) continue;
    PCB.input_code = s->id;
    PCB.input_value = *s++;
    cc();
  }
  return *this;
}

#line - "jrc.cpp"

#ifndef CONVERT_CASE
#define CONVERT_CASE(c) (c)
#endif
#ifndef TAB_SPACING
#define TAB_SPACING 8
#endif

static void ag_rp_1(void) {
#line - "jrc.syn"
  typedef_flag = 1;
#line - "jrc.cpp"
}

static void ag_rp_2(int f) {
#line - "jrc.syn"
  typedef_flag = f;
#line - "jrc.cpp"
}

static int ag_rp_3(void) {
#line - "jrc.syn"
int f = typedef_flag; typedef_flag = 0; return f;
#line - "jrc.cpp"
}

static void ag_rp_4(token s) {
#line - "jrc.syn"
  do_typedef(s);
#line - "jrc.cpp"
}

static token ag_rp_5(token t) {
#line - "jrc.syn"
  return check_typedef(t);
#line - "jrc.cpp"
}


#ifndef AG_TRACE_FILE_NAME
#define AG_TRACE_FILE_NAME "jrc.etr"
#endif

static void ag_trace_error(void) {
  FILE *ag_file = fopen(AG_TRACE_FILE_NAME, "w");
  int i;
  if (ag_file == NULL) return;
  fprintf(ag_file, "%d\n", (PCB).ssx);
  for (i = 0; i < (PCB).ssx; i++) fprintf(ag_file, "%d\n", (PCB).ss[i]);
  fprintf(ag_file, "%d\n", (PCB).sn);
  fprintf(ag_file, "%d\n", (PCB).token_number);
  fclose(ag_file);
}


#define READ_COUNTS 
#define WRITE_COUNTS 
#undef V
#define V(i,t) (*t (&(PCB).vs[(PCB).ssx + i]))
#undef VS
#define VS(i) (PCB).vs[(PCB).ssx + i]

#ifndef GET_CONTEXT
#define GET_CONTEXT CONTEXT = (PCB).input_context
#endif

typedef enum {
  ag_action_1,
  ag_action_2,
  ag_action_3,
  ag_action_4,
  ag_action_5,
  ag_action_6,
  ag_action_7,
  ag_action_8,
  ag_action_9,
  ag_action_10,
  ag_action_11,
  ag_action_12
} ag_parser_action;


#ifndef NULL_VALUE_INITIALIZER
#define NULL_VALUE_INITIALIZER = { 0 }
#endif

static cc_vs_type const ag_null_value NULL_VALUE_INITIALIZER;

static const unsigned char far ag_rpx[] = {
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    0,  0,  2,  0,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    0,  0,  0,  0,  0,  0,  5
};

#define AG_TCV(x) ag_tcv[(x)]

static const unsigned char far ag_tcv[] = {
    5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 40,  0,  0,
    0, 43, 35,  0, 16, 18, 36, 37, 29, 38, 23, 42,  0,  0,  0,  0,  0,  0,
    0,  0,  0,  0, 67, 84, 49, 69, 50, 66,  0, 62, 77, 25,  0, 27, 71,142,
   54, 78, 52, 26, 51, 46, 75, 72, 74, 70, 55, 79, 64, 73, 47, 76, 11, 13,
    0, 20,  0, 21, 58,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,125, 60,127,
   39,  0,  0, 10,  9,  8,  7,186,110,167,155,113,102,166,156,163,118,160,
  137,108,117,164,165,159,115,116,111,168,114,119, 33,109,128,161,107,129,
  120,112,103,162,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    0,  0,  0,  0
};

#ifndef SYNTAX_ERROR
#define SYNTAX_ERROR fprintf(stderr,"%s, line %d, column %d\n", \
  (PCB).error_message, (PCB).line, (PCB).column)
#endif

#ifndef FIRST_LINE
#define FIRST_LINE 1
#endif

#ifndef FIRST_COLUMN
#define FIRST_COLUMN 1
#endif

#ifndef PARSER_STACK_OVERFLOW
#define PARSER_STACK_OVERFLOW {fprintf(stderr, \
   "\nParser stack overflow, line %d, column %d\n",\
   (PCB).line, (PCB).column);}
#endif

#ifndef REDUCTION_TOKEN_ERROR
#define REDUCTION_TOKEN_ERROR {fprintf(stderr, \
    "\nReduction token error, line %d, column %d\n", \
    (PCB).line, (PCB).column);}
#endif


#ifndef AG_NEWLINE
#define AG_NEWLINE 10
#endif

#ifndef AG_RETURN
#define AG_RETURN 13
#endif

#ifndef AG_FORMFEED
#define AG_FORMFEED 12
#endif

#ifndef AG_TABCHAR
#define AG_TABCHAR 9
#endif

static void ag_track(void) {
  switch ((PCB).input_code) {
  case AG_NEWLINE:
    (PCB).column = 1, (PCB).line++;
  case AG_RETURN:
  case AG_FORMFEED:
    break;
  case AG_TABCHAR:
    (PCB).column += (TAB_SPACING) - ((PCB).column - 1) % (TAB_SPACING);
    break;
  default:
    (PCB).column++;
  }
  (PCB).read_flag = 1;
}


static void ag_prot(void) {
  int ag_k;
  ag_k = 128 - ++(PCB).btsx;
  if (ag_k <= (PCB).ssx) {
    ag_trace_error();
    (PCB).exit_flag = AG_STACK_ERROR_CODE;
    PARSER_STACK_OVERFLOW;
    return;
  }
  (PCB).bts[(PCB).btsx] = (PCB).sn;
  (PCB).bts[ag_k] = (PCB).ssx;
  (PCB).vs[ag_k] = (PCB).vs[(PCB).ssx];
  (PCB).ss[ag_k] = (PCB).ss[(PCB).ssx];
}

static void ag_undo(void) {
  if ((PCB).drt == -1) return;
  while ((PCB).btsx) {
    int ag_k = 128 - (PCB).btsx;
    (PCB).sn = (PCB).bts[(PCB).btsx--];
    (PCB).ssx = (PCB).bts[ag_k];
    (PCB).vs[(PCB).ssx] = (PCB).vs[ag_k];
    (PCB).ss[(PCB).ssx] = (PCB).ss[ag_k];
  }
  (PCB).token_number = (cc_token_type) (PCB).drt;
  (PCB).ssx = (PCB).dssx;
  (PCB).sn = (PCB).dsn;
  (PCB).drt = -1;
}



static const int far ag_rtt[] = {
   15,106,  0
};

static const unsigned char far ag_tstt[] = {
186,137,129,128,120,119,118,117,116,115,114,113,112,111,110,109,108,107,103,
  102,36,16,5,0,1,3,4,15,82,83,85,86,87,88,89,91,92,94,95,96,97,98,99,101,
  104,105,106,121,123,169,170,171,179,180,181,182,
186,125,0,15,24,106,
129,128,0,122,124,
186,36,16,0,15,171,179,180,181,182,
186,103,102,36,16,0,15,89,91,101,171,179,180,181,182,
111,110,109,108,107,103,102,0,99,101,
120,119,118,117,116,115,114,113,112,111,110,109,108,107,103,102,0,99,101,
  104,
111,110,109,108,107,103,102,0,99,100,101,
120,119,118,117,116,115,114,113,112,111,110,109,108,107,103,102,0,99,100,
  101,104,
20,16,0,174,185,
84,29,0,
84,29,0,
111,110,109,108,107,103,102,84,0,99,101,
111,110,109,108,107,103,102,84,0,99,100,101,
186,137,129,128,125,120,119,118,117,116,115,114,113,112,111,110,109,108,107,
  103,102,0,82,83,85,86,87,88,91,92,94,95,96,97,98,99,101,104,105,106,121,
  123,150,157,
186,137,129,128,120,119,118,117,116,115,114,113,112,111,110,109,108,107,103,
  102,36,16,0,15,89,99,101,104,105,106,121,123,171,179,180,181,182,
186,137,129,128,120,119,118,117,116,115,114,113,112,111,110,109,108,107,103,
  102,36,16,0,15,89,99,100,101,104,105,106,121,123,171,179,180,181,182,
186,36,16,0,15,89,93,106,145,171,172,173,175,176,177,179,180,181,182,
186,36,16,0,15,89,93,106,145,171,172,173,175,176,177,179,180,181,182,
125,84,0,150,
186,137,129,128,120,119,118,117,116,115,114,113,112,111,110,109,108,107,103,
  102,36,16,5,0,15,82,83,85,86,87,88,89,91,92,94,95,96,97,98,99,101,104,
  105,106,121,123,169,170,171,179,180,181,182,
5,0,
125,0,
186,0,15,24,106,138,
186,125,0,15,24,106,
18,0,
20,18,16,0,174,185,
18,0,
186,103,102,36,16,0,15,89,101,171,179,180,181,182,
186,40,39,38,37,36,35,33,27,26,21,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,
  32,41,44,45,48,53,56,57,59,61,63,65,80,
186,137,129,128,120,119,118,117,116,115,114,113,112,111,110,109,108,107,103,
  102,18,0,15,83,85,88,91,92,94,95,96,97,98,99,101,104,105,106,121,123,
  140,141,143,146,
20,0,
186,36,16,0,15,89,179,180,181,
186,36,16,0,15,89,93,106,145,172,173,175,176,177,179,180,181,
186,36,16,0,15,89,93,106,145,172,173,175,176,177,179,180,181,
186,36,16,0,15,89,93,106,145,172,173,175,176,177,179,180,181,
186,137,129,128,120,119,118,117,116,115,114,113,112,111,110,109,108,107,103,
  102,36,16,0,15,89,99,101,104,105,106,121,123,179,180,181,
186,137,129,128,120,119,118,117,116,115,114,113,112,111,110,109,108,107,103,
  102,36,16,0,15,89,99,100,101,104,105,106,121,123,179,180,181,
186,137,129,128,125,120,119,118,117,116,115,114,113,112,111,110,109,108,107,
  103,102,0,82,83,85,86,87,88,91,92,94,95,96,97,98,99,101,104,105,106,121,
  123,150,
186,168,167,166,165,164,163,162,161,159,156,155,137,129,128,127,125,120,119,
  118,117,116,115,114,113,112,111,110,109,108,107,103,102,84,40,39,38,37,
  36,35,33,27,26,16,13,11,10,9,8,7,0,2,6,12,14,15,17,19,24,28,30,31,32,41,
  44,45,48,53,56,57,59,61,63,65,81,82,83,85,86,87,88,91,92,94,95,96,97,98,
  99,101,104,105,106,121,123,149,150,151,152,153,154,157,158,
186,137,129,128,125,120,119,118,117,116,115,114,113,112,111,110,109,108,107,
  103,102,0,82,83,85,86,87,88,91,92,94,95,96,97,98,99,101,104,105,106,121,
  123,150,157,
125,84,69,29,0,90,150,
186,137,129,128,125,120,119,118,117,116,115,114,113,112,111,110,109,108,107,
  103,102,0,82,83,85,86,87,88,91,92,94,95,96,97,98,99,101,104,105,106,121,
  123,150,157,
125,84,69,29,0,90,150,
186,137,129,128,125,120,119,118,117,116,115,114,113,112,111,110,109,108,107,
  103,102,0,82,83,85,86,87,88,91,92,94,95,96,97,98,99,101,104,105,106,121,
  123,150,157,
186,36,16,0,15,106,171,173,175,176,177,178,179,180,181,182,
20,16,0,174,185,
186,103,102,36,16,0,15,89,91,101,106,145,171,173,175,176,177,179,180,181,
  182,
125,0,150,
84,69,29,0,90,
186,137,129,128,125,120,119,118,117,116,115,114,113,112,111,110,109,108,107,
  103,102,0,82,83,85,86,87,88,91,92,94,95,96,97,98,99,101,104,105,106,121,
  123,150,157,
125,0,150,
84,69,29,0,90,
186,0,15,24,106,138,
127,69,29,0,139,
127,29,0,
125,0,
186,137,129,128,120,119,118,117,116,115,114,113,112,103,102,0,85,91,94,97,
  98,101,104,105,106,121,123,126,130,131,132,
20,16,0,174,185,
20,16,0,174,185,
13,0,
186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,
186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,32,
186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,
186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,
27,26,25,23,20,16,0,
186,137,129,128,120,119,118,117,116,115,114,113,112,103,102,40,39,38,37,36,
  35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,17,19,28,30,31,32,34,41,44,
  45,48,53,56,57,59,61,63,65,85,91,94,97,98,101,104,105,106,121,123,
43,42,36,0,
38,37,0,
47,46,0,
52,51,50,49,0,
55,54,0,
35,0,
58,0,
60,0,
62,0,
66,64,0,
21,0,
111,110,109,108,107,103,102,0,99,101,
111,110,109,108,107,103,102,0,99,100,101,
186,137,129,128,120,119,118,117,116,115,114,113,112,111,110,109,108,107,103,
  102,36,29,20,18,16,0,15,89,99,101,104,105,106,121,123,144,174,179,180,
  181,183,184,185,
186,36,20,16,0,15,89,106,144,145,174,175,176,179,180,181,183,184,185,
186,137,129,128,120,119,118,117,116,115,114,113,112,111,110,109,108,107,103,
  102,36,29,20,18,16,0,15,89,99,100,101,104,105,106,121,123,144,174,179,
  180,181,183,184,185,
186,36,20,16,0,15,89,106,144,145,174,175,176,179,180,181,183,184,185,
29,0,
18,0,
29,18,0,
186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,32,
  41,44,45,48,53,56,57,59,61,63,65,80,
186,36,16,0,15,179,180,181,
186,103,102,36,16,0,15,89,91,101,179,180,181,
20,16,0,174,185,
84,69,29,0,90,
186,36,16,0,15,106,173,175,176,177,178,179,180,181,
186,103,102,36,16,0,15,89,91,101,106,145,173,175,176,177,179,180,181,
84,69,29,0,90,
84,69,29,0,90,
84,69,29,0,90,
79,78,77,76,75,74,73,72,71,70,69,0,68,
29,0,
84,79,78,77,76,75,74,73,72,71,70,69,67,66,64,62,60,58,55,54,52,51,50,49,47,
  46,43,42,38,37,36,35,29,27,26,25,23,20,16,0,
186,84,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,17,19,28,
  30,31,32,41,44,45,48,53,56,57,59,61,63,65,81,
84,0,
84,0,
186,0,15,24,106,
16,0,
186,168,167,166,165,164,163,162,161,159,156,155,125,84,40,39,38,37,36,35,33,
  27,26,16,13,11,10,9,8,7,0,2,6,12,14,15,17,19,24,28,30,31,32,41,44,45,48,
  53,56,57,59,61,63,65,81,106,149,150,151,152,153,154,
16,0,
16,0,
16,0,
84,0,
67,0,
186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,32,
  41,44,45,48,53,56,57,59,61,63,65,80,
67,0,
186,168,167,166,165,164,163,162,161,159,156,155,127,125,84,40,39,38,37,36,
  35,33,27,26,16,13,11,10,9,8,7,0,2,6,12,14,15,17,19,24,28,30,31,32,41,44,
  45,48,53,56,57,59,61,63,65,81,106,149,150,151,152,153,154,
186,111,110,109,108,107,103,102,67,36,16,0,
186,168,167,166,165,164,163,162,161,159,156,155,137,129,128,127,125,120,119,
  118,117,116,115,114,113,112,111,110,109,108,107,103,102,84,40,39,38,37,
  36,35,33,27,26,16,13,11,10,9,8,7,0,2,6,12,14,15,17,19,24,28,30,31,32,41,
  44,45,48,53,56,57,59,61,63,65,81,82,83,85,86,87,88,91,92,94,95,96,97,98,
  99,101,104,105,106,121,123,149,150,151,152,153,154,158,
186,137,129,128,125,120,119,118,117,116,115,114,113,112,111,110,109,108,107,
  103,102,0,82,83,85,86,87,88,91,92,94,95,96,97,98,99,101,104,105,106,121,
  123,150,
186,125,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,28,30,
  31,32,41,44,45,48,53,56,57,59,61,63,65,147,
186,137,129,128,125,120,119,118,117,116,115,114,113,112,111,110,109,108,107,
  103,102,0,82,83,85,86,87,88,91,92,94,95,96,97,98,99,101,104,105,106,121,
  123,150,
186,137,129,128,125,120,119,118,117,116,115,114,113,112,111,110,109,108,107,
  103,102,0,82,83,85,86,87,88,91,92,94,95,96,97,98,99,101,104,105,106,121,
  123,150,
20,16,0,174,185,
18,0,
186,36,16,0,15,106,171,173,175,176,177,178,179,180,181,182,
18,0,
186,137,129,128,120,119,118,117,116,115,114,113,112,111,110,109,108,107,103,
  102,18,0,83,85,88,91,92,94,95,96,97,98,99,101,104,105,106,121,123,140,
  141,143,
186,103,102,36,16,0,15,89,101,106,145,171,173,175,176,177,179,180,181,182,
186,36,16,0,15,106,171,173,175,176,177,178,179,180,181,182,
186,137,129,128,125,120,119,118,117,116,115,114,113,112,111,110,109,108,107,
  103,102,0,82,83,85,86,87,88,91,92,94,95,96,97,98,99,101,104,105,106,121,
  123,150,
127,29,0,
186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,32,
  41,44,45,48,53,56,57,59,61,63,65,80,
186,0,15,24,106,
186,137,129,128,120,119,118,117,116,115,114,113,112,103,102,0,85,91,94,97,
  98,101,104,105,106,121,123,126,130,131,132,
103,102,0,101,
103,102,0,101,
120,119,118,117,116,115,114,113,112,103,102,0,101,104,
186,137,129,128,120,119,118,117,116,115,114,113,112,103,102,67,36,16,0,15,
  89,101,104,105,106,121,123,133,136,179,180,181,
186,67,36,16,0,15,89,93,106,134,136,145,172,173,175,176,177,179,180,181,
84,29,0,
84,29,0,
186,137,129,128,127,120,119,118,117,116,115,114,113,112,103,102,0,85,91,94,
  97,98,101,104,105,106,121,123,130,131,132,
186,137,129,128,120,119,118,117,116,115,114,113,112,103,102,40,39,38,37,36,
  35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,17,19,28,30,31,32,34,41,44,
  45,48,53,56,57,59,61,63,65,85,91,94,97,98,101,104,105,106,121,123,
186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,17,19,28,30,
  31,32,41,44,45,48,53,56,57,59,61,63,65,
186,0,15,24,106,
186,0,15,24,106,
186,40,39,38,37,36,35,33,27,26,18,16,13,11,10,9,8,7,0,6,12,14,15,19,22,28,
  30,31,32,41,44,45,48,53,56,57,59,61,63,65,
186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,17,19,28,30,
  31,32,41,44,45,48,53,56,57,59,61,63,65,
186,137,129,128,120,119,118,117,116,115,114,113,112,103,102,36,20,18,16,0,
  101,104,105,106,121,123,144,174,183,184,185,
36,20,16,0,144,174,183,184,185,
18,0,
29,18,0,
186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,32,
186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,32,
186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,32,
186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,32,
  41,
186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,32,
  41,
186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,32,
  41,44,
186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,32,
  41,44,
186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,32,
  41,44,45,
186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,32,
  41,44,45,
186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,32,
  41,44,45,
186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,32,
  41,44,45,
186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,32,
  41,44,45,48,
186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,32,
  41,44,45,48,
186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,32,
  41,44,45,48,53,
186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,32,
  41,44,45,48,53,56,
186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,32,
  41,44,45,48,53,56,57,
186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,32,
  41,44,45,48,53,56,57,59,
186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,17,19,28,30,
  31,32,41,44,45,48,53,56,57,59,61,63,65,
186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,32,
  41,44,45,48,53,56,57,59,61,
186,137,129,128,120,119,118,117,116,115,114,113,112,111,110,109,108,107,103,
  102,36,20,18,16,0,15,83,85,88,91,92,94,95,96,97,98,99,101,104,105,106,
  121,123,140,141,143,174,179,180,181,183,184,185,
186,103,102,36,20,16,0,15,89,91,101,144,174,179,180,181,183,184,185,
186,137,129,128,120,119,118,117,116,115,114,113,112,111,110,109,108,107,103,
  102,36,20,18,16,0,15,83,85,88,91,92,94,95,96,97,98,99,101,104,105,106,
  121,123,140,141,143,174,175,176,179,180,181,183,184,185,
186,103,102,36,20,16,0,15,89,91,101,106,144,145,174,175,176,179,180,181,183,
  184,185,
186,142,137,129,128,120,119,118,117,116,115,114,113,112,111,110,109,108,107,
  103,102,0,83,85,88,91,92,94,95,96,97,98,99,101,104,105,106,121,123,143,
186,0,15,
21,0,
20,18,16,0,174,185,
186,103,102,36,16,0,15,89,101,179,180,181,
186,36,16,0,15,106,173,175,176,177,178,179,180,181,
186,103,102,36,16,0,15,89,101,106,145,173,175,176,177,179,180,181,
186,36,16,0,15,106,173,175,176,177,178,179,180,181,
186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,28,30,31,
  32,41,44,45,48,53,56,57,59,61,63,65,
186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,28,30,31,
  32,41,44,45,48,53,56,57,59,61,63,65,
84,0,
84,0,
186,84,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,17,19,28,
  30,31,32,41,44,45,48,53,56,57,59,61,63,65,81,
162,0,
186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,17,19,28,30,
  31,32,41,44,45,48,53,56,57,59,61,63,65,
186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,17,19,28,30,
  31,32,41,44,45,48,53,56,57,59,61,63,65,
186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,17,19,28,30,
  31,32,41,44,45,48,53,56,57,59,61,63,65,
186,168,167,166,165,164,163,162,161,159,156,155,125,84,40,39,38,37,36,35,33,
  27,26,16,13,11,10,9,8,7,0,2,6,12,14,15,17,19,24,28,30,31,32,41,44,45,48,
  53,56,57,59,61,63,65,81,106,149,150,151,152,153,154,
67,0,
186,168,167,166,165,164,163,162,161,159,156,155,125,84,40,39,38,37,36,35,33,
  27,26,16,13,11,10,9,8,7,0,2,6,12,14,15,17,19,24,28,30,31,32,41,44,45,48,
  53,56,57,59,61,63,65,81,106,149,150,151,152,153,154,
186,168,167,166,165,164,163,162,161,159,156,155,127,125,84,40,39,38,37,36,
  35,33,27,26,16,13,11,10,9,8,7,0,2,6,12,14,15,17,19,24,28,30,31,32,41,44,
  45,48,53,56,57,59,61,63,65,81,106,149,150,151,152,153,154,
186,125,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,28,30,
  31,32,41,44,45,48,53,56,57,59,61,63,65,147,148,
18,0,
20,16,0,174,185,
20,18,16,0,174,185,
20,16,0,174,185,
186,36,16,0,15,106,171,173,175,176,177,178,179,180,181,182,
20,18,16,0,174,185,
127,69,29,0,139,
186,137,129,128,127,120,119,118,117,116,115,114,113,112,103,102,0,85,91,94,
  97,98,101,104,105,106,121,123,130,131,132,
186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,32,
  41,44,45,48,53,56,57,59,61,63,65,80,
84,67,29,0,135,136,
84,67,29,0,135,136,
186,67,36,16,0,15,89,133,136,179,180,181,
186,67,36,16,0,15,89,93,106,134,136,145,172,173,175,176,177,179,180,181,
18,0,
29,18,0,
29,21,0,
186,137,129,128,120,119,118,117,116,115,114,113,112,111,110,109,108,107,103,
  102,36,20,18,16,0,83,85,88,91,92,94,95,96,97,98,99,101,104,105,106,121,
  123,140,141,143,174,183,184,185,
103,102,36,20,16,0,91,101,144,174,183,184,185,
186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,32,
43,42,36,0,
43,42,36,0,
38,37,0,
38,37,0,
47,46,0,
47,46,0,
47,46,0,
47,46,0,
52,51,50,49,0,
52,51,50,49,0,
55,54,0,
35,0,
58,0,
60,0,
67,29,0,
62,0,
18,0,
18,0,
18,0,
186,103,102,36,20,16,0,15,89,101,144,174,179,180,181,183,184,185,
186,103,102,36,20,16,0,15,89,101,106,144,145,174,175,176,179,180,181,183,
  184,185,
186,36,16,0,15,106,173,175,176,177,178,179,180,181,
84,0,
16,0,
29,18,0,
29,18,0,
29,18,0,
186,168,167,166,165,164,163,162,161,159,156,155,125,84,40,39,38,37,36,35,33,
  27,26,16,13,11,10,9,8,7,0,2,6,12,14,15,17,19,24,28,30,31,32,41,44,45,48,
  53,56,57,59,61,63,65,81,106,149,150,151,152,153,154,
127,29,0,
20,18,16,0,174,185,
186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,28,30,31,
  32,41,44,45,48,53,56,57,59,61,63,65,
103,102,36,20,16,0,101,144,174,183,184,185,
186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,30,31,32,
  41,44,45,48,53,56,57,59,61,63,65,
20,16,0,174,185,
186,84,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,17,19,28,
  30,31,32,41,44,45,48,53,56,57,59,61,63,65,81,
186,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,17,19,28,30,
  31,32,41,44,45,48,53,56,57,59,61,63,65,
186,168,167,166,165,164,163,162,161,159,156,155,125,84,40,39,38,37,36,35,33,
  27,26,16,13,11,10,9,8,7,0,2,6,12,14,15,17,19,24,28,30,31,32,41,44,45,48,
  53,56,57,59,61,63,65,81,106,149,150,151,152,153,154,
186,168,167,166,165,164,163,162,161,159,156,155,125,84,40,39,38,37,36,35,33,
  27,26,16,13,11,10,9,8,7,0,2,6,12,14,15,17,19,24,28,30,31,32,41,44,45,48,
  53,56,57,59,61,63,65,81,106,149,150,151,152,153,154,
186,168,167,166,165,164,163,162,161,159,156,155,125,84,40,39,38,37,36,35,33,
  27,26,16,13,11,10,9,8,7,0,2,6,12,14,15,17,19,24,28,30,31,32,41,44,45,48,
  53,56,57,59,61,63,65,81,106,149,150,151,152,153,154,
186,127,125,40,39,38,37,36,35,33,27,26,16,13,11,10,9,8,7,0,6,12,14,15,19,28,
  30,31,32,41,44,45,48,53,56,57,59,61,63,65,147,
84,0,
29,18,0,
160,0,
186,40,39,38,37,36,35,33,27,26,18,16,13,11,10,9,8,7,0,6,12,14,15,17,19,28,
  30,31,32,41,44,45,48,53,56,57,59,61,63,65,81,
84,0,
186,168,167,166,165,164,163,162,161,159,156,155,125,84,40,39,38,37,36,35,33,
  27,26,16,13,11,10,9,8,7,0,2,6,12,14,15,17,19,24,28,30,31,32,41,44,45,48,
  53,56,57,59,61,63,65,81,106,149,150,151,152,153,154,
18,0,
186,168,167,166,165,164,163,162,161,159,156,155,125,84,40,39,38,37,36,35,33,
  27,26,16,13,11,10,9,8,7,0,2,6,12,14,15,17,19,24,28,30,31,32,41,44,45,48,
  53,56,57,59,61,63,65,81,106,149,150,151,152,153,154,
  0
};


static unsigned const char far ag_astt[5043] = {
  2,1,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,8,7,0,1,1,2,1,1,1,1,1,1,1,1,1,
  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,7,1,1,1,1,1,7,2,1,2,1,1,7,2,1,1,
  1,1,1,2,1,1,1,1,7,2,3,1,1,3,3,1,3,3,3,3,3,3,2,9,9,5,3,3,9,9,9,9,9,9,9,9,9,
  3,3,3,3,2,9,9,5,3,3,3,9,9,9,9,2,9,9,5,3,3,3,9,9,9,9,9,9,9,9,9,9,9,9,9,2,9,
  9,5,3,3,3,3,1,1,5,3,1,3,1,7,3,1,7,3,3,3,3,2,9,9,3,5,3,3,9,9,9,9,2,9,9,3,5,
  3,3,3,2,1,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,
  1,1,1,1,1,1,1,1,3,1,2,1,4,4,3,3,3,3,3,3,3,3,3,3,3,3,3,2,9,9,1,1,7,2,1,3,3,
  3,3,3,1,3,1,1,1,1,1,2,1,4,4,3,3,3,3,3,3,3,3,3,9,9,9,9,2,9,9,1,1,7,2,1,3,3,
  3,3,3,3,1,3,1,1,1,1,1,2,1,1,7,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,7,2,1,1,
  1,1,1,1,1,1,1,1,1,1,1,1,1,3,7,3,2,1,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,
  1,5,7,2,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,1,1,1,1,1,3,7,1,5,2,
  7,1,1,1,1,2,1,7,1,1,1,1,7,1,3,1,7,3,1,1,7,2,9,9,1,1,7,2,3,3,3,3,1,3,3,2,1,
  1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  2,1,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,3,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  1,1,1,1,1,1,1,1,5,2,1,1,7,2,1,1,1,1,2,1,1,7,2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,
  1,7,2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,7,2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,4,4,3,
  3,3,3,3,3,3,3,3,3,3,3,3,2,9,9,1,1,7,2,1,3,3,3,3,3,1,3,1,1,1,2,1,4,4,3,3,3,
  3,3,3,3,3,3,9,9,9,9,2,9,9,1,1,7,2,1,3,3,3,3,3,3,1,3,1,1,1,2,1,4,4,1,1,1,1,
  1,1,1,1,1,1,1,1,1,1,2,1,1,7,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,2,1,
  1,1,1,1,1,1,1,1,1,1,1,4,4,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,8,1,1,1,1,1,
  1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,4,4,1,1,1,1,1,1,
  1,1,1,1,1,1,1,1,2,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,5,1,
  5,7,3,3,2,1,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,7,1,1,1,1,1,1,1,1,1,1,1,
  1,1,1,1,1,1,1,1,1,3,1,1,5,1,5,7,3,3,2,1,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,
  1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,2,1,1,7,2,1,1,1,1,1,1,1,
  1,1,1,1,1,1,5,3,1,2,1,1,1,1,7,2,3,1,1,1,3,3,3,3,3,3,3,1,3,3,1,5,3,5,1,5,7,
  3,2,1,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  1,1,1,1,1,1,3,1,1,5,3,5,1,5,7,3,2,7,1,1,1,1,5,1,5,7,3,3,1,7,1,5,2,1,4,4,1,
  1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,3,1,1,1,5,3,1,9,
  5,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,3,1,2,1,1,1,1,1,1,1,1,1,1,
  1,1,1,1,1,1,7,1,1,1,1,1,3,1,3,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,
  1,3,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,3,1,9,9,1,1,1,1,5,2,1,
  4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,
  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,1,5,1,1,5,1,
  1,1,1,5,1,1,5,1,5,1,5,1,5,1,5,1,1,5,3,7,3,3,3,3,2,9,9,5,3,3,9,9,9,9,2,9,9,
  5,3,3,3,2,1,4,4,3,3,3,3,3,3,3,3,3,3,3,3,3,2,9,9,1,5,1,5,1,7,2,3,3,3,3,3,3,
  1,3,3,3,3,1,3,3,3,1,2,1,1,1,5,2,3,1,3,3,3,3,3,3,1,3,3,3,1,2,1,4,4,3,3,3,3,
  3,3,3,3,3,9,9,9,9,2,9,9,1,5,1,5,1,7,2,3,3,3,3,3,3,3,1,3,3,3,3,1,3,3,3,1,2,
  1,1,1,5,2,3,1,3,3,3,3,3,3,1,3,3,3,1,1,5,3,7,1,3,7,2,1,1,1,1,1,1,1,1,1,1,1,
  1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,7,2,1,1,1,2,1,1,
  1,1,7,2,3,1,1,3,1,3,1,1,5,3,1,5,1,5,7,3,2,1,1,7,2,1,1,1,1,1,1,1,1,1,2,1,1,
  1,1,7,2,3,1,1,1,3,3,3,3,3,3,1,3,5,1,5,7,3,5,1,5,7,3,5,1,5,7,3,1,1,1,1,1,1,
  1,1,1,1,1,5,1,1,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
  5,5,5,5,5,5,5,5,5,5,5,7,2,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,
  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,7,3,7,2,7,1,1,1,1,7,2,1,1,1,1,1,1,1,1,1,
  1,1,1,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,7,1,7,3,7,1,7,2,1,1,1,1,1,1,1,1,1,1,1,
  1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,2,1,1,1,1,1,1,1,1,
  1,1,1,3,1,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,3,1,1,1,1,1,1,1,1,1,1,1,1,1,
  1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,5,5,5,5,5,5,5,5,5,5,5,7,2,1,1,1,1,1,1,1,
  1,1,1,1,1,4,4,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,8,1,1,1,1,1,1,1,1,1,1,1,
  1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,
  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,
  1,2,1,1,7,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,2,1,1,1,1,1,1,1,1,1,1,
  1,1,1,1,1,1,1,7,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,2,1,4,4,1,1,1,1,
  1,1,1,1,1,1,1,1,1,1,2,1,1,7,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,2,1,
  4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,7,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  1,1,1,3,1,1,7,1,1,1,7,2,1,1,7,2,1,1,1,1,1,1,1,1,1,1,1,1,7,2,1,4,4,1,1,1,1,
  1,1,1,1,1,1,1,1,1,2,1,1,3,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,9,9,
  1,1,7,2,3,3,1,3,3,3,3,3,3,3,1,3,3,2,1,1,7,2,1,1,1,1,1,1,1,1,1,1,1,2,1,4,4,
  1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,7,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  1,3,3,1,7,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  1,1,1,1,3,3,2,7,1,1,1,2,1,4,4,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,
  1,1,1,1,1,9,9,5,3,9,9,5,3,9,9,9,9,9,9,9,9,9,9,9,5,3,3,2,1,4,4,3,3,3,3,3,3,
  3,3,3,9,9,1,1,1,7,2,1,3,3,3,3,1,3,3,3,1,1,1,2,1,1,1,7,2,1,1,1,3,3,1,1,1,1,
  1,1,1,1,1,3,1,7,3,1,7,2,1,4,4,3,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,
  1,1,3,1,1,2,1,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,
  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,
  1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,7,
  3,3,3,2,7,3,3,3,2,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,
  1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,
  1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,4,4,3,3,3,3,3,3,3,3,3,9,9,1,1,5,1,7,3,3,3,3,
  1,3,3,3,3,3,1,1,1,1,5,3,3,3,3,1,1,7,1,3,7,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  1,7,1,1,1,1,1,3,1,3,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,3,1,3,2,
  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,3,1,3,2,1,1,1,1,1,1,1,1,1,1,1,
  1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,
  1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,2,1,1,1,
  1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,
  1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,
  1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,
  2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,
  1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,
  1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,
  1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,
  1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,
  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,4,
  4,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,3,1,7,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,5,2,3,1,1,3,3,3,1,3,3,3,1,2,1,4,4,1,
  1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,3,1,7,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,5,2,3,1,1,1,3,3,3,3,3,3,1,3,3,3,1,2,
  3,1,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  1,3,2,7,3,3,7,1,3,1,7,3,1,2,9,9,1,1,7,2,3,3,3,1,3,2,1,1,7,2,1,1,1,1,1,1,1,
  1,1,2,9,9,1,1,7,2,3,3,1,3,3,3,3,3,3,1,3,2,1,1,7,2,1,1,1,1,1,1,1,1,1,2,1,1,
  1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,3,2,1,
  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,
  7,3,7,2,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  1,1,1,1,1,1,1,1,7,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,
  1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,
  1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,
  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,8,1,1,1,1,1,1,1,1,
  1,1,1,1,1,1,1,1,7,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,
  3,3,3,1,7,2,1,1,1,1,1,1,1,1,1,1,1,1,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,3,
  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,2,1,1,1,1,1,1,
  1,1,1,1,1,3,1,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,3,1,1,1,1,1,1,1,1,1,1,1,
  1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,7,1,1,5,3,1,1,3,1,7,1,1,1,
  1,5,3,1,2,1,1,7,2,1,1,1,1,1,1,1,1,1,1,1,1,3,1,7,1,1,5,1,5,7,3,2,1,4,4,3,1,
  1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,3,1,1,2,1,1,1,1,1,1,1,1,1,1,1,
  1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,5,1,5,7,3,3,5,1,5,7,3,
  3,2,1,1,1,7,2,1,3,3,1,1,1,2,1,1,1,7,2,1,1,1,3,3,1,1,1,1,1,1,1,1,1,3,7,1,3,
  7,1,3,7,2,1,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,3,1,7,1,1,1,1,1,1,1,1,
  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,1,3,3,3,3,1,2,1,1,1,1,1,1,1,
  1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,3,1,3,1,1,1,5,1,1,1,5,1,1,5,1,1,5,1,1,5,1,1,
  5,1,1,5,1,1,5,1,1,1,1,5,1,1,1,1,5,1,1,5,1,5,1,5,1,5,1,1,7,1,5,3,7,3,7,1,7,
  2,9,9,1,1,1,5,2,3,3,3,3,3,1,3,3,3,1,2,9,9,1,1,1,5,2,3,3,1,3,3,3,3,3,3,1,3,
  3,3,1,2,1,1,7,2,1,1,1,1,1,1,1,1,1,1,7,1,7,1,1,7,1,1,7,1,1,7,2,1,1,1,1,1,1,
  1,1,1,1,1,1,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,3,1,1,1,1,1,1,1,1,1,1,1,1,
  1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,1,7,1,3,1,7,1,1,2,1,1,1,1,1,1,1,1,1,
  1,1,1,1,1,1,1,7,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,3,9,9,1,1,1,5,3,3,3,
  3,3,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  1,1,3,1,1,5,3,1,2,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,
  1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,
  1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,8,1,1,1,1,1,1,1,1,1,
  1,1,1,1,1,1,1,7,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,
  3,3,2,1,1,1,1,1,1,1,1,1,1,1,1,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,3,1,1,1,
  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,2,1,1,1,1,1,1,1,1,1,
  1,1,1,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,
  1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,1,7,1,1,7,1,5,2,1,1,1,1,1,1,1,1,1,8,
  1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,7,2,1,1,1,1,
  1,1,1,1,1,1,1,1,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,3,1,1,1,1,1,1,1,1,1,1,
  1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,1,7,2,1,1,1,1,1,1,1,1,1,1,1,1,8,1,
  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  1,1,1,1,3,3,3,3,3,3,11
};


static const unsigned short far ag_pstt[] = {
312,1,148,148,6,6,6,6,6,6,6,6,6,16,16,16,16,132,15,15,4,3,21,0,0,20,21,287,
  20,13,12,11,10,16,19,15,18,17,8,7,6,5,16,15,6,12,5,2,12,20,20,14,19,9,
  19,14,
312,23,1,22,22,22,
24,24,2,146,24,
312,4,3,3,287,25,27,26,27,25,
312,28,28,4,3,4,287,282,28,28,290,282,9,282,290,
126,126,126,126,132,131,131,102,126,131,
119,119,119,119,119,119,119,119,119,112,112,112,112,132,118,118,100,112,118,
  119,
128,128,128,128,132,128,128,99,128,128,128,
115,115,115,115,115,115,115,115,115,114,114,114,114,132,114,114,97,114,114,
  114,115,
29,30,280,284,31,
90,32,10,
89,33,11,
120,120,120,120,132,125,125,88,101,120,125,
122,122,122,122,132,122,122,87,98,122,122,122,
312,1,148,148,39,6,6,6,6,6,6,6,6,6,37,37,37,37,132,36,36,14,38,13,12,11,10,
  37,36,35,34,8,7,6,5,37,36,6,12,5,2,12,247,38,
312,1,148,148,117,117,117,117,117,117,117,117,117,104,104,104,104,132,107,
  107,4,3,15,287,41,104,107,117,124,130,2,124,40,41,9,41,40,
312,1,148,148,113,113,113,113,113,113,113,113,113,105,105,105,105,132,105,
  105,4,3,16,287,43,105,105,105,113,121,127,2,121,42,43,9,43,42,
312,47,45,17,287,48,49,46,49,44,49,49,49,49,49,48,9,48,44,
312,47,45,18,287,51,52,46,52,50,52,52,52,52,52,51,9,51,50,
39,241,19,242,
312,1,148,148,6,6,6,6,6,6,6,6,6,16,16,16,16,132,15,15,4,3,2,20,287,238,13,
  12,11,10,16,19,15,18,17,8,7,6,5,16,15,6,12,5,2,12,238,238,14,19,9,19,14,
3,21,
53,171,
312,23,54,54,54,55,
312,57,24,56,56,56,
58,25,
29,288,30,26,284,31,
59,27,
312,107,107,4,3,28,287,283,107,291,283,9,283,291,
312,62,62,62,62,62,62,61,63,64,301,66,60,65,65,65,65,65,29,65,60,65,65,65,
  67,62,67,67,68,69,70,71,72,73,74,75,76,77,77,
312,1,148,148,6,6,6,6,6,6,6,6,6,82,82,82,82,132,80,80,299,30,86,79,78,82,80,
  83,81,8,7,6,5,82,80,6,78,5,2,78,85,84,84,86,
87,298,
312,89,88,32,287,91,91,90,91,
312,93,92,33,287,94,94,46,94,94,94,94,94,94,94,90,94,
312,93,92,34,287,49,49,46,49,49,49,49,49,49,49,90,49,
312,93,92,35,287,52,52,46,52,52,52,52,52,52,52,90,52,
312,1,148,148,117,117,117,117,117,117,117,117,117,104,104,104,104,132,107,
  107,89,88,36,287,95,104,107,117,124,130,2,124,95,90,95,
312,1,148,148,113,113,113,113,113,113,113,113,113,105,105,105,105,132,105,
  105,89,88,37,287,96,105,105,105,113,121,127,2,121,96,90,96,
312,1,148,148,39,6,6,6,6,6,6,6,6,6,37,37,37,37,132,36,36,38,223,13,12,11,10,
  37,36,35,34,8,7,6,5,37,36,6,12,5,2,12,252,
312,100,101,102,103,104,105,106,107,108,110,111,1,148,148,218,39,6,6,6,6,6,
  6,6,6,6,37,37,37,37,132,36,36,109,62,62,62,62,62,62,61,63,64,66,60,65,
  65,65,65,65,39,113,65,60,65,99,98,65,112,98,97,62,67,67,68,69,70,71,72,
  73,74,75,76,98,109,115,13,12,11,10,37,36,35,34,8,7,6,5,37,36,6,12,114,2,
  12,113,113,113,113,113,113,115,113,
312,1,148,148,39,6,6,6,6,6,6,6,6,6,37,37,37,37,132,36,36,40,116,13,12,11,10,
  37,36,35,34,8,7,6,5,37,36,6,12,5,2,12,251,116,
39,202,117,202,41,92,246,
312,1,148,148,39,6,6,6,6,6,6,6,6,6,37,37,37,37,132,36,36,42,118,13,12,11,10,
  37,36,35,34,8,7,6,5,37,36,6,12,5,2,12,250,118,
39,202,117,202,43,91,245,
312,1,148,148,39,6,6,6,6,6,6,6,6,6,37,37,37,37,132,36,36,44,119,13,12,11,10,
  37,36,35,34,8,7,6,5,37,36,6,12,5,2,12,249,119,
312,47,122,45,287,120,25,121,123,123,121,120,27,26,27,25,
29,124,261,262,31,
312,125,125,47,126,47,287,282,125,125,46,265,290,272,265,265,272,282,9,282,
  290,
39,258,244,
202,117,202,49,95,
312,1,148,148,39,6,6,6,6,6,6,6,6,6,37,37,37,37,132,36,36,50,127,13,12,11,10,
  37,36,35,34,8,7,6,5,37,36,6,12,5,2,12,248,127,
39,258,243,
202,117,202,52,94,
312,53,54,54,54,128,
174,129,174,54,172,
169,130,55,
131,151,
312,1,148,148,134,134,134,134,134,134,134,134,134,135,135,57,133,135,136,
  134,132,135,134,133,132,2,133,139,139,138,137,
29,124,293,294,31,
29,124,285,286,31,
10,13,
312,62,62,62,62,62,62,61,63,64,140,60,65,65,65,65,65,61,65,60,65,65,65,29,
  62,
312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,62,65,60,65,65,65,28,62,
  28,
312,62,62,62,62,62,62,61,63,64,141,60,65,65,65,65,65,63,65,60,65,65,65,27,
  62,
312,62,62,62,62,62,62,61,63,64,141,60,65,65,65,65,65,64,65,60,65,65,65,26,
  62,
22,21,142,143,145,144,25,
312,1,148,148,134,134,134,134,134,134,134,134,134,146,146,62,62,62,62,62,62,
  61,63,64,66,60,65,65,65,65,65,66,65,60,65,65,149,65,149,97,62,67,148,67,
  68,69,70,71,72,73,74,75,76,149,133,146,147,134,132,146,134,133,132,2,
  133,
150,151,152,43,
153,154,46,
155,156,49,
157,158,159,160,54,
161,162,57,
163,59,
164,61,
165,63,
166,65,
167,168,67,
302,77,
120,120,120,120,132,125,125,101,120,125,
122,122,122,122,132,122,122,98,122,122,122,
312,1,148,148,117,117,117,117,117,117,117,117,117,104,104,104,104,132,107,
  107,170,191,29,191,169,80,287,193,104,107,117,124,130,2,124,192,192,193,
  90,193,192,192,31,
312,172,29,171,187,287,189,46,188,190,188,190,190,189,90,189,188,188,31,
312,1,148,148,113,113,113,113,113,113,113,113,113,105,105,105,105,132,105,
  105,170,184,29,184,169,82,287,186,105,105,105,113,121,127,2,121,185,185,
  186,90,186,185,185,31,
312,172,29,171,180,287,182,46,181,183,181,183,183,182,90,182,181,181,31,
173,176,
300,85,
174,292,86,
312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,87,65,60,65,65,65,67,62,
  67,67,68,69,70,71,72,73,74,75,76,175,175,
312,89,88,88,287,27,176,27,
312,177,177,89,88,89,287,282,177,177,282,90,282,
29,124,280,284,31,
202,117,202,91,93,
312,93,178,92,287,120,121,123,123,121,120,27,176,27,
312,179,179,93,180,93,287,282,179,179,46,265,272,265,265,272,282,90,282,
202,117,202,94,96,
202,117,202,95,92,
202,117,202,96,91,
181,181,181,181,181,181,181,181,181,181,181,37,181,
182,86,
11,11,11,11,11,11,11,11,11,11,11,11,196,11,11,11,11,11,11,11,11,11,11,11,11,
  11,11,11,11,11,11,11,11,11,11,11,11,11,11,99,
312,183,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,100,65,60,65,65,98,
  65,98,97,62,67,67,68,69,70,71,72,73,74,75,76,98,183,
235,101,
234,102,
312,103,184,184,184,
185,104,
312,100,101,102,103,104,105,106,107,108,110,111,39,109,62,62,62,62,62,62,61,
  63,64,66,60,65,65,65,65,65,105,186,65,60,65,99,98,65,112,98,97,62,67,67,
  68,69,70,71,72,73,74,75,76,98,109,112,186,186,186,186,186,186,
187,106,
188,107,
189,108,
226,109,
190,110,
312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,111,65,60,65,65,65,67,
  62,67,67,68,69,70,71,72,73,74,75,76,191,191,
192,112,
312,100,101,102,103,104,105,106,107,108,110,111,220,39,109,62,62,62,62,62,
  62,61,63,64,66,60,65,65,65,65,65,113,225,65,60,65,99,98,65,112,98,97,62,
  67,67,68,69,70,71,72,73,74,75,76,98,109,112,225,225,225,225,225,225,
129,129,129,129,129,129,129,129,197,129,129,114,
312,100,101,102,103,104,105,106,107,108,110,111,1,148,148,219,39,6,6,6,6,6,
  6,6,6,6,37,37,37,37,132,36,36,109,62,62,62,62,62,62,61,63,64,66,60,65,
  65,65,65,65,115,193,65,60,65,99,98,65,112,98,97,62,67,67,68,69,70,71,72,
  73,74,75,76,98,109,223,13,12,11,10,37,36,35,34,8,7,6,5,37,36,6,12,114,2,
  12,193,193,193,193,193,193,193,
312,1,148,148,39,6,6,6,6,6,6,6,6,6,37,37,37,37,132,36,36,116,223,13,12,11,
  10,37,36,35,34,8,7,6,5,37,36,6,12,5,2,12,256,
312,194,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,117,65,60,65,65,65,
  203,97,62,67,67,68,69,70,71,72,73,74,75,76,203,203,
312,1,148,148,39,6,6,6,6,6,6,6,6,6,37,37,37,37,132,36,36,118,223,13,12,11,
  10,37,36,35,34,8,7,6,5,37,36,6,12,5,2,12,255,
312,1,148,148,39,6,6,6,6,6,6,6,6,6,37,37,37,37,132,36,36,119,223,13,12,11,
  10,37,36,35,34,8,7,6,5,37,36,6,12,5,2,12,254,
29,124,120,195,31,
196,121,
312,47,122,122,287,197,25,121,123,123,121,197,27,26,27,25,
198,123,
312,1,148,148,6,6,6,6,6,6,6,6,6,82,82,82,82,132,80,80,299,124,79,78,82,80,
  83,81,8,7,6,5,82,80,6,78,5,2,78,85,84,84,
312,107,107,47,199,125,287,283,107,46,266,291,273,266,266,273,283,9,283,291,
312,47,122,126,287,200,25,121,123,123,121,200,27,26,27,25,
312,1,148,148,39,6,6,6,6,6,6,6,6,6,37,37,37,37,132,36,36,127,223,13,12,11,
  10,37,36,35,34,8,7,6,5,37,36,6,12,5,2,12,253,
170,130,128,
312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,129,65,60,65,65,65,67,
  62,67,67,68,69,70,71,72,73,74,75,76,175,175,
312,130,201,201,201,
312,1,148,148,134,134,134,134,134,134,134,134,134,135,135,131,133,135,136,
  134,132,135,134,133,132,2,133,202,202,138,137,
131,131,102,131,
125,125,101,125,
119,119,119,119,119,119,119,119,119,118,118,100,118,119,
312,1,148,148,117,117,117,117,117,117,117,117,117,107,107,203,89,88,135,287,
  204,107,117,124,130,2,124,158,158,204,90,204,
312,203,93,92,136,287,205,205,46,160,160,205,205,205,205,205,205,205,90,205,
157,206,137,
156,207,138,
312,1,148,148,149,134,134,134,134,134,134,134,134,134,135,135,139,133,135,
  136,134,132,135,134,133,132,2,133,155,138,137,
312,1,148,148,134,134,134,134,134,134,134,134,134,146,146,62,62,62,62,62,62,
  61,63,64,66,60,65,65,65,65,65,140,65,60,65,65,149,65,149,97,62,67,208,
  67,68,69,70,71,72,73,74,75,76,149,133,146,147,134,132,146,134,133,132,2,
  133,
312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,141,65,60,65,65,149,65,
  149,97,62,67,67,68,69,70,71,72,73,74,75,76,149,
312,142,20,20,20,
312,143,19,19,19,
312,62,62,62,62,62,62,61,63,64,17,66,60,65,65,65,65,65,144,65,60,65,65,65,
  209,209,97,62,67,67,68,69,70,71,72,73,74,75,76,209,
312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,145,65,60,65,65,210,65,
  210,97,62,67,67,68,69,70,71,72,73,74,75,76,210,
312,1,148,148,117,117,117,117,117,117,117,117,117,107,107,212,29,200,211,
  146,107,117,124,130,2,124,201,201,201,201,31,
212,29,211,198,199,199,199,199,31,
213,148,
182,14,149,
312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,150,65,60,65,65,65,42,
  62,42,
312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,151,65,60,65,65,65,41,
  62,41,
312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,152,65,60,65,65,65,40,
  62,40,
312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,153,65,60,65,65,65,214,
  62,214,214,
312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,154,65,60,65,65,65,215,
  62,215,215,
312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,155,65,60,65,65,65,67,
  62,67,67,216,
312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,156,65,60,65,65,65,67,
  62,67,67,217,
312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,157,65,60,65,65,65,67,
  62,67,67,68,218,
312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,158,65,60,65,65,65,67,
  62,67,67,68,219,
312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,159,65,60,65,65,65,67,
  62,67,67,68,220,
312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,160,65,60,65,65,65,67,
  62,67,67,68,221,
312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,161,65,60,65,65,65,67,
  62,67,67,68,69,222,
312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,162,65,60,65,65,65,67,
  62,67,67,68,69,223,
312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,163,65,60,65,65,65,67,
  62,67,67,68,69,70,224,
312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,164,65,60,65,65,65,67,
  62,67,67,68,69,70,71,225,
312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,165,65,60,65,65,65,67,
  62,67,67,68,69,70,71,72,226,
312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,166,65,60,65,65,65,67,
  62,67,67,68,69,70,71,72,73,227,
312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,167,65,60,65,65,228,65,
  228,97,62,67,67,68,69,70,71,72,73,74,75,76,228,
312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,168,65,60,65,65,65,67,
  62,67,67,68,69,70,71,72,73,74,229,
312,1,148,148,6,6,6,6,6,6,6,6,6,82,82,82,82,132,80,80,170,29,299,169,169,
  287,79,78,82,80,83,81,8,7,6,5,82,80,6,78,5,2,78,85,84,84,230,27,176,27,
  232,231,31,
312,233,233,170,29,169,304,287,282,233,233,306,306,282,90,282,306,306,31,
312,1,148,148,6,6,6,6,6,6,6,6,6,82,82,82,82,132,80,80,172,29,299,171,171,
  287,79,78,82,80,83,81,8,7,6,5,82,80,6,78,5,2,78,85,84,84,230,123,123,27,
  176,27,232,231,31,
312,234,234,172,29,171,304,287,282,234,234,46,306,265,306,265,265,282,90,
  282,306,306,31,
312,177,1,148,148,6,6,6,6,6,6,6,6,6,82,82,82,82,132,80,80,173,79,78,82,80,
  83,81,8,7,6,5,82,80,6,78,5,2,78,179,
312,174,195,
303,175,
29,288,124,176,284,31,
312,107,107,89,88,177,287,283,107,283,90,283,
312,93,178,178,287,197,121,123,123,121,197,27,176,27,
312,107,107,93,235,179,287,283,107,46,266,273,266,266,273,283,90,283,
312,93,178,180,287,200,121,123,123,121,200,27,176,27,
312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,181,65,60,65,65,65,70,
  97,62,67,67,68,69,70,71,72,73,74,75,76,70,
312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,182,65,60,65,65,65,83,
  97,62,67,67,68,69,70,71,72,73,74,75,76,83,
236,183,
233,184,
312,236,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,185,65,60,65,65,98,
  65,98,97,62,67,67,68,69,70,71,72,73,74,75,76,98,236,
237,186,
312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,187,65,60,65,65,238,65,
  238,97,62,67,67,68,69,70,71,72,73,74,75,76,238,
312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,188,65,60,65,65,239,65,
  239,97,62,67,67,68,69,70,71,72,73,74,75,76,239,
312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,189,65,60,65,65,240,65,
  240,97,62,67,67,68,69,70,71,72,73,74,75,76,240,
312,100,101,102,103,104,105,106,107,108,110,111,39,109,62,62,62,62,62,62,61,
  63,64,66,60,65,65,65,65,65,190,217,65,60,65,99,98,65,112,98,97,62,67,67,
  68,69,70,71,72,73,74,75,76,98,109,112,217,217,217,217,217,217,
241,191,
312,100,101,102,103,104,105,106,107,108,110,111,39,109,62,62,62,62,62,62,61,
  63,64,66,60,65,65,65,65,65,192,215,65,60,65,99,98,65,112,98,97,62,67,67,
  68,69,70,71,72,73,74,75,76,98,109,112,215,215,215,215,215,215,
312,100,101,102,103,104,105,106,107,108,110,111,221,39,109,62,62,62,62,62,
  62,61,63,64,66,60,65,65,65,65,65,193,225,65,60,65,99,98,65,112,98,97,62,
  67,67,68,69,70,71,72,73,74,75,76,98,109,112,225,225,225,225,225,225,
312,194,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,194,65,60,65,65,65,
  242,97,62,67,67,68,69,70,71,72,73,74,75,76,242,242,242,
275,195,
29,124,274,276,31,
29,278,124,197,195,31,
29,124,267,268,31,
312,47,122,199,287,243,25,121,123,123,121,243,27,26,27,25,
29,270,124,200,195,31,
174,129,174,201,173,
312,1,148,148,150,134,134,134,134,134,134,134,134,134,135,135,202,133,135,
  136,134,132,135,134,133,132,2,133,155,138,137,
312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,203,65,60,65,65,65,67,
  62,67,67,68,69,70,71,72,73,74,75,76,168,168,
166,203,166,204,164,164,
166,203,166,205,162,162,
312,203,89,88,206,287,204,159,159,204,90,204,
312,203,93,92,207,287,205,205,46,161,161,205,205,205,205,205,205,205,90,205,
30,208,
244,18,209,
182,16,210,
312,1,148,148,6,6,6,6,6,6,6,6,6,82,82,82,82,132,80,80,212,29,299,211,211,79,
  78,82,80,83,81,8,7,6,5,82,80,6,78,5,2,78,85,84,84,230,232,231,31,
245,245,212,29,211,304,245,245,306,306,306,306,31,
312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,213,65,60,65,65,65,38,
  62,38,
150,151,152,45,
150,151,152,44,
153,154,48,
153,154,47,
155,156,53,
155,156,52,
155,156,51,
155,156,50,
157,158,159,160,56,
157,158,159,160,55,
161,162,58,
163,60,
164,62,
165,64,
246,182,228,
166,66,
310,230,
309,231,
247,232,
312,107,107,170,29,169,305,287,283,107,307,307,283,90,283,307,307,31,
312,107,107,172,29,171,305,287,283,107,46,307,266,307,266,266,283,90,283,
  307,307,31,
312,93,178,235,287,243,121,123,123,121,243,27,176,27,
248,236,
249,237,
182,250,238,
182,251,239,
182,252,240,
312,100,101,102,103,104,105,106,107,108,110,111,39,109,62,62,62,62,62,62,61,
  63,64,66,60,65,65,65,65,65,241,216,65,60,65,99,98,65,112,98,97,62,67,67,
  68,69,70,71,72,73,74,75,76,98,109,112,216,216,216,216,216,216,
204,253,242,
29,271,124,243,195,31,
312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,244,65,60,65,65,65,24,
  97,62,67,67,68,69,70,71,72,73,74,75,76,24,
107,107,212,29,211,305,107,307,307,307,307,31,
312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,246,65,60,65,65,65,67,
  62,67,67,68,69,70,71,72,73,74,75,76,68,
29,124,308,311,31,
312,254,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,248,65,60,65,65,98,
  65,98,97,62,67,67,68,69,70,71,72,73,74,75,76,98,254,
312,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,249,65,60,65,65,255,65,
  255,97,62,67,67,68,69,70,71,72,73,74,75,76,255,
312,100,101,102,103,104,105,106,107,108,110,111,39,109,62,62,62,62,62,62,61,
  63,64,66,60,65,65,65,65,65,250,230,65,60,65,99,98,65,112,98,97,62,67,67,
  68,69,70,71,72,73,74,75,76,98,109,112,230,230,230,230,230,230,
312,100,101,102,103,104,105,106,107,108,110,111,39,109,62,62,62,62,62,62,61,
  63,64,66,60,65,65,65,65,65,251,229,65,60,65,99,98,65,112,98,97,62,67,67,
  68,69,70,71,72,73,74,75,76,98,109,112,229,229,229,229,229,229,
312,100,101,102,103,104,105,106,107,108,110,111,39,109,62,62,62,62,62,62,61,
  63,64,66,60,65,65,65,65,65,252,256,65,60,65,99,98,65,112,98,97,62,67,67,
  68,69,70,71,72,73,74,75,76,98,109,112,256,256,256,256,256,256,
312,205,194,62,62,62,62,62,62,61,63,64,66,60,65,65,65,65,65,253,65,60,65,65,
  65,208,97,62,67,67,68,69,70,71,72,73,74,75,76,208,208,
257,254,
182,258,255,
259,227,
312,62,62,62,62,62,62,61,63,64,260,66,60,65,65,65,65,65,257,65,60,65,65,98,
  65,98,97,62,67,67,68,69,70,71,72,73,74,75,76,98,260,
231,258,
312,100,101,102,103,104,105,106,107,108,110,111,39,109,62,62,62,62,62,62,61,
  63,64,66,60,65,65,65,65,65,259,228,65,60,65,99,98,65,112,98,97,62,67,67,
  68,69,70,71,72,73,74,75,76,98,109,112,228,228,228,228,228,228,
261,260,
312,100,101,102,103,104,105,106,107,108,110,111,39,109,62,62,62,62,62,62,61,
  63,64,66,60,65,65,65,65,65,261,232,65,60,65,99,98,65,112,98,97,62,67,67,
  68,69,70,71,72,73,74,75,76,98,109,112,232,232,232,232,232,232,
  0
};


static const unsigned short far ag_sbt[] = {
     0,  56,  62,  67,  77,  92, 102, 122, 133, 154, 159, 162, 165, 176,
   188, 232, 269, 307, 326, 345, 349, 402, 404, 406, 412, 418, 420, 426,
   428, 442, 481, 525, 527, 536, 553, 570, 587, 622, 658, 701, 804, 848,
   855, 899, 906, 950, 966, 971, 992, 995,1000,1044,1047,1052,1058,1063,
  1066,1068,1099,1104,1109,1111,1136,1162,1187,1212,1219,1284,1288,1291,
  1294,1299,1302,1304,1306,1308,1310,1313,1315,1325,1336,1379,1398,1442,
  1461,1463,1465,1468,1506,1514,1527,1532,1537,1551,1570,1575,1580,1585,
  1598,1600,1640,1681,1683,1685,1690,1692,1754,1756,1758,1760,1762,1764,
  1802,1804,1867,1879,1981,2024,2064,2107,2150,2155,2157,2173,2175,2217,
  2237,2253,2296,2299,2337,2342,2373,2377,2381,2395,2427,2447,2450,2453,
  2484,2549,2588,2593,2598,2638,2677,2708,2717,2719,2722,2748,2774,2800,
  2827,2854,2882,2910,2939,2968,2997,3026,3056,3086,3117,3149,3182,3216,
  3255,3290,3343,3362,3417,3440,3480,3483,3485,3491,3503,3517,3535,3549,
  3587,3625,3627,3629,3670,3672,3711,3750,3789,3851,3853,3915,3978,4019,
  4021,4026,4032,4037,4053,4059,4064,4095,4133,4139,4145,4157,4177,4179,
  4182,4185,4234,4247,4273,4277,4281,4284,4287,4290,4293,4296,4299,4304,
  4309,4312,4314,4316,4318,4321,4323,4325,4327,4329,4347,4369,4383,4385,
  4387,4390,4393,4396,4458,4461,4467,4505,4517,4554,4559,4600,4639,4701,
  4763,4825,4866,4868,4871,4873,4914,4916,4978,4980,5042
};


static const unsigned short far ag_sbe[] = {
    23,  58,  64,  70,  82,  99, 118, 129, 149, 156, 161, 164, 173, 184,
   209, 254, 291, 310, 329, 347, 372, 403, 405, 407, 414, 419, 423, 427,
   433, 460, 502, 526, 530, 539, 556, 573, 609, 644, 679, 751, 825, 852,
   876, 903, 927, 953, 968, 976, 993, 998,1021,1045,1050,1053,1061,1065,
  1067,1083,1101,1106,1110,1128,1153,1179,1204,1218,1250,1287,1290,1293,
  1298,1301,1303,1305,1307,1309,1312,1314,1322,1332,1361,1383,1423,1446,
  1462,1464,1467,1485,1509,1519,1529,1535,1540,1556,1573,1578,1583,1596,
  1599,1639,1658,1682,1684,1686,1691,1722,1755,1757,1759,1761,1763,1781,
  1803,1835,1878,1929,2002,2042,2085,2128,2152,2156,2160,2174,2196,2222,
  2240,2274,2298,2316,2338,2357,2375,2379,2392,2413,2431,2449,2452,2469,
  2515,2566,2589,2594,2616,2655,2696,2711,2718,2721,2739,2765,2791,2817,
  2844,2871,2899,2927,2956,2985,3014,3043,3073,3103,3134,3166,3199,3233,
  3272,3314,3349,3386,3423,3461,3481,3484,3488,3496,3506,3522,3538,3566,
  3604,3626,3628,3647,3671,3689,3728,3767,3819,3852,3883,3946,3996,4020,
  4023,4029,4034,4040,4056,4062,4080,4112,4136,4142,4149,4161,4178,4181,
  4184,4209,4239,4264,4276,4280,4283,4286,4289,4292,4295,4298,4303,4308,
  4311,4313,4315,4317,4320,4322,4324,4326,4328,4335,4353,4372,4384,4386,
  4389,4392,4395,4426,4460,4464,4484,4510,4534,4556,4577,4617,4669,4731,
  4793,4844,4867,4870,4872,4891,4915,4946,4979,5010,5042
};


static const unsigned char far ag_fl[] = {
  1,0,1,2,1,1,1,1,1,1,2,1,1,1,3,1,4,3,4,3,3,2,2,1,3,1,2,2,2,2,4,1,1,1,1,
  1,1,1,4,1,3,3,3,1,3,3,1,3,3,1,3,3,3,3,1,3,3,1,3,1,3,1,3,1,3,1,3,1,5,1,
  3,1,1,1,1,1,1,1,1,1,1,1,1,3,1,0,1,2,2,2,2,3,3,4,3,3,4,1,1,1,1,1,1,1,2,
  2,1,2,1,1,1,1,2,2,2,2,1,2,2,2,2,2,2,1,2,2,2,2,2,1,2,2,1,1,1,1,1,1,1,1,
  1,1,1,1,1,1,2,1,0,4,5,2,1,1,1,2,2,2,2,3,2,3,2,1,2,1,0,1,2,4,5,2,2,4,0,
  2,1,3,1,3,1,2,2,2,1,2,2,1,2,2,2,1,2,2,1,3,1,1,1,2,1,2,0,2,3,4,1,1,3,1,
  1,1,1,1,1,3,4,3,2,3,3,4,1,2,1,2,2,5,7,5,5,7,9,3,2,2,3,1,2,1,1,2,2,3,3,
  3,3,2,3,3,3,3,3,4,4,4,4,1,1,1,1,1,2,1,1,2,3,3,4,1,4,5,2,3,3,4,4,1,3,1,
  1,1,2,3,2,3,4,1,3,1,2,3,4,3,4,1,1,1,1,2,3,2,3,4,1,2,2,3,3,3,3,4,1
};

static const unsigned char far ag_ptt[] = {
    0,  4,  4,  1,  6,  6,  6,  6,  6, 12, 12, 14, 14, 14, 14, 19, 19, 19,
   19, 19, 19, 19, 19, 22, 22, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31,
   31, 32, 32, 41, 41, 41, 41, 44, 44, 44, 45, 45, 45, 48, 48, 48, 48, 48,
   53, 53, 53, 56, 56, 57, 57, 59, 59, 61, 61, 63, 63, 65, 65, 28, 28, 68,
   68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 17, 17, 80, 81, 81, 82, 82, 82,
   82, 87, 87, 87, 86, 86, 86, 92, 92, 92, 94, 94, 94, 88, 88, 88, 91, 91,
  100,100,101,101, 95, 95, 95, 95, 97, 97, 97, 97, 83, 83, 83, 85, 85, 85,
   96, 96, 96, 98, 98, 98, 99, 99, 99, 99, 99,104,104,104,104,104,104,104,
  104,104,105,105,121,122,122,122,124,124,126,126,130,130,132,132,131,131,
  134,134,133,133,135,135,136,123,123,123,138,138,139,139,140,140,141,141,
  143,143,143,143,143,143,143,143,143,143,143,143,143,143,146,146, 24, 24,
   34, 34, 34, 34, 90, 90,147,147,147,148,148,  2,  2,  2,  2,  2,  2,149,
  149,149,150,150,150,150,157,157,158,158,151,152,152,152,153,153,153,154,
  154,154,154,  3,  3,169,169,169,170,170,170,170,170,170,170,170,170,170,
  170,170,170,170,170, 93, 93,172,172,145,145,145,175,175,175,176,176,173,
  173,173,173,173,177,177,177,178,178, 89, 89,179,179,179,181,181,181,180,
  180,171,171,171,182,182,182,144,144,144,174,174,174,185,185,185,183,183,
  183,183,184,184,184,184, 15
};

static const unsigned char far  *ag_valid(int ag_k) {
  const unsigned char far  *ag_tp = &ag_tstt[ag_sbt[(PCB).sn+1]];
  while (*--ag_tp != (unsigned char) ag_k) if (*ag_tp == 0) return NULL;
  return ag_tp;
}

int cc_change_reduction(cc_token_type ag_k) {
  if (!ag_valid(ag_k)) return 0;
  (PCB).reduction_token = ag_k;
  return 1;
}

static void ag_default(const  int *ag_tp) {
  (PCB).ag_dsn = (PCB).sn;
  (PCB).ag_dtl = ag_tp;
  while (!ag_valid((cc_token_type) *ag_tp)) ag_tp++;
  (PCB).reduction_token = (cc_token_type) *ag_tp;
}



static void ag_ra(void)
{
  switch(ag_rpx[(PCB).ag_ap]) {
    case 1: ag_rp_1(); break;
    case 2: ag_rp_2(V(0,(int *))); break;
    case 3: V(0,(int *)) = ag_rp_3(); break;
    case 4: ag_rp_4(V(0,(token *))); break;
    case 5: ag_default(&ag_rtt[0]); V(0,(token *)) = ag_rp_5(V(0,(token *))); break;
  }
}

#define TOKEN_NAMES cc_token_names
const char *const cc_token_names[187] = {
  "prog start",
  "prog start",
  "statement",
  "translation unit",
  "",
  "eof",
  "constant",
  "FLOATINGconstant",
  "INTEGERconstant",
  "OCTALconstant",
  "HEXconstant",
  "CHARACTERconstant",
  "string literal list",
  "STRINGliteral",
  "primary expression",
  "IDENTIFIER",
  "'('",
  "expression",
  "')'",
  "postfix expression",
  "'['",
  "']'",
  "argument expression list",
  "'.'",
  "identifier or typedef name",
  "ARROW",
  "ICR",
  "DECR",
  "assignment expression",
  "','",
  "unary expression",
  "unary operator",
  "cast expression",
  "SIZEOF",
  "type name",
  "'&'",
  "'*'",
  "'+'",
  "'-'",
  "'~'",
  "'!'",
  "multiplicative expression",
  "'/'",
  "'%'",
  "additive expression",
  "shift expression",
  "LS",
  "RS",
  "relational expression",
  "'<'",
  "'>'",
  "LE",
  "GE",
  "equality expression",
  "EQ",
  "NE",
  "AND expression",
  "exclusive OR expression",
  "'^'",
  "inclusive OR expression",
  "'|'",
  "logical AND expression",
  "ANDAND",
  "logical OR expression",
  "OROR",
  "conditional expression",
  "'\\?'",
  "':'",
  "assignment operator",
  "'='",
  "MULTassign",
  "DIVassign",
  "MODassign",
  "PLUSassign",
  "MINUSassign",
  "LSassign",
  "RSassign",
  "ANDassign",
  "ERassign",
  "ORassign",
  "constant expression",
  "expression opt",
  "declaration",
  "sue declaration specifier",
  "';'",
  "sue type specifier",
  "declaring list",
  "default declaring list",
  "declaration qualifier list",
  "identifier declarator",
  "initializer opt",
  "type qualifier list",
  "declaration specifier",
  "declarator",
  "type specifier",
  "basic declaration specifier",
  "typedef declaration specifier",
  "basic type specifier",
  "typedef type specifier",
  "storage class",
  "declaration qualifier",
  "type qualifier",
  "CONST",
  "VOLATILE",
  "basic type name",
  "elaborated type name",
  "TYPEDEFname",
  "TYPEDEF",
  "EXTERN",
  "STATIC",
  "AUTO",
  "REGISTER",
  "VOID",
  "CHAR",
  "SHORT",
  "INT",
  "LONG",
  "FLOAT",
  "DOUBLE",
  "SIGNED",
  "UNSIGNED",
  "save flag",
  "struct or union specifier",
  "enum specifier",
  "struct or union",
  "'{'",
  "struct declaration list",
  "'}'",
  "STRUCT",
  "UNION",
  "struct declaration",
  "struct declaring list",
  "struct default declaring list",
  "struct identifier declarator",
  "struct declarator",
  "bit field size opt",
  "bit field size",
  "ENUM",
  "enumerator list",
  "enumerator value opt",
  "parameter type list",
  "parameter list",
  "ELLIPSIS",
  "parameter declaration",
  "abstract declarator",
  "parameter typedef declarator",
  "identifier list",
  "initializer",
  "initializer list",
  "labeled statement",
  "compound statement",
  "expression statement",
  "selection statement",
  "iteration statement",
  "jump statement",
  "CASE",
  "DEFAULT",
  "declaration list",
  "statement list",
  "IF",
  "ELSE",
  "SWITCH",
  "WHILE",
  "DO",
  "FOR",
  "GOTO",
  "CONTINUE",
  "BREAK",
  "RETURN",
  "external definition",
  "function definition",
  "old function declarator",
  "typedef declarator",
  "paren typedef declarator",
  "postfixing abstract declarator",
  "clean typedef declarator",
  "clean postfix typedef declarator",
  "paren postfix typedef declarator",
  "simple paren typedef declarator",
  "unary identifier declarator",
  "paren identifier declarator",
  "postfix identifier declarator",
  "postfix old function declarator",
  "unary abstract declarator",
  "postfix abstract declarator",
  "array abstract declarator",
  "NAME",

};

#ifndef MISSING_FORMAT
#define MISSING_FORMAT "Missing %s"
#endif
#ifndef UNEXPECTED_FORMAT
#define UNEXPECTED_FORMAT "Unexpected %s"
#endif
#ifndef UNNAMED_TOKEN
#define UNNAMED_TOKEN "input"
#endif


static void ag_diagnose(void) {
  int ag_snd = (PCB).sn;
  int ag_k = ag_sbt[ag_snd];

  if (*TOKEN_NAMES[ag_tstt[ag_k]] && ag_astt[ag_k + 1] == ag_action_8) {
    sprintf((PCB).ag_msg, MISSING_FORMAT, TOKEN_NAMES[ag_tstt[ag_k]]);
  }
  else if (ag_astt[ag_sbe[(PCB).sn]] == ag_action_8
          && (ag_k = (int) ag_sbe[(PCB).sn] + 1) == (int) ag_sbt[(PCB).sn+1] - 1
          && *TOKEN_NAMES[ag_tstt[ag_k]]) {
    sprintf((PCB).ag_msg, MISSING_FORMAT, TOKEN_NAMES[ag_tstt[ag_k]]);
  }
  else if ((PCB).token_number && *TOKEN_NAMES[(PCB).token_number]) {
    sprintf((PCB).ag_msg, UNEXPECTED_FORMAT, TOKEN_NAMES[(PCB).token_number]);
  }
  else if (isprint(((PCB).input_code)) && ((PCB).input_code) != '\\') {
    char buf[20];
    sprintf(buf, "\'%c\'", (char) ((PCB).input_code));
    sprintf((PCB).ag_msg, UNEXPECTED_FORMAT, buf);
  }
  else sprintf((PCB).ag_msg, UNEXPECTED_FORMAT, UNNAMED_TOKEN);
  (PCB).error_message = (PCB).ag_msg;


}
static int ag_action_1_r_proc(void);
static int ag_action_2_r_proc(void);
static int ag_action_3_r_proc(void);
static int ag_action_4_r_proc(void);
static int ag_action_1_s_proc(void);
static int ag_action_3_s_proc(void);
static int ag_action_1_proc(void);
static int ag_action_2_proc(void);
static int ag_action_3_proc(void);
static int ag_action_4_proc(void);
static int ag_action_5_proc(void);
static int ag_action_6_proc(void);
static int ag_action_7_proc(void);
static int ag_action_8_proc(void);
static int ag_action_9_proc(void);
static int ag_action_10_proc(void);
static int ag_action_11_proc(void);
static int ag_action_8_proc(void);


static int (*const  ag_r_procs_scan[])(void) = {
  ag_action_1_r_proc,
  ag_action_2_r_proc,
  ag_action_3_r_proc,
  ag_action_4_r_proc
};

static int (*const  ag_s_procs_scan[])(void) = {
  ag_action_1_s_proc,
  ag_action_2_r_proc,
  ag_action_3_s_proc,
  ag_action_4_r_proc
};

static int (*const  ag_gt_procs_scan[])(void) = {
  ag_action_1_proc,
  ag_action_2_proc,
  ag_action_3_proc,
  ag_action_4_proc,
  ag_action_5_proc,
  ag_action_6_proc,
  ag_action_7_proc,
  ag_action_8_proc,
  ag_action_9_proc,
  ag_action_10_proc,
  ag_action_11_proc,
  ag_action_8_proc
};


static int ag_action_10_proc(void) {
  (PCB).btsx = 0, (PCB).drt = -1;
  ag_track();
  return 0;
}

static int ag_action_11_proc(void) {
  (PCB).btsx = 0, (PCB).drt = -1;
  (*(token *) &(PCB).vs[(PCB).ssx]) = (PCB).input_value;
  (PCB).ssx--;
  ag_ra();
  (PCB).ssx++;
  ag_track();
  return 0;
}

static int ag_action_3_r_proc(void) {
  int ag_sd = ag_fl[(PCB).ag_ap] - 1;
  if (ag_sd) (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd];
  (PCB).btsx = 0, (PCB).drt = -1;
  (PCB).reduction_token = (cc_token_type) ag_ptt[(PCB).ag_ap];
  ag_ra();
  return (PCB).exit_flag == AG_RUNNING_CODE;
}

static int ag_action_3_s_proc(void) {
  int ag_sd = ag_fl[(PCB).ag_ap] - 1;
  if (ag_sd) (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd];
  (PCB).btsx = 0, (PCB).drt = -1;
  (PCB).reduction_token = (cc_token_type) ag_ptt[(PCB).ag_ap];
  ag_ra();
  return (PCB).exit_flag == AG_RUNNING_CODE;
}

static int ag_action_4_r_proc(void) {
  int ag_sd = ag_fl[(PCB).ag_ap] - 1;
  if (ag_sd) (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd];
  (PCB).reduction_token = (cc_token_type) ag_ptt[(PCB).ag_ap];
  return 1;
}

static int ag_action_2_proc(void) {
  (PCB).btsx = 0, (PCB).drt = -1;
  if ((PCB).ssx >= 128) {
    ag_trace_error();
    (PCB).exit_flag = AG_STACK_ERROR_CODE;
    PARSER_STACK_OVERFLOW;
  }
  (*(token *) &(PCB).vs[(PCB).ssx]) = (PCB).input_value;
  (PCB).ss[(PCB).ssx] = (PCB).sn;
  (PCB).ssx++;
  (PCB).sn = (PCB).ag_ap;
  ag_track();
  return 0;
}

static int ag_action_9_proc(void) {
  if ((PCB).drt == -1) {
    (PCB).drt=(PCB).token_number;
    (PCB).dssx=(PCB).ssx;
    (PCB).dsn=(PCB).sn;
  }
  ag_prot();
  (PCB).ss[(PCB).ssx] = (PCB).sn;
  (PCB).ssx++;
  (PCB).sn = (PCB).ag_ap;
  return (PCB).exit_flag == AG_RUNNING_CODE;
}

static int ag_action_2_r_proc(void) {
  (PCB).ssx++;
  (PCB).sn = (PCB).ag_ap;
  return 0;
}

static int ag_action_7_proc(void) {
  --(PCB).ssx;
  (PCB).exit_flag = AG_SUCCESS_CODE;
  return 0;
}

static int ag_action_1_proc(void) {
  (PCB).exit_flag = AG_SUCCESS_CODE;
  ag_track();
  return 0;
}

static int ag_action_1_r_proc(void) {
  (PCB).exit_flag = AG_SUCCESS_CODE;
  return 0;
}

static int ag_action_1_s_proc(void) {
  (PCB).exit_flag = AG_SUCCESS_CODE;
  return 0;
}

static int ag_action_4_proc(void) {
  int ag_sd = ag_fl[(PCB).ag_ap] - 1;
  (PCB).reduction_token = (cc_token_type) ag_ptt[(PCB).ag_ap];
  (PCB).btsx = 0, (PCB).drt = -1;
  (*(token *) &(PCB).vs[(PCB).ssx]) = (PCB).input_value;
  if (ag_sd) (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd];
  else (PCB).ss[(PCB).ssx] = (PCB).sn;
  ag_track();
  while ((PCB).exit_flag == AG_RUNNING_CODE) {
    unsigned ag_t1 = ag_sbe[(PCB).sn] + 1;
    unsigned ag_t2 = ag_sbt[(PCB).sn+1] - 1;
    do {
      unsigned ag_tx = (ag_t1 + ag_t2)/2;
      if (ag_tstt[ag_tx] < (unsigned char)(PCB).reduction_token) ag_t1 = ag_tx + 1;
      else ag_t2 = ag_tx;
    } while (ag_t1 < ag_t2);
    if (ag_tstt[ag_t1] != (PCB).reduction_token) {
      (PCB).exit_flag = AG_REDUCTION_ERROR_CODE; ag_trace_error();
      REDUCTION_TOKEN_ERROR; break;}
      (PCB).ag_ap = ag_pstt[ag_t1];
    if ((ag_s_procs_scan[ag_astt[ag_t1]])() == 0) break;
  }
  return 0;
}

static int ag_action_3_proc(void) {
  int ag_sd = ag_fl[(PCB).ag_ap] - 1;
  (PCB).btsx = 0, (PCB).drt = -1;
  (*(token *) &(PCB).vs[(PCB).ssx]) = (PCB).input_value;
  if (ag_sd) (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd];
  else (PCB).ss[(PCB).ssx] = (PCB).sn;
  ag_track();
  (PCB).reduction_token = (cc_token_type) ag_ptt[(PCB).ag_ap];
  ag_ra();
  while ((PCB).exit_flag == AG_RUNNING_CODE) {
    unsigned ag_t1 = ag_sbe[(PCB).sn] + 1;
    unsigned ag_t2 = ag_sbt[(PCB).sn+1] - 1;
    do {
      unsigned ag_tx = (ag_t1 + ag_t2)/2;
      if (ag_tstt[ag_tx] < (unsigned char)(PCB).reduction_token) ag_t1 = ag_tx + 1;
      else ag_t2 = ag_tx;
    } while (ag_t1 < ag_t2);
    if (ag_tstt[ag_t1] != (PCB).reduction_token) {
      (PCB).exit_flag = AG_REDUCTION_ERROR_CODE; ag_trace_error();
      REDUCTION_TOKEN_ERROR; break;}
      (PCB).ag_ap = ag_pstt[ag_t1];
    if ((ag_s_procs_scan[ag_astt[ag_t1]])() == 0) break;
  }
  return 0;
}

static int ag_action_8_proc(void) {
  ag_undo();
  ag_trace_error();
  (PCB).exit_flag = AG_SYNTAX_ERROR_CODE;
  ag_diagnose();
  SYNTAX_ERROR;
  ag_track();
  return (PCB).exit_flag == AG_RUNNING_CODE;
}

static int ag_action_5_proc(void) {
  int ag_sd = ag_fl[(PCB).ag_ap];
  (PCB).btsx = 0, (PCB).drt = -1;
  if (ag_sd) (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd];
  else {
    (PCB).ss[(PCB).ssx] = (PCB).sn;
  }
  (PCB).reduction_token = (cc_token_type) ag_ptt[(PCB).ag_ap];
  ag_ra();
  while ((PCB).exit_flag == AG_RUNNING_CODE) {
    unsigned ag_t1 = ag_sbe[(PCB).sn] + 1;
    unsigned ag_t2 = ag_sbt[(PCB).sn+1] - 1;
    do {
      unsigned ag_tx = (ag_t1 + ag_t2)/2;
      if (ag_tstt[ag_tx] < (unsigned char)(PCB).reduction_token) ag_t1 = ag_tx + 1;
      else ag_t2 = ag_tx;
    } while (ag_t1 < ag_t2);
    if (ag_tstt[ag_t1] != (PCB).reduction_token) {
      (PCB).exit_flag = AG_REDUCTION_ERROR_CODE; ag_trace_error();
      REDUCTION_TOKEN_ERROR; break;}
      (PCB).ag_ap = ag_pstt[ag_t1];
    if ((ag_r_procs_scan[ag_astt[ag_t1]])() == 0) break;
  }
  return (PCB).exit_flag == AG_RUNNING_CODE;
}

static int ag_action_6_proc(void) {
  int ag_sd = ag_fl[(PCB).ag_ap];
  (PCB).reduction_token = (cc_token_type) ag_ptt[(PCB).ag_ap];
  if ((PCB).drt == -1) {
    (PCB).drt=(PCB).token_number;
    (PCB).dssx=(PCB).ssx;
    (PCB).dsn=(PCB).sn;
  }
  if (ag_sd) {
    (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd];
  }
  else {
    ag_prot();
    (PCB).vs[(PCB).ssx] = ag_null_value;
    (PCB).ss[(PCB).ssx] = (PCB).sn;
  }
  while ((PCB).exit_flag == AG_RUNNING_CODE) {
    unsigned ag_t1 = ag_sbe[(PCB).sn] + 1;
    unsigned ag_t2 = ag_sbt[(PCB).sn+1] - 1;
    do {
      unsigned ag_tx = (ag_t1 + ag_t2)/2;
      if (ag_tstt[ag_tx] < (unsigned char)(PCB).reduction_token) ag_t1 = ag_tx + 1;
      else ag_t2 = ag_tx;
    } while (ag_t1 < ag_t2);
    if (ag_tstt[ag_t1] != (PCB).reduction_token) {
      (PCB).exit_flag = AG_REDUCTION_ERROR_CODE; ag_trace_error();
      REDUCTION_TOKEN_ERROR; break;}
      (PCB).ag_ap = ag_pstt[ag_t1];
    if ((ag_r_procs_scan[ag_astt[ag_t1]])() == 0) break;
  }
  return (PCB).exit_flag == AG_RUNNING_CODE;
}


void init_cc(void) {
  unsigned ag_t1;
  ag_t1 = 0;
  (PCB).ss[0] = (PCB).sn = (PCB).ssx = 0;
  (PCB).exit_flag = AG_RUNNING_CODE;
  (PCB).line = FIRST_LINE;
  (PCB).column = FIRST_COLUMN;
  (PCB).btsx = 0, (PCB).drt = -1;
  while (ag_tstt[ag_t1] == 0) {
    (PCB).ag_ap = ag_pstt[ag_t1];
    (ag_gt_procs_scan[ag_astt[ag_t1]])();
    ag_t1 = ag_sbt[(PCB).sn];
  }
}

void cc(void) {
  (PCB).token_number = (cc_token_type) AG_TCV((PCB).input_code);
  while (1) {
    unsigned ag_t1 = ag_sbt[(PCB).sn];
    unsigned ag_t2 = ag_sbe[(PCB).sn] - 1;
    do {
      unsigned ag_tx = (ag_t1 + ag_t2)/2;
      if (ag_tstt[ag_tx] > (unsigned char)(PCB).token_number)
        ag_t1 = ag_tx + 1;
      else ag_t2 = ag_tx;
    } while (ag_t1 < ag_t2);
    if (ag_tstt[ag_t1] != (unsigned char)(PCB).token_number)
      ag_t1 = ag_sbe[(PCB).sn];
    (PCB).ag_ap = ag_pstt[ag_t1];
    if ((ag_gt_procs_scan[ag_astt[ag_t1]])() == 0) break;
  }
}