Unverified Commit 0c6db356 authored by Tao Feng's avatar Tao Feng Committed by GitHub

Remove py27 Antlar presto sql usage extractor (#208)

* Remove py27 Antlar presto sql usage extractor

* remove more

* remove pytest macro
parent 97277402
...@@ -272,10 +272,6 @@ job = DefaultJob( ...@@ -272,10 +272,6 @@ job = DefaultJob(
job.launch() job.launch()
``` ```
#### [TblColUsgAggExtractor](https://github.com/lyft/amundsendatabuilder/blob/master/databuilder/extractor/table_column_usage_aggregate_extractor.py "TblColUsgAggExtractor")
An extractor that extracts table usage from SQL statements. It accept any extractor that extracts row from source that has SQL audit log. Once SQL statement is extracted, it uses [ANTLR](https://www.antlr.org/ "ANTLR") to parse and get tables and columns that it reads from. Also, it aggregates usage based on table and user. (Column level aggregation is not there yet.)
## List of transformers ## List of transformers
#### [ChainedTransformer](https://github.com/lyft/amundsendatabuilder/blob/master/databuilder/transformer/base_transformer.py#L41 "ChainedTransformer") #### [ChainedTransformer](https://github.com/lyft/amundsendatabuilder/blob/master/databuilder/transformer/base_transformer.py#L41 "ChainedTransformer")
A chanined transformer that can take multiple transformer. A chanined transformer that can take multiple transformer.
...@@ -296,9 +292,6 @@ job = DefaultJob( ...@@ -296,9 +292,6 @@ job = DefaultJob(
job.launch() job.launch()
``` ```
#### [SqlToTblColUsageTransformer](https://github.com/lyft/amundsendatabuilder/blob/master/databuilder/transformer/sql_to_table_col_usage_transformer.py "SqlToTblColUsageTransformer")
A SQL to usage transformer where it transforms to ColumnReader that has column, user, count. Currently it's collects on table level that column on same table will be de-duped. In many cases, "from" clause does not contain schema and this will be fetched via table name -> schema name mapping which it gets from metadata extractor.
## List of loader ## List of loader
#### [FsNeo4jCSVLoader](https://github.com/lyft/amundsendatabuilder/blob/master/databuilder/loader/file_system_neo4j_csv_loader.py "FsNeo4jCSVLoader") #### [FsNeo4jCSVLoader](https://github.com/lyft/amundsendatabuilder/blob/master/databuilder/loader/file_system_neo4j_csv_loader.py "FsNeo4jCSVLoader")
Write node and relationship CSV file(s) that can be consumed by Neo4jCsvPublisher. It assumes that the record it consumes is instance of Neo4jCsvSerializable. Write node and relationship CSV file(s) that can be consumed by Neo4jCsvPublisher. It assumes that the record it consumes is instance of Neo4jCsvSerializable.
......
from collections import namedtuple
import logging
from pyhocon import ConfigTree # noqa: F401
from typing import Dict, List, Any, Optional # noqa: F401
from databuilder import Scoped
from databuilder.transformer.base_transformer import NoopTransformer
from databuilder.extractor.base_extractor import Extractor
from databuilder.models.table_column_usage import ColumnReader, TableColumnUsage
from databuilder.transformer.base_transformer import ChainedTransformer
from databuilder.transformer.regex_str_replace_transformer import RegexStrReplaceTransformer
from databuilder.transformer.sql_to_table_col_usage_transformer import SqlToTblColUsageTransformer
TableColumnUsageTuple = namedtuple('TableColumnUsageTuple', ['database', 'cluster', 'schema',
'table', 'column', 'email'])
LOGGER = logging.getLogger(__name__)
# Config keys:
RAW_EXTRACTOR = 'raw_extractor'
class TblColUsgAggExtractor(Extractor):
"""
An aggregate extractor for table column usage.
It uses RegexStrReplaceTransformer to cleanse SQL statement and uses SqlToTblColUsageTransformer to get table
column usage.
All usage will be aggregated in memory and on last record, it will return aggregated TableColumnUsage
Note that this extractor will do all the transformation and aggregation so that no more transformation is needed,
after this.
"""
def init(self, conf):
# type: (ConfigTree) -> None
self._extractor = conf.get(RAW_EXTRACTOR) # type: Extractor
self._extractor.init(Scoped.get_scoped_conf(conf, self._extractor.get_scope()))
regex_transformer = RegexStrReplaceTransformer() # type: Any
if conf.get(regex_transformer.get_scope(), None):
regex_transformer.init(Scoped.get_scoped_conf(conf, regex_transformer.get_scope()))
else:
LOGGER.info('{} is not defined. Not using it'.format(regex_transformer.get_scope()))
regex_transformer = NoopTransformer()
sql_to_usage_transformer = SqlToTblColUsageTransformer()
sql_to_usage_transformer.init(Scoped.get_scoped_conf(conf, sql_to_usage_transformer.get_scope()))
self._transformer = ChainedTransformer((regex_transformer, sql_to_usage_transformer))
def extract(self):
# type: () -> Optional[TableColumnUsage]
"""
It aggregates all count per table and user in memory. Table level aggregation don't expect to occupy much
memory.
:return: Provides a record or None if no more to extract
"""
count_map = {} # type: Dict[TableColumnUsageTuple, int]
record = self._extractor.extract()
count = 0
while record:
count += 1
if count % 1000 == 0:
LOGGER.info('Aggregated {} records'.format(count))
tbl_col_usg = self._transformer.transform(record=record)
record = self._extractor.extract()
# filtered case
if not tbl_col_usg:
continue
for col_rdr in tbl_col_usg.col_readers:
key = TableColumnUsageTuple(database=col_rdr.database, cluster=col_rdr.cluster, schema=col_rdr.schema,
table=col_rdr.table, column=col_rdr.column, email=col_rdr.user_email)
new_count = count_map.get(key, 0) + col_rdr.read_count
count_map[key] = new_count
if not len(count_map):
return None
col_readers = [] # type: List[ColumnReader]
while len(count_map):
tbl_col_rdr_tuple, count = count_map.popitem()
col_readers.append(ColumnReader(database=tbl_col_rdr_tuple.database, cluster=tbl_col_rdr_tuple.cluster,
schema=tbl_col_rdr_tuple.schema, table=tbl_col_rdr_tuple.table,
column=tbl_col_rdr_tuple.column, user_email=tbl_col_rdr_tuple.email,
read_count=count))
return TableColumnUsage(col_readers=col_readers)
def get_scope(self):
# type: () -> str
return 'extractor.table_column_usage_aggregate'
def close(self):
# type: () -> None
self._transformer.close()
import copy
import logging
import six
from typing import Union, Iterable, Optional # noqa: F401
LOGGER = logging.getLogger(__name__)
def remove_double_quotes(val):
# type: (Union[str, None]) -> Union[str, None]
"""
Often times, column name, table name or any identifier comes with double quoted. This method will remove double
quotes.
:param val:
:return:
"""
if not val:
return val
if six.PY2 and isinstance(val, six.text_type):
val = val.encode('utf-8', 'ignore')
if val.startswith('"') and val.endswith('"'):
return val[1:-1]
return val
class Column(object):
"""
Column for usage.
"""
def __init__(self, name, table=None, col_alias=None):
# type: (str, Union[Table, None], Union[str, None]) -> None
self.col_name = remove_double_quotes(name)
self.table = table
self.col_alias = remove_double_quotes(col_alias)
def __repr__(self):
# type: () -> str
return 'Column(name={!r}, table={!r}, col_alias={!r})'.format(self.col_name, self.table, self.col_alias)
def resolve_col_name(self, col_name):
# type: (Union[str, None]) -> Union[str, None]
"""
Resolve column name for currently processing column.
e.g: SELECT bar from (SELECT foo as bar FROM foobar)
Above case, bar is trying to resolve with column foo that has alias bar. In this case, it will resolve to foo,
as that is the actual column name.
:param col_name:
:return:
"""
if self.col_name == '*':
return col_name
if col_name == self.col_alias or col_name == self.col_name:
return self.col_name
return None
@staticmethod
def resolve(select_col, from_cols):
# type: (Column, Iterable[Column]) -> Iterable[Column]
"""
Resolve processing column with processed columns. Processing column is the one from SELECT clause where it
does not have table information where it can optionally have table alias in front of column (foo.bar)
Processed columns are already resolved columns that it has column with table with it.
Resolving processing columns with processed columns means having processing columns choose correct processed
columns. The result is proper column name with table name.
e.g1: SELECT foo from foobar
- processing column: foo
- processed column: all columns from foobar
--> result: column 'foo' from 'foobar' table
e.g2: SELECT foo from (SELECT foo, bar FROM foobar)
- processing column: foo
- processed column: foo and bar columns from foobar
--> result: column 'foo' from 'foobar' table
:param select_col: column from select clause
:param from_cols: column from 'from' clause
:return: List of columns
"""
if LOGGER.isEnabledFor(logging.DEBUG):
LOGGER.debug('select_col: {}'.format(select_col))
LOGGER.debug('from_cols: {}'.format(from_cols))
if select_col.col_name != '*':
return Column.resolve_named_column(select_col, from_cols)
return Column._resolve_all_column(select_col, from_cols)
@staticmethod
def resolve_named_column(select_col, from_cols):
# type: (Column, Iterable[Column]) -> Iterable[Column]
"""
SELECT clause where column has name (not *)
e.g: SELECT foo, bar FROM foobar.
:param select_col: column from select clause
:param from_cols: column from 'from' clause
:return:
"""
# column name is defined and has table alias. (SELECT foo.bar)
if select_col.table:
for processed_col in from_cols:
# resolve column name as processing column name can be alias
col_name = processed_col.resolve_col_name(select_col.col_name)
if col_name and processed_col.table:
# resolve table name using alias
table = processed_col.table.resolve_table(select_col.table.name)
if table:
alias = Column.get_column_alias(select_col=select_col, from_col=processed_col)
col = Column(col_name, table=table, col_alias=alias)
return [col]
raise Exception('Cannot found case 1. select_col: {} , from_cols: {}'
.format(select_col, from_cols))
# col name defined but no table. (SELECT foo)
else:
sub_result = []
# Using column name only to find a match from processed column.
# Note that we can have a column name with multiple table as a result. This is the case that SQL engine
# resolves ambiguity by looking into actual columns in table. Here we use OrTable so that later on it
# can be disambiguated.
for processed_col in from_cols:
col_name = processed_col.resolve_col_name(select_col.col_name)
if col_name:
col = copy.deepcopy(processed_col)
col.col_name = col_name
alias = Column.get_column_alias(select_col=select_col, from_col=processed_col)
col.col_alias = alias
sub_result.append(col)
if not sub_result:
raise Exception('Cannot find case 2. select_col: {} , from_cols: {}'
.format(select_col, from_cols))
if len(sub_result) == 1:
return sub_result
tables = []
for col in sub_result:
tables.append(copy.deepcopy(col.table))
col = sub_result[0]
col.table = OrTable(tables)
return [col]
@staticmethod
def get_column_alias(select_col, from_col):
# type: (Column, Column) -> str
"""
Use processing column alias if not null.
:param select_col: column from select clause
:param from_col: column from 'from' clause
:return:
"""
return select_col.col_alias if select_col.col_alias else from_col.col_alias
@staticmethod
def _resolve_all_column(processing_col, processed_cols):
# type: (Column, Iterable[Column]) -> Iterable[Column]
"""
SELECT statement where column is '*'
e.g: SELECT * FROM foobar;
:param processed_cols:
:return:
"""
if processing_col.table:
result = []
# Select whatever we have in processed where it just need to match table
for processed_col in processed_cols:
if processed_col.table:
table = processed_col.table.resolve_table(processing_col.table.name)
if table:
col = copy.deepcopy(processed_col)
col.table = table
result.append(col)
if not result:
raise Exception('Cannot find case 3. select_col: {} , from_cols: {}'
.format(processing_col, processed_cols))
return result
# SELECT * case
else:
result = []
for processed_col in processed_cols:
result.append(copy.deepcopy(processed_col))
if not result:
raise Exception('Cannot find case 4. select_col: {} , from_cols: {}'
.format(processing_col, processed_cols))
return result
class Table(object):
"""
Table class for usage
"""
def __init__(self, name, schema=None, alias=None):
# type: (str, Union[str, None], Union[str, None]) -> None
self.name = remove_double_quotes(name)
self.schema = remove_double_quotes(schema)
self.alias = remove_double_quotes(alias)
def resolve_table(self, select_table_name):
# type: (Union[str, None]) -> Union[Table, None]
"""
If processing_table_name matches table return table instance
:param select_table_name: table in select clause
:return:
"""
if select_table_name == self.alias or select_table_name == self.name:
return self
return None
def __repr__(self):
# type: () -> str
return 'Table(name={!r}, schema={!r}, alias={!r})'.format(self.name, self.schema, self.alias)
class OrTable(Table):
"""
Table that holds multiple table. This is for ambiguous case.
For example, "SELECT a, b FROM foo JOIN bar USING c" statement does not tell if column a is from foo or bar.
Thus, column a is either from table foo or bar and this class represent this problem.
"""
def __init__(self, tables):
# type: (Iterable[Optional[Table]]) -> None
self.tables = tables
def resolve_table(self, select_table_name):
# type: (str) -> Optional[Table]
"""
If any of term matches with table return it
:param select_table_name:
:return:
"""
for table in self.tables:
if isinstance(table, OrTable):
result = table.resolve_table(select_table_name)
if result:
return result
continue
if select_table_name == table.alias or select_table_name == table.name:
return table
return None
def __repr__(self):
# type: () -> str
return 'OrTable(tables={!r})'.format(self.tables)
token literal names:
null
'.'
'('
')'
','
'?'
'->'
'['
']'
'=>'
'ADD'
'ALL'
'ALTER'
'ANALYZE'
'AND'
'ANY'
'ARRAY'
'AS'
'ASC'
'AT'
'BERNOULLI'
'BETWEEN'
'BY'
'CALL'
'CASCADE'
'CASE'
'CAST'
'CATALOGS'
'COALESCE'
'COLUMN'
'COLUMNS'
'COMMENT'
'COMMIT'
'COMMITTED'
'CONSTRAINT'
'CREATE'
'CROSS'
'CUBE'
'CURRENT'
'CURRENT_DATE'
'CURRENT_TIME'
'CURRENT_TIMESTAMP'
'CURRENT_USER'
'DATA'
'DATE'
'DAY'
'DEALLOCATE'
'DELETE'
'DESC'
'DESCRIBE'
'DISTINCT'
'DISTRIBUTED'
'DROP'
'ELSE'
'END'
'ESCAPE'
'EXCEPT'
'EXCLUDING'
'EXECUTE'
'EXISTS'
'EXPLAIN'
'EXTRACT'
'FALSE'
'FILTER'
'FIRST'
'FOLLOWING'
'FOR'
'FORMAT'
'FROM'
'FULL'
'FUNCTIONS'
'GRANT'
'GRANTS'
'GRAPHVIZ'
'GROUP'
'GROUPING'
'HAVING'
'HOUR'
'IF'
'IN'
'INCLUDING'
'INNER'
'INPUT'
'INSERT'
'INTEGER'
'INTERSECT'
'INTERVAL'
'INTO'
'IS'
'ISOLATION'
'JOIN'
'LAST'
'LATERAL'
'LEFT'
'LEVEL'
'LIKE'
'LIMIT'
'LOCALTIME'
'LOCALTIMESTAMP'
'LOGICAL'
'MAP'
'MINUTE'
'MONTH'
'NATURAL'
'NFC'
'NFD'
'NFKC'
'NFKD'
'NO'
'NORMALIZE'
'NOT'
'NULL'
'NULLIF'
'NULLS'
'ON'
'ONLY'
'OPTION'
'OR'
'ORDER'
'ORDINALITY'
'OUTER'
'OUTPUT'
'OVER'
'PARTITION'
'PARTITIONS'
'POSITION'
'PRECEDING'
'PREPARE'
'PRIVILEGES'
'PROPERTIES'
'PUBLIC'
'RANGE'
'READ'
'RECURSIVE'
'RENAME'
'REPEATABLE'
'REPLACE'
'RESET'
'RESTRICT'
'REVOKE'
'RIGHT'
'ROLLBACK'
'ROLLUP'
'ROW'
'ROWS'
'SCHEMA'
'SCHEMAS'
'SECOND'
'SELECT'
'SERIALIZABLE'
'SESSION'
'SET'
'SETS'
'SHOW'
'SMALLINT'
'SOME'
'START'
'STATS'
'SUBSTRING'
'SYSTEM'
'TABLE'
'TABLES'
'TABLESAMPLE'
'TEXT'
'THEN'
'TIME'
'TIMESTAMP'
'TINYINT'
'TO'
'TRANSACTION'
'TRUE'
'TRY_CAST'
'TYPE'
'UESCAPE'
'UNBOUNDED'
'UNCOMMITTED'
'UNION'
'UNNEST'
'USE'
'USING'
'VALIDATE'
'VALUES'
'VERBOSE'
'VIEW'
'WHEN'
'WHERE'
'WITH'
'WORK'
'WRITE'
'YEAR'
'ZONE'
'='
null
'<'
'<='
'>'
'>='
'+'
'-'
'*'
'/'
'%'
'||'
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
token symbolic names:
null
null
null
null
null
null
null
null
null
null
ADD
ALL
ALTER
ANALYZE
AND
ANY
ARRAY
AS
ASC
AT
BERNOULLI
BETWEEN
BY
CALL
CASCADE
CASE
CAST
CATALOGS
COALESCE
COLUMN
COLUMNS
COMMENT
COMMIT
COMMITTED
CONSTRAINT
CREATE
CROSS
CUBE
CURRENT
CURRENT_DATE
CURRENT_TIME
CURRENT_TIMESTAMP
CURRENT_USER
DATA
DATE
DAY
DEALLOCATE
DELETE
DESC
DESCRIBE
DISTINCT
DISTRIBUTED
DROP
ELSE
END
ESCAPE
EXCEPT
EXCLUDING
EXECUTE
EXISTS
EXPLAIN
EXTRACT
FALSE
FILTER
FIRST
FOLLOWING
FOR
FORMAT
FROM
FULL
FUNCTIONS
GRANT
GRANTS
GRAPHVIZ
GROUP
GROUPING
HAVING
HOUR
IF
IN
INCLUDING
INNER
INPUT
INSERT
INTEGER
INTERSECT
INTERVAL
INTO
IS
ISOLATION
JOIN
LAST
LATERAL
LEFT
LEVEL
LIKE
LIMIT
LOCALTIME
LOCALTIMESTAMP
LOGICAL
MAP
MINUTE
MONTH
NATURAL
NFC
NFD
NFKC
NFKD
NO
NORMALIZE
NOT
NULL
NULLIF
NULLS
ON
ONLY
OPTION
OR
ORDER
ORDINALITY
OUTER
OUTPUT
OVER
PARTITION
PARTITIONS
POSITION
PRECEDING
PREPARE
PRIVILEGES
PROPERTIES
PUBLIC
RANGE
READ
RECURSIVE
RENAME
REPEATABLE
REPLACE
RESET
RESTRICT
REVOKE
RIGHT
ROLLBACK
ROLLUP
ROW
ROWS
SCHEMA
SCHEMAS
SECOND
SELECT
SERIALIZABLE
SESSION
SET
SETS
SHOW
SMALLINT
SOME
START
STATS
SUBSTRING
SYSTEM
TABLE
TABLES
TABLESAMPLE
TEXT
THEN
TIME
TIMESTAMP
TINYINT
TO
TRANSACTION
TRUE
TRY_CAST
TYPE
UESCAPE
UNBOUNDED
UNCOMMITTED
UNION
UNNEST
USE
USING
VALIDATE
VALUES
VERBOSE
VIEW
WHEN
WHERE
WITH
WORK
WRITE
YEAR
ZONE
EQ
NEQ
LT
LTE
GT
GTE
PLUS
MINUS
ASTERISK
SLASH
PERCENT
CONCAT
STRING
UNICODE_STRING
BINARY_LITERAL
INTEGER_VALUE
DECIMAL_VALUE
DOUBLE_VALUE
IDENTIFIER
DIGIT_IDENTIFIER
QUOTED_IDENTIFIER
BACKQUOTED_IDENTIFIER
TIME_WITH_TIME_ZONE
TIMESTAMP_WITH_TIME_ZONE
DOUBLE_PRECISION
SIMPLE_COMMENT
BRACKETED_COMMENT
WS
UNRECOGNIZED
DELIMITER
rule names:
singleStatement
singleExpression
statement
query
with
tableElement
columnDefinition
likeClause
properties
property
queryNoWith
queryTerm
queryPrimary
sortItem
querySpecification
groupBy
groupingElement
groupingExpressions
groupingSet
namedQuery
setQuantifier
selectItem
relation
joinType
joinCriteria
sampledRelation
sampleType
aliasedRelation
columnAliases
relationPrimary
expression
booleanExpression
predicated
predicate
valueExpression
primaryExpression
string
timeZoneSpecifier
comparisonOperator
comparisonQuantifier
booleanValue
interval
intervalField
normalForm
type
typeParameter
baseType
whenClause
filter
over
windowFrame
frameBound
explainOption
transactionMode
levelOfIsolation
callArgument
privilege
qualifiedName
identifier
number
nonReserved
atn:
[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 222, 1505, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 144, 10, 4, 3, 4, 3, 4, 3, 4, 5, 4, 149, 10, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 155, 10, 4, 3, 4, 3, 4, 5, 4, 159, 10, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 173, 10, 4, 3, 4, 3, 4, 5, 4, 177, 10, 4, 3, 4, 3, 4, 5, 4, 181, 10, 4, 3, 4, 3, 4, 5, 4, 185, 10, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 193, 10, 4, 3, 4, 3, 4, 5, 4, 197, 10, 4, 3, 4, 5, 4, 200, 10, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 207, 10, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 7, 4, 214, 10, 4, 12, 4, 14, 4, 217, 11, 4, 3, 4, 3, 4, 3, 4, 5, 4, 222, 10, 4, 3, 4, 3, 4, 5, 4, 226, 10, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 232, 10, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 239, 10, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 248, 10, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 283, 10, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 294, 10, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 7, 4, 303, 10, 4, 12, 4, 14, 4, 306, 11, 4, 5, 4, 308, 10, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 7, 4, 316, 10, 4, 12, 4, 14, 4, 319, 11, 4, 3, 4, 3, 4, 5, 4, 323, 10, 4, 3, 4, 3, 4, 5, 4, 327, 10, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 335, 10, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 341, 10, 4, 3, 4, 3, 4, 3, 4, 7, 4, 346, 10, 4, 12, 4, 14, 4, 349, 11, 4, 3, 4, 3, 4, 5, 4, 353, 10, 4, 3, 4, 3, 4, 5, 4, 357, 10, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 367, 10, 4, 3, 4, 5, 4, 370, 10, 4, 3, 4, 3, 4, 5, 4, 374, 10, 4, 3, 4, 5, 4, 377, 10, 4, 3, 4, 3, 4, 3, 4, 3, 4, 7, 4, 383, 10, 4, 12, 4, 14, 4, 386, 11, 4, 3, 4, 3, 4, 5, 4, 390, 10, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 405, 10, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 411, 10, 4, 5, 4, 413, 10, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 419, 10, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 425, 10, 4, 5, 4, 427, 10, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 433, 10, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 7, 4, 472, 10, 4, 12, 4, 14, 4, 475, 11, 4, 5, 4, 477, 10, 4, 3, 4, 3, 4, 5, 4, 481, 10, 4, 3, 4, 3, 4, 5, 4, 485, 10, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 493, 10, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 7, 4, 500, 10, 4, 12, 4, 14, 4, 503, 11, 4, 5, 4, 505, 10, 4, 3, 4, 3, 4, 5, 4, 509, 10, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 7, 4, 525, 10, 4, 12, 4, 14, 4, 528, 11, 4, 5, 4, 530, 10, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 538, 10, 4, 3, 5, 5, 5, 541, 10, 5, 3, 5, 3, 5, 3, 6, 3, 6, 5, 6, 547, 10, 6, 3, 6, 3, 6, 3, 6, 7, 6, 552, 10, 6, 12, 6, 14, 6, 555, 11, 6, 3, 7, 3, 7, 5, 7, 559, 10, 7, 3, 8, 3, 8, 3, 8, 3, 8, 5, 8, 565, 10, 8, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 571, 10, 9, 3, 10, 3, 10, 3, 10, 3, 10, 7, 10, 577, 10, 10, 12, 10, 14, 10, 580, 11, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 7, 12, 594, 10, 12, 12, 12, 14, 12, 597, 11, 12, 5, 12, 599, 10, 12, 3, 12, 3, 12, 5, 12, 603, 10, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 611, 10, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 617, 10, 13, 3, 13, 7, 13, 620, 10, 13, 12, 13, 14, 13, 623, 11, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 7, 14, 632, 10, 14, 12, 14, 14, 14, 635, 11, 14, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 641, 10, 14, 3, 15, 3, 15, 5, 15, 645, 10, 15, 3, 15, 3, 15, 5, 15, 649, 10, 15, 3, 16, 3, 16, 5, 16, 653, 10, 16, 3, 16, 3, 16, 3, 16, 7, 16, 658, 10, 16, 12, 16, 14, 16, 661, 11, 16, 3, 16, 3, 16, 3, 16, 3, 16, 7, 16, 667, 10, 16, 12, 16, 14, 16, 670, 11, 16, 5, 16, 672, 10, 16, 3, 16, 3, 16, 5, 16, 676, 10, 16, 3, 16, 3, 16, 3, 16, 5, 16, 681, 10, 16, 3, 16, 3, 16, 5, 16, 685, 10, 16, 3, 17, 5, 17, 688, 10, 17, 3, 17, 3, 17, 3, 17, 7, 17, 693, 10, 17, 12, 17, 14, 17, 696, 11, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 704, 10, 18, 12, 18, 14, 18, 707, 11, 18, 5, 18, 709, 10, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 717, 10, 18, 12, 18, 14, 18, 720, 11, 18, 5, 18, 722, 10, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 731, 10, 18, 12, 18, 14, 18, 734, 11, 18, 3, 18, 3, 18, 5, 18, 738, 10, 18, 3, 19, 3, 19, 3, 19, 3, 19, 7, 19, 744, 10, 19, 12, 19, 14, 19, 747, 11, 19, 5, 19, 749, 10, 19, 3, 19, 3, 19, 5, 19, 753, 10, 19, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 759, 10, 20, 12, 20, 14, 20, 762, 11, 20, 5, 20, 764, 10, 20, 3, 20, 3, 20, 5, 20, 768, 10, 20, 3, 21, 3, 21, 5, 21, 772, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 23, 3, 23, 5, 23, 783, 10, 23, 3, 23, 5, 23, 786, 10, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 5, 23, 793, 10, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 812, 10, 24, 7, 24, 814, 10, 24, 12, 24, 14, 24, 817, 11, 24, 3, 25, 5, 25, 820, 10, 25, 3, 25, 3, 25, 5, 25, 824, 10, 25, 3, 25, 3, 25, 5, 25, 828, 10, 25, 3, 25, 3, 25, 5, 25, 832, 10, 25, 5, 25, 834, 10, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 7, 26, 843, 10, 26, 12, 26, 14, 26, 846, 11, 26, 3, 26, 3, 26, 5, 26, 850, 10, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 859, 10, 27, 3, 28, 3, 28, 3, 29, 3, 29, 5, 29, 865, 10, 29, 3, 29, 3, 29, 5, 29, 869, 10, 29, 5, 29, 871, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 877, 10, 30, 12, 30, 14, 30, 880, 11, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 7, 31, 894, 10, 31, 12, 31, 14, 31, 897, 11, 31, 3, 31, 3, 31, 3, 31, 5, 31, 902, 10, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 5, 31, 913, 10, 31, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 921, 10, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 7, 33, 929, 10, 33, 12, 33, 14, 33, 932, 11, 33, 3, 34, 3, 34, 5, 34, 936, 10, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 5, 35, 948, 10, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 5, 35, 956, 10, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 7, 35, 963, 10, 35, 12, 35, 14, 35, 966, 11, 35, 3, 35, 3, 35, 3, 35, 5, 35, 971, 10, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 5, 35, 979, 10, 35, 3, 35, 3, 35, 3, 35, 3, 35, 5, 35, 985, 10, 35, 3, 35, 3, 35, 5, 35, 989, 10, 35, 3, 35, 3, 35, 3, 35, 5, 35, 994, 10, 35, 3, 35, 3, 35, 3, 35, 5, 35, 999, 10, 35, 3, 36, 3, 36, 3, 36, 3, 36, 5, 36, 1005, 10, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 7, 36, 1019, 10, 36, 12, 36, 14, 36, 1022, 11, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 6, 37, 1048, 10, 37, 13, 37, 14, 37, 1049, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 7, 37, 1059, 10, 37, 12, 37, 14, 37, 1062, 11, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 1071, 10, 37, 3, 37, 5, 37, 1074, 10, 37, 3, 37, 3, 37, 3, 37, 5, 37, 1079, 10, 37, 3, 37, 3, 37, 3, 37, 7, 37, 1084, 10, 37, 12, 37, 14, 37, 1087, 11, 37, 5, 37, 1089, 10, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 7, 37, 1096, 10, 37, 12, 37, 14, 37, 1099, 11, 37, 5, 37, 1101, 10, 37, 3, 37, 3, 37, 5, 37, 1105, 10, 37, 3, 37, 5, 37, 1108, 10, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 7, 37, 1118, 10, 37, 12, 37, 14, 37, 1121, 11, 37, 5, 37, 1123, 10, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 6, 37, 1140, 10, 37, 13, 37, 14, 37, 1141, 3, 37, 3, 37, 5, 37, 1146, 10, 37, 3, 37, 3, 37, 3, 37, 3, 37, 6, 37, 1152, 10, 37, 13, 37, 14, 37, 1153, 3, 37, 3, 37, 5, 37, 1158, 10, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 7, 37, 1181, 10, 37, 12, 37, 14, 37, 1184, 11, 37, 5, 37, 1186, 10, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 1195, 10, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 1201, 10, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 1207, 10, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 1213, 10, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 1223, 10, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 1232, 10, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 7, 37, 1252, 10, 37, 12, 37, 14, 37, 1255, 11, 37, 5, 37, 1257, 10, 37, 3, 37, 5, 37, 1260, 10, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 7, 37, 1270, 10, 37, 12, 37, 14, 37, 1273, 11, 37, 3, 38, 3, 38, 3, 38, 3, 38, 5, 38, 1279, 10, 38, 5, 38, 1281, 10, 38, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 5, 39, 1289, 10, 39, 3, 40, 3, 40, 3, 41, 3, 41, 3, 42, 3, 42, 3, 43, 3, 43, 5, 43, 1299, 10, 43, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 1305, 10, 43, 3, 44, 3, 44, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 7, 46, 1332, 10, 46, 12, 46, 14, 46, 1335, 11, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 7, 46, 1344, 10, 46, 12, 46, 14, 46, 1347, 11, 46, 3, 46, 3, 46, 5, 46, 1351, 10, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 5, 46, 1358, 10, 46, 3, 46, 3, 46, 7, 46, 1362, 10, 46, 12, 46, 14, 46, 1365, 11, 46, 3, 47, 3, 47, 5, 47, 1369, 10, 47, 3, 48, 3, 48, 3, 48, 3, 48, 5, 48, 1375, 10, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 7, 51, 1395, 10, 51, 12, 51, 14, 51, 1398, 11, 51, 5, 51, 1400, 10, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 7, 51, 1407, 10, 51, 12, 51, 14, 51, 1410, 11, 51, 5, 51, 1412, 10, 51, 3, 51, 5, 51, 1415, 10, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 5, 52, 1435, 10, 52, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 5, 53, 1446, 10, 53, 3, 54, 3, 54, 3, 54, 3, 54, 5, 54, 1452, 10, 54, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 5, 55, 1459, 10, 55, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 5, 56, 1468, 10, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 5, 57, 1475, 10, 57, 3, 58, 3, 58, 3, 58, 3, 58, 5, 58, 1481, 10, 58, 3, 59, 3, 59, 3, 59, 7, 59, 1486, 10, 59, 12, 59, 14, 59, 1489, 11, 59, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 5, 60, 1496, 10, 60, 3, 61, 3, 61, 3, 61, 5, 61, 1501, 10, 61, 3, 62, 3, 62, 3, 62, 2, 8, 24, 46, 64, 70, 72, 90, 63, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 2, 24, 4, 2, 26, 26, 140, 140, 4, 2, 70, 70, 81, 81, 4, 2, 68, 68, 116, 116, 4, 2, 13, 13, 208, 208, 4, 2, 59, 59, 82, 82, 4, 2, 58, 58, 178, 178, 4, 2, 20, 20, 50, 50, 4, 2, 66, 66, 93, 93, 4, 2, 13, 13, 52, 52, 4, 2, 22, 22, 161, 161, 3, 2, 199, 200, 3, 2, 201, 203, 3, 2, 193, 198, 5, 2, 13, 13, 17, 17, 157, 157, 4, 2, 64, 64, 172, 172, 7, 2, 47, 47, 79, 79, 103, 104, 149, 149, 191, 191, 3, 2, 106, 109, 4, 2, 67, 67, 128, 128, 4, 2, 75, 75, 165, 165, 5, 2, 53, 53, 101, 101, 182, 182, 4, 2, 117, 117, 190, 190, 45, 2, 12, 13, 15, 15, 17, 18, 20, 22, 25, 26, 29, 35, 40, 40, 45, 47, 50, 50, 53, 53, 59, 59, 62, 62, 65, 67, 69, 69, 72, 75, 79, 80, 82, 82, 84, 84, 86, 86, 88, 88, 91, 91, 93, 94, 96, 96, 98, 98, 101, 104, 106, 110, 114, 115, 117, 118, 121, 121, 123, 128, 130, 134, 136, 141, 143, 143, 145, 149, 151, 161, 163, 165, 167, 171, 173, 174, 176, 177, 180, 180, 182, 182, 184, 185, 189, 192, 2, 1742, 2, 124, 3, 2, 2, 2, 4, 127, 3, 2, 2, 2, 6, 537, 3, 2, 2, 2, 8, 540, 3, 2, 2, 2, 10, 544, 3, 2, 2, 2, 12, 558, 3, 2, 2, 2, 14, 560, 3, 2, 2, 2, 16, 566, 3, 2, 2, 2, 18, 572, 3, 2, 2, 2, 20, 583, 3, 2, 2, 2, 22, 587, 3, 2, 2, 2, 24, 604, 3, 2, 2, 2, 26, 640, 3, 2, 2, 2, 28, 642, 3, 2, 2, 2, 30, 650, 3, 2, 2, 2, 32, 687, 3, 2, 2, 2, 34, 737, 3, 2, 2, 2, 36, 752, 3, 2, 2, 2, 38, 767, 3, 2, 2, 2, 40, 769, 3, 2, 2, 2, 42, 778, 3, 2, 2, 2, 44, 792, 3, 2, 2, 2, 46, 794, 3, 2, 2, 2, 48, 833, 3, 2, 2, 2, 50, 849, 3, 2, 2, 2, 52, 851, 3, 2, 2, 2, 54, 860, 3, 2, 2, 2, 56, 862, 3, 2, 2, 2, 58, 872, 3, 2, 2, 2, 60, 912, 3, 2, 2, 2, 62, 914, 3, 2, 2, 2, 64, 920, 3, 2, 2, 2, 66, 933, 3, 2, 2, 2, 68, 998, 3, 2, 2, 2, 70, 1004, 3, 2, 2, 2, 72, 1259, 3, 2, 2, 2, 74, 1280, 3, 2, 2, 2, 76, 1288, 3, 2, 2, 2, 78, 1290, 3, 2, 2, 2, 80, 1292, 3, 2, 2, 2, 82, 1294, 3, 2, 2, 2, 84, 1296, 3, 2, 2, 2, 86, 1306, 3, 2, 2, 2, 88, 1308, 3, 2, 2, 2, 90, 1357, 3, 2, 2, 2, 92, 1368, 3, 2, 2, 2, 94, 1374, 3, 2, 2, 2, 96, 1376, 3, 2, 2, 2, 98, 1381, 3, 2, 2, 2, 100, 1387, 3, 2, 2, 2, 102, 1434, 3, 2, 2, 2, 104, 1445, 3, 2, 2, 2, 106, 1451, 3, 2, 2, 2, 108, 1458, 3, 2, 2, 2, 110, 1467, 3, 2, 2, 2, 112, 1474, 3, 2, 2, 2, 114, 1480, 3, 2, 2, 2, 116, 1482, 3, 2, 2, 2, 118, 1495, 3, 2, 2, 2, 120, 1500, 3, 2, 2, 2, 122, 1502, 3, 2, 2, 2, 124, 125, 5, 6, 4, 2, 125, 126, 7, 2, 2, 3, 126, 3, 3, 2, 2, 2, 127, 128, 5, 62, 32, 2, 128, 129, 7, 2, 2, 3, 129, 5, 3, 2, 2, 2, 130, 538, 5, 8, 5, 2, 131, 132, 7, 180, 2, 2, 132, 538, 5, 118, 60, 2, 133, 134, 7, 180, 2, 2, 134, 135, 5, 118, 60, 2, 135, 136, 7, 3, 2, 2, 136, 137, 5, 118, 60, 2, 137, 538, 3, 2, 2, 2, 138, 139, 7, 37, 2, 2, 139, 143, 7, 147, 2, 2, 140, 141, 7, 80, 2, 2, 141, 142, 7, 112, 2, 2, 142, 144, 7, 61, 2, 2, 143, 140, 3, 2, 2, 2, 143, 144, 3, 2, 2, 2, 144, 145, 3, 2, 2, 2, 145, 148, 5, 116, 59, 2, 146, 147, 7, 188, 2, 2, 147, 149, 5, 18, 10, 2, 148, 146, 3, 2, 2, 2, 148, 149, 3, 2, 2, 2, 149, 538, 3, 2, 2, 2, 150, 151, 7, 54, 2, 2, 151, 154, 7, 147, 2, 2, 152, 153, 7, 80, 2, 2, 153, 155, 7, 61, 2, 2, 154, 152, 3, 2, 2, 2, 154, 155, 3, 2, 2, 2, 155, 156, 3, 2, 2, 2, 156, 158, 5, 116, 59, 2, 157, 159, 9, 2, 2, 2, 158, 157, 3, 2, 2, 2, 158, 159, 3, 2, 2, 2, 159, 538, 3, 2, 2, 2, 160, 161, 7, 14, 2, 2, 161, 162, 7, 147, 2, 2, 162, 163, 5, 116, 59, 2, 163, 164, 7, 136, 2, 2, 164, 165, 7, 170, 2, 2, 165, 166, 5, 118, 60, 2, 166, 538, 3, 2, 2, 2, 167, 168, 7, 37, 2, 2, 168, 172, 7, 162, 2, 2, 169, 170, 7, 80, 2, 2, 170, 171, 7, 112, 2, 2, 171, 173, 7, 61, 2, 2, 172, 169, 3, 2, 2, 2, 172, 173, 3, 2, 2, 2, 173, 174, 3, 2, 2, 2, 174, 176, 5, 116, 59, 2, 175, 177, 5, 58, 30, 2, 176, 175, 3, 2, 2, 2, 176, 177, 3, 2, 2, 2, 177, 180, 3, 2, 2, 2, 178, 179, 7, 33, 2, 2, 179, 181, 5, 74, 38, 2, 180, 178, 3, 2, 2, 2, 180, 181, 3, 2, 2, 2, 181, 184, 3, 2, 2, 2, 182, 183, 7, 188, 2, 2, 183, 185, 5, 18, 10, 2, 184, 182, 3, 2, 2, 2, 184, 185, 3, 2, 2, 2, 185, 186, 3, 2, 2, 2, 186, 192, 7, 19, 2, 2, 187, 193, 5, 8, 5, 2, 188, 189, 7, 4, 2, 2, 189, 190, 5, 8, 5, 2, 190, 191, 7, 5, 2, 2, 191, 193, 3, 2, 2, 2, 192, 187, 3, 2, 2, 2, 192, 188, 3, 2, 2, 2, 193, 199, 3, 2, 2, 2, 194, 196, 7, 188, 2, 2, 195, 197, 7, 110, 2, 2, 196, 195, 3, 2, 2, 2, 196, 197, 3, 2, 2, 2, 197, 198, 3, 2, 2, 2, 198, 200, 7, 45, 2, 2, 199, 194, 3, 2, 2, 2, 199, 200, 3, 2, 2, 2, 200, 538, 3, 2, 2, 2, 201, 202, 7, 37, 2, 2, 202, 206, 7, 162, 2, 2, 203, 204, 7, 80, 2, 2, 204, 205, 7, 112, 2, 2, 205, 207, 7, 61, 2, 2, 206, 203, 3, 2, 2, 2, 206, 207, 3, 2, 2, 2, 207, 208, 3, 2, 2, 2, 208, 209, 5, 116, 59, 2, 209, 210, 7, 4, 2, 2, 210, 215, 5, 12, 7, 2, 211, 212, 7, 6, 2, 2, 212, 214, 5, 12, 7, 2, 213, 211, 3, 2, 2, 2, 214, 217, 3, 2, 2, 2, 215, 213, 3, 2, 2, 2, 215, 216, 3, 2, 2, 2, 216, 218, 3, 2, 2, 2, 217, 215, 3, 2, 2, 2, 218, 221, 7, 5, 2, 2, 219, 220, 7, 33, 2, 2, 220, 222, 5, 74, 38, 2, 221, 219, 3, 2, 2, 2, 221, 222, 3, 2, 2, 2, 222, 225, 3, 2, 2, 2, 223, 224, 7, 188, 2, 2, 224, 226, 5, 18, 10, 2, 225, 223, 3, 2, 2, 2, 225, 226, 3, 2, 2, 2, 226, 538, 3, 2, 2, 2, 227, 228, 7, 54, 2, 2, 228, 231, 7, 162, 2, 2, 229, 230, 7, 80, 2, 2, 230, 232, 7, 61, 2, 2, 231, 229, 3, 2, 2, 2, 231, 232, 3, 2, 2, 2, 232, 233, 3, 2, 2, 2, 233, 538, 5, 116, 59, 2, 234, 235, 7, 85, 2, 2, 235, 236, 7, 89, 2, 2, 236, 238, 5, 116, 59, 2, 237, 239, 5, 58, 30, 2, 238, 237, 3, 2, 2, 2, 238, 239, 3, 2, 2, 2, 239, 240, 3, 2, 2, 2, 240, 241, 5, 8, 5, 2, 241, 538, 3, 2, 2, 2, 242, 243, 7, 49, 2, 2, 243, 244, 7, 70, 2, 2, 244, 247, 5, 116, 59, 2, 245, 246, 7, 187, 2, 2, 246, 248, 5, 64, 33, 2, 247, 245, 3, 2, 2, 2, 247, 248, 3, 2, 2, 2, 248, 538, 3, 2, 2, 2, 249, 250, 7, 14, 2, 2, 250, 251, 7, 162, 2, 2, 251, 252, 5, 116, 59, 2, 252, 253, 7, 136, 2, 2, 253, 254, 7, 170, 2, 2, 254, 255, 5, 116, 59, 2, 255, 538, 3, 2, 2, 2, 256, 257, 7, 14, 2, 2, 257, 258, 7, 162, 2, 2, 258, 259, 5, 116, 59, 2, 259, 260, 7, 136, 2, 2, 260, 261, 7, 31, 2, 2, 261, 262, 5, 118, 60, 2, 262, 263, 7, 170, 2, 2, 263, 264, 5, 118, 60, 2, 264, 538, 3, 2, 2, 2, 265, 266, 7, 14, 2, 2, 266, 267, 7, 162, 2, 2, 267, 268, 5, 116, 59, 2, 268, 269, 7, 54, 2, 2, 269, 270, 7, 31, 2, 2, 270, 271, 5, 116, 59, 2, 271, 538, 3, 2, 2, 2, 272, 273, 7, 14, 2, 2, 273, 274, 7, 162, 2, 2, 274, 275, 5, 116, 59, 2, 275, 276, 7, 12, 2, 2, 276, 277, 7, 31, 2, 2, 277, 278, 5, 14, 8, 2, 278, 538, 3, 2, 2, 2, 279, 282, 7, 37, 2, 2, 280, 281, 7, 119, 2, 2, 281, 283, 7, 138, 2, 2, 282, 280, 3, 2, 2, 2, 282, 283, 3, 2, 2, 2, 283, 284, 3, 2, 2, 2, 284, 285, 7, 185, 2, 2, 285, 286, 5, 116, 59, 2, 286, 287, 7, 19, 2, 2, 287, 288, 5, 8, 5, 2, 288, 538, 3, 2, 2, 2, 289, 290, 7, 54, 2, 2, 290, 293, 7, 185, 2, 2, 291, 292, 7, 80, 2, 2, 292, 294, 7, 61, 2, 2, 293, 291, 3, 2, 2, 2, 293, 294, 3, 2, 2, 2, 294, 295, 3, 2, 2, 2, 295, 538, 5, 116, 59, 2, 296, 297, 7, 25, 2, 2, 297, 298, 5, 116, 59, 2, 298, 307, 7, 4, 2, 2, 299, 304, 5, 112, 57, 2, 300, 301, 7, 6, 2, 2, 301, 303, 5, 112, 57, 2, 302, 300, 3, 2, 2, 2, 303, 306, 3, 2, 2, 2, 304, 302, 3, 2, 2, 2, 304, 305, 3, 2, 2, 2, 305, 308, 3, 2, 2, 2, 306, 304, 3, 2, 2, 2, 307, 299, 3, 2, 2, 2, 307, 308, 3, 2, 2, 2, 308, 309, 3, 2, 2, 2, 309, 310, 7, 5, 2, 2, 310, 538, 3, 2, 2, 2, 311, 322, 7, 73, 2, 2, 312, 317, 5, 114, 58, 2, 313, 314, 7, 6, 2, 2, 314, 316, 5, 114, 58, 2, 315, 313, 3, 2, 2, 2, 316, 319, 3, 2, 2, 2, 317, 315, 3, 2, 2, 2, 317, 318, 3, 2, 2, 2, 318, 323, 3, 2, 2, 2, 319, 317, 3, 2, 2, 2, 320, 321, 7, 13, 2, 2, 321, 323, 7, 130, 2, 2, 322, 312, 3, 2, 2, 2, 322, 320, 3, 2, 2, 2, 323, 324, 3, 2, 2, 2, 324, 326, 7, 116, 2, 2, 325, 327, 7, 162, 2, 2, 326, 325, 3, 2, 2, 2, 326, 327, 3, 2, 2, 2, 327, 328, 3, 2, 2, 2, 328, 329, 5, 116, 59, 2, 329, 330, 7, 170, 2, 2, 330, 334, 5, 118, 60, 2, 331, 332, 7, 188, 2, 2, 332, 333, 7, 73, 2, 2, 333, 335, 7, 118, 2, 2, 334, 331, 3, 2, 2, 2, 334, 335, 3, 2, 2, 2, 335, 538, 3, 2, 2, 2, 336, 340, 7, 141, 2, 2, 337, 338, 7, 73, 2, 2, 338, 339, 7, 118, 2, 2, 339, 341, 7, 68, 2, 2, 340, 337, 3, 2, 2, 2, 340, 341, 3, 2, 2, 2, 341, 352, 3, 2, 2, 2, 342, 347, 5, 114, 58, 2, 343, 344, 7, 6, 2, 2, 344, 346, 5, 114, 58, 2, 345, 343, 3, 2, 2, 2, 346, 349, 3, 2, 2, 2, 347, 345, 3, 2, 2, 2, 347, 348, 3, 2, 2, 2, 348, 353, 3, 2, 2, 2, 349, 347, 3, 2, 2, 2, 350, 351, 7, 13, 2, 2, 351, 353, 7, 130, 2, 2, 352, 342, 3, 2, 2, 2, 352, 350, 3, 2, 2, 2, 353, 354, 3, 2, 2, 2, 354, 356, 7, 116, 2, 2, 355, 357, 7, 162, 2, 2, 356, 355, 3, 2, 2, 2, 356, 357, 3, 2, 2, 2, 357, 358, 3, 2, 2, 2, 358, 359, 5, 116, 59, 2, 359, 360, 7, 70, 2, 2, 360, 361, 5, 118, 60, 2, 361, 538, 3, 2, 2, 2, 362, 363, 7, 155, 2, 2, 363, 369, 7, 74, 2, 2, 364, 366, 7, 116, 2, 2, 365, 367, 7, 162, 2, 2, 366, 365, 3, 2, 2, 2, 366, 367, 3, 2, 2, 2, 367, 368, 3, 2, 2, 2, 368, 370, 5, 116, 59, 2, 369, 364, 3, 2, 2, 2, 369, 370, 3, 2, 2, 2, 370, 538, 3, 2, 2, 2, 371, 373, 7, 62, 2, 2, 372, 374, 7, 15, 2, 2, 373, 372, 3, 2, 2, 2, 373, 374, 3, 2, 2, 2, 374, 376, 3, 2, 2, 2, 375, 377, 7, 184, 2, 2, 376, 375, 3, 2, 2, 2, 376, 377, 3, 2, 2, 2, 377, 389, 3, 2, 2, 2, 378, 379, 7, 4, 2, 2, 379, 384, 5, 106, 54, 2, 380, 381, 7, 6, 2, 2, 381, 383, 5, 106, 54, 2, 382, 380, 3, 2, 2, 2, 383, 386, 3, 2, 2, 2, 384, 382, 3, 2, 2, 2, 384, 385, 3, 2, 2, 2, 385, 387, 3, 2, 2, 2, 386, 384, 3, 2, 2, 2, 387, 388, 7, 5, 2, 2, 388, 390, 3, 2, 2, 2, 389, 378, 3, 2, 2, 2, 389, 390, 3, 2, 2, 2, 390, 391, 3, 2, 2, 2, 391, 538, 5, 6, 4, 2, 392, 393, 7, 155, 2, 2, 393, 394, 7, 37, 2, 2, 394, 395, 7, 162, 2, 2, 395, 538, 5, 116, 59, 2, 396, 397, 7, 155, 2, 2, 397, 398, 7, 37, 2, 2, 398, 399, 7, 185, 2, 2, 399, 538, 5, 116, 59, 2, 400, 401, 7, 155, 2, 2, 401, 404, 7, 163, 2, 2, 402, 403, 9, 3, 2, 2, 403, 405, 5, 116, 59, 2, 404, 402, 3, 2, 2, 2, 404, 405, 3, 2, 2, 2, 405, 412, 3, 2, 2, 2, 406, 407, 7, 97, 2, 2, 407, 410, 5, 74, 38, 2, 408, 409, 7, 57, 2, 2, 409, 411, 5, 74, 38, 2, 410, 408, 3, 2, 2, 2, 410, 411, 3, 2, 2, 2, 411, 413, 3, 2, 2, 2, 412, 406, 3, 2, 2, 2, 412, 413, 3, 2, 2, 2, 413, 538, 3, 2, 2, 2, 414, 415, 7, 155, 2, 2, 415, 418, 7, 148, 2, 2, 416, 417, 9, 3, 2, 2, 417, 419, 5, 118, 60, 2, 418, 416, 3, 2, 2, 2, 418, 419, 3, 2, 2, 2, 419, 426, 3, 2, 2, 2, 420, 421, 7, 97, 2, 2, 421, 424, 5, 74, 38, 2, 422, 423, 7, 57, 2, 2, 423, 425, 5, 74, 38, 2, 424, 422, 3, 2, 2, 2, 424, 425, 3, 2, 2, 2, 425, 427, 3, 2, 2, 2, 426, 420, 3, 2, 2, 2, 426, 427, 3, 2, 2, 2, 427, 538, 3, 2, 2, 2, 428, 429, 7, 155, 2, 2, 429, 432, 7, 29, 2, 2, 430, 431, 7, 97, 2, 2, 431, 433, 5, 74, 38, 2, 432, 430, 3, 2, 2, 2, 432, 433, 3, 2, 2, 2, 433, 538, 3, 2, 2, 2, 434, 435, 7, 155, 2, 2, 435, 436, 7, 32, 2, 2, 436, 437, 9, 3, 2, 2, 437, 538, 5, 116, 59, 2, 438, 439, 7, 155, 2, 2, 439, 440, 7, 159, 2, 2, 440, 441, 9, 4, 2, 2, 441, 538, 5, 116, 59, 2, 442, 443, 7, 155, 2, 2, 443, 444, 7, 159, 2, 2, 444, 445, 7, 68, 2, 2, 445, 446, 7, 4, 2, 2, 446, 447, 5, 30, 16, 2, 447, 448, 7, 5, 2, 2, 448, 538, 3, 2, 2, 2, 449, 450, 7, 51, 2, 2, 450, 538, 5, 116, 59, 2, 451, 452, 7, 50, 2, 2, 452, 538, 5, 116, 59, 2, 453, 454, 7, 155, 2, 2, 454, 538, 7, 72, 2, 2, 455, 456, 7, 155, 2, 2, 456, 538, 7, 152, 2, 2, 457, 458, 7, 153, 2, 2, 458, 459, 7, 152, 2, 2, 459, 460, 5, 116, 59, 2, 460, 461, 7, 193, 2, 2, 461, 462, 5, 62, 32, 2, 462, 538, 3, 2, 2, 2, 463, 464, 7, 139, 2, 2, 464, 465, 7, 152, 2, 2, 465, 538, 5, 116, 59, 2, 466, 467, 7, 158, 2, 2, 467, 476, 7, 171, 2, 2, 468, 473, 5, 108, 55, 2, 469, 470, 7, 6, 2, 2, 470, 472, 5, 108, 55, 2, 471, 469, 3, 2, 2, 2, 472, 475, 3, 2, 2, 2, 473, 471, 3, 2, 2, 2, 473, 474, 3, 2, 2, 2, 474, 477, 3, 2, 2, 2, 475, 473, 3, 2, 2, 2, 476, 468, 3, 2, 2, 2, 476, 477, 3, 2, 2, 2, 477, 538, 3, 2, 2, 2, 478, 480, 7, 34, 2, 2, 479, 481, 7, 189, 2, 2, 480, 479, 3, 2, 2, 2, 480, 481, 3, 2, 2, 2, 481, 538, 3, 2, 2, 2, 482, 484, 7, 143, 2, 2, 483, 485, 7, 189, 2, 2, 484, 483, 3, 2, 2, 2, 484, 485, 3, 2, 2, 2, 485, 538, 3, 2, 2, 2, 486, 487, 7, 155, 2, 2, 487, 488, 7, 126, 2, 2, 488, 489, 9, 3, 2, 2, 489, 492, 5, 116, 59, 2, 490, 491, 7, 187, 2, 2, 491, 493, 5, 64, 33, 2, 492, 490, 3, 2, 2, 2, 492, 493, 3, 2, 2, 2, 493, 504, 3, 2, 2, 2, 494, 495, 7, 120, 2, 2, 495, 496, 7, 24, 2, 2, 496, 501, 5, 28, 15, 2, 497, 498, 7, 6, 2, 2, 498, 500, 5, 28, 15, 2, 499, 497, 3, 2, 2, 2, 500, 503, 3, 2, 2, 2, 501, 499, 3, 2, 2, 2, 501, 502, 3, 2, 2, 2, 502, 505, 3, 2, 2, 2, 503, 501, 3, 2, 2, 2, 504, 494, 3, 2, 2, 2, 504, 505, 3, 2, 2, 2, 505, 508, 3, 2, 2, 2, 506, 507, 7, 98, 2, 2, 507, 509, 9, 5, 2, 2, 508, 506, 3, 2, 2, 2, 508, 509, 3, 2, 2, 2, 509, 538, 3, 2, 2, 2, 510, 511, 7, 129, 2, 2, 511, 512, 5, 118, 60, 2, 512, 513, 7, 70, 2, 2, 513, 514, 5, 6, 4, 2, 514, 538, 3, 2, 2, 2, 515, 516, 7, 48, 2, 2, 516, 517, 7, 129, 2, 2, 517, 538, 5, 118, 60, 2, 518, 519, 7, 60, 2, 2, 519, 529, 5, 118, 60, 2, 520, 521, 7, 181, 2, 2, 521, 526, 5, 62, 32, 2, 522, 523, 7, 6, 2, 2, 523, 525, 5, 62, 32, 2, 524, 522, 3, 2, 2, 2, 525, 528, 3, 2, 2, 2, 526, 524, 3, 2, 2, 2, 526, 527, 3, 2, 2, 2, 527, 530, 3, 2, 2, 2, 528, 526, 3, 2, 2, 2, 529, 520, 3, 2, 2, 2, 529, 530, 3, 2, 2, 2, 530, 538, 3, 2, 2, 2, 531, 532, 7, 51, 2, 2, 532, 533, 7, 84, 2, 2, 533, 538, 5, 118, 60, 2, 534, 535, 7, 51, 2, 2, 535, 536, 7, 123, 2, 2, 536, 538, 5, 118, 60, 2, 537, 130, 3, 2, 2, 2, 537, 131, 3, 2, 2, 2, 537, 133, 3, 2, 2, 2, 537, 138, 3, 2, 2, 2, 537, 150, 3, 2, 2, 2, 537, 160, 3, 2, 2, 2, 537, 167, 3, 2, 2, 2, 537, 201, 3, 2, 2, 2, 537, 227, 3, 2, 2, 2, 537, 234, 3, 2, 2, 2, 537, 242, 3, 2, 2, 2, 537, 249, 3, 2, 2, 2, 537, 256, 3, 2, 2, 2, 537, 265, 3, 2, 2, 2, 537, 272, 3, 2, 2, 2, 537, 279, 3, 2, 2, 2, 537, 289, 3, 2, 2, 2, 537, 296, 3, 2, 2, 2, 537, 311, 3, 2, 2, 2, 537, 336, 3, 2, 2, 2, 537, 362, 3, 2, 2, 2, 537, 371, 3, 2, 2, 2, 537, 392, 3, 2, 2, 2, 537, 396, 3, 2, 2, 2, 537, 400, 3, 2, 2, 2, 537, 414, 3, 2, 2, 2, 537, 428, 3, 2, 2, 2, 537, 434, 3, 2, 2, 2, 537, 438, 3, 2, 2, 2, 537, 442, 3, 2, 2, 2, 537, 449, 3, 2, 2, 2, 537, 451, 3, 2, 2, 2, 537, 453, 3, 2, 2, 2, 537, 455, 3, 2, 2, 2, 537, 457, 3, 2, 2, 2, 537, 463, 3, 2, 2, 2, 537, 466, 3, 2, 2, 2, 537, 478, 3, 2, 2, 2, 537, 482, 3, 2, 2, 2, 537, 486, 3, 2, 2, 2, 537, 510, 3, 2, 2, 2, 537, 515, 3, 2, 2, 2, 537, 518, 3, 2, 2, 2, 537, 531, 3, 2, 2, 2, 537, 534, 3, 2, 2, 2, 538, 7, 3, 2, 2, 2, 539, 541, 5, 10, 6, 2, 540, 539, 3, 2, 2, 2, 540, 541, 3, 2, 2, 2, 541, 542, 3, 2, 2, 2, 542, 543, 5, 22, 12, 2, 543, 9, 3, 2, 2, 2, 544, 546, 7, 188, 2, 2, 545, 547, 7, 135, 2, 2, 546, 545, 3, 2, 2, 2, 546, 547, 3, 2, 2, 2, 547, 548, 3, 2, 2, 2, 548, 553, 5, 40, 21, 2, 549, 550, 7, 6, 2, 2, 550, 552, 5, 40, 21, 2, 551, 549, 3, 2, 2, 2, 552, 555, 3, 2, 2, 2, 553, 551, 3, 2, 2, 2, 553, 554, 3, 2, 2, 2, 554, 11, 3, 2, 2, 2, 555, 553, 3, 2, 2, 2, 556, 559, 5, 14, 8, 2, 557, 559, 5, 16, 9, 2, 558, 556, 3, 2, 2, 2, 558, 557, 3, 2, 2, 2, 559, 13, 3, 2, 2, 2, 560, 561, 5, 118, 60, 2, 561, 564, 5, 90, 46, 2, 562, 563, 7, 33, 2, 2, 563, 565, 5, 74, 38, 2, 564, 562, 3, 2, 2, 2, 564, 565, 3, 2, 2, 2, 565, 15, 3, 2, 2, 2, 566, 567, 7, 97, 2, 2, 567, 570, 5, 116, 59, 2, 568, 569, 9, 6, 2, 2, 569, 571, 7, 131, 2, 2, 570, 568, 3, 2, 2, 2, 570, 571, 3, 2, 2, 2, 571, 17, 3, 2, 2, 2, 572, 573, 7, 4, 2, 2, 573, 578, 5, 20, 11, 2, 574, 575, 7, 6, 2, 2, 575, 577, 5, 20, 11, 2, 576, 574, 3, 2, 2, 2, 577, 580, 3, 2, 2, 2, 578, 576, 3, 2, 2, 2, 578, 579, 3, 2, 2, 2, 579, 581, 3, 2, 2, 2, 580, 578, 3, 2, 2, 2, 581, 582, 7, 5, 2, 2, 582, 19, 3, 2, 2, 2, 583, 584, 5, 118, 60, 2, 584, 585, 7, 193, 2, 2, 585, 586, 5, 62, 32, 2, 586, 21, 3, 2, 2, 2, 587, 598, 5, 24, 13, 2, 588, 589, 7, 120, 2, 2, 589, 590, 7, 24, 2, 2, 590, 595, 5, 28, 15, 2, 591, 592, 7, 6, 2, 2, 592, 594, 5, 28, 15, 2, 593, 591, 3, 2, 2, 2, 594, 597, 3, 2, 2, 2, 595, 593, 3, 2, 2, 2, 595, 596, 3, 2, 2, 2, 596, 599, 3, 2, 2, 2, 597, 595, 3, 2, 2, 2, 598, 588, 3, 2, 2, 2, 598, 599, 3, 2, 2, 2, 599, 602, 3, 2, 2, 2, 600, 601, 7, 98, 2, 2, 601, 603, 9, 5, 2, 2, 602, 600, 3, 2, 2, 2, 602, 603, 3, 2, 2, 2, 603, 23, 3, 2, 2, 2, 604, 605, 8, 13, 1, 2, 605, 606, 5, 26, 14, 2, 606, 621, 3, 2, 2, 2, 607, 608, 12, 4, 2, 2, 608, 610, 7, 87, 2, 2, 609, 611, 5, 42, 22, 2, 610, 609, 3, 2, 2, 2, 610, 611, 3, 2, 2, 2, 611, 612, 3, 2, 2, 2, 612, 620, 5, 24, 13, 5, 613, 614, 12, 3, 2, 2, 614, 616, 9, 7, 2, 2, 615, 617, 5, 42, 22, 2, 616, 615, 3, 2, 2, 2, 616, 617, 3, 2, 2, 2, 617, 618, 3, 2, 2, 2, 618, 620, 5, 24, 13, 4, 619, 607, 3, 2, 2, 2, 619, 613, 3, 2, 2, 2, 620, 623, 3, 2, 2, 2, 621, 619, 3, 2, 2, 2, 621, 622, 3, 2, 2, 2, 622, 25, 3, 2, 2, 2, 623, 621, 3, 2, 2, 2, 624, 641, 5, 30, 16, 2, 625, 626, 7, 162, 2, 2, 626, 641, 5, 116, 59, 2, 627, 628, 7, 183, 2, 2, 628, 633, 5, 62, 32, 2, 629, 630, 7, 6, 2, 2, 630, 632, 5, 62, 32, 2, 631, 629, 3, 2, 2, 2, 632, 635, 3, 2, 2, 2, 633, 631, 3, 2, 2, 2, 633, 634, 3, 2, 2, 2, 634, 641, 3, 2, 2, 2, 635, 633, 3, 2, 2, 2, 636, 637, 7, 4, 2, 2, 637, 638, 5, 22, 12, 2, 638, 639, 7, 5, 2, 2, 639, 641, 3, 2, 2, 2, 640, 624, 3, 2, 2, 2, 640, 625, 3, 2, 2, 2, 640, 627, 3, 2, 2, 2, 640, 636, 3, 2, 2, 2, 641, 27, 3, 2, 2, 2, 642, 644, 5, 62, 32, 2, 643, 645, 9, 8, 2, 2, 644, 643, 3, 2, 2, 2, 644, 645, 3, 2, 2, 2, 645, 648, 3, 2, 2, 2, 646, 647, 7, 115, 2, 2, 647, 649, 9, 9, 2, 2, 648, 646, 3, 2, 2, 2, 648, 649, 3, 2, 2, 2, 649, 29, 3, 2, 2, 2, 650, 652, 7, 150, 2, 2, 651, 653, 5, 42, 22, 2, 652, 651, 3, 2, 2, 2, 652, 653, 3, 2, 2, 2, 653, 654, 3, 2, 2, 2, 654, 659, 5, 44, 23, 2, 655, 656, 7, 6, 2, 2, 656, 658, 5, 44, 23, 2, 657, 655, 3, 2, 2, 2, 658, 661, 3, 2, 2, 2, 659, 657, 3, 2, 2, 2, 659, 660, 3, 2, 2, 2, 660, 671, 3, 2, 2, 2, 661, 659, 3, 2, 2, 2, 662, 663, 7, 70, 2, 2, 663, 668, 5, 46, 24, 2, 664, 665, 7, 6, 2, 2, 665, 667, 5, 46, 24, 2, 666, 664, 3, 2, 2, 2, 667, 670, 3, 2, 2, 2, 668, 666, 3, 2, 2, 2, 668, 669, 3, 2, 2, 2, 669, 672, 3, 2, 2, 2, 670, 668, 3, 2, 2, 2, 671, 662, 3, 2, 2, 2, 671, 672, 3, 2, 2, 2, 672, 675, 3, 2, 2, 2, 673, 674, 7, 187, 2, 2, 674, 676, 5, 64, 33, 2, 675, 673, 3, 2, 2, 2, 675, 676, 3, 2, 2, 2, 676, 680, 3, 2, 2, 2, 677, 678, 7, 76, 2, 2, 678, 679, 7, 24, 2, 2, 679, 681, 5, 32, 17, 2, 680, 677, 3, 2, 2, 2, 680, 681, 3, 2, 2, 2, 681, 684, 3, 2, 2, 2, 682, 683, 7, 78, 2, 2, 683, 685, 5, 64, 33, 2, 684, 682, 3, 2, 2, 2, 684, 685, 3, 2, 2, 2, 685, 31, 3, 2, 2, 2, 686, 688, 5, 42, 22, 2, 687, 686, 3, 2, 2, 2, 687, 688, 3, 2, 2, 2, 688, 689, 3, 2, 2, 2, 689, 694, 5, 34, 18, 2, 690, 691, 7, 6, 2, 2, 691, 693, 5, 34, 18, 2, 692, 690, 3, 2, 2, 2, 693, 696, 3, 2, 2, 2, 694, 692, 3, 2, 2, 2, 694, 695, 3, 2, 2, 2, 695, 33, 3, 2, 2, 2, 696, 694, 3, 2, 2, 2, 697, 738, 5, 36, 19, 2, 698, 699, 7, 144, 2, 2, 699, 708, 7, 4, 2, 2, 700, 705, 5, 116, 59, 2, 701, 702, 7, 6, 2, 2, 702, 704, 5, 116, 59, 2, 703, 701, 3, 2, 2, 2, 704, 707, 3, 2, 2, 2, 705, 703, 3, 2, 2, 2, 705, 706, 3, 2, 2, 2, 706, 709, 3, 2, 2, 2, 707, 705, 3, 2, 2, 2, 708, 700, 3, 2, 2, 2, 708, 709, 3, 2, 2, 2, 709, 710, 3, 2, 2, 2, 710, 738, 7, 5, 2, 2, 711, 712, 7, 39, 2, 2, 712, 721, 7, 4, 2, 2, 713, 718, 5, 116, 59, 2, 714, 715, 7, 6, 2, 2, 715, 717, 5, 116, 59, 2, 716, 714, 3, 2, 2, 2, 717, 720, 3, 2, 2, 2, 718, 716, 3, 2, 2, 2, 718, 719, 3, 2, 2, 2, 719, 722, 3, 2, 2, 2, 720, 718, 3, 2, 2, 2, 721, 713, 3, 2, 2, 2, 721, 722, 3, 2, 2, 2, 722, 723, 3, 2, 2, 2, 723, 738, 7, 5, 2, 2, 724, 725, 7, 77, 2, 2, 725, 726, 7, 154, 2, 2, 726, 727, 7, 4, 2, 2, 727, 732, 5, 38, 20, 2, 728, 729, 7, 6, 2, 2, 729, 731, 5, 38, 20, 2, 730, 728, 3, 2, 2, 2, 731, 734, 3, 2, 2, 2, 732, 730, 3, 2, 2, 2, 732, 733, 3, 2, 2, 2, 733, 735, 3, 2, 2, 2, 734, 732, 3, 2, 2, 2, 735, 736, 7, 5, 2, 2, 736, 738, 3, 2, 2, 2, 737, 697, 3, 2, 2, 2, 737, 698, 3, 2, 2, 2, 737, 711, 3, 2, 2, 2, 737, 724, 3, 2, 2, 2, 738, 35, 3, 2, 2, 2, 739, 748, 7, 4, 2, 2, 740, 745, 5, 62, 32, 2, 741, 742, 7, 6, 2, 2, 742, 744, 5, 62, 32, 2, 743, 741, 3, 2, 2, 2, 744, 747, 3, 2, 2, 2, 745, 743, 3, 2, 2, 2, 745, 746, 3, 2, 2, 2, 746, 749, 3, 2, 2, 2, 747, 745, 3, 2, 2, 2, 748, 740, 3, 2, 2, 2, 748, 749, 3, 2, 2, 2, 749, 750, 3, 2, 2, 2, 750, 753, 7, 5, 2, 2, 751, 753, 5, 62, 32, 2, 752, 739, 3, 2, 2, 2, 752, 751, 3, 2, 2, 2, 753, 37, 3, 2, 2, 2, 754, 763, 7, 4, 2, 2, 755, 760, 5, 116, 59, 2, 756, 757, 7, 6, 2, 2, 757, 759, 5, 116, 59, 2, 758, 756, 3, 2, 2, 2, 759, 762, 3, 2, 2, 2, 760, 758, 3, 2, 2, 2, 760, 761, 3, 2, 2, 2, 761, 764, 3, 2, 2, 2, 762, 760, 3, 2, 2, 2, 763, 755, 3, 2, 2, 2, 763, 764, 3, 2, 2, 2, 764, 765, 3, 2, 2, 2, 765, 768, 7, 5, 2, 2, 766, 768, 5, 116, 59, 2, 767, 754, 3, 2, 2, 2, 767, 766, 3, 2, 2, 2, 768, 39, 3, 2, 2, 2, 769, 771, 5, 118, 60, 2, 770, 772, 5, 58, 30, 2, 771, 770, 3, 2, 2, 2, 771, 772, 3, 2, 2, 2, 772, 773, 3, 2, 2, 2, 773, 774, 7, 19, 2, 2, 774, 775, 7, 4, 2, 2, 775, 776, 5, 8, 5, 2, 776, 777, 7, 5, 2, 2, 777, 41, 3, 2, 2, 2, 778, 779, 9, 10, 2, 2, 779, 43, 3, 2, 2, 2, 780, 785, 5, 62, 32, 2, 781, 783, 7, 19, 2, 2, 782, 781, 3, 2, 2, 2, 782, 783, 3, 2, 2, 2, 783, 784, 3, 2, 2, 2, 784, 786, 5, 118, 60, 2, 785, 782, 3, 2, 2, 2, 785, 786, 3, 2, 2, 2, 786, 793, 3, 2, 2, 2, 787, 788, 5, 116, 59, 2, 788, 789, 7, 3, 2, 2, 789, 790, 7, 201, 2, 2, 790, 793, 3, 2, 2, 2, 791, 793, 7, 201, 2, 2, 792, 780, 3, 2, 2, 2, 792, 787, 3, 2, 2, 2, 792, 791, 3, 2, 2, 2, 793, 45, 3, 2, 2, 2, 794, 795, 8, 24, 1, 2, 795, 796, 5, 52, 27, 2, 796, 815, 3, 2, 2, 2, 797, 811, 12, 4, 2, 2, 798, 799, 7, 38, 2, 2, 799, 800, 7, 92, 2, 2, 800, 812, 5, 52, 27, 2, 801, 802, 5, 48, 25, 2, 802, 803, 7, 92, 2, 2, 803, 804, 5, 46, 24, 2, 804, 805, 5, 50, 26, 2, 805, 812, 3, 2, 2, 2, 806, 807, 7, 105, 2, 2, 807, 808, 5, 48, 25, 2, 808, 809, 7, 92, 2, 2, 809, 810, 5, 52, 27, 2, 810, 812, 3, 2, 2, 2, 811, 798, 3, 2, 2, 2, 811, 801, 3, 2, 2, 2, 811, 806, 3, 2, 2, 2, 812, 814, 3, 2, 2, 2, 813, 797, 3, 2, 2, 2, 814, 817, 3, 2, 2, 2, 815, 813, 3, 2, 2, 2, 815, 816, 3, 2, 2, 2, 816, 47, 3, 2, 2, 2, 817, 815, 3, 2, 2, 2, 818, 820, 7, 83, 2, 2, 819, 818, 3, 2, 2, 2, 819, 820, 3, 2, 2, 2, 820, 834, 3, 2, 2, 2, 821, 823, 7, 95, 2, 2, 822, 824, 7, 122, 2, 2, 823, 822, 3, 2, 2, 2, 823, 824, 3, 2, 2, 2, 824, 834, 3, 2, 2, 2, 825, 827, 7, 142, 2, 2, 826, 828, 7, 122, 2, 2, 827, 826, 3, 2, 2, 2, 827, 828, 3, 2, 2, 2, 828, 834, 3, 2, 2, 2, 829, 831, 7, 71, 2, 2, 830, 832, 7, 122, 2, 2, 831, 830, 3, 2, 2, 2, 831, 832, 3, 2, 2, 2, 832, 834, 3, 2, 2, 2, 833, 819, 3, 2, 2, 2, 833, 821, 3, 2, 2, 2, 833, 825, 3, 2, 2, 2, 833, 829, 3, 2, 2, 2, 834, 49, 3, 2, 2, 2, 835, 836, 7, 116, 2, 2, 836, 850, 5, 64, 33, 2, 837, 838, 7, 181, 2, 2, 838, 839, 7, 4, 2, 2, 839, 844, 5, 118, 60, 2, 840, 841, 7, 6, 2, 2, 841, 843, 5, 118, 60, 2, 842, 840, 3, 2, 2, 2, 843, 846, 3, 2, 2, 2, 844, 842, 3, 2, 2, 2, 844, 845, 3, 2, 2, 2, 845, 847, 3, 2, 2, 2, 846, 844, 3, 2, 2, 2, 847, 848, 7, 5, 2, 2, 848, 850, 3, 2, 2, 2, 849, 835, 3, 2, 2, 2, 849, 837, 3, 2, 2, 2, 850, 51, 3, 2, 2, 2, 851, 858, 5, 56, 29, 2, 852, 853, 7, 164, 2, 2, 853, 854, 5, 54, 28, 2, 854, 855, 7, 4, 2, 2, 855, 856, 5, 62, 32, 2, 856, 857, 7, 5, 2, 2, 857, 859, 3, 2, 2, 2, 858, 852, 3, 2, 2, 2, 858, 859, 3, 2, 2, 2, 859, 53, 3, 2, 2, 2, 860, 861, 9, 11, 2, 2, 861, 55, 3, 2, 2, 2, 862, 870, 5, 60, 31, 2, 863, 865, 7, 19, 2, 2, 864, 863, 3, 2, 2, 2, 864, 865, 3, 2, 2, 2, 865, 866, 3, 2, 2, 2, 866, 868, 5, 118, 60, 2, 867, 869, 5, 58, 30, 2, 868, 867, 3, 2, 2, 2, 868, 869, 3, 2, 2, 2, 869, 871, 3, 2, 2, 2, 870, 864, 3, 2, 2, 2, 870, 871, 3, 2, 2, 2, 871, 57, 3, 2, 2, 2, 872, 873, 7, 4, 2, 2, 873, 878, 5, 118, 60, 2, 874, 875, 7, 6, 2, 2, 875, 877, 5, 118, 60, 2, 876, 874, 3, 2, 2, 2, 877, 880, 3, 2, 2, 2, 878, 876, 3, 2, 2, 2, 878, 879, 3, 2, 2, 2, 879, 881, 3, 2, 2, 2, 880, 878, 3, 2, 2, 2, 881, 882, 7, 5, 2, 2, 882, 59, 3, 2, 2, 2, 883, 913, 5, 116, 59, 2, 884, 885, 7, 4, 2, 2, 885, 886, 5, 8, 5, 2, 886, 887, 7, 5, 2, 2, 887, 913, 3, 2, 2, 2, 888, 889, 7, 179, 2, 2, 889, 890, 7, 4, 2, 2, 890, 895, 5, 62, 32, 2, 891, 892, 7, 6, 2, 2, 892, 894, 5, 62, 32, 2, 893, 891, 3, 2, 2, 2, 894, 897, 3, 2, 2, 2, 895, 893, 3, 2, 2, 2, 895, 896, 3, 2, 2, 2, 896, 898, 3, 2, 2, 2, 897, 895, 3, 2, 2, 2, 898, 901, 7, 5, 2, 2, 899, 900, 7, 188, 2, 2, 900, 902, 7, 121, 2, 2, 901, 899, 3, 2, 2, 2, 901, 902, 3, 2, 2, 2, 902, 913, 3, 2, 2, 2, 903, 904, 7, 94, 2, 2, 904, 905, 7, 4, 2, 2, 905, 906, 5, 8, 5, 2, 906, 907, 7, 5, 2, 2, 907, 913, 3, 2, 2, 2, 908, 909, 7, 4, 2, 2, 909, 910, 5, 46, 24, 2, 910, 911, 7, 5, 2, 2, 911, 913, 3, 2, 2, 2, 912, 883, 3, 2, 2, 2, 912, 884, 3, 2, 2, 2, 912, 888, 3, 2, 2, 2, 912, 903, 3, 2, 2, 2, 912, 908, 3, 2, 2, 2, 913, 61, 3, 2, 2, 2, 914, 915, 5, 64, 33, 2, 915, 63, 3, 2, 2, 2, 916, 917, 8, 33, 1, 2, 917, 921, 5, 66, 34, 2, 918, 919, 7, 112, 2, 2, 919, 921, 5, 64, 33, 5, 920, 916, 3, 2, 2, 2, 920, 918, 3, 2, 2, 2, 921, 930, 3, 2, 2, 2, 922, 923, 12, 4, 2, 2, 923, 924, 7, 16, 2, 2, 924, 929, 5, 64, 33, 5, 925, 926, 12, 3, 2, 2, 926, 927, 7, 119, 2, 2, 927, 929, 5, 64, 33, 4, 928, 922, 3, 2, 2, 2, 928, 925, 3, 2, 2, 2, 929, 932, 3, 2, 2, 2, 930, 928, 3, 2, 2, 2, 930, 931, 3, 2, 2, 2, 931, 65, 3, 2, 2, 2, 932, 930, 3, 2, 2, 2, 933, 935, 5, 70, 36, 2, 934, 936, 5, 68, 35, 2, 935, 934, 3, 2, 2, 2, 935, 936, 3, 2, 2, 2, 936, 67, 3, 2, 2, 2, 937, 938, 5, 78, 40, 2, 938, 939, 5, 70, 36, 2, 939, 999, 3, 2, 2, 2, 940, 941, 5, 78, 40, 2, 941, 942, 5, 80, 41, 2, 942, 943, 7, 4, 2, 2, 943, 944, 5, 8, 5, 2, 944, 945, 7, 5, 2, 2, 945, 999, 3, 2, 2, 2, 946, 948, 7, 112, 2, 2, 947, 946, 3, 2, 2, 2, 947, 948, 3, 2, 2, 2, 948, 949, 3, 2, 2, 2, 949, 950, 7, 23, 2, 2, 950, 951, 5, 70, 36, 2, 951, 952, 7, 16, 2, 2, 952, 953, 5, 70, 36, 2, 953, 999, 3, 2, 2, 2, 954, 956, 7, 112, 2, 2, 955, 954, 3, 2, 2, 2, 955, 956, 3, 2, 2, 2, 956, 957, 3, 2, 2, 2, 957, 958, 7, 81, 2, 2, 958, 959, 7, 4, 2, 2, 959, 964, 5, 62, 32, 2, 960, 961, 7, 6, 2, 2, 961, 963, 5, 62, 32, 2, 962, 960, 3, 2, 2, 2, 963, 966, 3, 2, 2, 2, 964, 962, 3, 2, 2, 2, 964, 965, 3, 2, 2, 2, 965, 967, 3, 2, 2, 2, 966, 964, 3, 2, 2, 2, 967, 968, 7, 5, 2, 2, 968, 999, 3, 2, 2, 2, 969, 971, 7, 112, 2, 2, 970, 969, 3, 2, 2, 2, 970, 971, 3, 2, 2, 2, 971, 972, 3, 2, 2, 2, 972, 973, 7, 81, 2, 2, 973, 974, 7, 4, 2, 2, 974, 975, 5, 8, 5, 2, 975, 976, 7, 5, 2, 2, 976, 999, 3, 2, 2, 2, 977, 979, 7, 112, 2, 2, 978, 977, 3, 2, 2, 2, 978, 979, 3, 2, 2, 2, 979, 980, 3, 2, 2, 2, 980, 981, 7, 97, 2, 2, 981, 984, 5, 70, 36, 2, 982, 983, 7, 57, 2, 2, 983, 985, 5, 70, 36, 2, 984, 982, 3, 2, 2, 2, 984, 985, 3, 2, 2, 2, 985, 999, 3, 2, 2, 2, 986, 988, 7, 90, 2, 2, 987, 989, 7, 112, 2, 2, 988, 987, 3, 2, 2, 2, 988, 989, 3, 2, 2, 2, 989, 990, 3, 2, 2, 2, 990, 999, 7, 113, 2, 2, 991, 993, 7, 90, 2, 2, 992, 994, 7, 112, 2, 2, 993, 992, 3, 2, 2, 2, 993, 994, 3, 2, 2, 2, 994, 995, 3, 2, 2, 2, 995, 996, 7, 52, 2, 2, 996, 997, 7, 70, 2, 2, 997, 999, 5, 70, 36, 2, 998, 937, 3, 2, 2, 2, 998, 940, 3, 2, 2, 2, 998, 947, 3, 2, 2, 2, 998, 955, 3, 2, 2, 2, 998, 970, 3, 2, 2, 2, 998, 978, 3, 2, 2, 2, 998, 986, 3, 2, 2, 2, 998, 991, 3, 2, 2, 2, 999, 69, 3, 2, 2, 2, 1000, 1001, 8, 36, 1, 2, 1001, 1005, 5, 72, 37, 2, 1002, 1003, 9, 12, 2, 2, 1003, 1005, 5, 70, 36, 6, 1004, 1000, 3, 2, 2, 2, 1004, 1002, 3, 2, 2, 2, 1005, 1020, 3, 2, 2, 2, 1006, 1007, 12, 5, 2, 2, 1007, 1008, 9, 13, 2, 2, 1008, 1019, 5, 70, 36, 6, 1009, 1010, 12, 4, 2, 2, 1010, 1011, 9, 12, 2, 2, 1011, 1019, 5, 70, 36, 5, 1012, 1013, 12, 3, 2, 2, 1013, 1014, 7, 204, 2, 2, 1014, 1019, 5, 70, 36, 4, 1015, 1016, 12, 7, 2, 2, 1016, 1017, 7, 21, 2, 2, 1017, 1019, 5, 76, 39, 2, 1018, 1006, 3, 2, 2, 2, 1018, 1009, 3, 2, 2, 2, 1018, 1012, 3, 2, 2, 2, 1018, 1015, 3, 2, 2, 2, 1019, 1022, 3, 2, 2, 2, 1020, 1018, 3, 2, 2, 2, 1020, 1021, 3, 2, 2, 2, 1021, 71, 3, 2, 2, 2, 1022, 1020, 3, 2, 2, 2, 1023, 1024, 8, 37, 1, 2, 1024, 1260, 7, 113, 2, 2, 1025, 1260, 5, 84, 43, 2, 1026, 1027, 5, 118, 60, 2, 1027, 1028, 5, 74, 38, 2, 1028, 1260, 3, 2, 2, 2, 1029, 1030, 7, 217, 2, 2, 1030, 1260, 5, 74, 38, 2, 1031, 1260, 5, 120, 61, 2, 1032, 1260, 5, 82, 42, 2, 1033, 1260, 5, 74, 38, 2, 1034, 1260, 7, 207, 2, 2, 1035, 1260, 7, 7, 2, 2, 1036, 1037, 7, 127, 2, 2, 1037, 1038, 7, 4, 2, 2, 1038, 1039, 5, 70, 36, 2, 1039, 1040, 7, 81, 2, 2, 1040, 1041, 5, 70, 36, 2, 1041, 1042, 7, 5, 2, 2, 1042, 1260, 3, 2, 2, 2, 1043, 1044, 7, 4, 2, 2, 1044, 1047, 5, 62, 32, 2, 1045, 1046, 7, 6, 2, 2, 1046, 1048, 5, 62, 32, 2, 1047, 1045, 3, 2, 2, 2, 1048, 1049, 3, 2, 2, 2, 1049, 1047, 3, 2, 2, 2, 1049, 1050, 3, 2, 2, 2, 1050, 1051, 3, 2, 2, 2, 1051, 1052, 7, 5, 2, 2, 1052, 1260, 3, 2, 2, 2, 1053, 1054, 7, 145, 2, 2, 1054, 1055, 7, 4, 2, 2, 1055, 1060, 5, 62, 32, 2, 1056, 1057, 7, 6, 2, 2, 1057, 1059, 5, 62, 32, 2, 1058, 1056, 3, 2, 2, 2, 1059, 1062, 3, 2, 2, 2, 1060, 1058, 3, 2, 2, 2, 1060, 1061, 3, 2, 2, 2, 1061, 1063, 3, 2, 2, 2, 1062, 1060, 3, 2, 2, 2, 1063, 1064, 7, 5, 2, 2, 1064, 1260, 3, 2, 2, 2, 1065, 1066, 5, 116, 59, 2, 1066, 1067, 7, 4, 2, 2, 1067, 1068, 7, 201, 2, 2, 1068, 1070, 7, 5, 2, 2, 1069, 1071, 5, 98, 50, 2, 1070, 1069, 3, 2, 2, 2, 1070, 1071, 3, 2, 2, 2, 1071, 1073, 3, 2, 2, 2, 1072, 1074, 5, 100, 51, 2, 1073, 1072, 3, 2, 2, 2, 1073, 1074, 3, 2, 2, 2, 1074, 1260, 3, 2, 2, 2, 1075, 1076, 5, 116, 59, 2, 1076, 1088, 7, 4, 2, 2, 1077, 1079, 5, 42, 22, 2, 1078, 1077, 3, 2, 2, 2, 1078, 1079, 3, 2, 2, 2, 1079, 1080, 3, 2, 2, 2, 1080, 1085, 5, 62, 32, 2, 1081, 1082, 7, 6, 2, 2, 1082, 1084, 5, 62, 32, 2, 1083, 1081, 3, 2, 2, 2, 1084, 1087, 3, 2, 2, 2, 1085, 1083, 3, 2, 2, 2, 1085, 1086, 3, 2, 2, 2, 1086, 1089, 3, 2, 2, 2, 1087, 1085, 3, 2, 2, 2, 1088, 1078, 3, 2, 2, 2, 1088, 1089, 3, 2, 2, 2, 1089, 1100, 3, 2, 2, 2, 1090, 1091, 7, 120, 2, 2, 1091, 1092, 7, 24, 2, 2, 1092, 1097, 5, 28, 15, 2, 1093, 1094, 7, 6, 2, 2, 1094, 1096, 5, 28, 15, 2, 1095, 1093, 3, 2, 2, 2, 1096, 1099, 3, 2, 2, 2, 1097, 1095, 3, 2, 2, 2, 1097, 1098, 3, 2, 2, 2, 1098, 1101, 3, 2, 2, 2, 1099, 1097, 3, 2, 2, 2, 1100, 1090, 3, 2, 2, 2, 1100, 1101, 3, 2, 2, 2, 1101, 1102, 3, 2, 2, 2, 1102, 1104, 7, 5, 2, 2, 1103, 1105, 5, 98, 50, 2, 1104, 1103, 3, 2, 2, 2, 1104, 1105, 3, 2, 2, 2, 1105, 1107, 3, 2, 2, 2, 1106, 1108, 5, 100, 51, 2, 1107, 1106, 3, 2, 2, 2, 1107, 1108, 3, 2, 2, 2, 1108, 1260, 3, 2, 2, 2, 1109, 1110, 5, 118, 60, 2, 1110, 1111, 7, 8, 2, 2, 1111, 1112, 5, 62, 32, 2, 1112, 1260, 3, 2, 2, 2, 1113, 1122, 7, 4, 2, 2, 1114, 1119, 5, 118, 60, 2, 1115, 1116, 7, 6, 2, 2, 1116, 1118, 5, 118, 60, 2, 1117, 1115, 3, 2, 2, 2, 1118, 1121, 3, 2, 2, 2, 1119, 1117, 3, 2, 2, 2, 1119, 1120, 3, 2, 2, 2, 1120, 1123, 3, 2, 2, 2, 1121, 1119, 3, 2, 2, 2, 1122, 1114, 3, 2, 2, 2, 1122, 1123, 3, 2, 2, 2, 1123, 1124, 3, 2, 2, 2, 1124, 1125, 7, 5, 2, 2, 1125, 1126, 7, 8, 2, 2, 1126, 1260, 5, 62, 32, 2, 1127, 1128, 7, 4, 2, 2, 1128, 1129, 5, 8, 5, 2, 1129, 1130, 7, 5, 2, 2, 1130, 1260, 3, 2, 2, 2, 1131, 1132, 7, 61, 2, 2, 1132, 1133, 7, 4, 2, 2, 1133, 1134, 5, 8, 5, 2, 1134, 1135, 7, 5, 2, 2, 1135, 1260, 3, 2, 2, 2, 1136, 1137, 7, 27, 2, 2, 1137, 1139, 5, 70, 36, 2, 1138, 1140, 5, 96, 49, 2, 1139, 1138, 3, 2, 2, 2, 1140, 1141, 3, 2, 2, 2, 1141, 1139, 3, 2, 2, 2, 1141, 1142, 3, 2, 2, 2, 1142, 1145, 3, 2, 2, 2, 1143, 1144, 7, 55, 2, 2, 1144, 1146, 5, 62, 32, 2, 1145, 1143, 3, 2, 2, 2, 1145, 1146, 3, 2, 2, 2, 1146, 1147, 3, 2, 2, 2, 1147, 1148, 7, 56, 2, 2, 1148, 1260, 3, 2, 2, 2, 1149, 1151, 7, 27, 2, 2, 1150, 1152, 5, 96, 49, 2, 1151, 1150, 3, 2, 2, 2, 1152, 1153, 3, 2, 2, 2, 1153, 1151, 3, 2, 2, 2, 1153, 1154, 3, 2, 2, 2, 1154, 1157, 3, 2, 2, 2, 1155, 1156, 7, 55, 2, 2, 1156, 1158, 5, 62, 32, 2, 1157, 1155, 3, 2, 2, 2, 1157, 1158, 3, 2, 2, 2, 1158, 1159, 3, 2, 2, 2, 1159, 1160, 7, 56, 2, 2, 1160, 1260, 3, 2, 2, 2, 1161, 1162, 7, 28, 2, 2, 1162, 1163, 7, 4, 2, 2, 1163, 1164, 5, 62, 32, 2, 1164, 1165, 7, 19, 2, 2, 1165, 1166, 5, 90, 46, 2, 1166, 1167, 7, 5, 2, 2, 1167, 1260, 3, 2, 2, 2, 1168, 1169, 7, 173, 2, 2, 1169, 1170, 7, 4, 2, 2, 1170, 1171, 5, 62, 32, 2, 1171, 1172, 7, 19, 2, 2, 1172, 1173, 5, 90, 46, 2, 1173, 1174, 7, 5, 2, 2, 1174, 1260, 3, 2, 2, 2, 1175, 1176, 7, 18, 2, 2, 1176, 1185, 7, 9, 2, 2, 1177, 1182, 5, 62, 32, 2, 1178, 1179, 7, 6, 2, 2, 1179, 1181, 5, 62, 32, 2, 1180, 1178, 3, 2, 2, 2, 1181, 1184, 3, 2, 2, 2, 1182, 1180, 3, 2, 2, 2, 1182, 1183, 3, 2, 2, 2, 1183, 1186, 3, 2, 2, 2, 1184, 1182, 3, 2, 2, 2, 1185, 1177, 3, 2, 2, 2, 1185, 1186, 3, 2, 2, 2, 1186, 1187, 3, 2, 2, 2, 1187, 1260, 7, 10, 2, 2, 1188, 1260, 5, 118, 60, 2, 1189, 1260, 7, 41, 2, 2, 1190, 1194, 7, 42, 2, 2, 1191, 1192, 7, 4, 2, 2, 1192, 1193, 7, 208, 2, 2, 1193, 1195, 7, 5, 2, 2, 1194, 1191, 3, 2, 2, 2, 1194, 1195, 3, 2, 2, 2, 1195, 1260, 3, 2, 2, 2, 1196, 1200, 7, 43, 2, 2, 1197, 1198, 7, 4, 2, 2, 1198, 1199, 7, 208, 2, 2, 1199, 1201, 7, 5, 2, 2, 1200, 1197, 3, 2, 2, 2, 1200, 1201, 3, 2, 2, 2, 1201, 1260, 3, 2, 2, 2, 1202, 1206, 7, 99, 2, 2, 1203, 1204, 7, 4, 2, 2, 1204, 1205, 7, 208, 2, 2, 1205, 1207, 7, 5, 2, 2, 1206, 1203, 3, 2, 2, 2, 1206, 1207, 3, 2, 2, 2, 1207, 1260, 3, 2, 2, 2, 1208, 1212, 7, 100, 2, 2, 1209, 1210, 7, 4, 2, 2, 1210, 1211, 7, 208, 2, 2, 1211, 1213, 7, 5, 2, 2, 1212, 1209, 3, 2, 2, 2, 1212, 1213, 3, 2, 2, 2, 1213, 1260, 3, 2, 2, 2, 1214, 1260, 7, 44, 2, 2, 1215, 1216, 7, 160, 2, 2, 1216, 1217, 7, 4, 2, 2, 1217, 1218, 5, 70, 36, 2, 1218, 1219, 7, 70, 2, 2, 1219, 1222, 5, 70, 36, 2, 1220, 1221, 7, 68, 2, 2, 1221, 1223, 5, 70, 36, 2, 1222, 1220, 3, 2, 2, 2, 1222, 1223, 3, 2, 2, 2, 1223, 1224, 3, 2, 2, 2, 1224, 1225, 7, 5, 2, 2, 1225, 1260, 3, 2, 2, 2, 1226, 1227, 7, 111, 2, 2, 1227, 1228, 7, 4, 2, 2, 1228, 1231, 5, 70, 36, 2, 1229, 1230, 7, 6, 2, 2, 1230, 1232, 5, 88, 45, 2, 1231, 1229, 3, 2, 2, 2, 1231, 1232, 3, 2, 2, 2, 1232, 1233, 3, 2, 2, 2, 1233, 1234, 7, 5, 2, 2, 1234, 1260, 3, 2, 2, 2, 1235, 1236, 7, 63, 2, 2, 1236, 1237, 7, 4, 2, 2, 1237, 1238, 5, 118, 60, 2, 1238, 1239, 7, 70, 2, 2, 1239, 1240, 5, 70, 36, 2, 1240, 1241, 7, 5, 2, 2, 1241, 1260, 3, 2, 2, 2, 1242, 1243, 7, 4, 2, 2, 1243, 1244, 5, 62, 32, 2, 1244, 1245, 7, 5, 2, 2, 1245, 1260, 3, 2, 2, 2, 1246, 1247, 7, 77, 2, 2, 1247, 1256, 7, 4, 2, 2, 1248, 1253, 5, 116, 59, 2, 1249, 1250, 7, 6, 2, 2, 1250, 1252, 5, 116, 59, 2, 1251, 1249, 3, 2, 2, 2, 1252, 1255, 3, 2, 2, 2, 1253, 1251, 3, 2, 2, 2, 1253, 1254, 3, 2, 2, 2, 1254, 1257, 3, 2, 2, 2, 1255, 1253, 3, 2, 2, 2, 1256, 1248, 3, 2, 2, 2, 1256, 1257, 3, 2, 2, 2, 1257, 1258, 3, 2, 2, 2, 1258, 1260, 7, 5, 2, 2, 1259, 1023, 3, 2, 2, 2, 1259, 1025, 3, 2, 2, 2, 1259, 1026, 3, 2, 2, 2, 1259, 1029, 3, 2, 2, 2, 1259, 1031, 3, 2, 2, 2, 1259, 1032, 3, 2, 2, 2, 1259, 1033, 3, 2, 2, 2, 1259, 1034, 3, 2, 2, 2, 1259, 1035, 3, 2, 2, 2, 1259, 1036, 3, 2, 2, 2, 1259, 1043, 3, 2, 2, 2, 1259, 1053, 3, 2, 2, 2, 1259, 1065, 3, 2, 2, 2, 1259, 1075, 3, 2, 2, 2, 1259, 1109, 3, 2, 2, 2, 1259, 1113, 3, 2, 2, 2, 1259, 1127, 3, 2, 2, 2, 1259, 1131, 3, 2, 2, 2, 1259, 1136, 3, 2, 2, 2, 1259, 1149, 3, 2, 2, 2, 1259, 1161, 3, 2, 2, 2, 1259, 1168, 3, 2, 2, 2, 1259, 1175, 3, 2, 2, 2, 1259, 1188, 3, 2, 2, 2, 1259, 1189, 3, 2, 2, 2, 1259, 1190, 3, 2, 2, 2, 1259, 1196, 3, 2, 2, 2, 1259, 1202, 3, 2, 2, 2, 1259, 1208, 3, 2, 2, 2, 1259, 1214, 3, 2, 2, 2, 1259, 1215, 3, 2, 2, 2, 1259, 1226, 3, 2, 2, 2, 1259, 1235, 3, 2, 2, 2, 1259, 1242, 3, 2, 2, 2, 1259, 1246, 3, 2, 2, 2, 1260, 1271, 3, 2, 2, 2, 1261, 1262, 12, 16, 2, 2, 1262, 1263, 7, 9, 2, 2, 1263, 1264, 5, 70, 36, 2, 1264, 1265, 7, 10, 2, 2, 1265, 1270, 3, 2, 2, 2, 1266, 1267, 12, 14, 2, 2, 1267, 1268, 7, 3, 2, 2, 1268, 1270, 5, 118, 60, 2, 1269, 1261, 3, 2, 2, 2, 1269, 1266, 3, 2, 2, 2, 1270, 1273, 3, 2, 2, 2, 1271, 1269, 3, 2, 2, 2, 1271, 1272, 3, 2, 2, 2, 1272, 73, 3, 2, 2, 2, 1273, 1271, 3, 2, 2, 2, 1274, 1281, 7, 205, 2, 2, 1275, 1278, 7, 206, 2, 2, 1276, 1277, 7, 175, 2, 2, 1277, 1279, 7, 205, 2, 2, 1278, 1276, 3, 2, 2, 2, 1278, 1279, 3, 2, 2, 2, 1279, 1281, 3, 2, 2, 2, 1280, 1274, 3, 2, 2, 2, 1280, 1275, 3, 2, 2, 2, 1281, 75, 3, 2, 2, 2, 1282, 1283, 7, 167, 2, 2, 1283, 1284, 7, 192, 2, 2, 1284, 1289, 5, 84, 43, 2, 1285, 1286, 7, 167, 2, 2, 1286, 1287, 7, 192, 2, 2, 1287, 1289, 5, 74, 38, 2, 1288, 1282, 3, 2, 2, 2, 1288, 1285, 3, 2, 2, 2, 1289, 77, 3, 2, 2, 2, 1290, 1291, 9, 14, 2, 2, 1291, 79, 3, 2, 2, 2, 1292, 1293, 9, 15, 2, 2, 1293, 81, 3, 2, 2, 2, 1294, 1295, 9, 16, 2, 2, 1295, 83, 3, 2, 2, 2, 1296, 1298, 7, 88, 2, 2, 1297, 1299, 9, 12, 2, 2, 1298, 1297, 3, 2, 2, 2, 1298, 1299, 3, 2, 2, 2, 1299, 1300, 3, 2, 2, 2, 1300, 1301, 5, 74, 38, 2, 1301, 1304, 5, 86, 44, 2, 1302, 1303, 7, 170, 2, 2, 1303, 1305, 5, 86, 44, 2, 1304, 1302, 3, 2, 2, 2, 1304, 1305, 3, 2, 2, 2, 1305, 85, 3, 2, 2, 2, 1306, 1307, 9, 17, 2, 2, 1307, 87, 3, 2, 2, 2, 1308, 1309, 9, 18, 2, 2, 1309, 89, 3, 2, 2, 2, 1310, 1311, 8, 46, 1, 2, 1311, 1312, 7, 18, 2, 2, 1312, 1313, 7, 195, 2, 2, 1313, 1314, 5, 90, 46, 2, 1314, 1315, 7, 197, 2, 2, 1315, 1358, 3, 2, 2, 2, 1316, 1317, 7, 102, 2, 2, 1317, 1318, 7, 195, 2, 2, 1318, 1319, 5, 90, 46, 2, 1319, 1320, 7, 6, 2, 2, 1320, 1321, 5, 90, 46, 2, 1321, 1322, 7, 197, 2, 2, 1322, 1358, 3, 2, 2, 2, 1323, 1324, 7, 145, 2, 2, 1324, 1325, 7, 4, 2, 2, 1325, 1326, 5, 118, 60, 2, 1326, 1333, 5, 90, 46, 2, 1327, 1328, 7, 6, 2, 2, 1328, 1329, 5, 118, 60, 2, 1329, 1330, 5, 90, 46, 2, 1330, 1332, 3, 2, 2, 2, 1331, 1327, 3, 2, 2, 2, 1332, 1335, 3, 2, 2, 2, 1333, 1331, 3, 2, 2, 2, 1333, 1334, 3, 2, 2, 2, 1334, 1336, 3, 2, 2, 2, 1335, 1333, 3, 2, 2, 2, 1336, 1337, 7, 5, 2, 2, 1337, 1358, 3, 2, 2, 2, 1338, 1350, 5, 94, 48, 2, 1339, 1340, 7, 4, 2, 2, 1340, 1345, 5, 92, 47, 2, 1341, 1342, 7, 6, 2, 2, 1342, 1344, 5, 92, 47, 2, 1343, 1341, 3, 2, 2, 2, 1344, 1347, 3, 2, 2, 2, 1345, 1343, 3, 2, 2, 2, 1345, 1346, 3, 2, 2, 2, 1346, 1348, 3, 2, 2, 2, 1347, 1345, 3, 2, 2, 2, 1348, 1349, 7, 5, 2, 2, 1349, 1351, 3, 2, 2, 2, 1350, 1339, 3, 2, 2, 2, 1350, 1351, 3, 2, 2, 2, 1351, 1358, 3, 2, 2, 2, 1352, 1353, 7, 88, 2, 2, 1353, 1354, 5, 86, 44, 2, 1354, 1355, 7, 170, 2, 2, 1355, 1356, 5, 86, 44, 2, 1356, 1358, 3, 2, 2, 2, 1357, 1310, 3, 2, 2, 2, 1357, 1316, 3, 2, 2, 2, 1357, 1323, 3, 2, 2, 2, 1357, 1338, 3, 2, 2, 2, 1357, 1352, 3, 2, 2, 2, 1358, 1363, 3, 2, 2, 2, 1359, 1360, 12, 8, 2, 2, 1360, 1362, 7, 18, 2, 2, 1361, 1359, 3, 2, 2, 2, 1362, 1365, 3, 2, 2, 2, 1363, 1361, 3, 2, 2, 2, 1363, 1364, 3, 2, 2, 2, 1364, 91, 3, 2, 2, 2, 1365, 1363, 3, 2, 2, 2, 1366, 1369, 7, 208, 2, 2, 1367, 1369, 5, 90, 46, 2, 1368, 1366, 3, 2, 2, 2, 1368, 1367, 3, 2, 2, 2, 1369, 93, 3, 2, 2, 2, 1370, 1375, 7, 215, 2, 2, 1371, 1375, 7, 216, 2, 2, 1372, 1375, 7, 217, 2, 2, 1373, 1375, 5, 118, 60, 2, 1374, 1370, 3, 2, 2, 2, 1374, 1371, 3, 2, 2, 2, 1374, 1372, 3, 2, 2, 2, 1374, 1373, 3, 2, 2, 2, 1375, 95, 3, 2, 2, 2, 1376, 1377, 7, 186, 2, 2, 1377, 1378, 5, 62, 32, 2, 1378, 1379, 7, 166, 2, 2, 1379, 1380, 5, 62, 32, 2, 1380, 97, 3, 2, 2, 2, 1381, 1382, 7, 65, 2, 2, 1382, 1383, 7, 4, 2, 2, 1383, 1384, 7, 187, 2, 2, 1384, 1385, 5, 64, 33, 2, 1385, 1386, 7, 5, 2, 2, 1386, 99, 3, 2, 2, 2, 1387, 1388, 7, 124, 2, 2, 1388, 1399, 7, 4, 2, 2, 1389, 1390, 7, 125, 2, 2, 1390, 1391, 7, 24, 2, 2, 1391, 1396, 5, 62, 32, 2, 1392, 1393, 7, 6, 2, 2, 1393, 1395, 5, 62, 32, 2, 1394, 1392, 3, 2, 2, 2, 1395, 1398, 3, 2, 2, 2, 1396, 1394, 3, 2, 2, 2, 1396, 1397, 3, 2, 2, 2, 1397, 1400, 3, 2, 2, 2, 1398, 1396, 3, 2, 2, 2, 1399, 1389, 3, 2, 2, 2, 1399, 1400, 3, 2, 2, 2, 1400, 1411, 3, 2, 2, 2, 1401, 1402, 7, 120, 2, 2, 1402, 1403, 7, 24, 2, 2, 1403, 1408, 5, 28, 15, 2, 1404, 1405, 7, 6, 2, 2, 1405, 1407, 5, 28, 15, 2, 1406, 1404, 3, 2, 2, 2, 1407, 1410, 3, 2, 2, 2, 1408, 1406, 3, 2, 2, 2, 1408, 1409, 3, 2, 2, 2, 1409, 1412, 3, 2, 2, 2, 1410, 1408, 3, 2, 2, 2, 1411, 1401, 3, 2, 2, 2, 1411, 1412, 3, 2, 2, 2, 1412, 1414, 3, 2, 2, 2, 1413, 1415, 5, 102, 52, 2, 1414, 1413, 3, 2, 2, 2, 1414, 1415, 3, 2, 2, 2, 1415, 1416, 3, 2, 2, 2, 1416, 1417, 7, 5, 2, 2, 1417, 101, 3, 2, 2, 2, 1418, 1419, 7, 133, 2, 2, 1419, 1435, 5, 104, 53, 2, 1420, 1421, 7, 146, 2, 2, 1421, 1435, 5, 104, 53, 2, 1422, 1423, 7, 133, 2, 2, 1423, 1424, 7, 23, 2, 2, 1424, 1425, 5, 104, 53, 2, 1425, 1426, 7, 16, 2, 2, 1426, 1427, 5, 104, 53, 2, 1427, 1435, 3, 2, 2, 2, 1428, 1429, 7, 146, 2, 2, 1429, 1430, 7, 23, 2, 2, 1430, 1431, 5, 104, 53, 2, 1431, 1432, 7, 16, 2, 2, 1432, 1433, 5, 104, 53, 2, 1433, 1435, 3, 2, 2, 2, 1434, 1418, 3, 2, 2, 2, 1434, 1420, 3, 2, 2, 2, 1434, 1422, 3, 2, 2, 2, 1434, 1428, 3, 2, 2, 2, 1435, 103, 3, 2, 2, 2, 1436, 1437, 7, 176, 2, 2, 1437, 1446, 7, 128, 2, 2, 1438, 1439, 7, 176, 2, 2, 1439, 1446, 7, 67, 2, 2, 1440, 1441, 7, 40, 2, 2, 1441, 1446, 7, 145, 2, 2, 1442, 1443, 5, 62, 32, 2, 1443, 1444, 9, 19, 2, 2, 1444, 1446, 3, 2, 2, 2, 1445, 1436, 3, 2, 2, 2, 1445, 1438, 3, 2, 2, 2, 1445, 1440, 3, 2, 2, 2, 1445, 1442, 3, 2, 2, 2, 1446, 105, 3, 2, 2, 2, 1447, 1448, 7, 69, 2, 2, 1448, 1452, 9, 20, 2, 2, 1449, 1450, 7, 174, 2, 2, 1450, 1452, 9, 21, 2, 2, 1451, 1447, 3, 2, 2, 2, 1451, 1449, 3, 2, 2, 2, 1452, 107, 3, 2, 2, 2, 1453, 1454, 7, 91, 2, 2, 1454, 1455, 7, 96, 2, 2, 1455, 1459, 5, 110, 56, 2, 1456, 1457, 7, 134, 2, 2, 1457, 1459, 9, 22, 2, 2, 1458, 1453, 3, 2, 2, 2, 1458, 1456, 3, 2, 2, 2, 1459, 109, 3, 2, 2, 2, 1460, 1461, 7, 134, 2, 2, 1461, 1468, 7, 177, 2, 2, 1462, 1463, 7, 134, 2, 2, 1463, 1468, 7, 35, 2, 2, 1464, 1465, 7, 137, 2, 2, 1465, 1468, 7, 134, 2, 2, 1466, 1468, 7, 151, 2, 2, 1467, 1460, 3, 2, 2, 2, 1467, 1462, 3, 2, 2, 2, 1467, 1464, 3, 2, 2, 2, 1467, 1466, 3, 2, 2, 2, 1468, 111, 3, 2, 2, 2, 1469, 1475, 5, 62, 32, 2, 1470, 1471, 5, 118, 60, 2, 1471, 1472, 7, 11, 2, 2, 1472, 1473, 5, 62, 32, 2, 1473, 1475, 3, 2, 2, 2, 1474, 1469, 3, 2, 2, 2, 1474, 1470, 3, 2, 2, 2, 1475, 113, 3, 2, 2, 2, 1476, 1481, 7, 150, 2, 2, 1477, 1481, 7, 49, 2, 2, 1478, 1481, 7, 85, 2, 2, 1479, 1481, 5, 118, 60, 2, 1480, 1476, 3, 2, 2, 2, 1480, 1477, 3, 2, 2, 2, 1480, 1478, 3, 2, 2, 2, 1480, 1479, 3, 2, 2, 2, 1481, 115, 3, 2, 2, 2, 1482, 1487, 5, 118, 60, 2, 1483, 1484, 7, 3, 2, 2, 1484, 1486, 5, 118, 60, 2, 1485, 1483, 3, 2, 2, 2, 1486, 1489, 3, 2, 2, 2, 1487, 1485, 3, 2, 2, 2, 1487, 1488, 3, 2, 2, 2, 1488, 117, 3, 2, 2, 2, 1489, 1487, 3, 2, 2, 2, 1490, 1496, 7, 211, 2, 2, 1491, 1496, 7, 213, 2, 2, 1492, 1496, 5, 122, 62, 2, 1493, 1496, 7, 214, 2, 2, 1494, 1496, 7, 212, 2, 2, 1495, 1490, 3, 2, 2, 2, 1495, 1491, 3, 2, 2, 2, 1495, 1492, 3, 2, 2, 2, 1495, 1493, 3, 2, 2, 2, 1495, 1494, 3, 2, 2, 2, 1496, 119, 3, 2, 2, 2, 1497, 1501, 7, 209, 2, 2, 1498, 1501, 7, 210, 2, 2, 1499, 1501, 7, 208, 2, 2, 1500, 1497, 3, 2, 2, 2, 1500, 1498, 3, 2, 2, 2, 1500, 1499, 3, 2, 2, 2, 1501, 121, 3, 2, 2, 2, 1502, 1503, 9, 23, 2, 2, 1503, 123, 3, 2, 2, 2, 189, 143, 148, 154, 158, 172, 176, 180, 184, 192, 196, 199, 206, 215, 221, 225, 231, 238, 247, 282, 293, 304, 307, 317, 322, 326, 334, 340, 347, 352, 356, 366, 369, 373, 376, 384, 389, 404, 410, 412, 418, 424, 426, 432, 473, 476, 480, 484, 492, 501, 504, 508, 526, 529, 537, 540, 546, 553, 558, 564, 570, 578, 595, 598, 602, 610, 616, 619, 621, 633, 640, 644, 648, 652, 659, 668, 671, 675, 680, 684, 687, 694, 705, 708, 718, 721, 732, 737, 745, 748, 752, 760, 763, 767, 771, 782, 785, 792, 811, 815, 819, 823, 827, 831, 833, 844, 849, 858, 864, 868, 870, 878, 895, 901, 912, 920, 928, 930, 935, 947, 955, 964, 970, 978, 984, 988, 993, 998, 1004, 1018, 1020, 1049, 1060, 1070, 1073, 1078, 1085, 1088, 1097, 1100, 1104, 1107, 1119, 1122, 1141, 1145, 1153, 1157, 1182, 1185, 1194, 1200, 1206, 1212, 1222, 1231, 1253, 1256, 1259, 1269, 1271, 1278, 1280, 1288, 1298, 1304, 1333, 1345, 1350, 1357, 1363, 1368, 1374, 1396, 1399, 1408, 1411, 1414, 1434, 1445, 1451, 1458, 1467, 1474, 1480, 1487, 1495, 1500]
\ No newline at end of file
T__0=1
T__1=2
T__2=3
T__3=4
T__4=5
T__5=6
T__6=7
T__7=8
T__8=9
ADD=10
ALL=11
ALTER=12
ANALYZE=13
AND=14
ANY=15
ARRAY=16
AS=17
ASC=18
AT=19
BERNOULLI=20
BETWEEN=21
BY=22
CALL=23
CASCADE=24
CASE=25
CAST=26
CATALOGS=27
COALESCE=28
COLUMN=29
COLUMNS=30
COMMENT=31
COMMIT=32
COMMITTED=33
CONSTRAINT=34
CREATE=35
CROSS=36
CUBE=37
CURRENT=38
CURRENT_DATE=39
CURRENT_TIME=40
CURRENT_TIMESTAMP=41
CURRENT_USER=42
DATA=43
DATE=44
DAY=45
DEALLOCATE=46
DELETE=47
DESC=48
DESCRIBE=49
DISTINCT=50
DISTRIBUTED=51
DROP=52
ELSE=53
END=54
ESCAPE=55
EXCEPT=56
EXCLUDING=57
EXECUTE=58
EXISTS=59
EXPLAIN=60
EXTRACT=61
FALSE=62
FILTER=63
FIRST=64
FOLLOWING=65
FOR=66
FORMAT=67
FROM=68
FULL=69
FUNCTIONS=70
GRANT=71
GRANTS=72
GRAPHVIZ=73
GROUP=74
GROUPING=75
HAVING=76
HOUR=77
IF=78
IN=79
INCLUDING=80
INNER=81
INPUT=82
INSERT=83
INTEGER=84
INTERSECT=85
INTERVAL=86
INTO=87
IS=88
ISOLATION=89
JOIN=90
LAST=91
LATERAL=92
LEFT=93
LEVEL=94
LIKE=95
LIMIT=96
LOCALTIME=97
LOCALTIMESTAMP=98
LOGICAL=99
MAP=100
MINUTE=101
MONTH=102
NATURAL=103
NFC=104
NFD=105
NFKC=106
NFKD=107
NO=108
NORMALIZE=109
NOT=110
NULL=111
NULLIF=112
NULLS=113
ON=114
ONLY=115
OPTION=116
OR=117
ORDER=118
ORDINALITY=119
OUTER=120
OUTPUT=121
OVER=122
PARTITION=123
PARTITIONS=124
POSITION=125
PRECEDING=126
PREPARE=127
PRIVILEGES=128
PROPERTIES=129
PUBLIC=130
RANGE=131
READ=132
RECURSIVE=133
RENAME=134
REPEATABLE=135
REPLACE=136
RESET=137
RESTRICT=138
REVOKE=139
RIGHT=140
ROLLBACK=141
ROLLUP=142
ROW=143
ROWS=144
SCHEMA=145
SCHEMAS=146
SECOND=147
SELECT=148
SERIALIZABLE=149
SESSION=150
SET=151
SETS=152
SHOW=153
SMALLINT=154
SOME=155
START=156
STATS=157
SUBSTRING=158
SYSTEM=159
TABLE=160
TABLES=161
TABLESAMPLE=162
TEXT=163
THEN=164
TIME=165
TIMESTAMP=166
TINYINT=167
TO=168
TRANSACTION=169
TRUE=170
TRY_CAST=171
TYPE=172
UESCAPE=173
UNBOUNDED=174
UNCOMMITTED=175
UNION=176
UNNEST=177
USE=178
USING=179
VALIDATE=180
VALUES=181
VERBOSE=182
VIEW=183
WHEN=184
WHERE=185
WITH=186
WORK=187
WRITE=188
YEAR=189
ZONE=190
EQ=191
NEQ=192
LT=193
LTE=194
GT=195
GTE=196
PLUS=197
MINUS=198
ASTERISK=199
SLASH=200
PERCENT=201
CONCAT=202
STRING=203
UNICODE_STRING=204
BINARY_LITERAL=205
INTEGER_VALUE=206
DECIMAL_VALUE=207
DOUBLE_VALUE=208
IDENTIFIER=209
DIGIT_IDENTIFIER=210
QUOTED_IDENTIFIER=211
BACKQUOTED_IDENTIFIER=212
TIME_WITH_TIME_ZONE=213
TIMESTAMP_WITH_TIME_ZONE=214
DOUBLE_PRECISION=215
SIMPLE_COMMENT=216
BRACKETED_COMMENT=217
WS=218
UNRECOGNIZED=219
DELIMITER=220
'.'=1
'('=2
')'=3
','=4
'?'=5
'->'=6
'['=7
']'=8
'=>'=9
'ADD'=10
'ALL'=11
'ALTER'=12
'ANALYZE'=13
'AND'=14
'ANY'=15
'ARRAY'=16
'AS'=17
'ASC'=18
'AT'=19
'BERNOULLI'=20
'BETWEEN'=21
'BY'=22
'CALL'=23
'CASCADE'=24
'CASE'=25
'CAST'=26
'CATALOGS'=27
'COALESCE'=28
'COLUMN'=29
'COLUMNS'=30
'COMMENT'=31
'COMMIT'=32
'COMMITTED'=33
'CONSTRAINT'=34
'CREATE'=35
'CROSS'=36
'CUBE'=37
'CURRENT'=38
'CURRENT_DATE'=39
'CURRENT_TIME'=40
'CURRENT_TIMESTAMP'=41
'CURRENT_USER'=42
'DATA'=43
'DATE'=44
'DAY'=45
'DEALLOCATE'=46
'DELETE'=47
'DESC'=48
'DESCRIBE'=49
'DISTINCT'=50
'DISTRIBUTED'=51
'DROP'=52
'ELSE'=53
'END'=54
'ESCAPE'=55
'EXCEPT'=56
'EXCLUDING'=57
'EXECUTE'=58
'EXISTS'=59
'EXPLAIN'=60
'EXTRACT'=61
'FALSE'=62
'FILTER'=63
'FIRST'=64
'FOLLOWING'=65
'FOR'=66
'FORMAT'=67
'FROM'=68
'FULL'=69
'FUNCTIONS'=70
'GRANT'=71
'GRANTS'=72
'GRAPHVIZ'=73
'GROUP'=74
'GROUPING'=75
'HAVING'=76
'HOUR'=77
'IF'=78
'IN'=79
'INCLUDING'=80
'INNER'=81
'INPUT'=82
'INSERT'=83
'INTEGER'=84
'INTERSECT'=85
'INTERVAL'=86
'INTO'=87
'IS'=88
'ISOLATION'=89
'JOIN'=90
'LAST'=91
'LATERAL'=92
'LEFT'=93
'LEVEL'=94
'LIKE'=95
'LIMIT'=96
'LOCALTIME'=97
'LOCALTIMESTAMP'=98
'LOGICAL'=99
'MAP'=100
'MINUTE'=101
'MONTH'=102
'NATURAL'=103
'NFC'=104
'NFD'=105
'NFKC'=106
'NFKD'=107
'NO'=108
'NORMALIZE'=109
'NOT'=110
'NULL'=111
'NULLIF'=112
'NULLS'=113
'ON'=114
'ONLY'=115
'OPTION'=116
'OR'=117
'ORDER'=118
'ORDINALITY'=119
'OUTER'=120
'OUTPUT'=121
'OVER'=122
'PARTITION'=123
'PARTITIONS'=124
'POSITION'=125
'PRECEDING'=126
'PREPARE'=127
'PRIVILEGES'=128
'PROPERTIES'=129
'PUBLIC'=130
'RANGE'=131
'READ'=132
'RECURSIVE'=133
'RENAME'=134
'REPEATABLE'=135
'REPLACE'=136
'RESET'=137
'RESTRICT'=138
'REVOKE'=139
'RIGHT'=140
'ROLLBACK'=141
'ROLLUP'=142
'ROW'=143
'ROWS'=144
'SCHEMA'=145
'SCHEMAS'=146
'SECOND'=147
'SELECT'=148
'SERIALIZABLE'=149
'SESSION'=150
'SET'=151
'SETS'=152
'SHOW'=153
'SMALLINT'=154
'SOME'=155
'START'=156
'STATS'=157
'SUBSTRING'=158
'SYSTEM'=159
'TABLE'=160
'TABLES'=161
'TABLESAMPLE'=162
'TEXT'=163
'THEN'=164
'TIME'=165
'TIMESTAMP'=166
'TINYINT'=167
'TO'=168
'TRANSACTION'=169
'TRUE'=170
'TRY_CAST'=171
'TYPE'=172
'UESCAPE'=173
'UNBOUNDED'=174
'UNCOMMITTED'=175
'UNION'=176
'UNNEST'=177
'USE'=178
'USING'=179
'VALIDATE'=180
'VALUES'=181
'VERBOSE'=182
'VIEW'=183
'WHEN'=184
'WHERE'=185
'WITH'=186
'WORK'=187
'WRITE'=188
'YEAR'=189
'ZONE'=190
'='=191
'<'=193
'<='=194
'>'=195
'>='=196
'+'=197
'-'=198
'*'=199
'/'=200
'%'=201
'||'=202
token literal names:
null
'.'
'('
')'
','
'?'
'->'
'['
']'
'=>'
'ADD'
'ALL'
'ALTER'
'ANALYZE'
'AND'
'ANY'
'ARRAY'
'AS'
'ASC'
'AT'
'BERNOULLI'
'BETWEEN'
'BY'
'CALL'
'CASCADE'
'CASE'
'CAST'
'CATALOGS'
'COALESCE'
'COLUMN'
'COLUMNS'
'COMMENT'
'COMMIT'
'COMMITTED'
'CONSTRAINT'
'CREATE'
'CROSS'
'CUBE'
'CURRENT'
'CURRENT_DATE'
'CURRENT_TIME'
'CURRENT_TIMESTAMP'
'CURRENT_USER'
'DATA'
'DATE'
'DAY'
'DEALLOCATE'
'DELETE'
'DESC'
'DESCRIBE'
'DISTINCT'
'DISTRIBUTED'
'DROP'
'ELSE'
'END'
'ESCAPE'
'EXCEPT'
'EXCLUDING'
'EXECUTE'
'EXISTS'
'EXPLAIN'
'EXTRACT'
'FALSE'
'FILTER'
'FIRST'
'FOLLOWING'
'FOR'
'FORMAT'
'FROM'
'FULL'
'FUNCTIONS'
'GRANT'
'GRANTS'
'GRAPHVIZ'
'GROUP'
'GROUPING'
'HAVING'
'HOUR'
'IF'
'IN'
'INCLUDING'
'INNER'
'INPUT'
'INSERT'
'INTEGER'
'INTERSECT'
'INTERVAL'
'INTO'
'IS'
'ISOLATION'
'JOIN'
'LAST'
'LATERAL'
'LEFT'
'LEVEL'
'LIKE'
'LIMIT'
'LOCALTIME'
'LOCALTIMESTAMP'
'LOGICAL'
'MAP'
'MINUTE'
'MONTH'
'NATURAL'
'NFC'
'NFD'
'NFKC'
'NFKD'
'NO'
'NORMALIZE'
'NOT'
'NULL'
'NULLIF'
'NULLS'
'ON'
'ONLY'
'OPTION'
'OR'
'ORDER'
'ORDINALITY'
'OUTER'
'OUTPUT'
'OVER'
'PARTITION'
'PARTITIONS'
'POSITION'
'PRECEDING'
'PREPARE'
'PRIVILEGES'
'PROPERTIES'
'PUBLIC'
'RANGE'
'READ'
'RECURSIVE'
'RENAME'
'REPEATABLE'
'REPLACE'
'RESET'
'RESTRICT'
'REVOKE'
'RIGHT'
'ROLLBACK'
'ROLLUP'
'ROW'
'ROWS'
'SCHEMA'
'SCHEMAS'
'SECOND'
'SELECT'
'SERIALIZABLE'
'SESSION'
'SET'
'SETS'
'SHOW'
'SMALLINT'
'SOME'
'START'
'STATS'
'SUBSTRING'
'SYSTEM'
'TABLE'
'TABLES'
'TABLESAMPLE'
'TEXT'
'THEN'
'TIME'
'TIMESTAMP'
'TINYINT'
'TO'
'TRANSACTION'
'TRUE'
'TRY_CAST'
'TYPE'
'UESCAPE'
'UNBOUNDED'
'UNCOMMITTED'
'UNION'
'UNNEST'
'USE'
'USING'
'VALIDATE'
'VALUES'
'VERBOSE'
'VIEW'
'WHEN'
'WHERE'
'WITH'
'WORK'
'WRITE'
'YEAR'
'ZONE'
'='
null
'<'
'<='
'>'
'>='
'+'
'-'
'*'
'/'
'%'
'||'
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
token symbolic names:
null
null
null
null
null
null
null
null
null
null
ADD
ALL
ALTER
ANALYZE
AND
ANY
ARRAY
AS
ASC
AT
BERNOULLI
BETWEEN
BY
CALL
CASCADE
CASE
CAST
CATALOGS
COALESCE
COLUMN
COLUMNS
COMMENT
COMMIT
COMMITTED
CONSTRAINT
CREATE
CROSS
CUBE
CURRENT
CURRENT_DATE
CURRENT_TIME
CURRENT_TIMESTAMP
CURRENT_USER
DATA
DATE
DAY
DEALLOCATE
DELETE
DESC
DESCRIBE
DISTINCT
DISTRIBUTED
DROP
ELSE
END
ESCAPE
EXCEPT
EXCLUDING
EXECUTE
EXISTS
EXPLAIN
EXTRACT
FALSE
FILTER
FIRST
FOLLOWING
FOR
FORMAT
FROM
FULL
FUNCTIONS
GRANT
GRANTS
GRAPHVIZ
GROUP
GROUPING
HAVING
HOUR
IF
IN
INCLUDING
INNER
INPUT
INSERT
INTEGER
INTERSECT
INTERVAL
INTO
IS
ISOLATION
JOIN
LAST
LATERAL
LEFT
LEVEL
LIKE
LIMIT
LOCALTIME
LOCALTIMESTAMP
LOGICAL
MAP
MINUTE
MONTH
NATURAL
NFC
NFD
NFKC
NFKD
NO
NORMALIZE
NOT
NULL
NULLIF
NULLS
ON
ONLY
OPTION
OR
ORDER
ORDINALITY
OUTER
OUTPUT
OVER
PARTITION
PARTITIONS
POSITION
PRECEDING
PREPARE
PRIVILEGES
PROPERTIES
PUBLIC
RANGE
READ
RECURSIVE
RENAME
REPEATABLE
REPLACE
RESET
RESTRICT
REVOKE
RIGHT
ROLLBACK
ROLLUP
ROW
ROWS
SCHEMA
SCHEMAS
SECOND
SELECT
SERIALIZABLE
SESSION
SET
SETS
SHOW
SMALLINT
SOME
START
STATS
SUBSTRING
SYSTEM
TABLE
TABLES
TABLESAMPLE
TEXT
THEN
TIME
TIMESTAMP
TINYINT
TO
TRANSACTION
TRUE
TRY_CAST
TYPE
UESCAPE
UNBOUNDED
UNCOMMITTED
UNION
UNNEST
USE
USING
VALIDATE
VALUES
VERBOSE
VIEW
WHEN
WHERE
WITH
WORK
WRITE
YEAR
ZONE
EQ
NEQ
LT
LTE
GT
GTE
PLUS
MINUS
ASTERISK
SLASH
PERCENT
CONCAT
STRING
UNICODE_STRING
BINARY_LITERAL
INTEGER_VALUE
DECIMAL_VALUE
DOUBLE_VALUE
IDENTIFIER
DIGIT_IDENTIFIER
QUOTED_IDENTIFIER
BACKQUOTED_IDENTIFIER
TIME_WITH_TIME_ZONE
TIMESTAMP_WITH_TIME_ZONE
DOUBLE_PRECISION
SIMPLE_COMMENT
BRACKETED_COMMENT
WS
UNRECOGNIZED
rule names:
T__0
T__1
T__2
T__3
T__4
T__5
T__6
T__7
T__8
ADD
ALL
ALTER
ANALYZE
AND
ANY
ARRAY
AS
ASC
AT
BERNOULLI
BETWEEN
BY
CALL
CASCADE
CASE
CAST
CATALOGS
COALESCE
COLUMN
COLUMNS
COMMENT
COMMIT
COMMITTED
CONSTRAINT
CREATE
CROSS
CUBE
CURRENT
CURRENT_DATE
CURRENT_TIME
CURRENT_TIMESTAMP
CURRENT_USER
DATA
DATE
DAY
DEALLOCATE
DELETE
DESC
DESCRIBE
DISTINCT
DISTRIBUTED
DROP
ELSE
END
ESCAPE
EXCEPT
EXCLUDING
EXECUTE
EXISTS
EXPLAIN
EXTRACT
FALSE
FILTER
FIRST
FOLLOWING
FOR
FORMAT
FROM
FULL
FUNCTIONS
GRANT
GRANTS
GRAPHVIZ
GROUP
GROUPING
HAVING
HOUR
IF
IN
INCLUDING
INNER
INPUT
INSERT
INTEGER
INTERSECT
INTERVAL
INTO
IS
ISOLATION
JOIN
LAST
LATERAL
LEFT
LEVEL
LIKE
LIMIT
LOCALTIME
LOCALTIMESTAMP
LOGICAL
MAP
MINUTE
MONTH
NATURAL
NFC
NFD
NFKC
NFKD
NO
NORMALIZE
NOT
NULL
NULLIF
NULLS
ON
ONLY
OPTION
OR
ORDER
ORDINALITY
OUTER
OUTPUT
OVER
PARTITION
PARTITIONS
POSITION
PRECEDING
PREPARE
PRIVILEGES
PROPERTIES
PUBLIC
RANGE
READ
RECURSIVE
RENAME
REPEATABLE
REPLACE
RESET
RESTRICT
REVOKE
RIGHT
ROLLBACK
ROLLUP
ROW
ROWS
SCHEMA
SCHEMAS
SECOND
SELECT
SERIALIZABLE
SESSION
SET
SETS
SHOW
SMALLINT
SOME
START
STATS
SUBSTRING
SYSTEM
TABLE
TABLES
TABLESAMPLE
TEXT
THEN
TIME
TIMESTAMP
TINYINT
TO
TRANSACTION
TRUE
TRY_CAST
TYPE
UESCAPE
UNBOUNDED
UNCOMMITTED
UNION
UNNEST
USE
USING
VALIDATE
VALUES
VERBOSE
VIEW
WHEN
WHERE
WITH
WORK
WRITE
YEAR
ZONE
EQ
NEQ
LT
LTE
GT
GTE
PLUS
MINUS
ASTERISK
SLASH
PERCENT
CONCAT
STRING
UNICODE_STRING
BINARY_LITERAL
INTEGER_VALUE
DECIMAL_VALUE
DOUBLE_VALUE
IDENTIFIER
DIGIT_IDENTIFIER
QUOTED_IDENTIFIER
BACKQUOTED_IDENTIFIER
TIME_WITH_TIME_ZONE
TIMESTAMP_WITH_TIME_ZONE
DOUBLE_PRECISION
EXPONENT
DIGIT
LETTER
SIMPLE_COMMENT
BRACKETED_COMMENT
WS
UNRECOGNIZED
channel names:
DEFAULT_TOKEN_CHANNEL
HIDDEN
mode names:
DEFAULT_MODE
atn:
[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 221, 2015, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 4, 122, 9, 122, 4, 123, 9, 123, 4, 124, 9, 124, 4, 125, 9, 125, 4, 126, 9, 126, 4, 127, 9, 127, 4, 128, 9, 128, 4, 129, 9, 129, 4, 130, 9, 130, 4, 131, 9, 131, 4, 132, 9, 132, 4, 133, 9, 133, 4, 134, 9, 134, 4, 135, 9, 135, 4, 136, 9, 136, 4, 137, 9, 137, 4, 138, 9, 138, 4, 139, 9, 139, 4, 140, 9, 140, 4, 141, 9, 141, 4, 142, 9, 142, 4, 143, 9, 143, 4, 144, 9, 144, 4, 145, 9, 145, 4, 146, 9, 146, 4, 147, 9, 147, 4, 148, 9, 148, 4, 149, 9, 149, 4, 150, 9, 150, 4, 151, 9, 151, 4, 152, 9, 152, 4, 153, 9, 153, 4, 154, 9, 154, 4, 155, 9, 155, 4, 156, 9, 156, 4, 157, 9, 157, 4, 158, 9, 158, 4, 159, 9, 159, 4, 160, 9, 160, 4, 161, 9, 161, 4, 162, 9, 162, 4, 163, 9, 163, 4, 164, 9, 164, 4, 165, 9, 165, 4, 166, 9, 166, 4, 167, 9, 167, 4, 168, 9, 168, 4, 169, 9, 169, 4, 170, 9, 170, 4, 171, 9, 171, 4, 172, 9, 172, 4, 173, 9, 173, 4, 174, 9, 174, 4, 175, 9, 175, 4, 176, 9, 176, 4, 177, 9, 177, 4, 178, 9, 178, 4, 179, 9, 179, 4, 180, 9, 180, 4, 181, 9, 181, 4, 182, 9, 182, 4, 183, 9, 183, 4, 184, 9, 184, 4, 185, 9, 185, 4, 186, 9, 186, 4, 187, 9, 187, 4, 188, 9, 188, 4, 189, 9, 189, 4, 190, 9, 190, 4, 191, 9, 191, 4, 192, 9, 192, 4, 193, 9, 193, 4, 194, 9, 194, 4, 195, 9, 195, 4, 196, 9, 196, 4, 197, 9, 197, 4, 198, 9, 198, 4, 199, 9, 199, 4, 200, 9, 200, 4, 201, 9, 201, 4, 202, 9, 202, 4, 203, 9, 203, 4, 204, 9, 204, 4, 205, 9, 205, 4, 206, 9, 206, 4, 207, 9, 207, 4, 208, 9, 208, 4, 209, 9, 209, 4, 210, 9, 210, 4, 211, 9, 211, 4, 212, 9, 212, 4, 213, 9, 213, 4, 214, 9, 214, 4, 215, 9, 215, 4, 216, 9, 216, 4, 217, 9, 217, 4, 218, 9, 218, 4, 219, 9, 219, 4, 220, 9, 220, 4, 221, 9, 221, 4, 222, 9, 222, 4, 223, 9, 223, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 5, 3, 5, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 79, 3, 79, 3, 79, 3, 80, 3, 80, 3, 80, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 94, 3, 94, 3, 94, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 100, 3, 100, 3, 100, 3, 100, 3, 100, 3, 100, 3, 100, 3, 100, 3, 101, 3, 101, 3, 101, 3, 101, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 105, 3, 105, 3, 105, 3, 105, 3, 106, 3, 106, 3, 106, 3, 106, 3, 107, 3, 107, 3, 107, 3, 107, 3, 107, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 109, 3, 109, 3, 109, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 111, 3, 111, 3, 111, 3, 111, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 115, 3, 115, 3, 115, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 118, 3, 118, 3, 118, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 123, 3, 123, 3, 123, 3, 123, 3, 123, 3, 124, 3, 124, 3, 124, 3, 124, 3, 124, 3, 124, 3, 124, 3, 124, 3, 124, 3, 124, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 126, 3, 126, 3, 126, 3, 126, 3, 126, 3, 126, 3, 126, 3, 126, 3, 126, 3, 127, 3, 127, 3, 127, 3, 127, 3, 127, 3, 127, 3, 127, 3, 127, 3, 127, 3, 127, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 131, 3, 131, 3, 131, 3, 131, 3, 131, 3, 131, 3, 131, 3, 132, 3, 132, 3, 132, 3, 132, 3, 132, 3, 132, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 134, 3, 134, 3, 134, 3, 134, 3, 134, 3, 134, 3, 134, 3, 134, 3, 134, 3, 134, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 136, 3, 136, 3, 136, 3, 136, 3, 136, 3, 136, 3, 136, 3, 136, 3, 136, 3, 136, 3, 136, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 140, 3, 140, 3, 140, 3, 140, 3, 140, 3, 140, 3, 140, 3, 141, 3, 141, 3, 141, 3, 141, 3, 141, 3, 141, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 144, 3, 144, 3, 144, 3, 144, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 146, 3, 146, 3, 146, 3, 146, 3, 146, 3, 146, 3, 146, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 149, 3, 149, 3, 149, 3, 149, 3, 149, 3, 149, 3, 149, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 152, 3, 152, 3, 152, 3, 152, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 3, 154, 3, 154, 3, 154, 3, 154, 3, 154, 3, 155, 3, 155, 3, 155, 3, 155, 3, 155, 3, 155, 3, 155, 3, 155, 3, 155, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 159, 3, 159, 3, 159, 3, 159, 3, 159, 3, 159, 3, 159, 3, 159, 3, 159, 3, 159, 3, 160, 3, 160, 3, 160, 3, 160, 3, 160, 3, 160, 3, 160, 3, 161, 3, 161, 3, 161, 3, 161, 3, 161, 3, 161, 3, 162, 3, 162, 3, 162, 3, 162, 3, 162, 3, 162, 3, 162, 3, 163, 3, 163, 3, 163, 3, 163, 3, 163, 3, 163, 3, 163, 3, 163, 3, 163, 3, 163, 3, 163, 3, 163, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 3, 165, 3, 165, 3, 165, 3, 165, 3, 165, 3, 166, 3, 166, 3, 166, 3, 166, 3, 166, 3, 167, 3, 167, 3, 167, 3, 167, 3, 167, 3, 167, 3, 167, 3, 167, 3, 167, 3, 167, 3, 168, 3, 168, 3, 168, 3, 168, 3, 168, 3, 168, 3, 168, 3, 168, 3, 169, 3, 169, 3, 169, 3, 170, 3, 170, 3, 170, 3, 170, 3, 170, 3, 170, 3, 170, 3, 170, 3, 170, 3, 170, 3, 170, 3, 170, 3, 171, 3, 171, 3, 171, 3, 171, 3, 171, 3, 172, 3, 172, 3, 172, 3, 172, 3, 172, 3, 172, 3, 172, 3, 172, 3, 172, 3, 173, 3, 173, 3, 173, 3, 173, 3, 173, 3, 174, 3, 174, 3, 174, 3, 174, 3, 174, 3, 174, 3, 174, 3, 174, 3, 175, 3, 175, 3, 175, 3, 175, 3, 175, 3, 175, 3, 175, 3, 175, 3, 175, 3, 175, 3, 176, 3, 176, 3, 176, 3, 176, 3, 176, 3, 176, 3, 176, 3, 176, 3, 176, 3, 176, 3, 176, 3, 176, 3, 177, 3, 177, 3, 177, 3, 177, 3, 177, 3, 177, 3, 178, 3, 178, 3, 178, 3, 178, 3, 178, 3, 178, 3, 178, 3, 179, 3, 179, 3, 179, 3, 179, 3, 180, 3, 180, 3, 180, 3, 180, 3, 180, 3, 180, 3, 181, 3, 181, 3, 181, 3, 181, 3, 181, 3, 181, 3, 181, 3, 181, 3, 181, 3, 182, 3, 182, 3, 182, 3, 182, 3, 182, 3, 182, 3, 182, 3, 183, 3, 183, 3, 183, 3, 183, 3, 183, 3, 183, 3, 183, 3, 183, 3, 184, 3, 184, 3, 184, 3, 184, 3, 184, 3, 185, 3, 185, 3, 185, 3, 185, 3, 185, 3, 186, 3, 186, 3, 186, 3, 186, 3, 186, 3, 186, 3, 187, 3, 187, 3, 187, 3, 187, 3, 187, 3, 188, 3, 188, 3, 188, 3, 188, 3, 188, 3, 189, 3, 189, 3, 189, 3, 189, 3, 189, 3, 189, 3, 190, 3, 190, 3, 190, 3, 190, 3, 190, 3, 191, 3, 191, 3, 191, 3, 191, 3, 191, 3, 192, 3, 192, 3, 193, 3, 193, 3, 193, 3, 193, 5, 193, 1740, 10, 193, 3, 194, 3, 194, 3, 195, 3, 195, 3, 195, 3, 196, 3, 196, 3, 197, 3, 197, 3, 197, 3, 198, 3, 198, 3, 199, 3, 199, 3, 200, 3, 200, 3, 201, 3, 201, 3, 202, 3, 202, 3, 203, 3, 203, 3, 203, 3, 204, 3, 204, 3, 204, 3, 204, 7, 204, 1769, 10, 204, 12, 204, 14, 204, 1772, 11, 204, 3, 204, 3, 204, 3, 205, 3, 205, 3, 205, 3, 205, 3, 205, 3, 205, 3, 205, 7, 205, 1783, 10, 205, 12, 205, 14, 205, 1786, 11, 205, 3, 205, 3, 205, 3, 206, 3, 206, 3, 206, 3, 206, 7, 206, 1794, 10, 206, 12, 206, 14, 206, 1797, 11, 206, 3, 206, 3, 206, 3, 207, 6, 207, 1802, 10, 207, 13, 207, 14, 207, 1803, 3, 208, 6, 208, 1807, 10, 208, 13, 208, 14, 208, 1808, 3, 208, 3, 208, 7, 208, 1813, 10, 208, 12, 208, 14, 208, 1816, 11, 208, 3, 208, 3, 208, 6, 208, 1820, 10, 208, 13, 208, 14, 208, 1821, 5, 208, 1824, 10, 208, 3, 209, 6, 209, 1827, 10, 209, 13, 209, 14, 209, 1828, 3, 209, 3, 209, 7, 209, 1833, 10, 209, 12, 209, 14, 209, 1836, 11, 209, 5, 209, 1838, 10, 209, 3, 209, 3, 209, 3, 209, 3, 209, 6, 209, 1844, 10, 209, 13, 209, 14, 209, 1845, 3, 209, 3, 209, 5, 209, 1850, 10, 209, 3, 210, 3, 210, 5, 210, 1854, 10, 210, 3, 210, 3, 210, 3, 210, 7, 210, 1859, 10, 210, 12, 210, 14, 210, 1862, 11, 210, 3, 211, 3, 211, 3, 211, 3, 211, 6, 211, 1868, 10, 211, 13, 211, 14, 211, 1869, 3, 212, 3, 212, 3, 212, 3, 212, 7, 212, 1876, 10, 212, 12, 212, 14, 212, 1879, 11, 212, 3, 212, 3, 212, 3, 213, 3, 213, 3, 213, 3, 213, 7, 213, 1887, 10, 213, 12, 213, 14, 213, 1890, 11, 213, 3, 213, 3, 213, 3, 214, 3, 214, 3, 214, 3, 214, 3, 214, 3, 214, 3, 214, 3, 214, 3, 214, 3, 214, 3, 214, 3, 214, 3, 214, 3, 214, 3, 214, 3, 214, 3, 214, 3, 214, 3, 214, 3, 214, 3, 214, 3, 214, 3, 214, 3, 215, 3, 215, 3, 215, 3, 215, 3, 215, 3, 215, 3, 215, 3, 215, 3, 215, 3, 215, 3, 215, 3, 215, 3, 215, 3, 215, 3, 215, 3, 215, 3, 215, 3, 215, 3, 215, 3, 215, 3, 215, 3, 215, 3, 215, 3, 215, 3, 215, 3, 215, 3, 215, 3, 215, 3, 216, 3, 216, 3, 216, 3, 216, 3, 216, 3, 216, 3, 216, 3, 216, 3, 216, 3, 216, 3, 216, 3, 216, 3, 216, 3, 216, 3, 216, 3, 216, 3, 216, 3, 216, 3, 217, 3, 217, 5, 217, 1965, 10, 217, 3, 217, 6, 217, 1968, 10, 217, 13, 217, 14, 217, 1969, 3, 218, 3, 218, 3, 219, 3, 219, 3, 220, 3, 220, 3, 220, 3, 220, 7, 220, 1980, 10, 220, 12, 220, 14, 220, 1983, 11, 220, 3, 220, 5, 220, 1986, 10, 220, 3, 220, 5, 220, 1989, 10, 220, 3, 220, 3, 220, 3, 221, 3, 221, 3, 221, 3, 221, 7, 221, 1997, 10, 221, 12, 221, 14, 221, 2000, 11, 221, 3, 221, 3, 221, 3, 221, 3, 221, 3, 221, 3, 222, 6, 222, 2008, 10, 222, 13, 222, 14, 222, 2009, 3, 222, 3, 222, 3, 223, 3, 223, 3, 1998, 2, 224, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, 51, 27, 53, 28, 55, 29, 57, 30, 59, 31, 61, 32, 63, 33, 65, 34, 67, 35, 69, 36, 71, 37, 73, 38, 75, 39, 77, 40, 79, 41, 81, 42, 83, 43, 85, 44, 87, 45, 89, 46, 91, 47, 93, 48, 95, 49, 97, 50, 99, 51, 101, 52, 103, 53, 105, 54, 107, 55, 109, 56, 111, 57, 113, 58, 115, 59, 117, 60, 119, 61, 121, 62, 123, 63, 125, 64, 127, 65, 129, 66, 131, 67, 133, 68, 135, 69, 137, 70, 139, 71, 141, 72, 143, 73, 145, 74, 147, 75, 149, 76, 151, 77, 153, 78, 155, 79, 157, 80, 159, 81, 161, 82, 163, 83, 165, 84, 167, 85, 169, 86, 171, 87, 173, 88, 175, 89, 177, 90, 179, 91, 181, 92, 183, 93, 185, 94, 187, 95, 189, 96, 191, 97, 193, 98, 195, 99, 197, 100, 199, 101, 201, 102, 203, 103, 205, 104, 207, 105, 209, 106, 211, 107, 213, 108, 215, 109, 217, 110, 219, 111, 221, 112, 223, 113, 225, 114, 227, 115, 229, 116, 231, 117, 233, 118, 235, 119, 237, 120, 239, 121, 241, 122, 243, 123, 245, 124, 247, 125, 249, 126, 251, 127, 253, 128, 255, 129, 257, 130, 259, 131, 261, 132, 263, 133, 265, 134, 267, 135, 269, 136, 271, 137, 273, 138, 275, 139, 277, 140, 279, 141, 281, 142, 283, 143, 285, 144, 287, 145, 289, 146, 291, 147, 293, 148, 295, 149, 297, 150, 299, 151, 301, 152, 303, 153, 305, 154, 307, 155, 309, 156, 311, 157, 313, 158, 315, 159, 317, 160, 319, 161, 321, 162, 323, 163, 325, 164, 327, 165, 329, 166, 331, 167, 333, 168, 335, 169, 337, 170, 339, 171, 341, 172, 343, 173, 345, 174, 347, 175, 349, 176, 351, 177, 353, 178, 355, 179, 357, 180, 359, 181, 361, 182, 363, 183, 365, 184, 367, 185, 369, 186, 371, 187, 373, 188, 375, 189, 377, 190, 379, 191, 381, 192, 383, 193, 385, 194, 387, 195, 389, 196, 391, 197, 393, 198, 395, 199, 397, 200, 399, 201, 401, 202, 403, 203, 405, 204, 407, 205, 409, 206, 411, 207, 413, 208, 415, 209, 417, 210, 419, 211, 421, 212, 423, 213, 425, 214, 427, 215, 429, 216, 431, 217, 433, 2, 435, 2, 437, 2, 439, 218, 441, 219, 443, 220, 445, 221, 3, 2, 11, 3, 2, 41, 41, 5, 2, 60, 60, 66, 66, 97, 97, 3, 2, 36, 36, 3, 2, 98, 98, 4, 2, 45, 45, 47, 47, 3, 2, 50, 59, 3, 2, 67, 92, 4, 2, 12, 12, 15, 15, 5, 2, 11, 12, 15, 15, 34, 34, 2, 2045, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 2, 143, 3, 2, 2, 2, 2, 145, 3, 2, 2, 2, 2, 147, 3, 2, 2, 2, 2, 149, 3, 2, 2, 2, 2, 151, 3, 2, 2, 2, 2, 153, 3, 2, 2, 2, 2, 155, 3, 2, 2, 2, 2, 157, 3, 2, 2, 2, 2, 159, 3, 2, 2, 2, 2, 161, 3, 2, 2, 2, 2, 163, 3, 2, 2, 2, 2, 165, 3, 2, 2, 2, 2, 167, 3, 2, 2, 2, 2, 169, 3, 2, 2, 2, 2, 171, 3, 2, 2, 2, 2, 173, 3, 2, 2, 2, 2, 175, 3, 2, 2, 2, 2, 177, 3, 2, 2, 2, 2, 179, 3, 2, 2, 2, 2, 181, 3, 2, 2, 2, 2, 183, 3, 2, 2, 2, 2, 185, 3, 2, 2, 2, 2, 187, 3, 2, 2, 2, 2, 189, 3, 2, 2, 2, 2, 191, 3, 2, 2, 2, 2, 193, 3, 2, 2, 2, 2, 195, 3, 2, 2, 2, 2, 197, 3, 2, 2, 2, 2, 199, 3, 2, 2, 2, 2, 201, 3, 2, 2, 2, 2, 203, 3, 2, 2, 2, 2, 205, 3, 2, 2, 2, 2, 207, 3, 2, 2, 2, 2, 209, 3, 2, 2, 2, 2, 211, 3, 2, 2, 2, 2, 213, 3, 2, 2, 2, 2, 215, 3, 2, 2, 2, 2, 217, 3, 2, 2, 2, 2, 219, 3, 2, 2, 2, 2, 221, 3, 2, 2, 2, 2, 223, 3, 2, 2, 2, 2, 225, 3, 2, 2, 2, 2, 227, 3, 2, 2, 2, 2, 229, 3, 2, 2, 2, 2, 231, 3, 2, 2, 2, 2, 233, 3, 2, 2, 2, 2, 235, 3, 2, 2, 2, 2, 237, 3, 2, 2, 2, 2, 239, 3, 2, 2, 2, 2, 241, 3, 2, 2, 2, 2, 243, 3, 2, 2, 2, 2, 245, 3, 2, 2, 2, 2, 247, 3, 2, 2, 2, 2, 249, 3, 2, 2, 2, 2, 251, 3, 2, 2, 2, 2, 253, 3, 2, 2, 2, 2, 255, 3, 2, 2, 2, 2, 257, 3, 2, 2, 2, 2, 259, 3, 2, 2, 2, 2, 261, 3, 2, 2, 2, 2, 263, 3, 2, 2, 2, 2, 265, 3, 2, 2, 2, 2, 267, 3, 2, 2, 2, 2, 269, 3, 2, 2, 2, 2, 271, 3, 2, 2, 2, 2, 273, 3, 2, 2, 2, 2, 275, 3, 2, 2, 2, 2, 277, 3, 2, 2, 2, 2, 279, 3, 2, 2, 2, 2, 281, 3, 2, 2, 2, 2, 283, 3, 2, 2, 2, 2, 285, 3, 2, 2, 2, 2, 287, 3, 2, 2, 2, 2, 289, 3, 2, 2, 2, 2, 291, 3, 2, 2, 2, 2, 293, 3, 2, 2, 2, 2, 295, 3, 2, 2, 2, 2, 297, 3, 2, 2, 2, 2, 299, 3, 2, 2, 2, 2, 301, 3, 2, 2, 2, 2, 303, 3, 2, 2, 2, 2, 305, 3, 2, 2, 2, 2, 307, 3, 2, 2, 2, 2, 309, 3, 2, 2, 2, 2, 311, 3, 2, 2, 2, 2, 313, 3, 2, 2, 2, 2, 315, 3, 2, 2, 2, 2, 317, 3, 2, 2, 2, 2, 319, 3, 2, 2, 2, 2, 321, 3, 2, 2, 2, 2, 323, 3, 2, 2, 2, 2, 325, 3, 2, 2, 2, 2, 327, 3, 2, 2, 2, 2, 329, 3, 2, 2, 2, 2, 331, 3, 2, 2, 2, 2, 333, 3, 2, 2, 2, 2, 335, 3, 2, 2, 2, 2, 337, 3, 2, 2, 2, 2, 339, 3, 2, 2, 2, 2, 341, 3, 2, 2, 2, 2, 343, 3, 2, 2, 2, 2, 345, 3, 2, 2, 2, 2, 347, 3, 2, 2, 2, 2, 349, 3, 2, 2, 2, 2, 351, 3, 2, 2, 2, 2, 353, 3, 2, 2, 2, 2, 355, 3, 2, 2, 2, 2, 357, 3, 2, 2, 2, 2, 359, 3, 2, 2, 2, 2, 361, 3, 2, 2, 2, 2, 363, 3, 2, 2, 2, 2, 365, 3, 2, 2, 2, 2, 367, 3, 2, 2, 2, 2, 369, 3, 2, 2, 2, 2, 371, 3, 2, 2, 2, 2, 373, 3, 2, 2, 2, 2, 375, 3, 2, 2, 2, 2, 377, 3, 2, 2, 2, 2, 379, 3, 2, 2, 2, 2, 381, 3, 2, 2, 2, 2, 383, 3, 2, 2, 2, 2, 385, 3, 2, 2, 2, 2, 387, 3, 2, 2, 2, 2, 389, 3, 2, 2, 2, 2, 391, 3, 2, 2, 2, 2, 393, 3, 2, 2, 2, 2, 395, 3, 2, 2, 2, 2, 397, 3, 2, 2, 2, 2, 399, 3, 2, 2, 2, 2, 401, 3, 2, 2, 2, 2, 403, 3, 2, 2, 2, 2, 405, 3, 2, 2, 2, 2, 407, 3, 2, 2, 2, 2, 409, 3, 2, 2, 2, 2, 411, 3, 2, 2, 2, 2, 413, 3, 2, 2, 2, 2, 415, 3, 2, 2, 2, 2, 417, 3, 2, 2, 2, 2, 419, 3, 2, 2, 2, 2, 421, 3, 2, 2, 2, 2, 423, 3, 2, 2, 2, 2, 425, 3, 2, 2, 2, 2, 427, 3, 2, 2, 2, 2, 429, 3, 2, 2, 2, 2, 431, 3, 2, 2, 2, 2, 439, 3, 2, 2, 2, 2, 441, 3, 2, 2, 2, 2, 443, 3, 2, 2, 2, 2, 445, 3, 2, 2, 2, 3, 447, 3, 2, 2, 2, 5, 449, 3, 2, 2, 2, 7, 451, 3, 2, 2, 2, 9, 453, 3, 2, 2, 2, 11, 455, 3, 2, 2, 2, 13, 457, 3, 2, 2, 2, 15, 460, 3, 2, 2, 2, 17, 462, 3, 2, 2, 2, 19, 464, 3, 2, 2, 2, 21, 467, 3, 2, 2, 2, 23, 471, 3, 2, 2, 2, 25, 475, 3, 2, 2, 2, 27, 481, 3, 2, 2, 2, 29, 489, 3, 2, 2, 2, 31, 493, 3, 2, 2, 2, 33, 497, 3, 2, 2, 2, 35, 503, 3, 2, 2, 2, 37, 506, 3, 2, 2, 2, 39, 510, 3, 2, 2, 2, 41, 513, 3, 2, 2, 2, 43, 523, 3, 2, 2, 2, 45, 531, 3, 2, 2, 2, 47, 534, 3, 2, 2, 2, 49, 539, 3, 2, 2, 2, 51, 547, 3, 2, 2, 2, 53, 552, 3, 2, 2, 2, 55, 557, 3, 2, 2, 2, 57, 566, 3, 2, 2, 2, 59, 575, 3, 2, 2, 2, 61, 582, 3, 2, 2, 2, 63, 590, 3, 2, 2, 2, 65, 598, 3, 2, 2, 2, 67, 605, 3, 2, 2, 2, 69, 615, 3, 2, 2, 2, 71, 626, 3, 2, 2, 2, 73, 633, 3, 2, 2, 2, 75, 639, 3, 2, 2, 2, 77, 644, 3, 2, 2, 2, 79, 652, 3, 2, 2, 2, 81, 665, 3, 2, 2, 2, 83, 678, 3, 2, 2, 2, 85, 696, 3, 2, 2, 2, 87, 709, 3, 2, 2, 2, 89, 714, 3, 2, 2, 2, 91, 719, 3, 2, 2, 2, 93, 723, 3, 2, 2, 2, 95, 734, 3, 2, 2, 2, 97, 741, 3, 2, 2, 2, 99, 746, 3, 2, 2, 2, 101, 755, 3, 2, 2, 2, 103, 764, 3, 2, 2, 2, 105, 776, 3, 2, 2, 2, 107, 781, 3, 2, 2, 2, 109, 786, 3, 2, 2, 2, 111, 790, 3, 2, 2, 2, 113, 797, 3, 2, 2, 2, 115, 804, 3, 2, 2, 2, 117, 814, 3, 2, 2, 2, 119, 822, 3, 2, 2, 2, 121, 829, 3, 2, 2, 2, 123, 837, 3, 2, 2, 2, 125, 845, 3, 2, 2, 2, 127, 851, 3, 2, 2, 2, 129, 858, 3, 2, 2, 2, 131, 864, 3, 2, 2, 2, 133, 874, 3, 2, 2, 2, 135, 878, 3, 2, 2, 2, 137, 885, 3, 2, 2, 2, 139, 890, 3, 2, 2, 2, 141, 895, 3, 2, 2, 2, 143, 905, 3, 2, 2, 2, 145, 911, 3, 2, 2, 2, 147, 918, 3, 2, 2, 2, 149, 927, 3, 2, 2, 2, 151, 933, 3, 2, 2, 2, 153, 942, 3, 2, 2, 2, 155, 949, 3, 2, 2, 2, 157, 954, 3, 2, 2, 2, 159, 957, 3, 2, 2, 2, 161, 960, 3, 2, 2, 2, 163, 970, 3, 2, 2, 2, 165, 976, 3, 2, 2, 2, 167, 982, 3, 2, 2, 2, 169, 989, 3, 2, 2, 2, 171, 997, 3, 2, 2, 2, 173, 1007, 3, 2, 2, 2, 175, 1016, 3, 2, 2, 2, 177, 1021, 3, 2, 2, 2, 179, 1024, 3, 2, 2, 2, 181, 1034, 3, 2, 2, 2, 183, 1039, 3, 2, 2, 2, 185, 1044, 3, 2, 2, 2, 187, 1052, 3, 2, 2, 2, 189, 1057, 3, 2, 2, 2, 191, 1063, 3, 2, 2, 2, 193, 1068, 3, 2, 2, 2, 195, 1074, 3, 2, 2, 2, 197, 1084, 3, 2, 2, 2, 199, 1099, 3, 2, 2, 2, 201, 1107, 3, 2, 2, 2, 203, 1111, 3, 2, 2, 2, 205, 1118, 3, 2, 2, 2, 207, 1124, 3, 2, 2, 2, 209, 1132, 3, 2, 2, 2, 211, 1136, 3, 2, 2, 2, 213, 1140, 3, 2, 2, 2, 215, 1145, 3, 2, 2, 2, 217, 1150, 3, 2, 2, 2, 219, 1153, 3, 2, 2, 2, 221, 1163, 3, 2, 2, 2, 223, 1167, 3, 2, 2, 2, 225, 1172, 3, 2, 2, 2, 227, 1179, 3, 2, 2, 2, 229, 1185, 3, 2, 2, 2, 231, 1188, 3, 2, 2, 2, 233, 1193, 3, 2, 2, 2, 235, 1200, 3, 2, 2, 2, 237, 1203, 3, 2, 2, 2, 239, 1209, 3, 2, 2, 2, 241, 1220, 3, 2, 2, 2, 243, 1226, 3, 2, 2, 2, 245, 1233, 3, 2, 2, 2, 247, 1238, 3, 2, 2, 2, 249, 1248, 3, 2, 2, 2, 251, 1259, 3, 2, 2, 2, 253, 1268, 3, 2, 2, 2, 255, 1278, 3, 2, 2, 2, 257, 1286, 3, 2, 2, 2, 259, 1297, 3, 2, 2, 2, 261, 1308, 3, 2, 2, 2, 263, 1315, 3, 2, 2, 2, 265, 1321, 3, 2, 2, 2, 267, 1326, 3, 2, 2, 2, 269, 1336, 3, 2, 2, 2, 271, 1343, 3, 2, 2, 2, 273, 1354, 3, 2, 2, 2, 275, 1362, 3, 2, 2, 2, 277, 1368, 3, 2, 2, 2, 279, 1377, 3, 2, 2, 2, 281, 1384, 3, 2, 2, 2, 283, 1390, 3, 2, 2, 2, 285, 1399, 3, 2, 2, 2, 287, 1406, 3, 2, 2, 2, 289, 1410, 3, 2, 2, 2, 291, 1415, 3, 2, 2, 2, 293, 1422, 3, 2, 2, 2, 295, 1430, 3, 2, 2, 2, 297, 1437, 3, 2, 2, 2, 299, 1444, 3, 2, 2, 2, 301, 1457, 3, 2, 2, 2, 303, 1465, 3, 2, 2, 2, 305, 1469, 3, 2, 2, 2, 307, 1474, 3, 2, 2, 2, 309, 1479, 3, 2, 2, 2, 311, 1488, 3, 2, 2, 2, 313, 1493, 3, 2, 2, 2, 315, 1499, 3, 2, 2, 2, 317, 1505, 3, 2, 2, 2, 319, 1515, 3, 2, 2, 2, 321, 1522, 3, 2, 2, 2, 323, 1528, 3, 2, 2, 2, 325, 1535, 3, 2, 2, 2, 327, 1547, 3, 2, 2, 2, 329, 1552, 3, 2, 2, 2, 331, 1557, 3, 2, 2, 2, 333, 1562, 3, 2, 2, 2, 335, 1572, 3, 2, 2, 2, 337, 1580, 3, 2, 2, 2, 339, 1583, 3, 2, 2, 2, 341, 1595, 3, 2, 2, 2, 343, 1600, 3, 2, 2, 2, 345, 1609, 3, 2, 2, 2, 347, 1614, 3, 2, 2, 2, 349, 1622, 3, 2, 2, 2, 351, 1632, 3, 2, 2, 2, 353, 1644, 3, 2, 2, 2, 355, 1650, 3, 2, 2, 2, 357, 1657, 3, 2, 2, 2, 359, 1661, 3, 2, 2, 2, 361, 1667, 3, 2, 2, 2, 363, 1676, 3, 2, 2, 2, 365, 1683, 3, 2, 2, 2, 367, 1691, 3, 2, 2, 2, 369, 1696, 3, 2, 2, 2, 371, 1701, 3, 2, 2, 2, 373, 1707, 3, 2, 2, 2, 375, 1712, 3, 2, 2, 2, 377, 1717, 3, 2, 2, 2, 379, 1723, 3, 2, 2, 2, 381, 1728, 3, 2, 2, 2, 383, 1733, 3, 2, 2, 2, 385, 1739, 3, 2, 2, 2, 387, 1741, 3, 2, 2, 2, 389, 1743, 3, 2, 2, 2, 391, 1746, 3, 2, 2, 2, 393, 1748, 3, 2, 2, 2, 395, 1751, 3, 2, 2, 2, 397, 1753, 3, 2, 2, 2, 399, 1755, 3, 2, 2, 2, 401, 1757, 3, 2, 2, 2, 403, 1759, 3, 2, 2, 2, 405, 1761, 3, 2, 2, 2, 407, 1764, 3, 2, 2, 2, 409, 1775, 3, 2, 2, 2, 411, 1789, 3, 2, 2, 2, 413, 1801, 3, 2, 2, 2, 415, 1823, 3, 2, 2, 2, 417, 1849, 3, 2, 2, 2, 419, 1853, 3, 2, 2, 2, 421, 1863, 3, 2, 2, 2, 423, 1871, 3, 2, 2, 2, 425, 1882, 3, 2, 2, 2, 427, 1893, 3, 2, 2, 2, 429, 1916, 3, 2, 2, 2, 431, 1944, 3, 2, 2, 2, 433, 1962, 3, 2, 2, 2, 435, 1971, 3, 2, 2, 2, 437, 1973, 3, 2, 2, 2, 439, 1975, 3, 2, 2, 2, 441, 1992, 3, 2, 2, 2, 443, 2007, 3, 2, 2, 2, 445, 2013, 3, 2, 2, 2, 447, 448, 7, 48, 2, 2, 448, 4, 3, 2, 2, 2, 449, 450, 7, 42, 2, 2, 450, 6, 3, 2, 2, 2, 451, 452, 7, 43, 2, 2, 452, 8, 3, 2, 2, 2, 453, 454, 7, 46, 2, 2, 454, 10, 3, 2, 2, 2, 455, 456, 7, 65, 2, 2, 456, 12, 3, 2, 2, 2, 457, 458, 7, 47, 2, 2, 458, 459, 7, 64, 2, 2, 459, 14, 3, 2, 2, 2, 460, 461, 7, 93, 2, 2, 461, 16, 3, 2, 2, 2, 462, 463, 7, 95, 2, 2, 463, 18, 3, 2, 2, 2, 464, 465, 7, 63, 2, 2, 465, 466, 7, 64, 2, 2, 466, 20, 3, 2, 2, 2, 467, 468, 7, 67, 2, 2, 468, 469, 7, 70, 2, 2, 469, 470, 7, 70, 2, 2, 470, 22, 3, 2, 2, 2, 471, 472, 7, 67, 2, 2, 472, 473, 7, 78, 2, 2, 473, 474, 7, 78, 2, 2, 474, 24, 3, 2, 2, 2, 475, 476, 7, 67, 2, 2, 476, 477, 7, 78, 2, 2, 477, 478, 7, 86, 2, 2, 478, 479, 7, 71, 2, 2, 479, 480, 7, 84, 2, 2, 480, 26, 3, 2, 2, 2, 481, 482, 7, 67, 2, 2, 482, 483, 7, 80, 2, 2, 483, 484, 7, 67, 2, 2, 484, 485, 7, 78, 2, 2, 485, 486, 7, 91, 2, 2, 486, 487, 7, 92, 2, 2, 487, 488, 7, 71, 2, 2, 488, 28, 3, 2, 2, 2, 489, 490, 7, 67, 2, 2, 490, 491, 7, 80, 2, 2, 491, 492, 7, 70, 2, 2, 492, 30, 3, 2, 2, 2, 493, 494, 7, 67, 2, 2, 494, 495, 7, 80, 2, 2, 495, 496, 7, 91, 2, 2, 496, 32, 3, 2, 2, 2, 497, 498, 7, 67, 2, 2, 498, 499, 7, 84, 2, 2, 499, 500, 7, 84, 2, 2, 500, 501, 7, 67, 2, 2, 501, 502, 7, 91, 2, 2, 502, 34, 3, 2, 2, 2, 503, 504, 7, 67, 2, 2, 504, 505, 7, 85, 2, 2, 505, 36, 3, 2, 2, 2, 506, 507, 7, 67, 2, 2, 507, 508, 7, 85, 2, 2, 508, 509, 7, 69, 2, 2, 509, 38, 3, 2, 2, 2, 510, 511, 7, 67, 2, 2, 511, 512, 7, 86, 2, 2, 512, 40, 3, 2, 2, 2, 513, 514, 7, 68, 2, 2, 514, 515, 7, 71, 2, 2, 515, 516, 7, 84, 2, 2, 516, 517, 7, 80, 2, 2, 517, 518, 7, 81, 2, 2, 518, 519, 7, 87, 2, 2, 519, 520, 7, 78, 2, 2, 520, 521, 7, 78, 2, 2, 521, 522, 7, 75, 2, 2, 522, 42, 3, 2, 2, 2, 523, 524, 7, 68, 2, 2, 524, 525, 7, 71, 2, 2, 525, 526, 7, 86, 2, 2, 526, 527, 7, 89, 2, 2, 527, 528, 7, 71, 2, 2, 528, 529, 7, 71, 2, 2, 529, 530, 7, 80, 2, 2, 530, 44, 3, 2, 2, 2, 531, 532, 7, 68, 2, 2, 532, 533, 7, 91, 2, 2, 533, 46, 3, 2, 2, 2, 534, 535, 7, 69, 2, 2, 535, 536, 7, 67, 2, 2, 536, 537, 7, 78, 2, 2, 537, 538, 7, 78, 2, 2, 538, 48, 3, 2, 2, 2, 539, 540, 7, 69, 2, 2, 540, 541, 7, 67, 2, 2, 541, 542, 7, 85, 2, 2, 542, 543, 7, 69, 2, 2, 543, 544, 7, 67, 2, 2, 544, 545, 7, 70, 2, 2, 545, 546, 7, 71, 2, 2, 546, 50, 3, 2, 2, 2, 547, 548, 7, 69, 2, 2, 548, 549, 7, 67, 2, 2, 549, 550, 7, 85, 2, 2, 550, 551, 7, 71, 2, 2, 551, 52, 3, 2, 2, 2, 552, 553, 7, 69, 2, 2, 553, 554, 7, 67, 2, 2, 554, 555, 7, 85, 2, 2, 555, 556, 7, 86, 2, 2, 556, 54, 3, 2, 2, 2, 557, 558, 7, 69, 2, 2, 558, 559, 7, 67, 2, 2, 559, 560, 7, 86, 2, 2, 560, 561, 7, 67, 2, 2, 561, 562, 7, 78, 2, 2, 562, 563, 7, 81, 2, 2, 563, 564, 7, 73, 2, 2, 564, 565, 7, 85, 2, 2, 565, 56, 3, 2, 2, 2, 566, 567, 7, 69, 2, 2, 567, 568, 7, 81, 2, 2, 568, 569, 7, 67, 2, 2, 569, 570, 7, 78, 2, 2, 570, 571, 7, 71, 2, 2, 571, 572, 7, 85, 2, 2, 572, 573, 7, 69, 2, 2, 573, 574, 7, 71, 2, 2, 574, 58, 3, 2, 2, 2, 575, 576, 7, 69, 2, 2, 576, 577, 7, 81, 2, 2, 577, 578, 7, 78, 2, 2, 578, 579, 7, 87, 2, 2, 579, 580, 7, 79, 2, 2, 580, 581, 7, 80, 2, 2, 581, 60, 3, 2, 2, 2, 582, 583, 7, 69, 2, 2, 583, 584, 7, 81, 2, 2, 584, 585, 7, 78, 2, 2, 585, 586, 7, 87, 2, 2, 586, 587, 7, 79, 2, 2, 587, 588, 7, 80, 2, 2, 588, 589, 7, 85, 2, 2, 589, 62, 3, 2, 2, 2, 590, 591, 7, 69, 2, 2, 591, 592, 7, 81, 2, 2, 592, 593, 7, 79, 2, 2, 593, 594, 7, 79, 2, 2, 594, 595, 7, 71, 2, 2, 595, 596, 7, 80, 2, 2, 596, 597, 7, 86, 2, 2, 597, 64, 3, 2, 2, 2, 598, 599, 7, 69, 2, 2, 599, 600, 7, 81, 2, 2, 600, 601, 7, 79, 2, 2, 601, 602, 7, 79, 2, 2, 602, 603, 7, 75, 2, 2, 603, 604, 7, 86, 2, 2, 604, 66, 3, 2, 2, 2, 605, 606, 7, 69, 2, 2, 606, 607, 7, 81, 2, 2, 607, 608, 7, 79, 2, 2, 608, 609, 7, 79, 2, 2, 609, 610, 7, 75, 2, 2, 610, 611, 7, 86, 2, 2, 611, 612, 7, 86, 2, 2, 612, 613, 7, 71, 2, 2, 613, 614, 7, 70, 2, 2, 614, 68, 3, 2, 2, 2, 615, 616, 7, 69, 2, 2, 616, 617, 7, 81, 2, 2, 617, 618, 7, 80, 2, 2, 618, 619, 7, 85, 2, 2, 619, 620, 7, 86, 2, 2, 620, 621, 7, 84, 2, 2, 621, 622, 7, 67, 2, 2, 622, 623, 7, 75, 2, 2, 623, 624, 7, 80, 2, 2, 624, 625, 7, 86, 2, 2, 625, 70, 3, 2, 2, 2, 626, 627, 7, 69, 2, 2, 627, 628, 7, 84, 2, 2, 628, 629, 7, 71, 2, 2, 629, 630, 7, 67, 2, 2, 630, 631, 7, 86, 2, 2, 631, 632, 7, 71, 2, 2, 632, 72, 3, 2, 2, 2, 633, 634, 7, 69, 2, 2, 634, 635, 7, 84, 2, 2, 635, 636, 7, 81, 2, 2, 636, 637, 7, 85, 2, 2, 637, 638, 7, 85, 2, 2, 638, 74, 3, 2, 2, 2, 639, 640, 7, 69, 2, 2, 640, 641, 7, 87, 2, 2, 641, 642, 7, 68, 2, 2, 642, 643, 7, 71, 2, 2, 643, 76, 3, 2, 2, 2, 644, 645, 7, 69, 2, 2, 645, 646, 7, 87, 2, 2, 646, 647, 7, 84, 2, 2, 647, 648, 7, 84, 2, 2, 648, 649, 7, 71, 2, 2, 649, 650, 7, 80, 2, 2, 650, 651, 7, 86, 2, 2, 651, 78, 3, 2, 2, 2, 652, 653, 7, 69, 2, 2, 653, 654, 7, 87, 2, 2, 654, 655, 7, 84, 2, 2, 655, 656, 7, 84, 2, 2, 656, 657, 7, 71, 2, 2, 657, 658, 7, 80, 2, 2, 658, 659, 7, 86, 2, 2, 659, 660, 7, 97, 2, 2, 660, 661, 7, 70, 2, 2, 661, 662, 7, 67, 2, 2, 662, 663, 7, 86, 2, 2, 663, 664, 7, 71, 2, 2, 664, 80, 3, 2, 2, 2, 665, 666, 7, 69, 2, 2, 666, 667, 7, 87, 2, 2, 667, 668, 7, 84, 2, 2, 668, 669, 7, 84, 2, 2, 669, 670, 7, 71, 2, 2, 670, 671, 7, 80, 2, 2, 671, 672, 7, 86, 2, 2, 672, 673, 7, 97, 2, 2, 673, 674, 7, 86, 2, 2, 674, 675, 7, 75, 2, 2, 675, 676, 7, 79, 2, 2, 676, 677, 7, 71, 2, 2, 677, 82, 3, 2, 2, 2, 678, 679, 7, 69, 2, 2, 679, 680, 7, 87, 2, 2, 680, 681, 7, 84, 2, 2, 681, 682, 7, 84, 2, 2, 682, 683, 7, 71, 2, 2, 683, 684, 7, 80, 2, 2, 684, 685, 7, 86, 2, 2, 685, 686, 7, 97, 2, 2, 686, 687, 7, 86, 2, 2, 687, 688, 7, 75, 2, 2, 688, 689, 7, 79, 2, 2, 689, 690, 7, 71, 2, 2, 690, 691, 7, 85, 2, 2, 691, 692, 7, 86, 2, 2, 692, 693, 7, 67, 2, 2, 693, 694, 7, 79, 2, 2, 694, 695, 7, 82, 2, 2, 695, 84, 3, 2, 2, 2, 696, 697, 7, 69, 2, 2, 697, 698, 7, 87, 2, 2, 698, 699, 7, 84, 2, 2, 699, 700, 7, 84, 2, 2, 700, 701, 7, 71, 2, 2, 701, 702, 7, 80, 2, 2, 702, 703, 7, 86, 2, 2, 703, 704, 7, 97, 2, 2, 704, 705, 7, 87, 2, 2, 705, 706, 7, 85, 2, 2, 706, 707, 7, 71, 2, 2, 707, 708, 7, 84, 2, 2, 708, 86, 3, 2, 2, 2, 709, 710, 7, 70, 2, 2, 710, 711, 7, 67, 2, 2, 711, 712, 7, 86, 2, 2, 712, 713, 7, 67, 2, 2, 713, 88, 3, 2, 2, 2, 714, 715, 7, 70, 2, 2, 715, 716, 7, 67, 2, 2, 716, 717, 7, 86, 2, 2, 717, 718, 7, 71, 2, 2, 718, 90, 3, 2, 2, 2, 719, 720, 7, 70, 2, 2, 720, 721, 7, 67, 2, 2, 721, 722, 7, 91, 2, 2, 722, 92, 3, 2, 2, 2, 723, 724, 7, 70, 2, 2, 724, 725, 7, 71, 2, 2, 725, 726, 7, 67, 2, 2, 726, 727, 7, 78, 2, 2, 727, 728, 7, 78, 2, 2, 728, 729, 7, 81, 2, 2, 729, 730, 7, 69, 2, 2, 730, 731, 7, 67, 2, 2, 731, 732, 7, 86, 2, 2, 732, 733, 7, 71, 2, 2, 733, 94, 3, 2, 2, 2, 734, 735, 7, 70, 2, 2, 735, 736, 7, 71, 2, 2, 736, 737, 7, 78, 2, 2, 737, 738, 7, 71, 2, 2, 738, 739, 7, 86, 2, 2, 739, 740, 7, 71, 2, 2, 740, 96, 3, 2, 2, 2, 741, 742, 7, 70, 2, 2, 742, 743, 7, 71, 2, 2, 743, 744, 7, 85, 2, 2, 744, 745, 7, 69, 2, 2, 745, 98, 3, 2, 2, 2, 746, 747, 7, 70, 2, 2, 747, 748, 7, 71, 2, 2, 748, 749, 7, 85, 2, 2, 749, 750, 7, 69, 2, 2, 750, 751, 7, 84, 2, 2, 751, 752, 7, 75, 2, 2, 752, 753, 7, 68, 2, 2, 753, 754, 7, 71, 2, 2, 754, 100, 3, 2, 2, 2, 755, 756, 7, 70, 2, 2, 756, 757, 7, 75, 2, 2, 757, 758, 7, 85, 2, 2, 758, 759, 7, 86, 2, 2, 759, 760, 7, 75, 2, 2, 760, 761, 7, 80, 2, 2, 761, 762, 7, 69, 2, 2, 762, 763, 7, 86, 2, 2, 763, 102, 3, 2, 2, 2, 764, 765, 7, 70, 2, 2, 765, 766, 7, 75, 2, 2, 766, 767, 7, 85, 2, 2, 767, 768, 7, 86, 2, 2, 768, 769, 7, 84, 2, 2, 769, 770, 7, 75, 2, 2, 770, 771, 7, 68, 2, 2, 771, 772, 7, 87, 2, 2, 772, 773, 7, 86, 2, 2, 773, 774, 7, 71, 2, 2, 774, 775, 7, 70, 2, 2, 775, 104, 3, 2, 2, 2, 776, 777, 7, 70, 2, 2, 777, 778, 7, 84, 2, 2, 778, 779, 7, 81, 2, 2, 779, 780, 7, 82, 2, 2, 780, 106, 3, 2, 2, 2, 781, 782, 7, 71, 2, 2, 782, 783, 7, 78, 2, 2, 783, 784, 7, 85, 2, 2, 784, 785, 7, 71, 2, 2, 785, 108, 3, 2, 2, 2, 786, 787, 7, 71, 2, 2, 787, 788, 7, 80, 2, 2, 788, 789, 7, 70, 2, 2, 789, 110, 3, 2, 2, 2, 790, 791, 7, 71, 2, 2, 791, 792, 7, 85, 2, 2, 792, 793, 7, 69, 2, 2, 793, 794, 7, 67, 2, 2, 794, 795, 7, 82, 2, 2, 795, 796, 7, 71, 2, 2, 796, 112, 3, 2, 2, 2, 797, 798, 7, 71, 2, 2, 798, 799, 7, 90, 2, 2, 799, 800, 7, 69, 2, 2, 800, 801, 7, 71, 2, 2, 801, 802, 7, 82, 2, 2, 802, 803, 7, 86, 2, 2, 803, 114, 3, 2, 2, 2, 804, 805, 7, 71, 2, 2, 805, 806, 7, 90, 2, 2, 806, 807, 7, 69, 2, 2, 807, 808, 7, 78, 2, 2, 808, 809, 7, 87, 2, 2, 809, 810, 7, 70, 2, 2, 810, 811, 7, 75, 2, 2, 811, 812, 7, 80, 2, 2, 812, 813, 7, 73, 2, 2, 813, 116, 3, 2, 2, 2, 814, 815, 7, 71, 2, 2, 815, 816, 7, 90, 2, 2, 816, 817, 7, 71, 2, 2, 817, 818, 7, 69, 2, 2, 818, 819, 7, 87, 2, 2, 819, 820, 7, 86, 2, 2, 820, 821, 7, 71, 2, 2, 821, 118, 3, 2, 2, 2, 822, 823, 7, 71, 2, 2, 823, 824, 7, 90, 2, 2, 824, 825, 7, 75, 2, 2, 825, 826, 7, 85, 2, 2, 826, 827, 7, 86, 2, 2, 827, 828, 7, 85, 2, 2, 828, 120, 3, 2, 2, 2, 829, 830, 7, 71, 2, 2, 830, 831, 7, 90, 2, 2, 831, 832, 7, 82, 2, 2, 832, 833, 7, 78, 2, 2, 833, 834, 7, 67, 2, 2, 834, 835, 7, 75, 2, 2, 835, 836, 7, 80, 2, 2, 836, 122, 3, 2, 2, 2, 837, 838, 7, 71, 2, 2, 838, 839, 7, 90, 2, 2, 839, 840, 7, 86, 2, 2, 840, 841, 7, 84, 2, 2, 841, 842, 7, 67, 2, 2, 842, 843, 7, 69, 2, 2, 843, 844, 7, 86, 2, 2, 844, 124, 3, 2, 2, 2, 845, 846, 7, 72, 2, 2, 846, 847, 7, 67, 2, 2, 847, 848, 7, 78, 2, 2, 848, 849, 7, 85, 2, 2, 849, 850, 7, 71, 2, 2, 850, 126, 3, 2, 2, 2, 851, 852, 7, 72, 2, 2, 852, 853, 7, 75, 2, 2, 853, 854, 7, 78, 2, 2, 854, 855, 7, 86, 2, 2, 855, 856, 7, 71, 2, 2, 856, 857, 7, 84, 2, 2, 857, 128, 3, 2, 2, 2, 858, 859, 7, 72, 2, 2, 859, 860, 7, 75, 2, 2, 860, 861, 7, 84, 2, 2, 861, 862, 7, 85, 2, 2, 862, 863, 7, 86, 2, 2, 863, 130, 3, 2, 2, 2, 864, 865, 7, 72, 2, 2, 865, 866, 7, 81, 2, 2, 866, 867, 7, 78, 2, 2, 867, 868, 7, 78, 2, 2, 868, 869, 7, 81, 2, 2, 869, 870, 7, 89, 2, 2, 870, 871, 7, 75, 2, 2, 871, 872, 7, 80, 2, 2, 872, 873, 7, 73, 2, 2, 873, 132, 3, 2, 2, 2, 874, 875, 7, 72, 2, 2, 875, 876, 7, 81, 2, 2, 876, 877, 7, 84, 2, 2, 877, 134, 3, 2, 2, 2, 878, 879, 7, 72, 2, 2, 879, 880, 7, 81, 2, 2, 880, 881, 7, 84, 2, 2, 881, 882, 7, 79, 2, 2, 882, 883, 7, 67, 2, 2, 883, 884, 7, 86, 2, 2, 884, 136, 3, 2, 2, 2, 885, 886, 7, 72, 2, 2, 886, 887, 7, 84, 2, 2, 887, 888, 7, 81, 2, 2, 888, 889, 7, 79, 2, 2, 889, 138, 3, 2, 2, 2, 890, 891, 7, 72, 2, 2, 891, 892, 7, 87, 2, 2, 892, 893, 7, 78, 2, 2, 893, 894, 7, 78, 2, 2, 894, 140, 3, 2, 2, 2, 895, 896, 7, 72, 2, 2, 896, 897, 7, 87, 2, 2, 897, 898, 7, 80, 2, 2, 898, 899, 7, 69, 2, 2, 899, 900, 7, 86, 2, 2, 900, 901, 7, 75, 2, 2, 901, 902, 7, 81, 2, 2, 902, 903, 7, 80, 2, 2, 903, 904, 7, 85, 2, 2, 904, 142, 3, 2, 2, 2, 905, 906, 7, 73, 2, 2, 906, 907, 7, 84, 2, 2, 907, 908, 7, 67, 2, 2, 908, 909, 7, 80, 2, 2, 909, 910, 7, 86, 2, 2, 910, 144, 3, 2, 2, 2, 911, 912, 7, 73, 2, 2, 912, 913, 7, 84, 2, 2, 913, 914, 7, 67, 2, 2, 914, 915, 7, 80, 2, 2, 915, 916, 7, 86, 2, 2, 916, 917, 7, 85, 2, 2, 917, 146, 3, 2, 2, 2, 918, 919, 7, 73, 2, 2, 919, 920, 7, 84, 2, 2, 920, 921, 7, 67, 2, 2, 921, 922, 7, 82, 2, 2, 922, 923, 7, 74, 2, 2, 923, 924, 7, 88, 2, 2, 924, 925, 7, 75, 2, 2, 925, 926, 7, 92, 2, 2, 926, 148, 3, 2, 2, 2, 927, 928, 7, 73, 2, 2, 928, 929, 7, 84, 2, 2, 929, 930, 7, 81, 2, 2, 930, 931, 7, 87, 2, 2, 931, 932, 7, 82, 2, 2, 932, 150, 3, 2, 2, 2, 933, 934, 7, 73, 2, 2, 934, 935, 7, 84, 2, 2, 935, 936, 7, 81, 2, 2, 936, 937, 7, 87, 2, 2, 937, 938, 7, 82, 2, 2, 938, 939, 7, 75, 2, 2, 939, 940, 7, 80, 2, 2, 940, 941, 7, 73, 2, 2, 941, 152, 3, 2, 2, 2, 942, 943, 7, 74, 2, 2, 943, 944, 7, 67, 2, 2, 944, 945, 7, 88, 2, 2, 945, 946, 7, 75, 2, 2, 946, 947, 7, 80, 2, 2, 947, 948, 7, 73, 2, 2, 948, 154, 3, 2, 2, 2, 949, 950, 7, 74, 2, 2, 950, 951, 7, 81, 2, 2, 951, 952, 7, 87, 2, 2, 952, 953, 7, 84, 2, 2, 953, 156, 3, 2, 2, 2, 954, 955, 7, 75, 2, 2, 955, 956, 7, 72, 2, 2, 956, 158, 3, 2, 2, 2, 957, 958, 7, 75, 2, 2, 958, 959, 7, 80, 2, 2, 959, 160, 3, 2, 2, 2, 960, 961, 7, 75, 2, 2, 961, 962, 7, 80, 2, 2, 962, 963, 7, 69, 2, 2, 963, 964, 7, 78, 2, 2, 964, 965, 7, 87, 2, 2, 965, 966, 7, 70, 2, 2, 966, 967, 7, 75, 2, 2, 967, 968, 7, 80, 2, 2, 968, 969, 7, 73, 2, 2, 969, 162, 3, 2, 2, 2, 970, 971, 7, 75, 2, 2, 971, 972, 7, 80, 2, 2, 972, 973, 7, 80, 2, 2, 973, 974, 7, 71, 2, 2, 974, 975, 7, 84, 2, 2, 975, 164, 3, 2, 2, 2, 976, 977, 7, 75, 2, 2, 977, 978, 7, 80, 2, 2, 978, 979, 7, 82, 2, 2, 979, 980, 7, 87, 2, 2, 980, 981, 7, 86, 2, 2, 981, 166, 3, 2, 2, 2, 982, 983, 7, 75, 2, 2, 983, 984, 7, 80, 2, 2, 984, 985, 7, 85, 2, 2, 985, 986, 7, 71, 2, 2, 986, 987, 7, 84, 2, 2, 987, 988, 7, 86, 2, 2, 988, 168, 3, 2, 2, 2, 989, 990, 7, 75, 2, 2, 990, 991, 7, 80, 2, 2, 991, 992, 7, 86, 2, 2, 992, 993, 7, 71, 2, 2, 993, 994, 7, 73, 2, 2, 994, 995, 7, 71, 2, 2, 995, 996, 7, 84, 2, 2, 996, 170, 3, 2, 2, 2, 997, 998, 7, 75, 2, 2, 998, 999, 7, 80, 2, 2, 999, 1000, 7, 86, 2, 2, 1000, 1001, 7, 71, 2, 2, 1001, 1002, 7, 84, 2, 2, 1002, 1003, 7, 85, 2, 2, 1003, 1004, 7, 71, 2, 2, 1004, 1005, 7, 69, 2, 2, 1005, 1006, 7, 86, 2, 2, 1006, 172, 3, 2, 2, 2, 1007, 1008, 7, 75, 2, 2, 1008, 1009, 7, 80, 2, 2, 1009, 1010, 7, 86, 2, 2, 1010, 1011, 7, 71, 2, 2, 1011, 1012, 7, 84, 2, 2, 1012, 1013, 7, 88, 2, 2, 1013, 1014, 7, 67, 2, 2, 1014, 1015, 7, 78, 2, 2, 1015, 174, 3, 2, 2, 2, 1016, 1017, 7, 75, 2, 2, 1017, 1018, 7, 80, 2, 2, 1018, 1019, 7, 86, 2, 2, 1019, 1020, 7, 81, 2, 2, 1020, 176, 3, 2, 2, 2, 1021, 1022, 7, 75, 2, 2, 1022, 1023, 7, 85, 2, 2, 1023, 178, 3, 2, 2, 2, 1024, 1025, 7, 75, 2, 2, 1025, 1026, 7, 85, 2, 2, 1026, 1027, 7, 81, 2, 2, 1027, 1028, 7, 78, 2, 2, 1028, 1029, 7, 67, 2, 2, 1029, 1030, 7, 86, 2, 2, 1030, 1031, 7, 75, 2, 2, 1031, 1032, 7, 81, 2, 2, 1032, 1033, 7, 80, 2, 2, 1033, 180, 3, 2, 2, 2, 1034, 1035, 7, 76, 2, 2, 1035, 1036, 7, 81, 2, 2, 1036, 1037, 7, 75, 2, 2, 1037, 1038, 7, 80, 2, 2, 1038, 182, 3, 2, 2, 2, 1039, 1040, 7, 78, 2, 2, 1040, 1041, 7, 67, 2, 2, 1041, 1042, 7, 85, 2, 2, 1042, 1043, 7, 86, 2, 2, 1043, 184, 3, 2, 2, 2, 1044, 1045, 7, 78, 2, 2, 1045, 1046, 7, 67, 2, 2, 1046, 1047, 7, 86, 2, 2, 1047, 1048, 7, 71, 2, 2, 1048, 1049, 7, 84, 2, 2, 1049, 1050, 7, 67, 2, 2, 1050, 1051, 7, 78, 2, 2, 1051, 186, 3, 2, 2, 2, 1052, 1053, 7, 78, 2, 2, 1053, 1054, 7, 71, 2, 2, 1054, 1055, 7, 72, 2, 2, 1055, 1056, 7, 86, 2, 2, 1056, 188, 3, 2, 2, 2, 1057, 1058, 7, 78, 2, 2, 1058, 1059, 7, 71, 2, 2, 1059, 1060, 7, 88, 2, 2, 1060, 1061, 7, 71, 2, 2, 1061, 1062, 7, 78, 2, 2, 1062, 190, 3, 2, 2, 2, 1063, 1064, 7, 78, 2, 2, 1064, 1065, 7, 75, 2, 2, 1065, 1066, 7, 77, 2, 2, 1066, 1067, 7, 71, 2, 2, 1067, 192, 3, 2, 2, 2, 1068, 1069, 7, 78, 2, 2, 1069, 1070, 7, 75, 2, 2, 1070, 1071, 7, 79, 2, 2, 1071, 1072, 7, 75, 2, 2, 1072, 1073, 7, 86, 2, 2, 1073, 194, 3, 2, 2, 2, 1074, 1075, 7, 78, 2, 2, 1075, 1076, 7, 81, 2, 2, 1076, 1077, 7, 69, 2, 2, 1077, 1078, 7, 67, 2, 2, 1078, 1079, 7, 78, 2, 2, 1079, 1080, 7, 86, 2, 2, 1080, 1081, 7, 75, 2, 2, 1081, 1082, 7, 79, 2, 2, 1082, 1083, 7, 71, 2, 2, 1083, 196, 3, 2, 2, 2, 1084, 1085, 7, 78, 2, 2, 1085, 1086, 7, 81, 2, 2, 1086, 1087, 7, 69, 2, 2, 1087, 1088, 7, 67, 2, 2, 1088, 1089, 7, 78, 2, 2, 1089, 1090, 7, 86, 2, 2, 1090, 1091, 7, 75, 2, 2, 1091, 1092, 7, 79, 2, 2, 1092, 1093, 7, 71, 2, 2, 1093, 1094, 7, 85, 2, 2, 1094, 1095, 7, 86, 2, 2, 1095, 1096, 7, 67, 2, 2, 1096, 1097, 7, 79, 2, 2, 1097, 1098, 7, 82, 2, 2, 1098, 198, 3, 2, 2, 2, 1099, 1100, 7, 78, 2, 2, 1100, 1101, 7, 81, 2, 2, 1101, 1102, 7, 73, 2, 2, 1102, 1103, 7, 75, 2, 2, 1103, 1104, 7, 69, 2, 2, 1104, 1105, 7, 67, 2, 2, 1105, 1106, 7, 78, 2, 2, 1106, 200, 3, 2, 2, 2, 1107, 1108, 7, 79, 2, 2, 1108, 1109, 7, 67, 2, 2, 1109, 1110, 7, 82, 2, 2, 1110, 202, 3, 2, 2, 2, 1111, 1112, 7, 79, 2, 2, 1112, 1113, 7, 75, 2, 2, 1113, 1114, 7, 80, 2, 2, 1114, 1115, 7, 87, 2, 2, 1115, 1116, 7, 86, 2, 2, 1116, 1117, 7, 71, 2, 2, 1117, 204, 3, 2, 2, 2, 1118, 1119, 7, 79, 2, 2, 1119, 1120, 7, 81, 2, 2, 1120, 1121, 7, 80, 2, 2, 1121, 1122, 7, 86, 2, 2, 1122, 1123, 7, 74, 2, 2, 1123, 206, 3, 2, 2, 2, 1124, 1125, 7, 80, 2, 2, 1125, 1126, 7, 67, 2, 2, 1126, 1127, 7, 86, 2, 2, 1127, 1128, 7, 87, 2, 2, 1128, 1129, 7, 84, 2, 2, 1129, 1130, 7, 67, 2, 2, 1130, 1131, 7, 78, 2, 2, 1131, 208, 3, 2, 2, 2, 1132, 1133, 7, 80, 2, 2, 1133, 1134, 7, 72, 2, 2, 1134, 1135, 7, 69, 2, 2, 1135, 210, 3, 2, 2, 2, 1136, 1137, 7, 80, 2, 2, 1137, 1138, 7, 72, 2, 2, 1138, 1139, 7, 70, 2, 2, 1139, 212, 3, 2, 2, 2, 1140, 1141, 7, 80, 2, 2, 1141, 1142, 7, 72, 2, 2, 1142, 1143, 7, 77, 2, 2, 1143, 1144, 7, 69, 2, 2, 1144, 214, 3, 2, 2, 2, 1145, 1146, 7, 80, 2, 2, 1146, 1147, 7, 72, 2, 2, 1147, 1148, 7, 77, 2, 2, 1148, 1149, 7, 70, 2, 2, 1149, 216, 3, 2, 2, 2, 1150, 1151, 7, 80, 2, 2, 1151, 1152, 7, 81, 2, 2, 1152, 218, 3, 2, 2, 2, 1153, 1154, 7, 80, 2, 2, 1154, 1155, 7, 81, 2, 2, 1155, 1156, 7, 84, 2, 2, 1156, 1157, 7, 79, 2, 2, 1157, 1158, 7, 67, 2, 2, 1158, 1159, 7, 78, 2, 2, 1159, 1160, 7, 75, 2, 2, 1160, 1161, 7, 92, 2, 2, 1161, 1162, 7, 71, 2, 2, 1162, 220, 3, 2, 2, 2, 1163, 1164, 7, 80, 2, 2, 1164, 1165, 7, 81, 2, 2, 1165, 1166, 7, 86, 2, 2, 1166, 222, 3, 2, 2, 2, 1167, 1168, 7, 80, 2, 2, 1168, 1169, 7, 87, 2, 2, 1169, 1170, 7, 78, 2, 2, 1170, 1171, 7, 78, 2, 2, 1171, 224, 3, 2, 2, 2, 1172, 1173, 7, 80, 2, 2, 1173, 1174, 7, 87, 2, 2, 1174, 1175, 7, 78, 2, 2, 1175, 1176, 7, 78, 2, 2, 1176, 1177, 7, 75, 2, 2, 1177, 1178, 7, 72, 2, 2, 1178, 226, 3, 2, 2, 2, 1179, 1180, 7, 80, 2, 2, 1180, 1181, 7, 87, 2, 2, 1181, 1182, 7, 78, 2, 2, 1182, 1183, 7, 78, 2, 2, 1183, 1184, 7, 85, 2, 2, 1184, 228, 3, 2, 2, 2, 1185, 1186, 7, 81, 2, 2, 1186, 1187, 7, 80, 2, 2, 1187, 230, 3, 2, 2, 2, 1188, 1189, 7, 81, 2, 2, 1189, 1190, 7, 80, 2, 2, 1190, 1191, 7, 78, 2, 2, 1191, 1192, 7, 91, 2, 2, 1192, 232, 3, 2, 2, 2, 1193, 1194, 7, 81, 2, 2, 1194, 1195, 7, 82, 2, 2, 1195, 1196, 7, 86, 2, 2, 1196, 1197, 7, 75, 2, 2, 1197, 1198, 7, 81, 2, 2, 1198, 1199, 7, 80, 2, 2, 1199, 234, 3, 2, 2, 2, 1200, 1201, 7, 81, 2, 2, 1201, 1202, 7, 84, 2, 2, 1202, 236, 3, 2, 2, 2, 1203, 1204, 7, 81, 2, 2, 1204, 1205, 7, 84, 2, 2, 1205, 1206, 7, 70, 2, 2, 1206, 1207, 7, 71, 2, 2, 1207, 1208, 7, 84, 2, 2, 1208, 238, 3, 2, 2, 2, 1209, 1210, 7, 81, 2, 2, 1210, 1211, 7, 84, 2, 2, 1211, 1212, 7, 70, 2, 2, 1212, 1213, 7, 75, 2, 2, 1213, 1214, 7, 80, 2, 2, 1214, 1215, 7, 67, 2, 2, 1215, 1216, 7, 78, 2, 2, 1216, 1217, 7, 75, 2, 2, 1217, 1218, 7, 86, 2, 2, 1218, 1219, 7, 91, 2, 2, 1219, 240, 3, 2, 2, 2, 1220, 1221, 7, 81, 2, 2, 1221, 1222, 7, 87, 2, 2, 1222, 1223, 7, 86, 2, 2, 1223, 1224, 7, 71, 2, 2, 1224, 1225, 7, 84, 2, 2, 1225, 242, 3, 2, 2, 2, 1226, 1227, 7, 81, 2, 2, 1227, 1228, 7, 87, 2, 2, 1228, 1229, 7, 86, 2, 2, 1229, 1230, 7, 82, 2, 2, 1230, 1231, 7, 87, 2, 2, 1231, 1232, 7, 86, 2, 2, 1232, 244, 3, 2, 2, 2, 1233, 1234, 7, 81, 2, 2, 1234, 1235, 7, 88, 2, 2, 1235, 1236, 7, 71, 2, 2, 1236, 1237, 7, 84, 2, 2, 1237, 246, 3, 2, 2, 2, 1238, 1239, 7, 82, 2, 2, 1239, 1240, 7, 67, 2, 2, 1240, 1241, 7, 84, 2, 2, 1241, 1242, 7, 86, 2, 2, 1242, 1243, 7, 75, 2, 2, 1243, 1244, 7, 86, 2, 2, 1244, 1245, 7, 75, 2, 2, 1245, 1246, 7, 81, 2, 2, 1246, 1247, 7, 80, 2, 2, 1247, 248, 3, 2, 2, 2, 1248, 1249, 7, 82, 2, 2, 1249, 1250, 7, 67, 2, 2, 1250, 1251, 7, 84, 2, 2, 1251, 1252, 7, 86, 2, 2, 1252, 1253, 7, 75, 2, 2, 1253, 1254, 7, 86, 2, 2, 1254, 1255, 7, 75, 2, 2, 1255, 1256, 7, 81, 2, 2, 1256, 1257, 7, 80, 2, 2, 1257, 1258, 7, 85, 2, 2, 1258, 250, 3, 2, 2, 2, 1259, 1260, 7, 82, 2, 2, 1260, 1261, 7, 81, 2, 2, 1261, 1262, 7, 85, 2, 2, 1262, 1263, 7, 75, 2, 2, 1263, 1264, 7, 86, 2, 2, 1264, 1265, 7, 75, 2, 2, 1265, 1266, 7, 81, 2, 2, 1266, 1267, 7, 80, 2, 2, 1267, 252, 3, 2, 2, 2, 1268, 1269, 7, 82, 2, 2, 1269, 1270, 7, 84, 2, 2, 1270, 1271, 7, 71, 2, 2, 1271, 1272, 7, 69, 2, 2, 1272, 1273, 7, 71, 2, 2, 1273, 1274, 7, 70, 2, 2, 1274, 1275, 7, 75, 2, 2, 1275, 1276, 7, 80, 2, 2, 1276, 1277, 7, 73, 2, 2, 1277, 254, 3, 2, 2, 2, 1278, 1279, 7, 82, 2, 2, 1279, 1280, 7, 84, 2, 2, 1280, 1281, 7, 71, 2, 2, 1281, 1282, 7, 82, 2, 2, 1282, 1283, 7, 67, 2, 2, 1283, 1284, 7, 84, 2, 2, 1284, 1285, 7, 71, 2, 2, 1285, 256, 3, 2, 2, 2, 1286, 1287, 7, 82, 2, 2, 1287, 1288, 7, 84, 2, 2, 1288, 1289, 7, 75, 2, 2, 1289, 1290, 7, 88, 2, 2, 1290, 1291, 7, 75, 2, 2, 1291, 1292, 7, 78, 2, 2, 1292, 1293, 7, 71, 2, 2, 1293, 1294, 7, 73, 2, 2, 1294, 1295, 7, 71, 2, 2, 1295, 1296, 7, 85, 2, 2, 1296, 258, 3, 2, 2, 2, 1297, 1298, 7, 82, 2, 2, 1298, 1299, 7, 84, 2, 2, 1299, 1300, 7, 81, 2, 2, 1300, 1301, 7, 82, 2, 2, 1301, 1302, 7, 71, 2, 2, 1302, 1303, 7, 84, 2, 2, 1303, 1304, 7, 86, 2, 2, 1304, 1305, 7, 75, 2, 2, 1305, 1306, 7, 71, 2, 2, 1306, 1307, 7, 85, 2, 2, 1307, 260, 3, 2, 2, 2, 1308, 1309, 7, 82, 2, 2, 1309, 1310, 7, 87, 2, 2, 1310, 1311, 7, 68, 2, 2, 1311, 1312, 7, 78, 2, 2, 1312, 1313, 7, 75, 2, 2, 1313, 1314, 7, 69, 2, 2, 1314, 262, 3, 2, 2, 2, 1315, 1316, 7, 84, 2, 2, 1316, 1317, 7, 67, 2, 2, 1317, 1318, 7, 80, 2, 2, 1318, 1319, 7, 73, 2, 2, 1319, 1320, 7, 71, 2, 2, 1320, 264, 3, 2, 2, 2, 1321, 1322, 7, 84, 2, 2, 1322, 1323, 7, 71, 2, 2, 1323, 1324, 7, 67, 2, 2, 1324, 1325, 7, 70, 2, 2, 1325, 266, 3, 2, 2, 2, 1326, 1327, 7, 84, 2, 2, 1327, 1328, 7, 71, 2, 2, 1328, 1329, 7, 69, 2, 2, 1329, 1330, 7, 87, 2, 2, 1330, 1331, 7, 84, 2, 2, 1331, 1332, 7, 85, 2, 2, 1332, 1333, 7, 75, 2, 2, 1333, 1334, 7, 88, 2, 2, 1334, 1335, 7, 71, 2, 2, 1335, 268, 3, 2, 2, 2, 1336, 1337, 7, 84, 2, 2, 1337, 1338, 7, 71, 2, 2, 1338, 1339, 7, 80, 2, 2, 1339, 1340, 7, 67, 2, 2, 1340, 1341, 7, 79, 2, 2, 1341, 1342, 7, 71, 2, 2, 1342, 270, 3, 2, 2, 2, 1343, 1344, 7, 84, 2, 2, 1344, 1345, 7, 71, 2, 2, 1345, 1346, 7, 82, 2, 2, 1346, 1347, 7, 71, 2, 2, 1347, 1348, 7, 67, 2, 2, 1348, 1349, 7, 86, 2, 2, 1349, 1350, 7, 67, 2, 2, 1350, 1351, 7, 68, 2, 2, 1351, 1352, 7, 78, 2, 2, 1352, 1353, 7, 71, 2, 2, 1353, 272, 3, 2, 2, 2, 1354, 1355, 7, 84, 2, 2, 1355, 1356, 7, 71, 2, 2, 1356, 1357, 7, 82, 2, 2, 1357, 1358, 7, 78, 2, 2, 1358, 1359, 7, 67, 2, 2, 1359, 1360, 7, 69, 2, 2, 1360, 1361, 7, 71, 2, 2, 1361, 274, 3, 2, 2, 2, 1362, 1363, 7, 84, 2, 2, 1363, 1364, 7, 71, 2, 2, 1364, 1365, 7, 85, 2, 2, 1365, 1366, 7, 71, 2, 2, 1366, 1367, 7, 86, 2, 2, 1367, 276, 3, 2, 2, 2, 1368, 1369, 7, 84, 2, 2, 1369, 1370, 7, 71, 2, 2, 1370, 1371, 7, 85, 2, 2, 1371, 1372, 7, 86, 2, 2, 1372, 1373, 7, 84, 2, 2, 1373, 1374, 7, 75, 2, 2, 1374, 1375, 7, 69, 2, 2, 1375, 1376, 7, 86, 2, 2, 1376, 278, 3, 2, 2, 2, 1377, 1378, 7, 84, 2, 2, 1378, 1379, 7, 71, 2, 2, 1379, 1380, 7, 88, 2, 2, 1380, 1381, 7, 81, 2, 2, 1381, 1382, 7, 77, 2, 2, 1382, 1383, 7, 71, 2, 2, 1383, 280, 3, 2, 2, 2, 1384, 1385, 7, 84, 2, 2, 1385, 1386, 7, 75, 2, 2, 1386, 1387, 7, 73, 2, 2, 1387, 1388, 7, 74, 2, 2, 1388, 1389, 7, 86, 2, 2, 1389, 282, 3, 2, 2, 2, 1390, 1391, 7, 84, 2, 2, 1391, 1392, 7, 81, 2, 2, 1392, 1393, 7, 78, 2, 2, 1393, 1394, 7, 78, 2, 2, 1394, 1395, 7, 68, 2, 2, 1395, 1396, 7, 67, 2, 2, 1396, 1397, 7, 69, 2, 2, 1397, 1398, 7, 77, 2, 2, 1398, 284, 3, 2, 2, 2, 1399, 1400, 7, 84, 2, 2, 1400, 1401, 7, 81, 2, 2, 1401, 1402, 7, 78, 2, 2, 1402, 1403, 7, 78, 2, 2, 1403, 1404, 7, 87, 2, 2, 1404, 1405, 7, 82, 2, 2, 1405, 286, 3, 2, 2, 2, 1406, 1407, 7, 84, 2, 2, 1407, 1408, 7, 81, 2, 2, 1408, 1409, 7, 89, 2, 2, 1409, 288, 3, 2, 2, 2, 1410, 1411, 7, 84, 2, 2, 1411, 1412, 7, 81, 2, 2, 1412, 1413, 7, 89, 2, 2, 1413, 1414, 7, 85, 2, 2, 1414, 290, 3, 2, 2, 2, 1415, 1416, 7, 85, 2, 2, 1416, 1417, 7, 69, 2, 2, 1417, 1418, 7, 74, 2, 2, 1418, 1419, 7, 71, 2, 2, 1419, 1420, 7, 79, 2, 2, 1420, 1421, 7, 67, 2, 2, 1421, 292, 3, 2, 2, 2, 1422, 1423, 7, 85, 2, 2, 1423, 1424, 7, 69, 2, 2, 1424, 1425, 7, 74, 2, 2, 1425, 1426, 7, 71, 2, 2, 1426, 1427, 7, 79, 2, 2, 1427, 1428, 7, 67, 2, 2, 1428, 1429, 7, 85, 2, 2, 1429, 294, 3, 2, 2, 2, 1430, 1431, 7, 85, 2, 2, 1431, 1432, 7, 71, 2, 2, 1432, 1433, 7, 69, 2, 2, 1433, 1434, 7, 81, 2, 2, 1434, 1435, 7, 80, 2, 2, 1435, 1436, 7, 70, 2, 2, 1436, 296, 3, 2, 2, 2, 1437, 1438, 7, 85, 2, 2, 1438, 1439, 7, 71, 2, 2, 1439, 1440, 7, 78, 2, 2, 1440, 1441, 7, 71, 2, 2, 1441, 1442, 7, 69, 2, 2, 1442, 1443, 7, 86, 2, 2, 1443, 298, 3, 2, 2, 2, 1444, 1445, 7, 85, 2, 2, 1445, 1446, 7, 71, 2, 2, 1446, 1447, 7, 84, 2, 2, 1447, 1448, 7, 75, 2, 2, 1448, 1449, 7, 67, 2, 2, 1449, 1450, 7, 78, 2, 2, 1450, 1451, 7, 75, 2, 2, 1451, 1452, 7, 92, 2, 2, 1452, 1453, 7, 67, 2, 2, 1453, 1454, 7, 68, 2, 2, 1454, 1455, 7, 78, 2, 2, 1455, 1456, 7, 71, 2, 2, 1456, 300, 3, 2, 2, 2, 1457, 1458, 7, 85, 2, 2, 1458, 1459, 7, 71, 2, 2, 1459, 1460, 7, 85, 2, 2, 1460, 1461, 7, 85, 2, 2, 1461, 1462, 7, 75, 2, 2, 1462, 1463, 7, 81, 2, 2, 1463, 1464, 7, 80, 2, 2, 1464, 302, 3, 2, 2, 2, 1465, 1466, 7, 85, 2, 2, 1466, 1467, 7, 71, 2, 2, 1467, 1468, 7, 86, 2, 2, 1468, 304, 3, 2, 2, 2, 1469, 1470, 7, 85, 2, 2, 1470, 1471, 7, 71, 2, 2, 1471, 1472, 7, 86, 2, 2, 1472, 1473, 7, 85, 2, 2, 1473, 306, 3, 2, 2, 2, 1474, 1475, 7, 85, 2, 2, 1475, 1476, 7, 74, 2, 2, 1476, 1477, 7, 81, 2, 2, 1477, 1478, 7, 89, 2, 2, 1478, 308, 3, 2, 2, 2, 1479, 1480, 7, 85, 2, 2, 1480, 1481, 7, 79, 2, 2, 1481, 1482, 7, 67, 2, 2, 1482, 1483, 7, 78, 2, 2, 1483, 1484, 7, 78, 2, 2, 1484, 1485, 7, 75, 2, 2, 1485, 1486, 7, 80, 2, 2, 1486, 1487, 7, 86, 2, 2, 1487, 310, 3, 2, 2, 2, 1488, 1489, 7, 85, 2, 2, 1489, 1490, 7, 81, 2, 2, 1490, 1491, 7, 79, 2, 2, 1491, 1492, 7, 71, 2, 2, 1492, 312, 3, 2, 2, 2, 1493, 1494, 7, 85, 2, 2, 1494, 1495, 7, 86, 2, 2, 1495, 1496, 7, 67, 2, 2, 1496, 1497, 7, 84, 2, 2, 1497, 1498, 7, 86, 2, 2, 1498, 314, 3, 2, 2, 2, 1499, 1500, 7, 85, 2, 2, 1500, 1501, 7, 86, 2, 2, 1501, 1502, 7, 67, 2, 2, 1502, 1503, 7, 86, 2, 2, 1503, 1504, 7, 85, 2, 2, 1504, 316, 3, 2, 2, 2, 1505, 1506, 7, 85, 2, 2, 1506, 1507, 7, 87, 2, 2, 1507, 1508, 7, 68, 2, 2, 1508, 1509, 7, 85, 2, 2, 1509, 1510, 7, 86, 2, 2, 1510, 1511, 7, 84, 2, 2, 1511, 1512, 7, 75, 2, 2, 1512, 1513, 7, 80, 2, 2, 1513, 1514, 7, 73, 2, 2, 1514, 318, 3, 2, 2, 2, 1515, 1516, 7, 85, 2, 2, 1516, 1517, 7, 91, 2, 2, 1517, 1518, 7, 85, 2, 2, 1518, 1519, 7, 86, 2, 2, 1519, 1520, 7, 71, 2, 2, 1520, 1521, 7, 79, 2, 2, 1521, 320, 3, 2, 2, 2, 1522, 1523, 7, 86, 2, 2, 1523, 1524, 7, 67, 2, 2, 1524, 1525, 7, 68, 2, 2, 1525, 1526, 7, 78, 2, 2, 1526, 1527, 7, 71, 2, 2, 1527, 322, 3, 2, 2, 2, 1528, 1529, 7, 86, 2, 2, 1529, 1530, 7, 67, 2, 2, 1530, 1531, 7, 68, 2, 2, 1531, 1532, 7, 78, 2, 2, 1532, 1533, 7, 71, 2, 2, 1533, 1534, 7, 85, 2, 2, 1534, 324, 3, 2, 2, 2, 1535, 1536, 7, 86, 2, 2, 1536, 1537, 7, 67, 2, 2, 1537, 1538, 7, 68, 2, 2, 1538, 1539, 7, 78, 2, 2, 1539, 1540, 7, 71, 2, 2, 1540, 1541, 7, 85, 2, 2, 1541, 1542, 7, 67, 2, 2, 1542, 1543, 7, 79, 2, 2, 1543, 1544, 7, 82, 2, 2, 1544, 1545, 7, 78, 2, 2, 1545, 1546, 7, 71, 2, 2, 1546, 326, 3, 2, 2, 2, 1547, 1548, 7, 86, 2, 2, 1548, 1549, 7, 71, 2, 2, 1549, 1550, 7, 90, 2, 2, 1550, 1551, 7, 86, 2, 2, 1551, 328, 3, 2, 2, 2, 1552, 1553, 7, 86, 2, 2, 1553, 1554, 7, 74, 2, 2, 1554, 1555, 7, 71, 2, 2, 1555, 1556, 7, 80, 2, 2, 1556, 330, 3, 2, 2, 2, 1557, 1558, 7, 86, 2, 2, 1558, 1559, 7, 75, 2, 2, 1559, 1560, 7, 79, 2, 2, 1560, 1561, 7, 71, 2, 2, 1561, 332, 3, 2, 2, 2, 1562, 1563, 7, 86, 2, 2, 1563, 1564, 7, 75, 2, 2, 1564, 1565, 7, 79, 2, 2, 1565, 1566, 7, 71, 2, 2, 1566, 1567, 7, 85, 2, 2, 1567, 1568, 7, 86, 2, 2, 1568, 1569, 7, 67, 2, 2, 1569, 1570, 7, 79, 2, 2, 1570, 1571, 7, 82, 2, 2, 1571, 334, 3, 2, 2, 2, 1572, 1573, 7, 86, 2, 2, 1573, 1574, 7, 75, 2, 2, 1574, 1575, 7, 80, 2, 2, 1575, 1576, 7, 91, 2, 2, 1576, 1577, 7, 75, 2, 2, 1577, 1578, 7, 80, 2, 2, 1578, 1579, 7, 86, 2, 2, 1579, 336, 3, 2, 2, 2, 1580, 1581, 7, 86, 2, 2, 1581, 1582, 7, 81, 2, 2, 1582, 338, 3, 2, 2, 2, 1583, 1584, 7, 86, 2, 2, 1584, 1585, 7, 84, 2, 2, 1585, 1586, 7, 67, 2, 2, 1586, 1587, 7, 80, 2, 2, 1587, 1588, 7, 85, 2, 2, 1588, 1589, 7, 67, 2, 2, 1589, 1590, 7, 69, 2, 2, 1590, 1591, 7, 86, 2, 2, 1591, 1592, 7, 75, 2, 2, 1592, 1593, 7, 81, 2, 2, 1593, 1594, 7, 80, 2, 2, 1594, 340, 3, 2, 2, 2, 1595, 1596, 7, 86, 2, 2, 1596, 1597, 7, 84, 2, 2, 1597, 1598, 7, 87, 2, 2, 1598, 1599, 7, 71, 2, 2, 1599, 342, 3, 2, 2, 2, 1600, 1601, 7, 86, 2, 2, 1601, 1602, 7, 84, 2, 2, 1602, 1603, 7, 91, 2, 2, 1603, 1604, 7, 97, 2, 2, 1604, 1605, 7, 69, 2, 2, 1605, 1606, 7, 67, 2, 2, 1606, 1607, 7, 85, 2, 2, 1607, 1608, 7, 86, 2, 2, 1608, 344, 3, 2, 2, 2, 1609, 1610, 7, 86, 2, 2, 1610, 1611, 7, 91, 2, 2, 1611, 1612, 7, 82, 2, 2, 1612, 1613, 7, 71, 2, 2, 1613, 346, 3, 2, 2, 2, 1614, 1615, 7, 87, 2, 2, 1615, 1616, 7, 71, 2, 2, 1616, 1617, 7, 85, 2, 2, 1617, 1618, 7, 69, 2, 2, 1618, 1619, 7, 67, 2, 2, 1619, 1620, 7, 82, 2, 2, 1620, 1621, 7, 71, 2, 2, 1621, 348, 3, 2, 2, 2, 1622, 1623, 7, 87, 2, 2, 1623, 1624, 7, 80, 2, 2, 1624, 1625, 7, 68, 2, 2, 1625, 1626, 7, 81, 2, 2, 1626, 1627, 7, 87, 2, 2, 1627, 1628, 7, 80, 2, 2, 1628, 1629, 7, 70, 2, 2, 1629, 1630, 7, 71, 2, 2, 1630, 1631, 7, 70, 2, 2, 1631, 350, 3, 2, 2, 2, 1632, 1633, 7, 87, 2, 2, 1633, 1634, 7, 80, 2, 2, 1634, 1635, 7, 69, 2, 2, 1635, 1636, 7, 81, 2, 2, 1636, 1637, 7, 79, 2, 2, 1637, 1638, 7, 79, 2, 2, 1638, 1639, 7, 75, 2, 2, 1639, 1640, 7, 86, 2, 2, 1640, 1641, 7, 86, 2, 2, 1641, 1642, 7, 71, 2, 2, 1642, 1643, 7, 70, 2, 2, 1643, 352, 3, 2, 2, 2, 1644, 1645, 7, 87, 2, 2, 1645, 1646, 7, 80, 2, 2, 1646, 1647, 7, 75, 2, 2, 1647, 1648, 7, 81, 2, 2, 1648, 1649, 7, 80, 2, 2, 1649, 354, 3, 2, 2, 2, 1650, 1651, 7, 87, 2, 2, 1651, 1652, 7, 80, 2, 2, 1652, 1653, 7, 80, 2, 2, 1653, 1654, 7, 71, 2, 2, 1654, 1655, 7, 85, 2, 2, 1655, 1656, 7, 86, 2, 2, 1656, 356, 3, 2, 2, 2, 1657, 1658, 7, 87, 2, 2, 1658, 1659, 7, 85, 2, 2, 1659, 1660, 7, 71, 2, 2, 1660, 358, 3, 2, 2, 2, 1661, 1662, 7, 87, 2, 2, 1662, 1663, 7, 85, 2, 2, 1663, 1664, 7, 75, 2, 2, 1664, 1665, 7, 80, 2, 2, 1665, 1666, 7, 73, 2, 2, 1666, 360, 3, 2, 2, 2, 1667, 1668, 7, 88, 2, 2, 1668, 1669, 7, 67, 2, 2, 1669, 1670, 7, 78, 2, 2, 1670, 1671, 7, 75, 2, 2, 1671, 1672, 7, 70, 2, 2, 1672, 1673, 7, 67, 2, 2, 1673, 1674, 7, 86, 2, 2, 1674, 1675, 7, 71, 2, 2, 1675, 362, 3, 2, 2, 2, 1676, 1677, 7, 88, 2, 2, 1677, 1678, 7, 67, 2, 2, 1678, 1679, 7, 78, 2, 2, 1679, 1680, 7, 87, 2, 2, 1680, 1681, 7, 71, 2, 2, 1681, 1682, 7, 85, 2, 2, 1682, 364, 3, 2, 2, 2, 1683, 1684, 7, 88, 2, 2, 1684, 1685, 7, 71, 2, 2, 1685, 1686, 7, 84, 2, 2, 1686, 1687, 7, 68, 2, 2, 1687, 1688, 7, 81, 2, 2, 1688, 1689, 7, 85, 2, 2, 1689, 1690, 7, 71, 2, 2, 1690, 366, 3, 2, 2, 2, 1691, 1692, 7, 88, 2, 2, 1692, 1693, 7, 75, 2, 2, 1693, 1694, 7, 71, 2, 2, 1694, 1695, 7, 89, 2, 2, 1695, 368, 3, 2, 2, 2, 1696, 1697, 7, 89, 2, 2, 1697, 1698, 7, 74, 2, 2, 1698, 1699, 7, 71, 2, 2, 1699, 1700, 7, 80, 2, 2, 1700, 370, 3, 2, 2, 2, 1701, 1702, 7, 89, 2, 2, 1702, 1703, 7, 74, 2, 2, 1703, 1704, 7, 71, 2, 2, 1704, 1705, 7, 84, 2, 2, 1705, 1706, 7, 71, 2, 2, 1706, 372, 3, 2, 2, 2, 1707, 1708, 7, 89, 2, 2, 1708, 1709, 7, 75, 2, 2, 1709, 1710, 7, 86, 2, 2, 1710, 1711, 7, 74, 2, 2, 1711, 374, 3, 2, 2, 2, 1712, 1713, 7, 89, 2, 2, 1713, 1714, 7, 81, 2, 2, 1714, 1715, 7, 84, 2, 2, 1715, 1716, 7, 77, 2, 2, 1716, 376, 3, 2, 2, 2, 1717, 1718, 7, 89, 2, 2, 1718, 1719, 7, 84, 2, 2, 1719, 1720, 7, 75, 2, 2, 1720, 1721, 7, 86, 2, 2, 1721, 1722, 7, 71, 2, 2, 1722, 378, 3, 2, 2, 2, 1723, 1724, 7, 91, 2, 2, 1724, 1725, 7, 71, 2, 2, 1725, 1726, 7, 67, 2, 2, 1726, 1727, 7, 84, 2, 2, 1727, 380, 3, 2, 2, 2, 1728, 1729, 7, 92, 2, 2, 1729, 1730, 7, 81, 2, 2, 1730, 1731, 7, 80, 2, 2, 1731, 1732, 7, 71, 2, 2, 1732, 382, 3, 2, 2, 2, 1733, 1734, 7, 63, 2, 2, 1734, 384, 3, 2, 2, 2, 1735, 1736, 7, 62, 2, 2, 1736, 1740, 7, 64, 2, 2, 1737, 1738, 7, 35, 2, 2, 1738, 1740, 7, 63, 2, 2, 1739, 1735, 3, 2, 2, 2, 1739, 1737, 3, 2, 2, 2, 1740, 386, 3, 2, 2, 2, 1741, 1742, 7, 62, 2, 2, 1742, 388, 3, 2, 2, 2, 1743, 1744, 7, 62, 2, 2, 1744, 1745, 7, 63, 2, 2, 1745, 390, 3, 2, 2, 2, 1746, 1747, 7, 64, 2, 2, 1747, 392, 3, 2, 2, 2, 1748, 1749, 7, 64, 2, 2, 1749, 1750, 7, 63, 2, 2, 1750, 394, 3, 2, 2, 2, 1751, 1752, 7, 45, 2, 2, 1752, 396, 3, 2, 2, 2, 1753, 1754, 7, 47, 2, 2, 1754, 398, 3, 2, 2, 2, 1755, 1756, 7, 44, 2, 2, 1756, 400, 3, 2, 2, 2, 1757, 1758, 7, 49, 2, 2, 1758, 402, 3, 2, 2, 2, 1759, 1760, 7, 39, 2, 2, 1760, 404, 3, 2, 2, 2, 1761, 1762, 7, 126, 2, 2, 1762, 1763, 7, 126, 2, 2, 1763, 406, 3, 2, 2, 2, 1764, 1770, 7, 41, 2, 2, 1765, 1769, 10, 2, 2, 2, 1766, 1767, 7, 41, 2, 2, 1767, 1769, 7, 41, 2, 2, 1768, 1765, 3, 2, 2, 2, 1768, 1766, 3, 2, 2, 2, 1769, 1772, 3, 2, 2, 2, 1770, 1768, 3, 2, 2, 2, 1770, 1771, 3, 2, 2, 2, 1771, 1773, 3, 2, 2, 2, 1772, 1770, 3, 2, 2, 2, 1773, 1774, 7, 41, 2, 2, 1774, 408, 3, 2, 2, 2, 1775, 1776, 7, 87, 2, 2, 1776, 1777, 7, 40, 2, 2, 1777, 1778, 7, 41, 2, 2, 1778, 1784, 3, 2, 2, 2, 1779, 1783, 10, 2, 2, 2, 1780, 1781, 7, 41, 2, 2, 1781, 1783, 7, 41, 2, 2, 1782, 1779, 3, 2, 2, 2, 1782, 1780, 3, 2, 2, 2, 1783, 1786, 3, 2, 2, 2, 1784, 1782, 3, 2, 2, 2, 1784, 1785, 3, 2, 2, 2, 1785, 1787, 3, 2, 2, 2, 1786, 1784, 3, 2, 2, 2, 1787, 1788, 7, 41, 2, 2, 1788, 410, 3, 2, 2, 2, 1789, 1790, 7, 90, 2, 2, 1790, 1791, 7, 41, 2, 2, 1791, 1795, 3, 2, 2, 2, 1792, 1794, 10, 2, 2, 2, 1793, 1792, 3, 2, 2, 2, 1794, 1797, 3, 2, 2, 2, 1795, 1793, 3, 2, 2, 2, 1795, 1796, 3, 2, 2, 2, 1796, 1798, 3, 2, 2, 2, 1797, 1795, 3, 2, 2, 2, 1798, 1799, 7, 41, 2, 2, 1799, 412, 3, 2, 2, 2, 1800, 1802, 5, 435, 218, 2, 1801, 1800, 3, 2, 2, 2, 1802, 1803, 3, 2, 2, 2, 1803, 1801, 3, 2, 2, 2, 1803, 1804, 3, 2, 2, 2, 1804, 414, 3, 2, 2, 2, 1805, 1807, 5, 435, 218, 2, 1806, 1805, 3, 2, 2, 2, 1807, 1808, 3, 2, 2, 2, 1808, 1806, 3, 2, 2, 2, 1808, 1809, 3, 2, 2, 2, 1809, 1810, 3, 2, 2, 2, 1810, 1814, 7, 48, 2, 2, 1811, 1813, 5, 435, 218, 2, 1812, 1811, 3, 2, 2, 2, 1813, 1816, 3, 2, 2, 2, 1814, 1812, 3, 2, 2, 2, 1814, 1815, 3, 2, 2, 2, 1815, 1824, 3, 2, 2, 2, 1816, 1814, 3, 2, 2, 2, 1817, 1819, 7, 48, 2, 2, 1818, 1820, 5, 435, 218, 2, 1819, 1818, 3, 2, 2, 2, 1820, 1821, 3, 2, 2, 2, 1821, 1819, 3, 2, 2, 2, 1821, 1822, 3, 2, 2, 2, 1822, 1824, 3, 2, 2, 2, 1823, 1806, 3, 2, 2, 2, 1823, 1817, 3, 2, 2, 2, 1824, 416, 3, 2, 2, 2, 1825, 1827, 5, 435, 218, 2, 1826, 1825, 3, 2, 2, 2, 1827, 1828, 3, 2, 2, 2, 1828, 1826, 3, 2, 2, 2, 1828, 1829, 3, 2, 2, 2, 1829, 1837, 3, 2, 2, 2, 1830, 1834, 7, 48, 2, 2, 1831, 1833, 5, 435, 218, 2, 1832, 1831, 3, 2, 2, 2, 1833, 1836, 3, 2, 2, 2, 1834, 1832, 3, 2, 2, 2, 1834, 1835, 3, 2, 2, 2, 1835, 1838, 3, 2, 2, 2, 1836, 1834, 3, 2, 2, 2, 1837, 1830, 3, 2, 2, 2, 1837, 1838, 3, 2, 2, 2, 1838, 1839, 3, 2, 2, 2, 1839, 1840, 5, 433, 217, 2, 1840, 1850, 3, 2, 2, 2, 1841, 1843, 7, 48, 2, 2, 1842, 1844, 5, 435, 218, 2, 1843, 1842, 3, 2, 2, 2, 1844, 1845, 3, 2, 2, 2, 1845, 1843, 3, 2, 2, 2, 1845, 1846, 3, 2, 2, 2, 1846, 1847, 3, 2, 2, 2, 1847, 1848, 5, 433, 217, 2, 1848, 1850, 3, 2, 2, 2, 1849, 1826, 3, 2, 2, 2, 1849, 1841, 3, 2, 2, 2, 1850, 418, 3, 2, 2, 2, 1851, 1854, 5, 437, 219, 2, 1852, 1854, 7, 97, 2, 2, 1853, 1851, 3, 2, 2, 2, 1853, 1852, 3, 2, 2, 2, 1854, 1860, 3, 2, 2, 2, 1855, 1859, 5, 437, 219, 2, 1856, 1859, 5, 435, 218, 2, 1857, 1859, 9, 3, 2, 2, 1858, 1855, 3, 2, 2, 2, 1858, 1856, 3, 2, 2, 2, 1858, 1857, 3, 2, 2, 2, 1859, 1862, 3, 2, 2, 2, 1860, 1858, 3, 2, 2, 2, 1860, 1861, 3, 2, 2, 2, 1861, 420, 3, 2, 2, 2, 1862, 1860, 3, 2, 2, 2, 1863, 1867, 5, 435, 218, 2, 1864, 1868, 5, 437, 219, 2, 1865, 1868, 5, 435, 218, 2, 1866, 1868, 9, 3, 2, 2, 1867, 1864, 3, 2, 2, 2, 1867, 1865, 3, 2, 2, 2, 1867, 1866, 3, 2, 2, 2, 1868, 1869, 3, 2, 2, 2, 1869, 1867, 3, 2, 2, 2, 1869, 1870, 3, 2, 2, 2, 1870, 422, 3, 2, 2, 2, 1871, 1877, 7, 36, 2, 2, 1872, 1876, 10, 4, 2, 2, 1873, 1874, 7, 36, 2, 2, 1874, 1876, 7, 36, 2, 2, 1875, 1872, 3, 2, 2, 2, 1875, 1873, 3, 2, 2, 2, 1876, 1879, 3, 2, 2, 2, 1877, 1875, 3, 2, 2, 2, 1877, 1878, 3, 2, 2, 2, 1878, 1880, 3, 2, 2, 2, 1879, 1877, 3, 2, 2, 2, 1880, 1881, 7, 36, 2, 2, 1881, 424, 3, 2, 2, 2, 1882, 1888, 7, 98, 2, 2, 1883, 1887, 10, 5, 2, 2, 1884, 1885, 7, 98, 2, 2, 1885, 1887, 7, 98, 2, 2, 1886, 1883, 3, 2, 2, 2, 1886, 1884, 3, 2, 2, 2, 1887, 1890, 3, 2, 2, 2, 1888, 1886, 3, 2, 2, 2, 1888, 1889, 3, 2, 2, 2, 1889, 1891, 3, 2, 2, 2, 1890, 1888, 3, 2, 2, 2, 1891, 1892, 7, 98, 2, 2, 1892, 426, 3, 2, 2, 2, 1893, 1894, 7, 86, 2, 2, 1894, 1895, 7, 75, 2, 2, 1895, 1896, 7, 79, 2, 2, 1896, 1897, 7, 71, 2, 2, 1897, 1898, 3, 2, 2, 2, 1898, 1899, 5, 443, 222, 2, 1899, 1900, 7, 89, 2, 2, 1900, 1901, 7, 75, 2, 2, 1901, 1902, 7, 86, 2, 2, 1902, 1903, 7, 74, 2, 2, 1903, 1904, 3, 2, 2, 2, 1904, 1905, 5, 443, 222, 2, 1905, 1906, 7, 86, 2, 2, 1906, 1907, 7, 75, 2, 2, 1907, 1908, 7, 79, 2, 2, 1908, 1909, 7, 71, 2, 2, 1909, 1910, 3, 2, 2, 2, 1910, 1911, 5, 443, 222, 2, 1911, 1912, 7, 92, 2, 2, 1912, 1913, 7, 81, 2, 2, 1913, 1914, 7, 80, 2, 2, 1914, 1915, 7, 71, 2, 2, 1915, 428, 3, 2, 2, 2, 1916, 1917, 7, 86, 2, 2, 1917, 1918, 7, 75, 2, 2, 1918, 1919, 7, 79, 2, 2, 1919, 1920, 7, 71, 2, 2, 1920, 1921, 7, 85, 2, 2, 1921, 1922, 7, 86, 2, 2, 1922, 1923, 7, 67, 2, 2, 1923, 1924, 7, 79, 2, 2, 1924, 1925, 7, 82, 2, 2, 1925, 1926, 3, 2, 2, 2, 1926, 1927, 5, 443, 222, 2, 1927, 1928, 7, 89, 2, 2, 1928, 1929, 7, 75, 2, 2, 1929, 1930, 7, 86, 2, 2, 1930, 1931, 7, 74, 2, 2, 1931, 1932, 3, 2, 2, 2, 1932, 1933, 5, 443, 222, 2, 1933, 1934, 7, 86, 2, 2, 1934, 1935, 7, 75, 2, 2, 1935, 1936, 7, 79, 2, 2, 1936, 1937, 7, 71, 2, 2, 1937, 1938, 3, 2, 2, 2, 1938, 1939, 5, 443, 222, 2, 1939, 1940, 7, 92, 2, 2, 1940, 1941, 7, 81, 2, 2, 1941, 1942, 7, 80, 2, 2, 1942, 1943, 7, 71, 2, 2, 1943, 430, 3, 2, 2, 2, 1944, 1945, 7, 70, 2, 2, 1945, 1946, 7, 81, 2, 2, 1946, 1947, 7, 87, 2, 2, 1947, 1948, 7, 68, 2, 2, 1948, 1949, 7, 78, 2, 2, 1949, 1950, 7, 71, 2, 2, 1950, 1951, 3, 2, 2, 2, 1951, 1952, 5, 443, 222, 2, 1952, 1953, 7, 82, 2, 2, 1953, 1954, 7, 84, 2, 2, 1954, 1955, 7, 71, 2, 2, 1955, 1956, 7, 69, 2, 2, 1956, 1957, 7, 75, 2, 2, 1957, 1958, 7, 85, 2, 2, 1958, 1959, 7, 75, 2, 2, 1959, 1960, 7, 81, 2, 2, 1960, 1961, 7, 80, 2, 2, 1961, 432, 3, 2, 2, 2, 1962, 1964, 7, 71, 2, 2, 1963, 1965, 9, 6, 2, 2, 1964, 1963, 3, 2, 2, 2, 1964, 1965, 3, 2, 2, 2, 1965, 1967, 3, 2, 2, 2, 1966, 1968, 5, 435, 218, 2, 1967, 1966, 3, 2, 2, 2, 1968, 1969, 3, 2, 2, 2, 1969, 1967, 3, 2, 2, 2, 1969, 1970, 3, 2, 2, 2, 1970, 434, 3, 2, 2, 2, 1971, 1972, 9, 7, 2, 2, 1972, 436, 3, 2, 2, 2, 1973, 1974, 9, 8, 2, 2, 1974, 438, 3, 2, 2, 2, 1975, 1976, 7, 47, 2, 2, 1976, 1977, 7, 47, 2, 2, 1977, 1981, 3, 2, 2, 2, 1978, 1980, 10, 9, 2, 2, 1979, 1978, 3, 2, 2, 2, 1980, 1983, 3, 2, 2, 2, 1981, 1979, 3, 2, 2, 2, 1981, 1982, 3, 2, 2, 2, 1982, 1985, 3, 2, 2, 2, 1983, 1981, 3, 2, 2, 2, 1984, 1986, 7, 15, 2, 2, 1985, 1984, 3, 2, 2, 2, 1985, 1986, 3, 2, 2, 2, 1986, 1988, 3, 2, 2, 2, 1987, 1989, 7, 12, 2, 2, 1988, 1987, 3, 2, 2, 2, 1988, 1989, 3, 2, 2, 2, 1989, 1990, 3, 2, 2, 2, 1990, 1991, 8, 220, 2, 2, 1991, 440, 3, 2, 2, 2, 1992, 1993, 7, 49, 2, 2, 1993, 1994, 7, 44, 2, 2, 1994, 1998, 3, 2, 2, 2, 1995, 1997, 11, 2, 2, 2, 1996, 1995, 3, 2, 2, 2, 1997, 2000, 3, 2, 2, 2, 1998, 1999, 3, 2, 2, 2, 1998, 1996, 3, 2, 2, 2, 1999, 2001, 3, 2, 2, 2, 2000, 1998, 3, 2, 2, 2, 2001, 2002, 7, 44, 2, 2, 2002, 2003, 7, 49, 2, 2, 2003, 2004, 3, 2, 2, 2, 2004, 2005, 8, 221, 2, 2, 2005, 442, 3, 2, 2, 2, 2006, 2008, 9, 10, 2, 2, 2007, 2006, 3, 2, 2, 2, 2008, 2009, 3, 2, 2, 2, 2009, 2007, 3, 2, 2, 2, 2009, 2010, 3, 2, 2, 2, 2010, 2011, 3, 2, 2, 2, 2011, 2012, 8, 222, 2, 2, 2012, 444, 3, 2, 2, 2, 2013, 2014, 11, 2, 2, 2, 2014, 446, 3, 2, 2, 2, 35, 2, 1739, 1768, 1770, 1782, 1784, 1795, 1803, 1808, 1814, 1821, 1823, 1828, 1834, 1837, 1845, 1849, 1853, 1858, 1860, 1867, 1869, 1875, 1877, 1886, 1888, 1964, 1969, 1981, 1985, 1988, 1998, 2009, 3, 2, 3, 2]
\ No newline at end of file
# Generated from SqlBase.g4 by ANTLR 4.7.1
# encoding: utf-8
from __future__ import print_function
from antlr4 import *
from io import StringIO
import sys
def serializedATN():
with StringIO() as buf:
buf.write(u"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2")
buf.write(u"\u00dd\u07df\b\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6")
buf.write(u"\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t\13\4\f\t")
buf.write(u"\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4")
buf.write(u"\22\t\22\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27")
buf.write(u"\t\27\4\30\t\30\4\31\t\31\4\32\t\32\4\33\t\33\4\34\t")
buf.write(u"\34\4\35\t\35\4\36\t\36\4\37\t\37\4 \t \4!\t!\4\"\t\"")
buf.write(u"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4")
buf.write(u"+\t+\4,\t,\4-\t-\4.\t.\4/\t/\4\60\t\60\4\61\t\61\4\62")
buf.write(u"\t\62\4\63\t\63\4\64\t\64\4\65\t\65\4\66\t\66\4\67\t")
buf.write(u"\67\48\t8\49\t9\4:\t:\4;\t;\4<\t<\4=\t=\4>\t>\4?\t?\4")
buf.write(u"@\t@\4A\tA\4B\tB\4C\tC\4D\tD\4E\tE\4F\tF\4G\tG\4H\tH")
buf.write(u"\4I\tI\4J\tJ\4K\tK\4L\tL\4M\tM\4N\tN\4O\tO\4P\tP\4Q\t")
buf.write(u"Q\4R\tR\4S\tS\4T\tT\4U\tU\4V\tV\4W\tW\4X\tX\4Y\tY\4Z")
buf.write(u"\tZ\4[\t[\4\\\t\\\4]\t]\4^\t^\4_\t_\4`\t`\4a\ta\4b\t")
buf.write(u"b\4c\tc\4d\td\4e\te\4f\tf\4g\tg\4h\th\4i\ti\4j\tj\4k")
buf.write(u"\tk\4l\tl\4m\tm\4n\tn\4o\to\4p\tp\4q\tq\4r\tr\4s\ts\4")
buf.write(u"t\tt\4u\tu\4v\tv\4w\tw\4x\tx\4y\ty\4z\tz\4{\t{\4|\t|")
buf.write(u"\4}\t}\4~\t~\4\177\t\177\4\u0080\t\u0080\4\u0081\t\u0081")
buf.write(u"\4\u0082\t\u0082\4\u0083\t\u0083\4\u0084\t\u0084\4\u0085")
buf.write(u"\t\u0085\4\u0086\t\u0086\4\u0087\t\u0087\4\u0088\t\u0088")
buf.write(u"\4\u0089\t\u0089\4\u008a\t\u008a\4\u008b\t\u008b\4\u008c")
buf.write(u"\t\u008c\4\u008d\t\u008d\4\u008e\t\u008e\4\u008f\t\u008f")
buf.write(u"\4\u0090\t\u0090\4\u0091\t\u0091\4\u0092\t\u0092\4\u0093")
buf.write(u"\t\u0093\4\u0094\t\u0094\4\u0095\t\u0095\4\u0096\t\u0096")
buf.write(u"\4\u0097\t\u0097\4\u0098\t\u0098\4\u0099\t\u0099\4\u009a")
buf.write(u"\t\u009a\4\u009b\t\u009b\4\u009c\t\u009c\4\u009d\t\u009d")
buf.write(u"\4\u009e\t\u009e\4\u009f\t\u009f\4\u00a0\t\u00a0\4\u00a1")
buf.write(u"\t\u00a1\4\u00a2\t\u00a2\4\u00a3\t\u00a3\4\u00a4\t\u00a4")
buf.write(u"\4\u00a5\t\u00a5\4\u00a6\t\u00a6\4\u00a7\t\u00a7\4\u00a8")
buf.write(u"\t\u00a8\4\u00a9\t\u00a9\4\u00aa\t\u00aa\4\u00ab\t\u00ab")
buf.write(u"\4\u00ac\t\u00ac\4\u00ad\t\u00ad\4\u00ae\t\u00ae\4\u00af")
buf.write(u"\t\u00af\4\u00b0\t\u00b0\4\u00b1\t\u00b1\4\u00b2\t\u00b2")
buf.write(u"\4\u00b3\t\u00b3\4\u00b4\t\u00b4\4\u00b5\t\u00b5\4\u00b6")
buf.write(u"\t\u00b6\4\u00b7\t\u00b7\4\u00b8\t\u00b8\4\u00b9\t\u00b9")
buf.write(u"\4\u00ba\t\u00ba\4\u00bb\t\u00bb\4\u00bc\t\u00bc\4\u00bd")
buf.write(u"\t\u00bd\4\u00be\t\u00be\4\u00bf\t\u00bf\4\u00c0\t\u00c0")
buf.write(u"\4\u00c1\t\u00c1\4\u00c2\t\u00c2\4\u00c3\t\u00c3\4\u00c4")
buf.write(u"\t\u00c4\4\u00c5\t\u00c5\4\u00c6\t\u00c6\4\u00c7\t\u00c7")
buf.write(u"\4\u00c8\t\u00c8\4\u00c9\t\u00c9\4\u00ca\t\u00ca\4\u00cb")
buf.write(u"\t\u00cb\4\u00cc\t\u00cc\4\u00cd\t\u00cd\4\u00ce\t\u00ce")
buf.write(u"\4\u00cf\t\u00cf\4\u00d0\t\u00d0\4\u00d1\t\u00d1\4\u00d2")
buf.write(u"\t\u00d2\4\u00d3\t\u00d3\4\u00d4\t\u00d4\4\u00d5\t\u00d5")
buf.write(u"\4\u00d6\t\u00d6\4\u00d7\t\u00d7\4\u00d8\t\u00d8\4\u00d9")
buf.write(u"\t\u00d9\4\u00da\t\u00da\4\u00db\t\u00db\4\u00dc\t\u00dc")
buf.write(u"\4\u00dd\t\u00dd\4\u00de\t\u00de\4\u00df\t\u00df\3\2")
buf.write(u"\3\2\3\3\3\3\3\4\3\4\3\5\3\5\3\6\3\6\3\7\3\7\3\7\3\b")
buf.write(u"\3\b\3\t\3\t\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\f\3\f")
buf.write(u"\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16")
buf.write(u"\3\16\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3\20\3\20\3")
buf.write(u"\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\22\3\22\3\22")
buf.write(u"\3\23\3\23\3\23\3\23\3\24\3\24\3\24\3\25\3\25\3\25\3")
buf.write(u"\25\3\25\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26")
buf.write(u"\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\30\3\30\3\30\3")
buf.write(u"\30\3\30\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\32")
buf.write(u"\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\34\3")
buf.write(u"\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\35\3\35\3\35")
buf.write(u"\3\35\3\35\3\35\3\35\3\35\3\35\3\36\3\36\3\36\3\36\3")
buf.write(u"\36\3\36\3\36\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37")
buf.write(u"\3 \3 \3 \3 \3 \3 \3 \3 \3!\3!\3!\3!\3!\3!\3!\3\"\3\"")
buf.write(u"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3#\3#\3")
buf.write(u"#\3#\3#\3#\3#\3$\3$\3$\3$\3$\3$\3$\3%\3%\3%\3%\3%\3%")
buf.write(u"\3&\3&\3&\3&\3&\3\'\3\'\3\'\3\'\3\'\3\'\3\'\3\'\3(\3")
buf.write(u"(\3(\3(\3(\3(\3(\3(\3(\3(\3(\3(\3(\3)\3)\3)\3)\3)\3)")
buf.write(u"\3)\3)\3)\3)\3)\3)\3)\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3")
buf.write(u"*\3*\3*\3*\3*\3*\3*\3*\3+\3+\3+\3+\3+\3+\3+\3+\3+\3+")
buf.write(u"\3+\3+\3+\3,\3,\3,\3,\3,\3-\3-\3-\3-\3-\3.\3.\3.\3.\3")
buf.write(u"/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3\60\3\60\3\60\3\60\3")
buf.write(u"\60\3\60\3\60\3\61\3\61\3\61\3\61\3\61\3\62\3\62\3\62")
buf.write(u"\3\62\3\62\3\62\3\62\3\62\3\62\3\63\3\63\3\63\3\63\3")
buf.write(u"\63\3\63\3\63\3\63\3\63\3\64\3\64\3\64\3\64\3\64\3\64")
buf.write(u"\3\64\3\64\3\64\3\64\3\64\3\64\3\65\3\65\3\65\3\65\3")
buf.write(u"\65\3\66\3\66\3\66\3\66\3\66\3\67\3\67\3\67\3\67\38\3")
buf.write(u"8\38\38\38\38\38\39\39\39\39\39\39\39\3:\3:\3:\3:\3:")
buf.write(u"\3:\3:\3:\3:\3:\3;\3;\3;\3;\3;\3;\3;\3;\3<\3<\3<\3<\3")
buf.write(u"<\3<\3<\3=\3=\3=\3=\3=\3=\3=\3=\3>\3>\3>\3>\3>\3>\3>")
buf.write(u"\3>\3?\3?\3?\3?\3?\3?\3@\3@\3@\3@\3@\3@\3@\3A\3A\3A\3")
buf.write(u"A\3A\3A\3B\3B\3B\3B\3B\3B\3B\3B\3B\3B\3C\3C\3C\3C\3D")
buf.write(u"\3D\3D\3D\3D\3D\3D\3E\3E\3E\3E\3E\3F\3F\3F\3F\3F\3G\3")
buf.write(u"G\3G\3G\3G\3G\3G\3G\3G\3G\3H\3H\3H\3H\3H\3H\3I\3I\3I")
buf.write(u"\3I\3I\3I\3I\3J\3J\3J\3J\3J\3J\3J\3J\3J\3K\3K\3K\3K\3")
buf.write(u"K\3K\3L\3L\3L\3L\3L\3L\3L\3L\3L\3M\3M\3M\3M\3M\3M\3M")
buf.write(u"\3N\3N\3N\3N\3N\3O\3O\3O\3P\3P\3P\3Q\3Q\3Q\3Q\3Q\3Q\3")
buf.write(u"Q\3Q\3Q\3Q\3R\3R\3R\3R\3R\3R\3S\3S\3S\3S\3S\3S\3T\3T")
buf.write(u"\3T\3T\3T\3T\3T\3U\3U\3U\3U\3U\3U\3U\3U\3V\3V\3V\3V\3")
buf.write(u"V\3V\3V\3V\3V\3V\3W\3W\3W\3W\3W\3W\3W\3W\3W\3X\3X\3X")
buf.write(u"\3X\3X\3Y\3Y\3Y\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3[\3[\3")
buf.write(u"[\3[\3[\3\\\3\\\3\\\3\\\3\\\3]\3]\3]\3]\3]\3]\3]\3]\3")
buf.write(u"^\3^\3^\3^\3^\3_\3_\3_\3_\3_\3_\3`\3`\3`\3`\3`\3a\3a")
buf.write(u"\3a\3a\3a\3a\3b\3b\3b\3b\3b\3b\3b\3b\3b\3b\3c\3c\3c\3")
buf.write(u"c\3c\3c\3c\3c\3c\3c\3c\3c\3c\3c\3c\3d\3d\3d\3d\3d\3d")
buf.write(u"\3d\3d\3e\3e\3e\3e\3f\3f\3f\3f\3f\3f\3f\3g\3g\3g\3g\3")
buf.write(u"g\3g\3h\3h\3h\3h\3h\3h\3h\3h\3i\3i\3i\3i\3j\3j\3j\3j")
buf.write(u"\3k\3k\3k\3k\3k\3l\3l\3l\3l\3l\3m\3m\3m\3n\3n\3n\3n\3")
buf.write(u"n\3n\3n\3n\3n\3n\3o\3o\3o\3o\3p\3p\3p\3p\3p\3q\3q\3q")
buf.write(u"\3q\3q\3q\3q\3r\3r\3r\3r\3r\3r\3s\3s\3s\3t\3t\3t\3t\3")
buf.write(u"t\3u\3u\3u\3u\3u\3u\3u\3v\3v\3v\3w\3w\3w\3w\3w\3w\3x")
buf.write(u"\3x\3x\3x\3x\3x\3x\3x\3x\3x\3x\3y\3y\3y\3y\3y\3y\3z\3")
buf.write(u"z\3z\3z\3z\3z\3z\3{\3{\3{\3{\3{\3|\3|\3|\3|\3|\3|\3|")
buf.write(u"\3|\3|\3|\3}\3}\3}\3}\3}\3}\3}\3}\3}\3}\3}\3~\3~\3~\3")
buf.write(u"~\3~\3~\3~\3~\3~\3\177\3\177\3\177\3\177\3\177\3\177")
buf.write(u"\3\177\3\177\3\177\3\177\3\u0080\3\u0080\3\u0080\3\u0080")
buf.write(u"\3\u0080\3\u0080\3\u0080\3\u0080\3\u0081\3\u0081\3\u0081")
buf.write(u"\3\u0081\3\u0081\3\u0081\3\u0081\3\u0081\3\u0081\3\u0081")
buf.write(u"\3\u0081\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082")
buf.write(u"\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082\3\u0083\3\u0083")
buf.write(u"\3\u0083\3\u0083\3\u0083\3\u0083\3\u0083\3\u0084\3\u0084")
buf.write(u"\3\u0084\3\u0084\3\u0084\3\u0084\3\u0085\3\u0085\3\u0085")
buf.write(u"\3\u0085\3\u0085\3\u0086\3\u0086\3\u0086\3\u0086\3\u0086")
buf.write(u"\3\u0086\3\u0086\3\u0086\3\u0086\3\u0086\3\u0087\3\u0087")
buf.write(u"\3\u0087\3\u0087\3\u0087\3\u0087\3\u0087\3\u0088\3\u0088")
buf.write(u"\3\u0088\3\u0088\3\u0088\3\u0088\3\u0088\3\u0088\3\u0088")
buf.write(u"\3\u0088\3\u0088\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089")
buf.write(u"\3\u0089\3\u0089\3\u0089\3\u008a\3\u008a\3\u008a\3\u008a")
buf.write(u"\3\u008a\3\u008a\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b")
buf.write(u"\3\u008b\3\u008b\3\u008b\3\u008b\3\u008c\3\u008c\3\u008c")
buf.write(u"\3\u008c\3\u008c\3\u008c\3\u008c\3\u008d\3\u008d\3\u008d")
buf.write(u"\3\u008d\3\u008d\3\u008d\3\u008e\3\u008e\3\u008e\3\u008e")
buf.write(u"\3\u008e\3\u008e\3\u008e\3\u008e\3\u008e\3\u008f\3\u008f")
buf.write(u"\3\u008f\3\u008f\3\u008f\3\u008f\3\u008f\3\u0090\3\u0090")
buf.write(u"\3\u0090\3\u0090\3\u0091\3\u0091\3\u0091\3\u0091\3\u0091")
buf.write(u"\3\u0092\3\u0092\3\u0092\3\u0092\3\u0092\3\u0092\3\u0092")
buf.write(u"\3\u0093\3\u0093\3\u0093\3\u0093\3\u0093\3\u0093\3\u0093")
buf.write(u"\3\u0093\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094")
buf.write(u"\3\u0094\3\u0095\3\u0095\3\u0095\3\u0095\3\u0095\3\u0095")
buf.write(u"\3\u0095\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096")
buf.write(u"\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096")
buf.write(u"\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097")
buf.write(u"\3\u0097\3\u0098\3\u0098\3\u0098\3\u0098\3\u0099\3\u0099")
buf.write(u"\3\u0099\3\u0099\3\u0099\3\u009a\3\u009a\3\u009a\3\u009a")
buf.write(u"\3\u009a\3\u009b\3\u009b\3\u009b\3\u009b\3\u009b\3\u009b")
buf.write(u"\3\u009b\3\u009b\3\u009b\3\u009c\3\u009c\3\u009c\3\u009c")
buf.write(u"\3\u009c\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d")
buf.write(u"\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009f")
buf.write(u"\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f")
buf.write(u"\3\u009f\3\u009f\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0")
buf.write(u"\3\u00a0\3\u00a0\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1")
buf.write(u"\3\u00a1\3\u00a2\3\u00a2\3\u00a2\3\u00a2\3\u00a2\3\u00a2")
buf.write(u"\3\u00a2\3\u00a3\3\u00a3\3\u00a3\3\u00a3\3\u00a3\3\u00a3")
buf.write(u"\3\u00a3\3\u00a3\3\u00a3\3\u00a3\3\u00a3\3\u00a3\3\u00a4")
buf.write(u"\3\u00a4\3\u00a4\3\u00a4\3\u00a4\3\u00a5\3\u00a5\3\u00a5")
buf.write(u"\3\u00a5\3\u00a5\3\u00a6\3\u00a6\3\u00a6\3\u00a6\3\u00a6")
buf.write(u"\3\u00a7\3\u00a7\3\u00a7\3\u00a7\3\u00a7\3\u00a7\3\u00a7")
buf.write(u"\3\u00a7\3\u00a7\3\u00a7\3\u00a8\3\u00a8\3\u00a8\3\u00a8")
buf.write(u"\3\u00a8\3\u00a8\3\u00a8\3\u00a8\3\u00a9\3\u00a9\3\u00a9")
buf.write(u"\3\u00aa\3\u00aa\3\u00aa\3\u00aa\3\u00aa\3\u00aa\3\u00aa")
buf.write(u"\3\u00aa\3\u00aa\3\u00aa\3\u00aa\3\u00aa\3\u00ab\3\u00ab")
buf.write(u"\3\u00ab\3\u00ab\3\u00ab\3\u00ac\3\u00ac\3\u00ac\3\u00ac")
buf.write(u"\3\u00ac\3\u00ac\3\u00ac\3\u00ac\3\u00ac\3\u00ad\3\u00ad")
buf.write(u"\3\u00ad\3\u00ad\3\u00ad\3\u00ae\3\u00ae\3\u00ae\3\u00ae")
buf.write(u"\3\u00ae\3\u00ae\3\u00ae\3\u00ae\3\u00af\3\u00af\3\u00af")
buf.write(u"\3\u00af\3\u00af\3\u00af\3\u00af\3\u00af\3\u00af\3\u00af")
buf.write(u"\3\u00b0\3\u00b0\3\u00b0\3\u00b0\3\u00b0\3\u00b0\3\u00b0")
buf.write(u"\3\u00b0\3\u00b0\3\u00b0\3\u00b0\3\u00b0\3\u00b1\3\u00b1")
buf.write(u"\3\u00b1\3\u00b1\3\u00b1\3\u00b1\3\u00b2\3\u00b2\3\u00b2")
buf.write(u"\3\u00b2\3\u00b2\3\u00b2\3\u00b2\3\u00b3\3\u00b3\3\u00b3")
buf.write(u"\3\u00b3\3\u00b4\3\u00b4\3\u00b4\3\u00b4\3\u00b4\3\u00b4")
buf.write(u"\3\u00b5\3\u00b5\3\u00b5\3\u00b5\3\u00b5\3\u00b5\3\u00b5")
buf.write(u"\3\u00b5\3\u00b5\3\u00b6\3\u00b6\3\u00b6\3\u00b6\3\u00b6")
buf.write(u"\3\u00b6\3\u00b6\3\u00b7\3\u00b7\3\u00b7\3\u00b7\3\u00b7")
buf.write(u"\3\u00b7\3\u00b7\3\u00b7\3\u00b8\3\u00b8\3\u00b8\3\u00b8")
buf.write(u"\3\u00b8\3\u00b9\3\u00b9\3\u00b9\3\u00b9\3\u00b9\3\u00ba")
buf.write(u"\3\u00ba\3\u00ba\3\u00ba\3\u00ba\3\u00ba\3\u00bb\3\u00bb")
buf.write(u"\3\u00bb\3\u00bb\3\u00bb\3\u00bc\3\u00bc\3\u00bc\3\u00bc")
buf.write(u"\3\u00bc\3\u00bd\3\u00bd\3\u00bd\3\u00bd\3\u00bd\3\u00bd")
buf.write(u"\3\u00be\3\u00be\3\u00be\3\u00be\3\u00be\3\u00bf\3\u00bf")
buf.write(u"\3\u00bf\3\u00bf\3\u00bf\3\u00c0\3\u00c0\3\u00c1\3\u00c1")
buf.write(u"\3\u00c1\3\u00c1\5\u00c1\u06cc\n\u00c1\3\u00c2\3\u00c2")
buf.write(u"\3\u00c3\3\u00c3\3\u00c3\3\u00c4\3\u00c4\3\u00c5\3\u00c5")
buf.write(u"\3\u00c5\3\u00c6\3\u00c6\3\u00c7\3\u00c7\3\u00c8\3\u00c8")
buf.write(u"\3\u00c9\3\u00c9\3\u00ca\3\u00ca\3\u00cb\3\u00cb\3\u00cb")
buf.write(u"\3\u00cc\3\u00cc\3\u00cc\3\u00cc\7\u00cc\u06e9\n\u00cc")
buf.write(u"\f\u00cc\16\u00cc\u06ec\13\u00cc\3\u00cc\3\u00cc\3\u00cd")
buf.write(u"\3\u00cd\3\u00cd\3\u00cd\3\u00cd\3\u00cd\3\u00cd\7\u00cd")
buf.write(u"\u06f7\n\u00cd\f\u00cd\16\u00cd\u06fa\13\u00cd\3\u00cd")
buf.write(u"\3\u00cd\3\u00ce\3\u00ce\3\u00ce\3\u00ce\7\u00ce\u0702")
buf.write(u"\n\u00ce\f\u00ce\16\u00ce\u0705\13\u00ce\3\u00ce\3\u00ce")
buf.write(u"\3\u00cf\6\u00cf\u070a\n\u00cf\r\u00cf\16\u00cf\u070b")
buf.write(u"\3\u00d0\6\u00d0\u070f\n\u00d0\r\u00d0\16\u00d0\u0710")
buf.write(u"\3\u00d0\3\u00d0\7\u00d0\u0715\n\u00d0\f\u00d0\16\u00d0")
buf.write(u"\u0718\13\u00d0\3\u00d0\3\u00d0\6\u00d0\u071c\n\u00d0")
buf.write(u"\r\u00d0\16\u00d0\u071d\5\u00d0\u0720\n\u00d0\3\u00d1")
buf.write(u"\6\u00d1\u0723\n\u00d1\r\u00d1\16\u00d1\u0724\3\u00d1")
buf.write(u"\3\u00d1\7\u00d1\u0729\n\u00d1\f\u00d1\16\u00d1\u072c")
buf.write(u"\13\u00d1\5\u00d1\u072e\n\u00d1\3\u00d1\3\u00d1\3\u00d1")
buf.write(u"\3\u00d1\6\u00d1\u0734\n\u00d1\r\u00d1\16\u00d1\u0735")
buf.write(u"\3\u00d1\3\u00d1\5\u00d1\u073a\n\u00d1\3\u00d2\3\u00d2")
buf.write(u"\5\u00d2\u073e\n\u00d2\3\u00d2\3\u00d2\3\u00d2\7\u00d2")
buf.write(u"\u0743\n\u00d2\f\u00d2\16\u00d2\u0746\13\u00d2\3\u00d3")
buf.write(u"\3\u00d3\3\u00d3\3\u00d3\6\u00d3\u074c\n\u00d3\r\u00d3")
buf.write(u"\16\u00d3\u074d\3\u00d4\3\u00d4\3\u00d4\3\u00d4\7\u00d4")
buf.write(u"\u0754\n\u00d4\f\u00d4\16\u00d4\u0757\13\u00d4\3\u00d4")
buf.write(u"\3\u00d4\3\u00d5\3\u00d5\3\u00d5\3\u00d5\7\u00d5\u075f")
buf.write(u"\n\u00d5\f\u00d5\16\u00d5\u0762\13\u00d5\3\u00d5\3\u00d5")
buf.write(u"\3\u00d6\3\u00d6\3\u00d6\3\u00d6\3\u00d6\3\u00d6\3\u00d6")
buf.write(u"\3\u00d6\3\u00d6\3\u00d6\3\u00d6\3\u00d6\3\u00d6\3\u00d6")
buf.write(u"\3\u00d6\3\u00d6\3\u00d6\3\u00d6\3\u00d6\3\u00d6\3\u00d6")
buf.write(u"\3\u00d6\3\u00d6\3\u00d7\3\u00d7\3\u00d7\3\u00d7\3\u00d7")
buf.write(u"\3\u00d7\3\u00d7\3\u00d7\3\u00d7\3\u00d7\3\u00d7\3\u00d7")
buf.write(u"\3\u00d7\3\u00d7\3\u00d7\3\u00d7\3\u00d7\3\u00d7\3\u00d7")
buf.write(u"\3\u00d7\3\u00d7\3\u00d7\3\u00d7\3\u00d7\3\u00d7\3\u00d7")
buf.write(u"\3\u00d7\3\u00d7\3\u00d8\3\u00d8\3\u00d8\3\u00d8\3\u00d8")
buf.write(u"\3\u00d8\3\u00d8\3\u00d8\3\u00d8\3\u00d8\3\u00d8\3\u00d8")
buf.write(u"\3\u00d8\3\u00d8\3\u00d8\3\u00d8\3\u00d8\3\u00d8\3\u00d9")
buf.write(u"\3\u00d9\5\u00d9\u07ad\n\u00d9\3\u00d9\6\u00d9\u07b0")
buf.write(u"\n\u00d9\r\u00d9\16\u00d9\u07b1\3\u00da\3\u00da\3\u00db")
buf.write(u"\3\u00db\3\u00dc\3\u00dc\3\u00dc\3\u00dc\7\u00dc\u07bc")
buf.write(u"\n\u00dc\f\u00dc\16\u00dc\u07bf\13\u00dc\3\u00dc\5\u00dc")
buf.write(u"\u07c2\n\u00dc\3\u00dc\5\u00dc\u07c5\n\u00dc\3\u00dc")
buf.write(u"\3\u00dc\3\u00dd\3\u00dd\3\u00dd\3\u00dd\7\u00dd\u07cd")
buf.write(u"\n\u00dd\f\u00dd\16\u00dd\u07d0\13\u00dd\3\u00dd\3\u00dd")
buf.write(u"\3\u00dd\3\u00dd\3\u00dd\3\u00de\6\u00de\u07d8\n\u00de")
buf.write(u"\r\u00de\16\u00de\u07d9\3\u00de\3\u00de\3\u00df\3\u00df")
buf.write(u"\3\u07ce\2\u00e0\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23")
buf.write(u"\13\25\f\27\r\31\16\33\17\35\20\37\21!\22#\23%\24\'\25")
buf.write(u")\26+\27-\30/\31\61\32\63\33\65\34\67\359\36;\37= ?!")
buf.write(u"A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65")
buf.write(u"i\66k\67m8o9q:s;u<w=y>{?}@\177A\u0081B\u0083C\u0085D")
buf.write(u"\u0087E\u0089F\u008bG\u008dH\u008fI\u0091J\u0093K\u0095")
buf.write(u"L\u0097M\u0099N\u009bO\u009dP\u009fQ\u00a1R\u00a3S\u00a5")
buf.write(u"T\u00a7U\u00a9V\u00abW\u00adX\u00afY\u00b1Z\u00b3[\u00b5")
buf.write(u"\\\u00b7]\u00b9^\u00bb_\u00bd`\u00bfa\u00c1b\u00c3c\u00c5")
buf.write(u"d\u00c7e\u00c9f\u00cbg\u00cdh\u00cfi\u00d1j\u00d3k\u00d5")
buf.write(u"l\u00d7m\u00d9n\u00dbo\u00ddp\u00dfq\u00e1r\u00e3s\u00e5")
buf.write(u"t\u00e7u\u00e9v\u00ebw\u00edx\u00efy\u00f1z\u00f3{\u00f5")
buf.write(u"|\u00f7}\u00f9~\u00fb\177\u00fd\u0080\u00ff\u0081\u0101")
buf.write(u"\u0082\u0103\u0083\u0105\u0084\u0107\u0085\u0109\u0086")
buf.write(u"\u010b\u0087\u010d\u0088\u010f\u0089\u0111\u008a\u0113")
buf.write(u"\u008b\u0115\u008c\u0117\u008d\u0119\u008e\u011b\u008f")
buf.write(u"\u011d\u0090\u011f\u0091\u0121\u0092\u0123\u0093\u0125")
buf.write(u"\u0094\u0127\u0095\u0129\u0096\u012b\u0097\u012d\u0098")
buf.write(u"\u012f\u0099\u0131\u009a\u0133\u009b\u0135\u009c\u0137")
buf.write(u"\u009d\u0139\u009e\u013b\u009f\u013d\u00a0\u013f\u00a1")
buf.write(u"\u0141\u00a2\u0143\u00a3\u0145\u00a4\u0147\u00a5\u0149")
buf.write(u"\u00a6\u014b\u00a7\u014d\u00a8\u014f\u00a9\u0151\u00aa")
buf.write(u"\u0153\u00ab\u0155\u00ac\u0157\u00ad\u0159\u00ae\u015b")
buf.write(u"\u00af\u015d\u00b0\u015f\u00b1\u0161\u00b2\u0163\u00b3")
buf.write(u"\u0165\u00b4\u0167\u00b5\u0169\u00b6\u016b\u00b7\u016d")
buf.write(u"\u00b8\u016f\u00b9\u0171\u00ba\u0173\u00bb\u0175\u00bc")
buf.write(u"\u0177\u00bd\u0179\u00be\u017b\u00bf\u017d\u00c0\u017f")
buf.write(u"\u00c1\u0181\u00c2\u0183\u00c3\u0185\u00c4\u0187\u00c5")
buf.write(u"\u0189\u00c6\u018b\u00c7\u018d\u00c8\u018f\u00c9\u0191")
buf.write(u"\u00ca\u0193\u00cb\u0195\u00cc\u0197\u00cd\u0199\u00ce")
buf.write(u"\u019b\u00cf\u019d\u00d0\u019f\u00d1\u01a1\u00d2\u01a3")
buf.write(u"\u00d3\u01a5\u00d4\u01a7\u00d5\u01a9\u00d6\u01ab\u00d7")
buf.write(u"\u01ad\u00d8\u01af\u00d9\u01b1\2\u01b3\2\u01b5\2\u01b7")
buf.write(u"\u00da\u01b9\u00db\u01bb\u00dc\u01bd\u00dd\3\2\13\3\2")
buf.write(u"))\5\2<<BBaa\3\2$$\3\2bb\4\2--//\3\2\62;\3\2C\\\4\2\f")
buf.write(u"\f\17\17\5\2\13\f\17\17\"\"\2\u07fd\2\3\3\2\2\2\2\5\3")
buf.write(u"\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2")
buf.write(u"\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2")
buf.write(u"\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2")
buf.write(u"\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'")
buf.write(u"\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2")
buf.write(u"\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2")
buf.write(u"\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2")
buf.write(u"\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2")
buf.write(u"\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3")
buf.write(u"\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2")
buf.write(u"_\3\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2")
buf.write(u"\2i\3\2\2\2\2k\3\2\2\2\2m\3\2\2\2\2o\3\2\2\2\2q\3\2\2")
buf.write(u"\2\2s\3\2\2\2\2u\3\2\2\2\2w\3\2\2\2\2y\3\2\2\2\2{\3\2")
buf.write(u"\2\2\2}\3\2\2\2\2\177\3\2\2\2\2\u0081\3\2\2\2\2\u0083")
buf.write(u"\3\2\2\2\2\u0085\3\2\2\2\2\u0087\3\2\2\2\2\u0089\3\2")
buf.write(u"\2\2\2\u008b\3\2\2\2\2\u008d\3\2\2\2\2\u008f\3\2\2\2")
buf.write(u"\2\u0091\3\2\2\2\2\u0093\3\2\2\2\2\u0095\3\2\2\2\2\u0097")
buf.write(u"\3\2\2\2\2\u0099\3\2\2\2\2\u009b\3\2\2\2\2\u009d\3\2")
buf.write(u"\2\2\2\u009f\3\2\2\2\2\u00a1\3\2\2\2\2\u00a3\3\2\2\2")
buf.write(u"\2\u00a5\3\2\2\2\2\u00a7\3\2\2\2\2\u00a9\3\2\2\2\2\u00ab")
buf.write(u"\3\2\2\2\2\u00ad\3\2\2\2\2\u00af\3\2\2\2\2\u00b1\3\2")
buf.write(u"\2\2\2\u00b3\3\2\2\2\2\u00b5\3\2\2\2\2\u00b7\3\2\2\2")
buf.write(u"\2\u00b9\3\2\2\2\2\u00bb\3\2\2\2\2\u00bd\3\2\2\2\2\u00bf")
buf.write(u"\3\2\2\2\2\u00c1\3\2\2\2\2\u00c3\3\2\2\2\2\u00c5\3\2")
buf.write(u"\2\2\2\u00c7\3\2\2\2\2\u00c9\3\2\2\2\2\u00cb\3\2\2\2")
buf.write(u"\2\u00cd\3\2\2\2\2\u00cf\3\2\2\2\2\u00d1\3\2\2\2\2\u00d3")
buf.write(u"\3\2\2\2\2\u00d5\3\2\2\2\2\u00d7\3\2\2\2\2\u00d9\3\2")
buf.write(u"\2\2\2\u00db\3\2\2\2\2\u00dd\3\2\2\2\2\u00df\3\2\2\2")
buf.write(u"\2\u00e1\3\2\2\2\2\u00e3\3\2\2\2\2\u00e5\3\2\2\2\2\u00e7")
buf.write(u"\3\2\2\2\2\u00e9\3\2\2\2\2\u00eb\3\2\2\2\2\u00ed\3\2")
buf.write(u"\2\2\2\u00ef\3\2\2\2\2\u00f1\3\2\2\2\2\u00f3\3\2\2\2")
buf.write(u"\2\u00f5\3\2\2\2\2\u00f7\3\2\2\2\2\u00f9\3\2\2\2\2\u00fb")
buf.write(u"\3\2\2\2\2\u00fd\3\2\2\2\2\u00ff\3\2\2\2\2\u0101\3\2")
buf.write(u"\2\2\2\u0103\3\2\2\2\2\u0105\3\2\2\2\2\u0107\3\2\2\2")
buf.write(u"\2\u0109\3\2\2\2\2\u010b\3\2\2\2\2\u010d\3\2\2\2\2\u010f")
buf.write(u"\3\2\2\2\2\u0111\3\2\2\2\2\u0113\3\2\2\2\2\u0115\3\2")
buf.write(u"\2\2\2\u0117\3\2\2\2\2\u0119\3\2\2\2\2\u011b\3\2\2\2")
buf.write(u"\2\u011d\3\2\2\2\2\u011f\3\2\2\2\2\u0121\3\2\2\2\2\u0123")
buf.write(u"\3\2\2\2\2\u0125\3\2\2\2\2\u0127\3\2\2\2\2\u0129\3\2")
buf.write(u"\2\2\2\u012b\3\2\2\2\2\u012d\3\2\2\2\2\u012f\3\2\2\2")
buf.write(u"\2\u0131\3\2\2\2\2\u0133\3\2\2\2\2\u0135\3\2\2\2\2\u0137")
buf.write(u"\3\2\2\2\2\u0139\3\2\2\2\2\u013b\3\2\2\2\2\u013d\3\2")
buf.write(u"\2\2\2\u013f\3\2\2\2\2\u0141\3\2\2\2\2\u0143\3\2\2\2")
buf.write(u"\2\u0145\3\2\2\2\2\u0147\3\2\2\2\2\u0149\3\2\2\2\2\u014b")
buf.write(u"\3\2\2\2\2\u014d\3\2\2\2\2\u014f\3\2\2\2\2\u0151\3\2")
buf.write(u"\2\2\2\u0153\3\2\2\2\2\u0155\3\2\2\2\2\u0157\3\2\2\2")
buf.write(u"\2\u0159\3\2\2\2\2\u015b\3\2\2\2\2\u015d\3\2\2\2\2\u015f")
buf.write(u"\3\2\2\2\2\u0161\3\2\2\2\2\u0163\3\2\2\2\2\u0165\3\2")
buf.write(u"\2\2\2\u0167\3\2\2\2\2\u0169\3\2\2\2\2\u016b\3\2\2\2")
buf.write(u"\2\u016d\3\2\2\2\2\u016f\3\2\2\2\2\u0171\3\2\2\2\2\u0173")
buf.write(u"\3\2\2\2\2\u0175\3\2\2\2\2\u0177\3\2\2\2\2\u0179\3\2")
buf.write(u"\2\2\2\u017b\3\2\2\2\2\u017d\3\2\2\2\2\u017f\3\2\2\2")
buf.write(u"\2\u0181\3\2\2\2\2\u0183\3\2\2\2\2\u0185\3\2\2\2\2\u0187")
buf.write(u"\3\2\2\2\2\u0189\3\2\2\2\2\u018b\3\2\2\2\2\u018d\3\2")
buf.write(u"\2\2\2\u018f\3\2\2\2\2\u0191\3\2\2\2\2\u0193\3\2\2\2")
buf.write(u"\2\u0195\3\2\2\2\2\u0197\3\2\2\2\2\u0199\3\2\2\2\2\u019b")
buf.write(u"\3\2\2\2\2\u019d\3\2\2\2\2\u019f\3\2\2\2\2\u01a1\3\2")
buf.write(u"\2\2\2\u01a3\3\2\2\2\2\u01a5\3\2\2\2\2\u01a7\3\2\2\2")
buf.write(u"\2\u01a9\3\2\2\2\2\u01ab\3\2\2\2\2\u01ad\3\2\2\2\2\u01af")
buf.write(u"\3\2\2\2\2\u01b7\3\2\2\2\2\u01b9\3\2\2\2\2\u01bb\3\2")
buf.write(u"\2\2\2\u01bd\3\2\2\2\3\u01bf\3\2\2\2\5\u01c1\3\2\2\2")
buf.write(u"\7\u01c3\3\2\2\2\t\u01c5\3\2\2\2\13\u01c7\3\2\2\2\r\u01c9")
buf.write(u"\3\2\2\2\17\u01cc\3\2\2\2\21\u01ce\3\2\2\2\23\u01d0\3")
buf.write(u"\2\2\2\25\u01d3\3\2\2\2\27\u01d7\3\2\2\2\31\u01db\3\2")
buf.write(u"\2\2\33\u01e1\3\2\2\2\35\u01e9\3\2\2\2\37\u01ed\3\2\2")
buf.write(u"\2!\u01f1\3\2\2\2#\u01f7\3\2\2\2%\u01fa\3\2\2\2\'\u01fe")
buf.write(u"\3\2\2\2)\u0201\3\2\2\2+\u020b\3\2\2\2-\u0213\3\2\2\2")
buf.write(u"/\u0216\3\2\2\2\61\u021b\3\2\2\2\63\u0223\3\2\2\2\65")
buf.write(u"\u0228\3\2\2\2\67\u022d\3\2\2\29\u0236\3\2\2\2;\u023f")
buf.write(u"\3\2\2\2=\u0246\3\2\2\2?\u024e\3\2\2\2A\u0256\3\2\2\2")
buf.write(u"C\u025d\3\2\2\2E\u0267\3\2\2\2G\u0272\3\2\2\2I\u0279")
buf.write(u"\3\2\2\2K\u027f\3\2\2\2M\u0284\3\2\2\2O\u028c\3\2\2\2")
buf.write(u"Q\u0299\3\2\2\2S\u02a6\3\2\2\2U\u02b8\3\2\2\2W\u02c5")
buf.write(u"\3\2\2\2Y\u02ca\3\2\2\2[\u02cf\3\2\2\2]\u02d3\3\2\2\2")
buf.write(u"_\u02de\3\2\2\2a\u02e5\3\2\2\2c\u02ea\3\2\2\2e\u02f3")
buf.write(u"\3\2\2\2g\u02fc\3\2\2\2i\u0308\3\2\2\2k\u030d\3\2\2\2")
buf.write(u"m\u0312\3\2\2\2o\u0316\3\2\2\2q\u031d\3\2\2\2s\u0324")
buf.write(u"\3\2\2\2u\u032e\3\2\2\2w\u0336\3\2\2\2y\u033d\3\2\2\2")
buf.write(u"{\u0345\3\2\2\2}\u034d\3\2\2\2\177\u0353\3\2\2\2\u0081")
buf.write(u"\u035a\3\2\2\2\u0083\u0360\3\2\2\2\u0085\u036a\3\2\2")
buf.write(u"\2\u0087\u036e\3\2\2\2\u0089\u0375\3\2\2\2\u008b\u037a")
buf.write(u"\3\2\2\2\u008d\u037f\3\2\2\2\u008f\u0389\3\2\2\2\u0091")
buf.write(u"\u038f\3\2\2\2\u0093\u0396\3\2\2\2\u0095\u039f\3\2\2")
buf.write(u"\2\u0097\u03a5\3\2\2\2\u0099\u03ae\3\2\2\2\u009b\u03b5")
buf.write(u"\3\2\2\2\u009d\u03ba\3\2\2\2\u009f\u03bd\3\2\2\2\u00a1")
buf.write(u"\u03c0\3\2\2\2\u00a3\u03ca\3\2\2\2\u00a5\u03d0\3\2\2")
buf.write(u"\2\u00a7\u03d6\3\2\2\2\u00a9\u03dd\3\2\2\2\u00ab\u03e5")
buf.write(u"\3\2\2\2\u00ad\u03ef\3\2\2\2\u00af\u03f8\3\2\2\2\u00b1")
buf.write(u"\u03fd\3\2\2\2\u00b3\u0400\3\2\2\2\u00b5\u040a\3\2\2")
buf.write(u"\2\u00b7\u040f\3\2\2\2\u00b9\u0414\3\2\2\2\u00bb\u041c")
buf.write(u"\3\2\2\2\u00bd\u0421\3\2\2\2\u00bf\u0427\3\2\2\2\u00c1")
buf.write(u"\u042c\3\2\2\2\u00c3\u0432\3\2\2\2\u00c5\u043c\3\2\2")
buf.write(u"\2\u00c7\u044b\3\2\2\2\u00c9\u0453\3\2\2\2\u00cb\u0457")
buf.write(u"\3\2\2\2\u00cd\u045e\3\2\2\2\u00cf\u0464\3\2\2\2\u00d1")
buf.write(u"\u046c\3\2\2\2\u00d3\u0470\3\2\2\2\u00d5\u0474\3\2\2")
buf.write(u"\2\u00d7\u0479\3\2\2\2\u00d9\u047e\3\2\2\2\u00db\u0481")
buf.write(u"\3\2\2\2\u00dd\u048b\3\2\2\2\u00df\u048f\3\2\2\2\u00e1")
buf.write(u"\u0494\3\2\2\2\u00e3\u049b\3\2\2\2\u00e5\u04a1\3\2\2")
buf.write(u"\2\u00e7\u04a4\3\2\2\2\u00e9\u04a9\3\2\2\2\u00eb\u04b0")
buf.write(u"\3\2\2\2\u00ed\u04b3\3\2\2\2\u00ef\u04b9\3\2\2\2\u00f1")
buf.write(u"\u04c4\3\2\2\2\u00f3\u04ca\3\2\2\2\u00f5\u04d1\3\2\2")
buf.write(u"\2\u00f7\u04d6\3\2\2\2\u00f9\u04e0\3\2\2\2\u00fb\u04eb")
buf.write(u"\3\2\2\2\u00fd\u04f4\3\2\2\2\u00ff\u04fe\3\2\2\2\u0101")
buf.write(u"\u0506\3\2\2\2\u0103\u0511\3\2\2\2\u0105\u051c\3\2\2")
buf.write(u"\2\u0107\u0523\3\2\2\2\u0109\u0529\3\2\2\2\u010b\u052e")
buf.write(u"\3\2\2\2\u010d\u0538\3\2\2\2\u010f\u053f\3\2\2\2\u0111")
buf.write(u"\u054a\3\2\2\2\u0113\u0552\3\2\2\2\u0115\u0558\3\2\2")
buf.write(u"\2\u0117\u0561\3\2\2\2\u0119\u0568\3\2\2\2\u011b\u056e")
buf.write(u"\3\2\2\2\u011d\u0577\3\2\2\2\u011f\u057e\3\2\2\2\u0121")
buf.write(u"\u0582\3\2\2\2\u0123\u0587\3\2\2\2\u0125\u058e\3\2\2")
buf.write(u"\2\u0127\u0596\3\2\2\2\u0129\u059d\3\2\2\2\u012b\u05a4")
buf.write(u"\3\2\2\2\u012d\u05b1\3\2\2\2\u012f\u05b9\3\2\2\2\u0131")
buf.write(u"\u05bd\3\2\2\2\u0133\u05c2\3\2\2\2\u0135\u05c7\3\2\2")
buf.write(u"\2\u0137\u05d0\3\2\2\2\u0139\u05d5\3\2\2\2\u013b\u05db")
buf.write(u"\3\2\2\2\u013d\u05e1\3\2\2\2\u013f\u05eb\3\2\2\2\u0141")
buf.write(u"\u05f2\3\2\2\2\u0143\u05f8\3\2\2\2\u0145\u05ff\3\2\2")
buf.write(u"\2\u0147\u060b\3\2\2\2\u0149\u0610\3\2\2\2\u014b\u0615")
buf.write(u"\3\2\2\2\u014d\u061a\3\2\2\2\u014f\u0624\3\2\2\2\u0151")
buf.write(u"\u062c\3\2\2\2\u0153\u062f\3\2\2\2\u0155\u063b\3\2\2")
buf.write(u"\2\u0157\u0640\3\2\2\2\u0159\u0649\3\2\2\2\u015b\u064e")
buf.write(u"\3\2\2\2\u015d\u0656\3\2\2\2\u015f\u0660\3\2\2\2\u0161")
buf.write(u"\u066c\3\2\2\2\u0163\u0672\3\2\2\2\u0165\u0679\3\2\2")
buf.write(u"\2\u0167\u067d\3\2\2\2\u0169\u0683\3\2\2\2\u016b\u068c")
buf.write(u"\3\2\2\2\u016d\u0693\3\2\2\2\u016f\u069b\3\2\2\2\u0171")
buf.write(u"\u06a0\3\2\2\2\u0173\u06a5\3\2\2\2\u0175\u06ab\3\2\2")
buf.write(u"\2\u0177\u06b0\3\2\2\2\u0179\u06b5\3\2\2\2\u017b\u06bb")
buf.write(u"\3\2\2\2\u017d\u06c0\3\2\2\2\u017f\u06c5\3\2\2\2\u0181")
buf.write(u"\u06cb\3\2\2\2\u0183\u06cd\3\2\2\2\u0185\u06cf\3\2\2")
buf.write(u"\2\u0187\u06d2\3\2\2\2\u0189\u06d4\3\2\2\2\u018b\u06d7")
buf.write(u"\3\2\2\2\u018d\u06d9\3\2\2\2\u018f\u06db\3\2\2\2\u0191")
buf.write(u"\u06dd\3\2\2\2\u0193\u06df\3\2\2\2\u0195\u06e1\3\2\2")
buf.write(u"\2\u0197\u06e4\3\2\2\2\u0199\u06ef\3\2\2\2\u019b\u06fd")
buf.write(u"\3\2\2\2\u019d\u0709\3\2\2\2\u019f\u071f\3\2\2\2\u01a1")
buf.write(u"\u0739\3\2\2\2\u01a3\u073d\3\2\2\2\u01a5\u0747\3\2\2")
buf.write(u"\2\u01a7\u074f\3\2\2\2\u01a9\u075a\3\2\2\2\u01ab\u0765")
buf.write(u"\3\2\2\2\u01ad\u077c\3\2\2\2\u01af\u0798\3\2\2\2\u01b1")
buf.write(u"\u07aa\3\2\2\2\u01b3\u07b3\3\2\2\2\u01b5\u07b5\3\2\2")
buf.write(u"\2\u01b7\u07b7\3\2\2\2\u01b9\u07c8\3\2\2\2\u01bb\u07d7")
buf.write(u"\3\2\2\2\u01bd\u07dd\3\2\2\2\u01bf\u01c0\7\60\2\2\u01c0")
buf.write(u"\4\3\2\2\2\u01c1\u01c2\7*\2\2\u01c2\6\3\2\2\2\u01c3\u01c4")
buf.write(u"\7+\2\2\u01c4\b\3\2\2\2\u01c5\u01c6\7.\2\2\u01c6\n\3")
buf.write(u"\2\2\2\u01c7\u01c8\7A\2\2\u01c8\f\3\2\2\2\u01c9\u01ca")
buf.write(u"\7/\2\2\u01ca\u01cb\7@\2\2\u01cb\16\3\2\2\2\u01cc\u01cd")
buf.write(u"\7]\2\2\u01cd\20\3\2\2\2\u01ce\u01cf\7_\2\2\u01cf\22")
buf.write(u"\3\2\2\2\u01d0\u01d1\7?\2\2\u01d1\u01d2\7@\2\2\u01d2")
buf.write(u"\24\3\2\2\2\u01d3\u01d4\7C\2\2\u01d4\u01d5\7F\2\2\u01d5")
buf.write(u"\u01d6\7F\2\2\u01d6\26\3\2\2\2\u01d7\u01d8\7C\2\2\u01d8")
buf.write(u"\u01d9\7N\2\2\u01d9\u01da\7N\2\2\u01da\30\3\2\2\2\u01db")
buf.write(u"\u01dc\7C\2\2\u01dc\u01dd\7N\2\2\u01dd\u01de\7V\2\2\u01de")
buf.write(u"\u01df\7G\2\2\u01df\u01e0\7T\2\2\u01e0\32\3\2\2\2\u01e1")
buf.write(u"\u01e2\7C\2\2\u01e2\u01e3\7P\2\2\u01e3\u01e4\7C\2\2\u01e4")
buf.write(u"\u01e5\7N\2\2\u01e5\u01e6\7[\2\2\u01e6\u01e7\7\\\2\2")
buf.write(u"\u01e7\u01e8\7G\2\2\u01e8\34\3\2\2\2\u01e9\u01ea\7C\2")
buf.write(u"\2\u01ea\u01eb\7P\2\2\u01eb\u01ec\7F\2\2\u01ec\36\3\2")
buf.write(u"\2\2\u01ed\u01ee\7C\2\2\u01ee\u01ef\7P\2\2\u01ef\u01f0")
buf.write(u"\7[\2\2\u01f0 \3\2\2\2\u01f1\u01f2\7C\2\2\u01f2\u01f3")
buf.write(u"\7T\2\2\u01f3\u01f4\7T\2\2\u01f4\u01f5\7C\2\2\u01f5\u01f6")
buf.write(u"\7[\2\2\u01f6\"\3\2\2\2\u01f7\u01f8\7C\2\2\u01f8\u01f9")
buf.write(u"\7U\2\2\u01f9$\3\2\2\2\u01fa\u01fb\7C\2\2\u01fb\u01fc")
buf.write(u"\7U\2\2\u01fc\u01fd\7E\2\2\u01fd&\3\2\2\2\u01fe\u01ff")
buf.write(u"\7C\2\2\u01ff\u0200\7V\2\2\u0200(\3\2\2\2\u0201\u0202")
buf.write(u"\7D\2\2\u0202\u0203\7G\2\2\u0203\u0204\7T\2\2\u0204\u0205")
buf.write(u"\7P\2\2\u0205\u0206\7Q\2\2\u0206\u0207\7W\2\2\u0207\u0208")
buf.write(u"\7N\2\2\u0208\u0209\7N\2\2\u0209\u020a\7K\2\2\u020a*")
buf.write(u"\3\2\2\2\u020b\u020c\7D\2\2\u020c\u020d\7G\2\2\u020d")
buf.write(u"\u020e\7V\2\2\u020e\u020f\7Y\2\2\u020f\u0210\7G\2\2\u0210")
buf.write(u"\u0211\7G\2\2\u0211\u0212\7P\2\2\u0212,\3\2\2\2\u0213")
buf.write(u"\u0214\7D\2\2\u0214\u0215\7[\2\2\u0215.\3\2\2\2\u0216")
buf.write(u"\u0217\7E\2\2\u0217\u0218\7C\2\2\u0218\u0219\7N\2\2\u0219")
buf.write(u"\u021a\7N\2\2\u021a\60\3\2\2\2\u021b\u021c\7E\2\2\u021c")
buf.write(u"\u021d\7C\2\2\u021d\u021e\7U\2\2\u021e\u021f\7E\2\2\u021f")
buf.write(u"\u0220\7C\2\2\u0220\u0221\7F\2\2\u0221\u0222\7G\2\2\u0222")
buf.write(u"\62\3\2\2\2\u0223\u0224\7E\2\2\u0224\u0225\7C\2\2\u0225")
buf.write(u"\u0226\7U\2\2\u0226\u0227\7G\2\2\u0227\64\3\2\2\2\u0228")
buf.write(u"\u0229\7E\2\2\u0229\u022a\7C\2\2\u022a\u022b\7U\2\2\u022b")
buf.write(u"\u022c\7V\2\2\u022c\66\3\2\2\2\u022d\u022e\7E\2\2\u022e")
buf.write(u"\u022f\7C\2\2\u022f\u0230\7V\2\2\u0230\u0231\7C\2\2\u0231")
buf.write(u"\u0232\7N\2\2\u0232\u0233\7Q\2\2\u0233\u0234\7I\2\2\u0234")
buf.write(u"\u0235\7U\2\2\u02358\3\2\2\2\u0236\u0237\7E\2\2\u0237")
buf.write(u"\u0238\7Q\2\2\u0238\u0239\7C\2\2\u0239\u023a\7N\2\2\u023a")
buf.write(u"\u023b\7G\2\2\u023b\u023c\7U\2\2\u023c\u023d\7E\2\2\u023d")
buf.write(u"\u023e\7G\2\2\u023e:\3\2\2\2\u023f\u0240\7E\2\2\u0240")
buf.write(u"\u0241\7Q\2\2\u0241\u0242\7N\2\2\u0242\u0243\7W\2\2\u0243")
buf.write(u"\u0244\7O\2\2\u0244\u0245\7P\2\2\u0245<\3\2\2\2\u0246")
buf.write(u"\u0247\7E\2\2\u0247\u0248\7Q\2\2\u0248\u0249\7N\2\2\u0249")
buf.write(u"\u024a\7W\2\2\u024a\u024b\7O\2\2\u024b\u024c\7P\2\2\u024c")
buf.write(u"\u024d\7U\2\2\u024d>\3\2\2\2\u024e\u024f\7E\2\2\u024f")
buf.write(u"\u0250\7Q\2\2\u0250\u0251\7O\2\2\u0251\u0252\7O\2\2\u0252")
buf.write(u"\u0253\7G\2\2\u0253\u0254\7P\2\2\u0254\u0255\7V\2\2\u0255")
buf.write(u"@\3\2\2\2\u0256\u0257\7E\2\2\u0257\u0258\7Q\2\2\u0258")
buf.write(u"\u0259\7O\2\2\u0259\u025a\7O\2\2\u025a\u025b\7K\2\2\u025b")
buf.write(u"\u025c\7V\2\2\u025cB\3\2\2\2\u025d\u025e\7E\2\2\u025e")
buf.write(u"\u025f\7Q\2\2\u025f\u0260\7O\2\2\u0260\u0261\7O\2\2\u0261")
buf.write(u"\u0262\7K\2\2\u0262\u0263\7V\2\2\u0263\u0264\7V\2\2\u0264")
buf.write(u"\u0265\7G\2\2\u0265\u0266\7F\2\2\u0266D\3\2\2\2\u0267")
buf.write(u"\u0268\7E\2\2\u0268\u0269\7Q\2\2\u0269\u026a\7P\2\2\u026a")
buf.write(u"\u026b\7U\2\2\u026b\u026c\7V\2\2\u026c\u026d\7T\2\2\u026d")
buf.write(u"\u026e\7C\2\2\u026e\u026f\7K\2\2\u026f\u0270\7P\2\2\u0270")
buf.write(u"\u0271\7V\2\2\u0271F\3\2\2\2\u0272\u0273\7E\2\2\u0273")
buf.write(u"\u0274\7T\2\2\u0274\u0275\7G\2\2\u0275\u0276\7C\2\2\u0276")
buf.write(u"\u0277\7V\2\2\u0277\u0278\7G\2\2\u0278H\3\2\2\2\u0279")
buf.write(u"\u027a\7E\2\2\u027a\u027b\7T\2\2\u027b\u027c\7Q\2\2\u027c")
buf.write(u"\u027d\7U\2\2\u027d\u027e\7U\2\2\u027eJ\3\2\2\2\u027f")
buf.write(u"\u0280\7E\2\2\u0280\u0281\7W\2\2\u0281\u0282\7D\2\2\u0282")
buf.write(u"\u0283\7G\2\2\u0283L\3\2\2\2\u0284\u0285\7E\2\2\u0285")
buf.write(u"\u0286\7W\2\2\u0286\u0287\7T\2\2\u0287\u0288\7T\2\2\u0288")
buf.write(u"\u0289\7G\2\2\u0289\u028a\7P\2\2\u028a\u028b\7V\2\2\u028b")
buf.write(u"N\3\2\2\2\u028c\u028d\7E\2\2\u028d\u028e\7W\2\2\u028e")
buf.write(u"\u028f\7T\2\2\u028f\u0290\7T\2\2\u0290\u0291\7G\2\2\u0291")
buf.write(u"\u0292\7P\2\2\u0292\u0293\7V\2\2\u0293\u0294\7a\2\2\u0294")
buf.write(u"\u0295\7F\2\2\u0295\u0296\7C\2\2\u0296\u0297\7V\2\2\u0297")
buf.write(u"\u0298\7G\2\2\u0298P\3\2\2\2\u0299\u029a\7E\2\2\u029a")
buf.write(u"\u029b\7W\2\2\u029b\u029c\7T\2\2\u029c\u029d\7T\2\2\u029d")
buf.write(u"\u029e\7G\2\2\u029e\u029f\7P\2\2\u029f\u02a0\7V\2\2\u02a0")
buf.write(u"\u02a1\7a\2\2\u02a1\u02a2\7V\2\2\u02a2\u02a3\7K\2\2\u02a3")
buf.write(u"\u02a4\7O\2\2\u02a4\u02a5\7G\2\2\u02a5R\3\2\2\2\u02a6")
buf.write(u"\u02a7\7E\2\2\u02a7\u02a8\7W\2\2\u02a8\u02a9\7T\2\2\u02a9")
buf.write(u"\u02aa\7T\2\2\u02aa\u02ab\7G\2\2\u02ab\u02ac\7P\2\2\u02ac")
buf.write(u"\u02ad\7V\2\2\u02ad\u02ae\7a\2\2\u02ae\u02af\7V\2\2\u02af")
buf.write(u"\u02b0\7K\2\2\u02b0\u02b1\7O\2\2\u02b1\u02b2\7G\2\2\u02b2")
buf.write(u"\u02b3\7U\2\2\u02b3\u02b4\7V\2\2\u02b4\u02b5\7C\2\2\u02b5")
buf.write(u"\u02b6\7O\2\2\u02b6\u02b7\7R\2\2\u02b7T\3\2\2\2\u02b8")
buf.write(u"\u02b9\7E\2\2\u02b9\u02ba\7W\2\2\u02ba\u02bb\7T\2\2\u02bb")
buf.write(u"\u02bc\7T\2\2\u02bc\u02bd\7G\2\2\u02bd\u02be\7P\2\2\u02be")
buf.write(u"\u02bf\7V\2\2\u02bf\u02c0\7a\2\2\u02c0\u02c1\7W\2\2\u02c1")
buf.write(u"\u02c2\7U\2\2\u02c2\u02c3\7G\2\2\u02c3\u02c4\7T\2\2\u02c4")
buf.write(u"V\3\2\2\2\u02c5\u02c6\7F\2\2\u02c6\u02c7\7C\2\2\u02c7")
buf.write(u"\u02c8\7V\2\2\u02c8\u02c9\7C\2\2\u02c9X\3\2\2\2\u02ca")
buf.write(u"\u02cb\7F\2\2\u02cb\u02cc\7C\2\2\u02cc\u02cd\7V\2\2\u02cd")
buf.write(u"\u02ce\7G\2\2\u02ceZ\3\2\2\2\u02cf\u02d0\7F\2\2\u02d0")
buf.write(u"\u02d1\7C\2\2\u02d1\u02d2\7[\2\2\u02d2\\\3\2\2\2\u02d3")
buf.write(u"\u02d4\7F\2\2\u02d4\u02d5\7G\2\2\u02d5\u02d6\7C\2\2\u02d6")
buf.write(u"\u02d7\7N\2\2\u02d7\u02d8\7N\2\2\u02d8\u02d9\7Q\2\2\u02d9")
buf.write(u"\u02da\7E\2\2\u02da\u02db\7C\2\2\u02db\u02dc\7V\2\2\u02dc")
buf.write(u"\u02dd\7G\2\2\u02dd^\3\2\2\2\u02de\u02df\7F\2\2\u02df")
buf.write(u"\u02e0\7G\2\2\u02e0\u02e1\7N\2\2\u02e1\u02e2\7G\2\2\u02e2")
buf.write(u"\u02e3\7V\2\2\u02e3\u02e4\7G\2\2\u02e4`\3\2\2\2\u02e5")
buf.write(u"\u02e6\7F\2\2\u02e6\u02e7\7G\2\2\u02e7\u02e8\7U\2\2\u02e8")
buf.write(u"\u02e9\7E\2\2\u02e9b\3\2\2\2\u02ea\u02eb\7F\2\2\u02eb")
buf.write(u"\u02ec\7G\2\2\u02ec\u02ed\7U\2\2\u02ed\u02ee\7E\2\2\u02ee")
buf.write(u"\u02ef\7T\2\2\u02ef\u02f0\7K\2\2\u02f0\u02f1\7D\2\2\u02f1")
buf.write(u"\u02f2\7G\2\2\u02f2d\3\2\2\2\u02f3\u02f4\7F\2\2\u02f4")
buf.write(u"\u02f5\7K\2\2\u02f5\u02f6\7U\2\2\u02f6\u02f7\7V\2\2\u02f7")
buf.write(u"\u02f8\7K\2\2\u02f8\u02f9\7P\2\2\u02f9\u02fa\7E\2\2\u02fa")
buf.write(u"\u02fb\7V\2\2\u02fbf\3\2\2\2\u02fc\u02fd\7F\2\2\u02fd")
buf.write(u"\u02fe\7K\2\2\u02fe\u02ff\7U\2\2\u02ff\u0300\7V\2\2\u0300")
buf.write(u"\u0301\7T\2\2\u0301\u0302\7K\2\2\u0302\u0303\7D\2\2\u0303")
buf.write(u"\u0304\7W\2\2\u0304\u0305\7V\2\2\u0305\u0306\7G\2\2\u0306")
buf.write(u"\u0307\7F\2\2\u0307h\3\2\2\2\u0308\u0309\7F\2\2\u0309")
buf.write(u"\u030a\7T\2\2\u030a\u030b\7Q\2\2\u030b\u030c\7R\2\2\u030c")
buf.write(u"j\3\2\2\2\u030d\u030e\7G\2\2\u030e\u030f\7N\2\2\u030f")
buf.write(u"\u0310\7U\2\2\u0310\u0311\7G\2\2\u0311l\3\2\2\2\u0312")
buf.write(u"\u0313\7G\2\2\u0313\u0314\7P\2\2\u0314\u0315\7F\2\2\u0315")
buf.write(u"n\3\2\2\2\u0316\u0317\7G\2\2\u0317\u0318\7U\2\2\u0318")
buf.write(u"\u0319\7E\2\2\u0319\u031a\7C\2\2\u031a\u031b\7R\2\2\u031b")
buf.write(u"\u031c\7G\2\2\u031cp\3\2\2\2\u031d\u031e\7G\2\2\u031e")
buf.write(u"\u031f\7Z\2\2\u031f\u0320\7E\2\2\u0320\u0321\7G\2\2\u0321")
buf.write(u"\u0322\7R\2\2\u0322\u0323\7V\2\2\u0323r\3\2\2\2\u0324")
buf.write(u"\u0325\7G\2\2\u0325\u0326\7Z\2\2\u0326\u0327\7E\2\2\u0327")
buf.write(u"\u0328\7N\2\2\u0328\u0329\7W\2\2\u0329\u032a\7F\2\2\u032a")
buf.write(u"\u032b\7K\2\2\u032b\u032c\7P\2\2\u032c\u032d\7I\2\2\u032d")
buf.write(u"t\3\2\2\2\u032e\u032f\7G\2\2\u032f\u0330\7Z\2\2\u0330")
buf.write(u"\u0331\7G\2\2\u0331\u0332\7E\2\2\u0332\u0333\7W\2\2\u0333")
buf.write(u"\u0334\7V\2\2\u0334\u0335\7G\2\2\u0335v\3\2\2\2\u0336")
buf.write(u"\u0337\7G\2\2\u0337\u0338\7Z\2\2\u0338\u0339\7K\2\2\u0339")
buf.write(u"\u033a\7U\2\2\u033a\u033b\7V\2\2\u033b\u033c\7U\2\2\u033c")
buf.write(u"x\3\2\2\2\u033d\u033e\7G\2\2\u033e\u033f\7Z\2\2\u033f")
buf.write(u"\u0340\7R\2\2\u0340\u0341\7N\2\2\u0341\u0342\7C\2\2\u0342")
buf.write(u"\u0343\7K\2\2\u0343\u0344\7P\2\2\u0344z\3\2\2\2\u0345")
buf.write(u"\u0346\7G\2\2\u0346\u0347\7Z\2\2\u0347\u0348\7V\2\2\u0348")
buf.write(u"\u0349\7T\2\2\u0349\u034a\7C\2\2\u034a\u034b\7E\2\2\u034b")
buf.write(u"\u034c\7V\2\2\u034c|\3\2\2\2\u034d\u034e\7H\2\2\u034e")
buf.write(u"\u034f\7C\2\2\u034f\u0350\7N\2\2\u0350\u0351\7U\2\2\u0351")
buf.write(u"\u0352\7G\2\2\u0352~\3\2\2\2\u0353\u0354\7H\2\2\u0354")
buf.write(u"\u0355\7K\2\2\u0355\u0356\7N\2\2\u0356\u0357\7V\2\2\u0357")
buf.write(u"\u0358\7G\2\2\u0358\u0359\7T\2\2\u0359\u0080\3\2\2\2")
buf.write(u"\u035a\u035b\7H\2\2\u035b\u035c\7K\2\2\u035c\u035d\7")
buf.write(u"T\2\2\u035d\u035e\7U\2\2\u035e\u035f\7V\2\2\u035f\u0082")
buf.write(u"\3\2\2\2\u0360\u0361\7H\2\2\u0361\u0362\7Q\2\2\u0362")
buf.write(u"\u0363\7N\2\2\u0363\u0364\7N\2\2\u0364\u0365\7Q\2\2\u0365")
buf.write(u"\u0366\7Y\2\2\u0366\u0367\7K\2\2\u0367\u0368\7P\2\2\u0368")
buf.write(u"\u0369\7I\2\2\u0369\u0084\3\2\2\2\u036a\u036b\7H\2\2")
buf.write(u"\u036b\u036c\7Q\2\2\u036c\u036d\7T\2\2\u036d\u0086\3")
buf.write(u"\2\2\2\u036e\u036f\7H\2\2\u036f\u0370\7Q\2\2\u0370\u0371")
buf.write(u"\7T\2\2\u0371\u0372\7O\2\2\u0372\u0373\7C\2\2\u0373\u0374")
buf.write(u"\7V\2\2\u0374\u0088\3\2\2\2\u0375\u0376\7H\2\2\u0376")
buf.write(u"\u0377\7T\2\2\u0377\u0378\7Q\2\2\u0378\u0379\7O\2\2\u0379")
buf.write(u"\u008a\3\2\2\2\u037a\u037b\7H\2\2\u037b\u037c\7W\2\2")
buf.write(u"\u037c\u037d\7N\2\2\u037d\u037e\7N\2\2\u037e\u008c\3")
buf.write(u"\2\2\2\u037f\u0380\7H\2\2\u0380\u0381\7W\2\2\u0381\u0382")
buf.write(u"\7P\2\2\u0382\u0383\7E\2\2\u0383\u0384\7V\2\2\u0384\u0385")
buf.write(u"\7K\2\2\u0385\u0386\7Q\2\2\u0386\u0387\7P\2\2\u0387\u0388")
buf.write(u"\7U\2\2\u0388\u008e\3\2\2\2\u0389\u038a\7I\2\2\u038a")
buf.write(u"\u038b\7T\2\2\u038b\u038c\7C\2\2\u038c\u038d\7P\2\2\u038d")
buf.write(u"\u038e\7V\2\2\u038e\u0090\3\2\2\2\u038f\u0390\7I\2\2")
buf.write(u"\u0390\u0391\7T\2\2\u0391\u0392\7C\2\2\u0392\u0393\7")
buf.write(u"P\2\2\u0393\u0394\7V\2\2\u0394\u0395\7U\2\2\u0395\u0092")
buf.write(u"\3\2\2\2\u0396\u0397\7I\2\2\u0397\u0398\7T\2\2\u0398")
buf.write(u"\u0399\7C\2\2\u0399\u039a\7R\2\2\u039a\u039b\7J\2\2\u039b")
buf.write(u"\u039c\7X\2\2\u039c\u039d\7K\2\2\u039d\u039e\7\\\2\2")
buf.write(u"\u039e\u0094\3\2\2\2\u039f\u03a0\7I\2\2\u03a0\u03a1\7")
buf.write(u"T\2\2\u03a1\u03a2\7Q\2\2\u03a2\u03a3\7W\2\2\u03a3\u03a4")
buf.write(u"\7R\2\2\u03a4\u0096\3\2\2\2\u03a5\u03a6\7I\2\2\u03a6")
buf.write(u"\u03a7\7T\2\2\u03a7\u03a8\7Q\2\2\u03a8\u03a9\7W\2\2\u03a9")
buf.write(u"\u03aa\7R\2\2\u03aa\u03ab\7K\2\2\u03ab\u03ac\7P\2\2\u03ac")
buf.write(u"\u03ad\7I\2\2\u03ad\u0098\3\2\2\2\u03ae\u03af\7J\2\2")
buf.write(u"\u03af\u03b0\7C\2\2\u03b0\u03b1\7X\2\2\u03b1\u03b2\7")
buf.write(u"K\2\2\u03b2\u03b3\7P\2\2\u03b3\u03b4\7I\2\2\u03b4\u009a")
buf.write(u"\3\2\2\2\u03b5\u03b6\7J\2\2\u03b6\u03b7\7Q\2\2\u03b7")
buf.write(u"\u03b8\7W\2\2\u03b8\u03b9\7T\2\2\u03b9\u009c\3\2\2\2")
buf.write(u"\u03ba\u03bb\7K\2\2\u03bb\u03bc\7H\2\2\u03bc\u009e\3")
buf.write(u"\2\2\2\u03bd\u03be\7K\2\2\u03be\u03bf\7P\2\2\u03bf\u00a0")
buf.write(u"\3\2\2\2\u03c0\u03c1\7K\2\2\u03c1\u03c2\7P\2\2\u03c2")
buf.write(u"\u03c3\7E\2\2\u03c3\u03c4\7N\2\2\u03c4\u03c5\7W\2\2\u03c5")
buf.write(u"\u03c6\7F\2\2\u03c6\u03c7\7K\2\2\u03c7\u03c8\7P\2\2\u03c8")
buf.write(u"\u03c9\7I\2\2\u03c9\u00a2\3\2\2\2\u03ca\u03cb\7K\2\2")
buf.write(u"\u03cb\u03cc\7P\2\2\u03cc\u03cd\7P\2\2\u03cd\u03ce\7")
buf.write(u"G\2\2\u03ce\u03cf\7T\2\2\u03cf\u00a4\3\2\2\2\u03d0\u03d1")
buf.write(u"\7K\2\2\u03d1\u03d2\7P\2\2\u03d2\u03d3\7R\2\2\u03d3\u03d4")
buf.write(u"\7W\2\2\u03d4\u03d5\7V\2\2\u03d5\u00a6\3\2\2\2\u03d6")
buf.write(u"\u03d7\7K\2\2\u03d7\u03d8\7P\2\2\u03d8\u03d9\7U\2\2\u03d9")
buf.write(u"\u03da\7G\2\2\u03da\u03db\7T\2\2\u03db\u03dc\7V\2\2\u03dc")
buf.write(u"\u00a8\3\2\2\2\u03dd\u03de\7K\2\2\u03de\u03df\7P\2\2")
buf.write(u"\u03df\u03e0\7V\2\2\u03e0\u03e1\7G\2\2\u03e1\u03e2\7")
buf.write(u"I\2\2\u03e2\u03e3\7G\2\2\u03e3\u03e4\7T\2\2\u03e4\u00aa")
buf.write(u"\3\2\2\2\u03e5\u03e6\7K\2\2\u03e6\u03e7\7P\2\2\u03e7")
buf.write(u"\u03e8\7V\2\2\u03e8\u03e9\7G\2\2\u03e9\u03ea\7T\2\2\u03ea")
buf.write(u"\u03eb\7U\2\2\u03eb\u03ec\7G\2\2\u03ec\u03ed\7E\2\2\u03ed")
buf.write(u"\u03ee\7V\2\2\u03ee\u00ac\3\2\2\2\u03ef\u03f0\7K\2\2")
buf.write(u"\u03f0\u03f1\7P\2\2\u03f1\u03f2\7V\2\2\u03f2\u03f3\7")
buf.write(u"G\2\2\u03f3\u03f4\7T\2\2\u03f4\u03f5\7X\2\2\u03f5\u03f6")
buf.write(u"\7C\2\2\u03f6\u03f7\7N\2\2\u03f7\u00ae\3\2\2\2\u03f8")
buf.write(u"\u03f9\7K\2\2\u03f9\u03fa\7P\2\2\u03fa\u03fb\7V\2\2\u03fb")
buf.write(u"\u03fc\7Q\2\2\u03fc\u00b0\3\2\2\2\u03fd\u03fe\7K\2\2")
buf.write(u"\u03fe\u03ff\7U\2\2\u03ff\u00b2\3\2\2\2\u0400\u0401\7")
buf.write(u"K\2\2\u0401\u0402\7U\2\2\u0402\u0403\7Q\2\2\u0403\u0404")
buf.write(u"\7N\2\2\u0404\u0405\7C\2\2\u0405\u0406\7V\2\2\u0406\u0407")
buf.write(u"\7K\2\2\u0407\u0408\7Q\2\2\u0408\u0409\7P\2\2\u0409\u00b4")
buf.write(u"\3\2\2\2\u040a\u040b\7L\2\2\u040b\u040c\7Q\2\2\u040c")
buf.write(u"\u040d\7K\2\2\u040d\u040e\7P\2\2\u040e\u00b6\3\2\2\2")
buf.write(u"\u040f\u0410\7N\2\2\u0410\u0411\7C\2\2\u0411\u0412\7")
buf.write(u"U\2\2\u0412\u0413\7V\2\2\u0413\u00b8\3\2\2\2\u0414\u0415")
buf.write(u"\7N\2\2\u0415\u0416\7C\2\2\u0416\u0417\7V\2\2\u0417\u0418")
buf.write(u"\7G\2\2\u0418\u0419\7T\2\2\u0419\u041a\7C\2\2\u041a\u041b")
buf.write(u"\7N\2\2\u041b\u00ba\3\2\2\2\u041c\u041d\7N\2\2\u041d")
buf.write(u"\u041e\7G\2\2\u041e\u041f\7H\2\2\u041f\u0420\7V\2\2\u0420")
buf.write(u"\u00bc\3\2\2\2\u0421\u0422\7N\2\2\u0422\u0423\7G\2\2")
buf.write(u"\u0423\u0424\7X\2\2\u0424\u0425\7G\2\2\u0425\u0426\7")
buf.write(u"N\2\2\u0426\u00be\3\2\2\2\u0427\u0428\7N\2\2\u0428\u0429")
buf.write(u"\7K\2\2\u0429\u042a\7M\2\2\u042a\u042b\7G\2\2\u042b\u00c0")
buf.write(u"\3\2\2\2\u042c\u042d\7N\2\2\u042d\u042e\7K\2\2\u042e")
buf.write(u"\u042f\7O\2\2\u042f\u0430\7K\2\2\u0430\u0431\7V\2\2\u0431")
buf.write(u"\u00c2\3\2\2\2\u0432\u0433\7N\2\2\u0433\u0434\7Q\2\2")
buf.write(u"\u0434\u0435\7E\2\2\u0435\u0436\7C\2\2\u0436\u0437\7")
buf.write(u"N\2\2\u0437\u0438\7V\2\2\u0438\u0439\7K\2\2\u0439\u043a")
buf.write(u"\7O\2\2\u043a\u043b\7G\2\2\u043b\u00c4\3\2\2\2\u043c")
buf.write(u"\u043d\7N\2\2\u043d\u043e\7Q\2\2\u043e\u043f\7E\2\2\u043f")
buf.write(u"\u0440\7C\2\2\u0440\u0441\7N\2\2\u0441\u0442\7V\2\2\u0442")
buf.write(u"\u0443\7K\2\2\u0443\u0444\7O\2\2\u0444\u0445\7G\2\2\u0445")
buf.write(u"\u0446\7U\2\2\u0446\u0447\7V\2\2\u0447\u0448\7C\2\2\u0448")
buf.write(u"\u0449\7O\2\2\u0449\u044a\7R\2\2\u044a\u00c6\3\2\2\2")
buf.write(u"\u044b\u044c\7N\2\2\u044c\u044d\7Q\2\2\u044d\u044e\7")
buf.write(u"I\2\2\u044e\u044f\7K\2\2\u044f\u0450\7E\2\2\u0450\u0451")
buf.write(u"\7C\2\2\u0451\u0452\7N\2\2\u0452\u00c8\3\2\2\2\u0453")
buf.write(u"\u0454\7O\2\2\u0454\u0455\7C\2\2\u0455\u0456\7R\2\2\u0456")
buf.write(u"\u00ca\3\2\2\2\u0457\u0458\7O\2\2\u0458\u0459\7K\2\2")
buf.write(u"\u0459\u045a\7P\2\2\u045a\u045b\7W\2\2\u045b\u045c\7")
buf.write(u"V\2\2\u045c\u045d\7G\2\2\u045d\u00cc\3\2\2\2\u045e\u045f")
buf.write(u"\7O\2\2\u045f\u0460\7Q\2\2\u0460\u0461\7P\2\2\u0461\u0462")
buf.write(u"\7V\2\2\u0462\u0463\7J\2\2\u0463\u00ce\3\2\2\2\u0464")
buf.write(u"\u0465\7P\2\2\u0465\u0466\7C\2\2\u0466\u0467\7V\2\2\u0467")
buf.write(u"\u0468\7W\2\2\u0468\u0469\7T\2\2\u0469\u046a\7C\2\2\u046a")
buf.write(u"\u046b\7N\2\2\u046b\u00d0\3\2\2\2\u046c\u046d\7P\2\2")
buf.write(u"\u046d\u046e\7H\2\2\u046e\u046f\7E\2\2\u046f\u00d2\3")
buf.write(u"\2\2\2\u0470\u0471\7P\2\2\u0471\u0472\7H\2\2\u0472\u0473")
buf.write(u"\7F\2\2\u0473\u00d4\3\2\2\2\u0474\u0475\7P\2\2\u0475")
buf.write(u"\u0476\7H\2\2\u0476\u0477\7M\2\2\u0477\u0478\7E\2\2\u0478")
buf.write(u"\u00d6\3\2\2\2\u0479\u047a\7P\2\2\u047a\u047b\7H\2\2")
buf.write(u"\u047b\u047c\7M\2\2\u047c\u047d\7F\2\2\u047d\u00d8\3")
buf.write(u"\2\2\2\u047e\u047f\7P\2\2\u047f\u0480\7Q\2\2\u0480\u00da")
buf.write(u"\3\2\2\2\u0481\u0482\7P\2\2\u0482\u0483\7Q\2\2\u0483")
buf.write(u"\u0484\7T\2\2\u0484\u0485\7O\2\2\u0485\u0486\7C\2\2\u0486")
buf.write(u"\u0487\7N\2\2\u0487\u0488\7K\2\2\u0488\u0489\7\\\2\2")
buf.write(u"\u0489\u048a\7G\2\2\u048a\u00dc\3\2\2\2\u048b\u048c\7")
buf.write(u"P\2\2\u048c\u048d\7Q\2\2\u048d\u048e\7V\2\2\u048e\u00de")
buf.write(u"\3\2\2\2\u048f\u0490\7P\2\2\u0490\u0491\7W\2\2\u0491")
buf.write(u"\u0492\7N\2\2\u0492\u0493\7N\2\2\u0493\u00e0\3\2\2\2")
buf.write(u"\u0494\u0495\7P\2\2\u0495\u0496\7W\2\2\u0496\u0497\7")
buf.write(u"N\2\2\u0497\u0498\7N\2\2\u0498\u0499\7K\2\2\u0499\u049a")
buf.write(u"\7H\2\2\u049a\u00e2\3\2\2\2\u049b\u049c\7P\2\2\u049c")
buf.write(u"\u049d\7W\2\2\u049d\u049e\7N\2\2\u049e\u049f\7N\2\2\u049f")
buf.write(u"\u04a0\7U\2\2\u04a0\u00e4\3\2\2\2\u04a1\u04a2\7Q\2\2")
buf.write(u"\u04a2\u04a3\7P\2\2\u04a3\u00e6\3\2\2\2\u04a4\u04a5\7")
buf.write(u"Q\2\2\u04a5\u04a6\7P\2\2\u04a6\u04a7\7N\2\2\u04a7\u04a8")
buf.write(u"\7[\2\2\u04a8\u00e8\3\2\2\2\u04a9\u04aa\7Q\2\2\u04aa")
buf.write(u"\u04ab\7R\2\2\u04ab\u04ac\7V\2\2\u04ac\u04ad\7K\2\2\u04ad")
buf.write(u"\u04ae\7Q\2\2\u04ae\u04af\7P\2\2\u04af\u00ea\3\2\2\2")
buf.write(u"\u04b0\u04b1\7Q\2\2\u04b1\u04b2\7T\2\2\u04b2\u00ec\3")
buf.write(u"\2\2\2\u04b3\u04b4\7Q\2\2\u04b4\u04b5\7T\2\2\u04b5\u04b6")
buf.write(u"\7F\2\2\u04b6\u04b7\7G\2\2\u04b7\u04b8\7T\2\2\u04b8\u00ee")
buf.write(u"\3\2\2\2\u04b9\u04ba\7Q\2\2\u04ba\u04bb\7T\2\2\u04bb")
buf.write(u"\u04bc\7F\2\2\u04bc\u04bd\7K\2\2\u04bd\u04be\7P\2\2\u04be")
buf.write(u"\u04bf\7C\2\2\u04bf\u04c0\7N\2\2\u04c0\u04c1\7K\2\2\u04c1")
buf.write(u"\u04c2\7V\2\2\u04c2\u04c3\7[\2\2\u04c3\u00f0\3\2\2\2")
buf.write(u"\u04c4\u04c5\7Q\2\2\u04c5\u04c6\7W\2\2\u04c6\u04c7\7")
buf.write(u"V\2\2\u04c7\u04c8\7G\2\2\u04c8\u04c9\7T\2\2\u04c9\u00f2")
buf.write(u"\3\2\2\2\u04ca\u04cb\7Q\2\2\u04cb\u04cc\7W\2\2\u04cc")
buf.write(u"\u04cd\7V\2\2\u04cd\u04ce\7R\2\2\u04ce\u04cf\7W\2\2\u04cf")
buf.write(u"\u04d0\7V\2\2\u04d0\u00f4\3\2\2\2\u04d1\u04d2\7Q\2\2")
buf.write(u"\u04d2\u04d3\7X\2\2\u04d3\u04d4\7G\2\2\u04d4\u04d5\7")
buf.write(u"T\2\2\u04d5\u00f6\3\2\2\2\u04d6\u04d7\7R\2\2\u04d7\u04d8")
buf.write(u"\7C\2\2\u04d8\u04d9\7T\2\2\u04d9\u04da\7V\2\2\u04da\u04db")
buf.write(u"\7K\2\2\u04db\u04dc\7V\2\2\u04dc\u04dd\7K\2\2\u04dd\u04de")
buf.write(u"\7Q\2\2\u04de\u04df\7P\2\2\u04df\u00f8\3\2\2\2\u04e0")
buf.write(u"\u04e1\7R\2\2\u04e1\u04e2\7C\2\2\u04e2\u04e3\7T\2\2\u04e3")
buf.write(u"\u04e4\7V\2\2\u04e4\u04e5\7K\2\2\u04e5\u04e6\7V\2\2\u04e6")
buf.write(u"\u04e7\7K\2\2\u04e7\u04e8\7Q\2\2\u04e8\u04e9\7P\2\2\u04e9")
buf.write(u"\u04ea\7U\2\2\u04ea\u00fa\3\2\2\2\u04eb\u04ec\7R\2\2")
buf.write(u"\u04ec\u04ed\7Q\2\2\u04ed\u04ee\7U\2\2\u04ee\u04ef\7")
buf.write(u"K\2\2\u04ef\u04f0\7V\2\2\u04f0\u04f1\7K\2\2\u04f1\u04f2")
buf.write(u"\7Q\2\2\u04f2\u04f3\7P\2\2\u04f3\u00fc\3\2\2\2\u04f4")
buf.write(u"\u04f5\7R\2\2\u04f5\u04f6\7T\2\2\u04f6\u04f7\7G\2\2\u04f7")
buf.write(u"\u04f8\7E\2\2\u04f8\u04f9\7G\2\2\u04f9\u04fa\7F\2\2\u04fa")
buf.write(u"\u04fb\7K\2\2\u04fb\u04fc\7P\2\2\u04fc\u04fd\7I\2\2\u04fd")
buf.write(u"\u00fe\3\2\2\2\u04fe\u04ff\7R\2\2\u04ff\u0500\7T\2\2")
buf.write(u"\u0500\u0501\7G\2\2\u0501\u0502\7R\2\2\u0502\u0503\7")
buf.write(u"C\2\2\u0503\u0504\7T\2\2\u0504\u0505\7G\2\2\u0505\u0100")
buf.write(u"\3\2\2\2\u0506\u0507\7R\2\2\u0507\u0508\7T\2\2\u0508")
buf.write(u"\u0509\7K\2\2\u0509\u050a\7X\2\2\u050a\u050b\7K\2\2\u050b")
buf.write(u"\u050c\7N\2\2\u050c\u050d\7G\2\2\u050d\u050e\7I\2\2\u050e")
buf.write(u"\u050f\7G\2\2\u050f\u0510\7U\2\2\u0510\u0102\3\2\2\2")
buf.write(u"\u0511\u0512\7R\2\2\u0512\u0513\7T\2\2\u0513\u0514\7")
buf.write(u"Q\2\2\u0514\u0515\7R\2\2\u0515\u0516\7G\2\2\u0516\u0517")
buf.write(u"\7T\2\2\u0517\u0518\7V\2\2\u0518\u0519\7K\2\2\u0519\u051a")
buf.write(u"\7G\2\2\u051a\u051b\7U\2\2\u051b\u0104\3\2\2\2\u051c")
buf.write(u"\u051d\7R\2\2\u051d\u051e\7W\2\2\u051e\u051f\7D\2\2\u051f")
buf.write(u"\u0520\7N\2\2\u0520\u0521\7K\2\2\u0521\u0522\7E\2\2\u0522")
buf.write(u"\u0106\3\2\2\2\u0523\u0524\7T\2\2\u0524\u0525\7C\2\2")
buf.write(u"\u0525\u0526\7P\2\2\u0526\u0527\7I\2\2\u0527\u0528\7")
buf.write(u"G\2\2\u0528\u0108\3\2\2\2\u0529\u052a\7T\2\2\u052a\u052b")
buf.write(u"\7G\2\2\u052b\u052c\7C\2\2\u052c\u052d\7F\2\2\u052d\u010a")
buf.write(u"\3\2\2\2\u052e\u052f\7T\2\2\u052f\u0530\7G\2\2\u0530")
buf.write(u"\u0531\7E\2\2\u0531\u0532\7W\2\2\u0532\u0533\7T\2\2\u0533")
buf.write(u"\u0534\7U\2\2\u0534\u0535\7K\2\2\u0535\u0536\7X\2\2\u0536")
buf.write(u"\u0537\7G\2\2\u0537\u010c\3\2\2\2\u0538\u0539\7T\2\2")
buf.write(u"\u0539\u053a\7G\2\2\u053a\u053b\7P\2\2\u053b\u053c\7")
buf.write(u"C\2\2\u053c\u053d\7O\2\2\u053d\u053e\7G\2\2\u053e\u010e")
buf.write(u"\3\2\2\2\u053f\u0540\7T\2\2\u0540\u0541\7G\2\2\u0541")
buf.write(u"\u0542\7R\2\2\u0542\u0543\7G\2\2\u0543\u0544\7C\2\2\u0544")
buf.write(u"\u0545\7V\2\2\u0545\u0546\7C\2\2\u0546\u0547\7D\2\2\u0547")
buf.write(u"\u0548\7N\2\2\u0548\u0549\7G\2\2\u0549\u0110\3\2\2\2")
buf.write(u"\u054a\u054b\7T\2\2\u054b\u054c\7G\2\2\u054c\u054d\7")
buf.write(u"R\2\2\u054d\u054e\7N\2\2\u054e\u054f\7C\2\2\u054f\u0550")
buf.write(u"\7E\2\2\u0550\u0551\7G\2\2\u0551\u0112\3\2\2\2\u0552")
buf.write(u"\u0553\7T\2\2\u0553\u0554\7G\2\2\u0554\u0555\7U\2\2\u0555")
buf.write(u"\u0556\7G\2\2\u0556\u0557\7V\2\2\u0557\u0114\3\2\2\2")
buf.write(u"\u0558\u0559\7T\2\2\u0559\u055a\7G\2\2\u055a\u055b\7")
buf.write(u"U\2\2\u055b\u055c\7V\2\2\u055c\u055d\7T\2\2\u055d\u055e")
buf.write(u"\7K\2\2\u055e\u055f\7E\2\2\u055f\u0560\7V\2\2\u0560\u0116")
buf.write(u"\3\2\2\2\u0561\u0562\7T\2\2\u0562\u0563\7G\2\2\u0563")
buf.write(u"\u0564\7X\2\2\u0564\u0565\7Q\2\2\u0565\u0566\7M\2\2\u0566")
buf.write(u"\u0567\7G\2\2\u0567\u0118\3\2\2\2\u0568\u0569\7T\2\2")
buf.write(u"\u0569\u056a\7K\2\2\u056a\u056b\7I\2\2\u056b\u056c\7")
buf.write(u"J\2\2\u056c\u056d\7V\2\2\u056d\u011a\3\2\2\2\u056e\u056f")
buf.write(u"\7T\2\2\u056f\u0570\7Q\2\2\u0570\u0571\7N\2\2\u0571\u0572")
buf.write(u"\7N\2\2\u0572\u0573\7D\2\2\u0573\u0574\7C\2\2\u0574\u0575")
buf.write(u"\7E\2\2\u0575\u0576\7M\2\2\u0576\u011c\3\2\2\2\u0577")
buf.write(u"\u0578\7T\2\2\u0578\u0579\7Q\2\2\u0579\u057a\7N\2\2\u057a")
buf.write(u"\u057b\7N\2\2\u057b\u057c\7W\2\2\u057c\u057d\7R\2\2\u057d")
buf.write(u"\u011e\3\2\2\2\u057e\u057f\7T\2\2\u057f\u0580\7Q\2\2")
buf.write(u"\u0580\u0581\7Y\2\2\u0581\u0120\3\2\2\2\u0582\u0583\7")
buf.write(u"T\2\2\u0583\u0584\7Q\2\2\u0584\u0585\7Y\2\2\u0585\u0586")
buf.write(u"\7U\2\2\u0586\u0122\3\2\2\2\u0587\u0588\7U\2\2\u0588")
buf.write(u"\u0589\7E\2\2\u0589\u058a\7J\2\2\u058a\u058b\7G\2\2\u058b")
buf.write(u"\u058c\7O\2\2\u058c\u058d\7C\2\2\u058d\u0124\3\2\2\2")
buf.write(u"\u058e\u058f\7U\2\2\u058f\u0590\7E\2\2\u0590\u0591\7")
buf.write(u"J\2\2\u0591\u0592\7G\2\2\u0592\u0593\7O\2\2\u0593\u0594")
buf.write(u"\7C\2\2\u0594\u0595\7U\2\2\u0595\u0126\3\2\2\2\u0596")
buf.write(u"\u0597\7U\2\2\u0597\u0598\7G\2\2\u0598\u0599\7E\2\2\u0599")
buf.write(u"\u059a\7Q\2\2\u059a\u059b\7P\2\2\u059b\u059c\7F\2\2\u059c")
buf.write(u"\u0128\3\2\2\2\u059d\u059e\7U\2\2\u059e\u059f\7G\2\2")
buf.write(u"\u059f\u05a0\7N\2\2\u05a0\u05a1\7G\2\2\u05a1\u05a2\7")
buf.write(u"E\2\2\u05a2\u05a3\7V\2\2\u05a3\u012a\3\2\2\2\u05a4\u05a5")
buf.write(u"\7U\2\2\u05a5\u05a6\7G\2\2\u05a6\u05a7\7T\2\2\u05a7\u05a8")
buf.write(u"\7K\2\2\u05a8\u05a9\7C\2\2\u05a9\u05aa\7N\2\2\u05aa\u05ab")
buf.write(u"\7K\2\2\u05ab\u05ac\7\\\2\2\u05ac\u05ad\7C\2\2\u05ad")
buf.write(u"\u05ae\7D\2\2\u05ae\u05af\7N\2\2\u05af\u05b0\7G\2\2\u05b0")
buf.write(u"\u012c\3\2\2\2\u05b1\u05b2\7U\2\2\u05b2\u05b3\7G\2\2")
buf.write(u"\u05b3\u05b4\7U\2\2\u05b4\u05b5\7U\2\2\u05b5\u05b6\7")
buf.write(u"K\2\2\u05b6\u05b7\7Q\2\2\u05b7\u05b8\7P\2\2\u05b8\u012e")
buf.write(u"\3\2\2\2\u05b9\u05ba\7U\2\2\u05ba\u05bb\7G\2\2\u05bb")
buf.write(u"\u05bc\7V\2\2\u05bc\u0130\3\2\2\2\u05bd\u05be\7U\2\2")
buf.write(u"\u05be\u05bf\7G\2\2\u05bf\u05c0\7V\2\2\u05c0\u05c1\7")
buf.write(u"U\2\2\u05c1\u0132\3\2\2\2\u05c2\u05c3\7U\2\2\u05c3\u05c4")
buf.write(u"\7J\2\2\u05c4\u05c5\7Q\2\2\u05c5\u05c6\7Y\2\2\u05c6\u0134")
buf.write(u"\3\2\2\2\u05c7\u05c8\7U\2\2\u05c8\u05c9\7O\2\2\u05c9")
buf.write(u"\u05ca\7C\2\2\u05ca\u05cb\7N\2\2\u05cb\u05cc\7N\2\2\u05cc")
buf.write(u"\u05cd\7K\2\2\u05cd\u05ce\7P\2\2\u05ce\u05cf\7V\2\2\u05cf")
buf.write(u"\u0136\3\2\2\2\u05d0\u05d1\7U\2\2\u05d1\u05d2\7Q\2\2")
buf.write(u"\u05d2\u05d3\7O\2\2\u05d3\u05d4\7G\2\2\u05d4\u0138\3")
buf.write(u"\2\2\2\u05d5\u05d6\7U\2\2\u05d6\u05d7\7V\2\2\u05d7\u05d8")
buf.write(u"\7C\2\2\u05d8\u05d9\7T\2\2\u05d9\u05da\7V\2\2\u05da\u013a")
buf.write(u"\3\2\2\2\u05db\u05dc\7U\2\2\u05dc\u05dd\7V\2\2\u05dd")
buf.write(u"\u05de\7C\2\2\u05de\u05df\7V\2\2\u05df\u05e0\7U\2\2\u05e0")
buf.write(u"\u013c\3\2\2\2\u05e1\u05e2\7U\2\2\u05e2\u05e3\7W\2\2")
buf.write(u"\u05e3\u05e4\7D\2\2\u05e4\u05e5\7U\2\2\u05e5\u05e6\7")
buf.write(u"V\2\2\u05e6\u05e7\7T\2\2\u05e7\u05e8\7K\2\2\u05e8\u05e9")
buf.write(u"\7P\2\2\u05e9\u05ea\7I\2\2\u05ea\u013e\3\2\2\2\u05eb")
buf.write(u"\u05ec\7U\2\2\u05ec\u05ed\7[\2\2\u05ed\u05ee\7U\2\2\u05ee")
buf.write(u"\u05ef\7V\2\2\u05ef\u05f0\7G\2\2\u05f0\u05f1\7O\2\2\u05f1")
buf.write(u"\u0140\3\2\2\2\u05f2\u05f3\7V\2\2\u05f3\u05f4\7C\2\2")
buf.write(u"\u05f4\u05f5\7D\2\2\u05f5\u05f6\7N\2\2\u05f6\u05f7\7")
buf.write(u"G\2\2\u05f7\u0142\3\2\2\2\u05f8\u05f9\7V\2\2\u05f9\u05fa")
buf.write(u"\7C\2\2\u05fa\u05fb\7D\2\2\u05fb\u05fc\7N\2\2\u05fc\u05fd")
buf.write(u"\7G\2\2\u05fd\u05fe\7U\2\2\u05fe\u0144\3\2\2\2\u05ff")
buf.write(u"\u0600\7V\2\2\u0600\u0601\7C\2\2\u0601\u0602\7D\2\2\u0602")
buf.write(u"\u0603\7N\2\2\u0603\u0604\7G\2\2\u0604\u0605\7U\2\2\u0605")
buf.write(u"\u0606\7C\2\2\u0606\u0607\7O\2\2\u0607\u0608\7R\2\2\u0608")
buf.write(u"\u0609\7N\2\2\u0609\u060a\7G\2\2\u060a\u0146\3\2\2\2")
buf.write(u"\u060b\u060c\7V\2\2\u060c\u060d\7G\2\2\u060d\u060e\7")
buf.write(u"Z\2\2\u060e\u060f\7V\2\2\u060f\u0148\3\2\2\2\u0610\u0611")
buf.write(u"\7V\2\2\u0611\u0612\7J\2\2\u0612\u0613\7G\2\2\u0613\u0614")
buf.write(u"\7P\2\2\u0614\u014a\3\2\2\2\u0615\u0616\7V\2\2\u0616")
buf.write(u"\u0617\7K\2\2\u0617\u0618\7O\2\2\u0618\u0619\7G\2\2\u0619")
buf.write(u"\u014c\3\2\2\2\u061a\u061b\7V\2\2\u061b\u061c\7K\2\2")
buf.write(u"\u061c\u061d\7O\2\2\u061d\u061e\7G\2\2\u061e\u061f\7")
buf.write(u"U\2\2\u061f\u0620\7V\2\2\u0620\u0621\7C\2\2\u0621\u0622")
buf.write(u"\7O\2\2\u0622\u0623\7R\2\2\u0623\u014e\3\2\2\2\u0624")
buf.write(u"\u0625\7V\2\2\u0625\u0626\7K\2\2\u0626\u0627\7P\2\2\u0627")
buf.write(u"\u0628\7[\2\2\u0628\u0629\7K\2\2\u0629\u062a\7P\2\2\u062a")
buf.write(u"\u062b\7V\2\2\u062b\u0150\3\2\2\2\u062c\u062d\7V\2\2")
buf.write(u"\u062d\u062e\7Q\2\2\u062e\u0152\3\2\2\2\u062f\u0630\7")
buf.write(u"V\2\2\u0630\u0631\7T\2\2\u0631\u0632\7C\2\2\u0632\u0633")
buf.write(u"\7P\2\2\u0633\u0634\7U\2\2\u0634\u0635\7C\2\2\u0635\u0636")
buf.write(u"\7E\2\2\u0636\u0637\7V\2\2\u0637\u0638\7K\2\2\u0638\u0639")
buf.write(u"\7Q\2\2\u0639\u063a\7P\2\2\u063a\u0154\3\2\2\2\u063b")
buf.write(u"\u063c\7V\2\2\u063c\u063d\7T\2\2\u063d\u063e\7W\2\2\u063e")
buf.write(u"\u063f\7G\2\2\u063f\u0156\3\2\2\2\u0640\u0641\7V\2\2")
buf.write(u"\u0641\u0642\7T\2\2\u0642\u0643\7[\2\2\u0643\u0644\7")
buf.write(u"a\2\2\u0644\u0645\7E\2\2\u0645\u0646\7C\2\2\u0646\u0647")
buf.write(u"\7U\2\2\u0647\u0648\7V\2\2\u0648\u0158\3\2\2\2\u0649")
buf.write(u"\u064a\7V\2\2\u064a\u064b\7[\2\2\u064b\u064c\7R\2\2\u064c")
buf.write(u"\u064d\7G\2\2\u064d\u015a\3\2\2\2\u064e\u064f\7W\2\2")
buf.write(u"\u064f\u0650\7G\2\2\u0650\u0651\7U\2\2\u0651\u0652\7")
buf.write(u"E\2\2\u0652\u0653\7C\2\2\u0653\u0654\7R\2\2\u0654\u0655")
buf.write(u"\7G\2\2\u0655\u015c\3\2\2\2\u0656\u0657\7W\2\2\u0657")
buf.write(u"\u0658\7P\2\2\u0658\u0659\7D\2\2\u0659\u065a\7Q\2\2\u065a")
buf.write(u"\u065b\7W\2\2\u065b\u065c\7P\2\2\u065c\u065d\7F\2\2\u065d")
buf.write(u"\u065e\7G\2\2\u065e\u065f\7F\2\2\u065f\u015e\3\2\2\2")
buf.write(u"\u0660\u0661\7W\2\2\u0661\u0662\7P\2\2\u0662\u0663\7")
buf.write(u"E\2\2\u0663\u0664\7Q\2\2\u0664\u0665\7O\2\2\u0665\u0666")
buf.write(u"\7O\2\2\u0666\u0667\7K\2\2\u0667\u0668\7V\2\2\u0668\u0669")
buf.write(u"\7V\2\2\u0669\u066a\7G\2\2\u066a\u066b\7F\2\2\u066b\u0160")
buf.write(u"\3\2\2\2\u066c\u066d\7W\2\2\u066d\u066e\7P\2\2\u066e")
buf.write(u"\u066f\7K\2\2\u066f\u0670\7Q\2\2\u0670\u0671\7P\2\2\u0671")
buf.write(u"\u0162\3\2\2\2\u0672\u0673\7W\2\2\u0673\u0674\7P\2\2")
buf.write(u"\u0674\u0675\7P\2\2\u0675\u0676\7G\2\2\u0676\u0677\7")
buf.write(u"U\2\2\u0677\u0678\7V\2\2\u0678\u0164\3\2\2\2\u0679\u067a")
buf.write(u"\7W\2\2\u067a\u067b\7U\2\2\u067b\u067c\7G\2\2\u067c\u0166")
buf.write(u"\3\2\2\2\u067d\u067e\7W\2\2\u067e\u067f\7U\2\2\u067f")
buf.write(u"\u0680\7K\2\2\u0680\u0681\7P\2\2\u0681\u0682\7I\2\2\u0682")
buf.write(u"\u0168\3\2\2\2\u0683\u0684\7X\2\2\u0684\u0685\7C\2\2")
buf.write(u"\u0685\u0686\7N\2\2\u0686\u0687\7K\2\2\u0687\u0688\7")
buf.write(u"F\2\2\u0688\u0689\7C\2\2\u0689\u068a\7V\2\2\u068a\u068b")
buf.write(u"\7G\2\2\u068b\u016a\3\2\2\2\u068c\u068d\7X\2\2\u068d")
buf.write(u"\u068e\7C\2\2\u068e\u068f\7N\2\2\u068f\u0690\7W\2\2\u0690")
buf.write(u"\u0691\7G\2\2\u0691\u0692\7U\2\2\u0692\u016c\3\2\2\2")
buf.write(u"\u0693\u0694\7X\2\2\u0694\u0695\7G\2\2\u0695\u0696\7")
buf.write(u"T\2\2\u0696\u0697\7D\2\2\u0697\u0698\7Q\2\2\u0698\u0699")
buf.write(u"\7U\2\2\u0699\u069a\7G\2\2\u069a\u016e\3\2\2\2\u069b")
buf.write(u"\u069c\7X\2\2\u069c\u069d\7K\2\2\u069d\u069e\7G\2\2\u069e")
buf.write(u"\u069f\7Y\2\2\u069f\u0170\3\2\2\2\u06a0\u06a1\7Y\2\2")
buf.write(u"\u06a1\u06a2\7J\2\2\u06a2\u06a3\7G\2\2\u06a3\u06a4\7")
buf.write(u"P\2\2\u06a4\u0172\3\2\2\2\u06a5\u06a6\7Y\2\2\u06a6\u06a7")
buf.write(u"\7J\2\2\u06a7\u06a8\7G\2\2\u06a8\u06a9\7T\2\2\u06a9\u06aa")
buf.write(u"\7G\2\2\u06aa\u0174\3\2\2\2\u06ab\u06ac\7Y\2\2\u06ac")
buf.write(u"\u06ad\7K\2\2\u06ad\u06ae\7V\2\2\u06ae\u06af\7J\2\2\u06af")
buf.write(u"\u0176\3\2\2\2\u06b0\u06b1\7Y\2\2\u06b1\u06b2\7Q\2\2")
buf.write(u"\u06b2\u06b3\7T\2\2\u06b3\u06b4\7M\2\2\u06b4\u0178\3")
buf.write(u"\2\2\2\u06b5\u06b6\7Y\2\2\u06b6\u06b7\7T\2\2\u06b7\u06b8")
buf.write(u"\7K\2\2\u06b8\u06b9\7V\2\2\u06b9\u06ba\7G\2\2\u06ba\u017a")
buf.write(u"\3\2\2\2\u06bb\u06bc\7[\2\2\u06bc\u06bd\7G\2\2\u06bd")
buf.write(u"\u06be\7C\2\2\u06be\u06bf\7T\2\2\u06bf\u017c\3\2\2\2")
buf.write(u"\u06c0\u06c1\7\\\2\2\u06c1\u06c2\7Q\2\2\u06c2\u06c3\7")
buf.write(u"P\2\2\u06c3\u06c4\7G\2\2\u06c4\u017e\3\2\2\2\u06c5\u06c6")
buf.write(u"\7?\2\2\u06c6\u0180\3\2\2\2\u06c7\u06c8\7>\2\2\u06c8")
buf.write(u"\u06cc\7@\2\2\u06c9\u06ca\7#\2\2\u06ca\u06cc\7?\2\2\u06cb")
buf.write(u"\u06c7\3\2\2\2\u06cb\u06c9\3\2\2\2\u06cc\u0182\3\2\2")
buf.write(u"\2\u06cd\u06ce\7>\2\2\u06ce\u0184\3\2\2\2\u06cf\u06d0")
buf.write(u"\7>\2\2\u06d0\u06d1\7?\2\2\u06d1\u0186\3\2\2\2\u06d2")
buf.write(u"\u06d3\7@\2\2\u06d3\u0188\3\2\2\2\u06d4\u06d5\7@\2\2")
buf.write(u"\u06d5\u06d6\7?\2\2\u06d6\u018a\3\2\2\2\u06d7\u06d8\7")
buf.write(u"-\2\2\u06d8\u018c\3\2\2\2\u06d9\u06da\7/\2\2\u06da\u018e")
buf.write(u"\3\2\2\2\u06db\u06dc\7,\2\2\u06dc\u0190\3\2\2\2\u06dd")
buf.write(u"\u06de\7\61\2\2\u06de\u0192\3\2\2\2\u06df\u06e0\7\'\2")
buf.write(u"\2\u06e0\u0194\3\2\2\2\u06e1\u06e2\7~\2\2\u06e2\u06e3")
buf.write(u"\7~\2\2\u06e3\u0196\3\2\2\2\u06e4\u06ea\7)\2\2\u06e5")
buf.write(u"\u06e9\n\2\2\2\u06e6\u06e7\7)\2\2\u06e7\u06e9\7)\2\2")
buf.write(u"\u06e8\u06e5\3\2\2\2\u06e8\u06e6\3\2\2\2\u06e9\u06ec")
buf.write(u"\3\2\2\2\u06ea\u06e8\3\2\2\2\u06ea\u06eb\3\2\2\2\u06eb")
buf.write(u"\u06ed\3\2\2\2\u06ec\u06ea\3\2\2\2\u06ed\u06ee\7)\2\2")
buf.write(u"\u06ee\u0198\3\2\2\2\u06ef\u06f0\7W\2\2\u06f0\u06f1\7")
buf.write(u"(\2\2\u06f1\u06f2\7)\2\2\u06f2\u06f8\3\2\2\2\u06f3\u06f7")
buf.write(u"\n\2\2\2\u06f4\u06f5\7)\2\2\u06f5\u06f7\7)\2\2\u06f6")
buf.write(u"\u06f3\3\2\2\2\u06f6\u06f4\3\2\2\2\u06f7\u06fa\3\2\2")
buf.write(u"\2\u06f8\u06f6\3\2\2\2\u06f8\u06f9\3\2\2\2\u06f9\u06fb")
buf.write(u"\3\2\2\2\u06fa\u06f8\3\2\2\2\u06fb\u06fc\7)\2\2\u06fc")
buf.write(u"\u019a\3\2\2\2\u06fd\u06fe\7Z\2\2\u06fe\u06ff\7)\2\2")
buf.write(u"\u06ff\u0703\3\2\2\2\u0700\u0702\n\2\2\2\u0701\u0700")
buf.write(u"\3\2\2\2\u0702\u0705\3\2\2\2\u0703\u0701\3\2\2\2\u0703")
buf.write(u"\u0704\3\2\2\2\u0704\u0706\3\2\2\2\u0705\u0703\3\2\2")
buf.write(u"\2\u0706\u0707\7)\2\2\u0707\u019c\3\2\2\2\u0708\u070a")
buf.write(u"\5\u01b3\u00da\2\u0709\u0708\3\2\2\2\u070a\u070b\3\2")
buf.write(u"\2\2\u070b\u0709\3\2\2\2\u070b\u070c\3\2\2\2\u070c\u019e")
buf.write(u"\3\2\2\2\u070d\u070f\5\u01b3\u00da\2\u070e\u070d\3\2")
buf.write(u"\2\2\u070f\u0710\3\2\2\2\u0710\u070e\3\2\2\2\u0710\u0711")
buf.write(u"\3\2\2\2\u0711\u0712\3\2\2\2\u0712\u0716\7\60\2\2\u0713")
buf.write(u"\u0715\5\u01b3\u00da\2\u0714\u0713\3\2\2\2\u0715\u0718")
buf.write(u"\3\2\2\2\u0716\u0714\3\2\2\2\u0716\u0717\3\2\2\2\u0717")
buf.write(u"\u0720\3\2\2\2\u0718\u0716\3\2\2\2\u0719\u071b\7\60\2")
buf.write(u"\2\u071a\u071c\5\u01b3\u00da\2\u071b\u071a\3\2\2\2\u071c")
buf.write(u"\u071d\3\2\2\2\u071d\u071b\3\2\2\2\u071d\u071e\3\2\2")
buf.write(u"\2\u071e\u0720\3\2\2\2\u071f\u070e\3\2\2\2\u071f\u0719")
buf.write(u"\3\2\2\2\u0720\u01a0\3\2\2\2\u0721\u0723\5\u01b3\u00da")
buf.write(u"\2\u0722\u0721\3\2\2\2\u0723\u0724\3\2\2\2\u0724\u0722")
buf.write(u"\3\2\2\2\u0724\u0725\3\2\2\2\u0725\u072d\3\2\2\2\u0726")
buf.write(u"\u072a\7\60\2\2\u0727\u0729\5\u01b3\u00da\2\u0728\u0727")
buf.write(u"\3\2\2\2\u0729\u072c\3\2\2\2\u072a\u0728\3\2\2\2\u072a")
buf.write(u"\u072b\3\2\2\2\u072b\u072e\3\2\2\2\u072c\u072a\3\2\2")
buf.write(u"\2\u072d\u0726\3\2\2\2\u072d\u072e\3\2\2\2\u072e\u072f")
buf.write(u"\3\2\2\2\u072f\u0730\5\u01b1\u00d9\2\u0730\u073a\3\2")
buf.write(u"\2\2\u0731\u0733\7\60\2\2\u0732\u0734\5\u01b3\u00da\2")
buf.write(u"\u0733\u0732\3\2\2\2\u0734\u0735\3\2\2\2\u0735\u0733")
buf.write(u"\3\2\2\2\u0735\u0736\3\2\2\2\u0736\u0737\3\2\2\2\u0737")
buf.write(u"\u0738\5\u01b1\u00d9\2\u0738\u073a\3\2\2\2\u0739\u0722")
buf.write(u"\3\2\2\2\u0739\u0731\3\2\2\2\u073a\u01a2\3\2\2\2\u073b")
buf.write(u"\u073e\5\u01b5\u00db\2\u073c\u073e\7a\2\2\u073d\u073b")
buf.write(u"\3\2\2\2\u073d\u073c\3\2\2\2\u073e\u0744\3\2\2\2\u073f")
buf.write(u"\u0743\5\u01b5\u00db\2\u0740\u0743\5\u01b3\u00da\2\u0741")
buf.write(u"\u0743\t\3\2\2\u0742\u073f\3\2\2\2\u0742\u0740\3\2\2")
buf.write(u"\2\u0742\u0741\3\2\2\2\u0743\u0746\3\2\2\2\u0744\u0742")
buf.write(u"\3\2\2\2\u0744\u0745\3\2\2\2\u0745\u01a4\3\2\2\2\u0746")
buf.write(u"\u0744\3\2\2\2\u0747\u074b\5\u01b3\u00da\2\u0748\u074c")
buf.write(u"\5\u01b5\u00db\2\u0749\u074c\5\u01b3\u00da\2\u074a\u074c")
buf.write(u"\t\3\2\2\u074b\u0748\3\2\2\2\u074b\u0749\3\2\2\2\u074b")
buf.write(u"\u074a\3\2\2\2\u074c\u074d\3\2\2\2\u074d\u074b\3\2\2")
buf.write(u"\2\u074d\u074e\3\2\2\2\u074e\u01a6\3\2\2\2\u074f\u0755")
buf.write(u"\7$\2\2\u0750\u0754\n\4\2\2\u0751\u0752\7$\2\2\u0752")
buf.write(u"\u0754\7$\2\2\u0753\u0750\3\2\2\2\u0753\u0751\3\2\2\2")
buf.write(u"\u0754\u0757\3\2\2\2\u0755\u0753\3\2\2\2\u0755\u0756")
buf.write(u"\3\2\2\2\u0756\u0758\3\2\2\2\u0757\u0755\3\2\2\2\u0758")
buf.write(u"\u0759\7$\2\2\u0759\u01a8\3\2\2\2\u075a\u0760\7b\2\2")
buf.write(u"\u075b\u075f\n\5\2\2\u075c\u075d\7b\2\2\u075d\u075f\7")
buf.write(u"b\2\2\u075e\u075b\3\2\2\2\u075e\u075c\3\2\2\2\u075f\u0762")
buf.write(u"\3\2\2\2\u0760\u075e\3\2\2\2\u0760\u0761\3\2\2\2\u0761")
buf.write(u"\u0763\3\2\2\2\u0762\u0760\3\2\2\2\u0763\u0764\7b\2\2")
buf.write(u"\u0764\u01aa\3\2\2\2\u0765\u0766\7V\2\2\u0766\u0767\7")
buf.write(u"K\2\2\u0767\u0768\7O\2\2\u0768\u0769\7G\2\2\u0769\u076a")
buf.write(u"\3\2\2\2\u076a\u076b\5\u01bb\u00de\2\u076b\u076c\7Y\2")
buf.write(u"\2\u076c\u076d\7K\2\2\u076d\u076e\7V\2\2\u076e\u076f")
buf.write(u"\7J\2\2\u076f\u0770\3\2\2\2\u0770\u0771\5\u01bb\u00de")
buf.write(u"\2\u0771\u0772\7V\2\2\u0772\u0773\7K\2\2\u0773\u0774")
buf.write(u"\7O\2\2\u0774\u0775\7G\2\2\u0775\u0776\3\2\2\2\u0776")
buf.write(u"\u0777\5\u01bb\u00de\2\u0777\u0778\7\\\2\2\u0778\u0779")
buf.write(u"\7Q\2\2\u0779\u077a\7P\2\2\u077a\u077b\7G\2\2\u077b\u01ac")
buf.write(u"\3\2\2\2\u077c\u077d\7V\2\2\u077d\u077e\7K\2\2\u077e")
buf.write(u"\u077f\7O\2\2\u077f\u0780\7G\2\2\u0780\u0781\7U\2\2\u0781")
buf.write(u"\u0782\7V\2\2\u0782\u0783\7C\2\2\u0783\u0784\7O\2\2\u0784")
buf.write(u"\u0785\7R\2\2\u0785\u0786\3\2\2\2\u0786\u0787\5\u01bb")
buf.write(u"\u00de\2\u0787\u0788\7Y\2\2\u0788\u0789\7K\2\2\u0789")
buf.write(u"\u078a\7V\2\2\u078a\u078b\7J\2\2\u078b\u078c\3\2\2\2")
buf.write(u"\u078c\u078d\5\u01bb\u00de\2\u078d\u078e\7V\2\2\u078e")
buf.write(u"\u078f\7K\2\2\u078f\u0790\7O\2\2\u0790\u0791\7G\2\2\u0791")
buf.write(u"\u0792\3\2\2\2\u0792\u0793\5\u01bb\u00de\2\u0793\u0794")
buf.write(u"\7\\\2\2\u0794\u0795\7Q\2\2\u0795\u0796\7P\2\2\u0796")
buf.write(u"\u0797\7G\2\2\u0797\u01ae\3\2\2\2\u0798\u0799\7F\2\2")
buf.write(u"\u0799\u079a\7Q\2\2\u079a\u079b\7W\2\2\u079b\u079c\7")
buf.write(u"D\2\2\u079c\u079d\7N\2\2\u079d\u079e\7G\2\2\u079e\u079f")
buf.write(u"\3\2\2\2\u079f\u07a0\5\u01bb\u00de\2\u07a0\u07a1\7R\2")
buf.write(u"\2\u07a1\u07a2\7T\2\2\u07a2\u07a3\7G\2\2\u07a3\u07a4")
buf.write(u"\7E\2\2\u07a4\u07a5\7K\2\2\u07a5\u07a6\7U\2\2\u07a6\u07a7")
buf.write(u"\7K\2\2\u07a7\u07a8\7Q\2\2\u07a8\u07a9\7P\2\2\u07a9\u01b0")
buf.write(u"\3\2\2\2\u07aa\u07ac\7G\2\2\u07ab\u07ad\t\6\2\2\u07ac")
buf.write(u"\u07ab\3\2\2\2\u07ac\u07ad\3\2\2\2\u07ad\u07af\3\2\2")
buf.write(u"\2\u07ae\u07b0\5\u01b3\u00da\2\u07af\u07ae\3\2\2\2\u07b0")
buf.write(u"\u07b1\3\2\2\2\u07b1\u07af\3\2\2\2\u07b1\u07b2\3\2\2")
buf.write(u"\2\u07b2\u01b2\3\2\2\2\u07b3\u07b4\t\7\2\2\u07b4\u01b4")
buf.write(u"\3\2\2\2\u07b5\u07b6\t\b\2\2\u07b6\u01b6\3\2\2\2\u07b7")
buf.write(u"\u07b8\7/\2\2\u07b8\u07b9\7/\2\2\u07b9\u07bd\3\2\2\2")
buf.write(u"\u07ba\u07bc\n\t\2\2\u07bb\u07ba\3\2\2\2\u07bc\u07bf")
buf.write(u"\3\2\2\2\u07bd\u07bb\3\2\2\2\u07bd\u07be\3\2\2\2\u07be")
buf.write(u"\u07c1\3\2\2\2\u07bf\u07bd\3\2\2\2\u07c0\u07c2\7\17\2")
buf.write(u"\2\u07c1\u07c0\3\2\2\2\u07c1\u07c2\3\2\2\2\u07c2\u07c4")
buf.write(u"\3\2\2\2\u07c3\u07c5\7\f\2\2\u07c4\u07c3\3\2\2\2\u07c4")
buf.write(u"\u07c5\3\2\2\2\u07c5\u07c6\3\2\2\2\u07c6\u07c7\b\u00dc")
buf.write(u"\2\2\u07c7\u01b8\3\2\2\2\u07c8\u07c9\7\61\2\2\u07c9\u07ca")
buf.write(u"\7,\2\2\u07ca\u07ce\3\2\2\2\u07cb\u07cd\13\2\2\2\u07cc")
buf.write(u"\u07cb\3\2\2\2\u07cd\u07d0\3\2\2\2\u07ce\u07cf\3\2\2")
buf.write(u"\2\u07ce\u07cc\3\2\2\2\u07cf\u07d1\3\2\2\2\u07d0\u07ce")
buf.write(u"\3\2\2\2\u07d1\u07d2\7,\2\2\u07d2\u07d3\7\61\2\2\u07d3")
buf.write(u"\u07d4\3\2\2\2\u07d4\u07d5\b\u00dd\2\2\u07d5\u01ba\3")
buf.write(u"\2\2\2\u07d6\u07d8\t\n\2\2\u07d7\u07d6\3\2\2\2\u07d8")
buf.write(u"\u07d9\3\2\2\2\u07d9\u07d7\3\2\2\2\u07d9\u07da\3\2\2")
buf.write(u"\2\u07da\u07db\3\2\2\2\u07db\u07dc\b\u00de\2\2\u07dc")
buf.write(u"\u01bc\3\2\2\2\u07dd\u07de\13\2\2\2\u07de\u01be\3\2\2")
buf.write(u"\2#\2\u06cb\u06e8\u06ea\u06f6\u06f8\u0703\u070b\u0710")
buf.write(u"\u0716\u071d\u071f\u0724\u072a\u072d\u0735\u0739\u073d")
buf.write(u"\u0742\u0744\u074b\u074d\u0753\u0755\u075e\u0760\u07ac")
buf.write(u"\u07b1\u07bd\u07c1\u07c4\u07ce\u07d9\3\2\3\2")
return buf.getvalue()
class SqlBaseLexer(Lexer):
atn = ATNDeserializer().deserialize(serializedATN())
decisionsToDFA = [ DFA(ds, i) for i, ds in enumerate(atn.decisionToState) ]
T__0 = 1
T__1 = 2
T__2 = 3
T__3 = 4
T__4 = 5
T__5 = 6
T__6 = 7
T__7 = 8
T__8 = 9
ADD = 10
ALL = 11
ALTER = 12
ANALYZE = 13
AND = 14
ANY = 15
ARRAY = 16
AS = 17
ASC = 18
AT = 19
BERNOULLI = 20
BETWEEN = 21
BY = 22
CALL = 23
CASCADE = 24
CASE = 25
CAST = 26
CATALOGS = 27
COALESCE = 28
COLUMN = 29
COLUMNS = 30
COMMENT = 31
COMMIT = 32
COMMITTED = 33
CONSTRAINT = 34
CREATE = 35
CROSS = 36
CUBE = 37
CURRENT = 38
CURRENT_DATE = 39
CURRENT_TIME = 40
CURRENT_TIMESTAMP = 41
CURRENT_USER = 42
DATA = 43
DATE = 44
DAY = 45
DEALLOCATE = 46
DELETE = 47
DESC = 48
DESCRIBE = 49
DISTINCT = 50
DISTRIBUTED = 51
DROP = 52
ELSE = 53
END = 54
ESCAPE = 55
EXCEPT = 56
EXCLUDING = 57
EXECUTE = 58
EXISTS = 59
EXPLAIN = 60
EXTRACT = 61
FALSE = 62
FILTER = 63
FIRST = 64
FOLLOWING = 65
FOR = 66
FORMAT = 67
FROM = 68
FULL = 69
FUNCTIONS = 70
GRANT = 71
GRANTS = 72
GRAPHVIZ = 73
GROUP = 74
GROUPING = 75
HAVING = 76
HOUR = 77
IF = 78
IN = 79
INCLUDING = 80
INNER = 81
INPUT = 82
INSERT = 83
INTEGER = 84
INTERSECT = 85
INTERVAL = 86
INTO = 87
IS = 88
ISOLATION = 89
JOIN = 90
LAST = 91
LATERAL = 92
LEFT = 93
LEVEL = 94
LIKE = 95
LIMIT = 96
LOCALTIME = 97
LOCALTIMESTAMP = 98
LOGICAL = 99
MAP = 100
MINUTE = 101
MONTH = 102
NATURAL = 103
NFC = 104
NFD = 105
NFKC = 106
NFKD = 107
NO = 108
NORMALIZE = 109
NOT = 110
NULL = 111
NULLIF = 112
NULLS = 113
ON = 114
ONLY = 115
OPTION = 116
OR = 117
ORDER = 118
ORDINALITY = 119
OUTER = 120
OUTPUT = 121
OVER = 122
PARTITION = 123
PARTITIONS = 124
POSITION = 125
PRECEDING = 126
PREPARE = 127
PRIVILEGES = 128
PROPERTIES = 129
PUBLIC = 130
RANGE = 131
READ = 132
RECURSIVE = 133
RENAME = 134
REPEATABLE = 135
REPLACE = 136
RESET = 137
RESTRICT = 138
REVOKE = 139
RIGHT = 140
ROLLBACK = 141
ROLLUP = 142
ROW = 143
ROWS = 144
SCHEMA = 145
SCHEMAS = 146
SECOND = 147
SELECT = 148
SERIALIZABLE = 149
SESSION = 150
SET = 151
SETS = 152
SHOW = 153
SMALLINT = 154
SOME = 155
START = 156
STATS = 157
SUBSTRING = 158
SYSTEM = 159
TABLE = 160
TABLES = 161
TABLESAMPLE = 162
TEXT = 163
THEN = 164
TIME = 165
TIMESTAMP = 166
TINYINT = 167
TO = 168
TRANSACTION = 169
TRUE = 170
TRY_CAST = 171
TYPE = 172
UESCAPE = 173
UNBOUNDED = 174
UNCOMMITTED = 175
UNION = 176
UNNEST = 177
USE = 178
USING = 179
VALIDATE = 180
VALUES = 181
VERBOSE = 182
VIEW = 183
WHEN = 184
WHERE = 185
WITH = 186
WORK = 187
WRITE = 188
YEAR = 189
ZONE = 190
EQ = 191
NEQ = 192
LT = 193
LTE = 194
GT = 195
GTE = 196
PLUS = 197
MINUS = 198
ASTERISK = 199
SLASH = 200
PERCENT = 201
CONCAT = 202
STRING = 203
UNICODE_STRING = 204
BINARY_LITERAL = 205
INTEGER_VALUE = 206
DECIMAL_VALUE = 207
DOUBLE_VALUE = 208
IDENTIFIER = 209
DIGIT_IDENTIFIER = 210
QUOTED_IDENTIFIER = 211
BACKQUOTED_IDENTIFIER = 212
TIME_WITH_TIME_ZONE = 213
TIMESTAMP_WITH_TIME_ZONE = 214
DOUBLE_PRECISION = 215
SIMPLE_COMMENT = 216
BRACKETED_COMMENT = 217
WS = 218
UNRECOGNIZED = 219
channelNames = [ u"DEFAULT_TOKEN_CHANNEL", u"HIDDEN" ]
modeNames = [ u"DEFAULT_MODE" ]
literalNames = [ u"<INVALID>",
u"'.'", u"'('", u"')'", u"','", u"'?'", u"'->'", u"'['", u"']'",
u"'=>'", u"'ADD'", u"'ALL'", u"'ALTER'", u"'ANALYZE'", u"'AND'",
u"'ANY'", u"'ARRAY'", u"'AS'", u"'ASC'", u"'AT'", u"'BERNOULLI'",
u"'BETWEEN'", u"'BY'", u"'CALL'", u"'CASCADE'", u"'CASE'", u"'CAST'",
u"'CATALOGS'", u"'COALESCE'", u"'COLUMN'", u"'COLUMNS'", u"'COMMENT'",
u"'COMMIT'", u"'COMMITTED'", u"'CONSTRAINT'", u"'CREATE'", u"'CROSS'",
u"'CUBE'", u"'CURRENT'", u"'CURRENT_DATE'", u"'CURRENT_TIME'",
u"'CURRENT_TIMESTAMP'", u"'CURRENT_USER'", u"'DATA'", u"'DATE'",
u"'DAY'", u"'DEALLOCATE'", u"'DELETE'", u"'DESC'", u"'DESCRIBE'",
u"'DISTINCT'", u"'DISTRIBUTED'", u"'DROP'", u"'ELSE'", u"'END'",
u"'ESCAPE'", u"'EXCEPT'", u"'EXCLUDING'", u"'EXECUTE'", u"'EXISTS'",
u"'EXPLAIN'", u"'EXTRACT'", u"'FALSE'", u"'FILTER'", u"'FIRST'",
u"'FOLLOWING'", u"'FOR'", u"'FORMAT'", u"'FROM'", u"'FULL'",
u"'FUNCTIONS'", u"'GRANT'", u"'GRANTS'", u"'GRAPHVIZ'", u"'GROUP'",
u"'GROUPING'", u"'HAVING'", u"'HOUR'", u"'IF'", u"'IN'", u"'INCLUDING'",
u"'INNER'", u"'INPUT'", u"'INSERT'", u"'INTEGER'", u"'INTERSECT'",
u"'INTERVAL'", u"'INTO'", u"'IS'", u"'ISOLATION'", u"'JOIN'",
u"'LAST'", u"'LATERAL'", u"'LEFT'", u"'LEVEL'", u"'LIKE'", u"'LIMIT'",
u"'LOCALTIME'", u"'LOCALTIMESTAMP'", u"'LOGICAL'", u"'MAP'",
u"'MINUTE'", u"'MONTH'", u"'NATURAL'", u"'NFC'", u"'NFD'", u"'NFKC'",
u"'NFKD'", u"'NO'", u"'NORMALIZE'", u"'NOT'", u"'NULL'", u"'NULLIF'",
u"'NULLS'", u"'ON'", u"'ONLY'", u"'OPTION'", u"'OR'", u"'ORDER'",
u"'ORDINALITY'", u"'OUTER'", u"'OUTPUT'", u"'OVER'", u"'PARTITION'",
u"'PARTITIONS'", u"'POSITION'", u"'PRECEDING'", u"'PREPARE'",
u"'PRIVILEGES'", u"'PROPERTIES'", u"'PUBLIC'", u"'RANGE'", u"'READ'",
u"'RECURSIVE'", u"'RENAME'", u"'REPEATABLE'", u"'REPLACE'",
u"'RESET'", u"'RESTRICT'", u"'REVOKE'", u"'RIGHT'", u"'ROLLBACK'",
u"'ROLLUP'", u"'ROW'", u"'ROWS'", u"'SCHEMA'", u"'SCHEMAS'",
u"'SECOND'", u"'SELECT'", u"'SERIALIZABLE'", u"'SESSION'", u"'SET'",
u"'SETS'", u"'SHOW'", u"'SMALLINT'", u"'SOME'", u"'START'",
u"'STATS'", u"'SUBSTRING'", u"'SYSTEM'", u"'TABLE'", u"'TABLES'",
u"'TABLESAMPLE'", u"'TEXT'", u"'THEN'", u"'TIME'", u"'TIMESTAMP'",
u"'TINYINT'", u"'TO'", u"'TRANSACTION'", u"'TRUE'", u"'TRY_CAST'",
u"'TYPE'", u"'UESCAPE'", u"'UNBOUNDED'", u"'UNCOMMITTED'", u"'UNION'",
u"'UNNEST'", u"'USE'", u"'USING'", u"'VALIDATE'", u"'VALUES'",
u"'VERBOSE'", u"'VIEW'", u"'WHEN'", u"'WHERE'", u"'WITH'", u"'WORK'",
u"'WRITE'", u"'YEAR'", u"'ZONE'", u"'='", u"'<'", u"'<='", u"'>'",
u"'>='", u"'+'", u"'-'", u"'*'", u"'/'", u"'%'", u"'||'" ]
symbolicNames = [ u"<INVALID>",
u"ADD", u"ALL", u"ALTER", u"ANALYZE", u"AND", u"ANY", u"ARRAY",
u"AS", u"ASC", u"AT", u"BERNOULLI", u"BETWEEN", u"BY", u"CALL",
u"CASCADE", u"CASE", u"CAST", u"CATALOGS", u"COALESCE", u"COLUMN",
u"COLUMNS", u"COMMENT", u"COMMIT", u"COMMITTED", u"CONSTRAINT",
u"CREATE", u"CROSS", u"CUBE", u"CURRENT", u"CURRENT_DATE", u"CURRENT_TIME",
u"CURRENT_TIMESTAMP", u"CURRENT_USER", u"DATA", u"DATE", u"DAY",
u"DEALLOCATE", u"DELETE", u"DESC", u"DESCRIBE", u"DISTINCT",
u"DISTRIBUTED", u"DROP", u"ELSE", u"END", u"ESCAPE", u"EXCEPT",
u"EXCLUDING", u"EXECUTE", u"EXISTS", u"EXPLAIN", u"EXTRACT",
u"FALSE", u"FILTER", u"FIRST", u"FOLLOWING", u"FOR", u"FORMAT",
u"FROM", u"FULL", u"FUNCTIONS", u"GRANT", u"GRANTS", u"GRAPHVIZ",
u"GROUP", u"GROUPING", u"HAVING", u"HOUR", u"IF", u"IN", u"INCLUDING",
u"INNER", u"INPUT", u"INSERT", u"INTEGER", u"INTERSECT", u"INTERVAL",
u"INTO", u"IS", u"ISOLATION", u"JOIN", u"LAST", u"LATERAL",
u"LEFT", u"LEVEL", u"LIKE", u"LIMIT", u"LOCALTIME", u"LOCALTIMESTAMP",
u"LOGICAL", u"MAP", u"MINUTE", u"MONTH", u"NATURAL", u"NFC",
u"NFD", u"NFKC", u"NFKD", u"NO", u"NORMALIZE", u"NOT", u"NULL",
u"NULLIF", u"NULLS", u"ON", u"ONLY", u"OPTION", u"OR", u"ORDER",
u"ORDINALITY", u"OUTER", u"OUTPUT", u"OVER", u"PARTITION", u"PARTITIONS",
u"POSITION", u"PRECEDING", u"PREPARE", u"PRIVILEGES", u"PROPERTIES",
u"PUBLIC", u"RANGE", u"READ", u"RECURSIVE", u"RENAME", u"REPEATABLE",
u"REPLACE", u"RESET", u"RESTRICT", u"REVOKE", u"RIGHT", u"ROLLBACK",
u"ROLLUP", u"ROW", u"ROWS", u"SCHEMA", u"SCHEMAS", u"SECOND",
u"SELECT", u"SERIALIZABLE", u"SESSION", u"SET", u"SETS", u"SHOW",
u"SMALLINT", u"SOME", u"START", u"STATS", u"SUBSTRING", u"SYSTEM",
u"TABLE", u"TABLES", u"TABLESAMPLE", u"TEXT", u"THEN", u"TIME",
u"TIMESTAMP", u"TINYINT", u"TO", u"TRANSACTION", u"TRUE", u"TRY_CAST",
u"TYPE", u"UESCAPE", u"UNBOUNDED", u"UNCOMMITTED", u"UNION",
u"UNNEST", u"USE", u"USING", u"VALIDATE", u"VALUES", u"VERBOSE",
u"VIEW", u"WHEN", u"WHERE", u"WITH", u"WORK", u"WRITE", u"YEAR",
u"ZONE", u"EQ", u"NEQ", u"LT", u"LTE", u"GT", u"GTE", u"PLUS",
u"MINUS", u"ASTERISK", u"SLASH", u"PERCENT", u"CONCAT", u"STRING",
u"UNICODE_STRING", u"BINARY_LITERAL", u"INTEGER_VALUE", u"DECIMAL_VALUE",
u"DOUBLE_VALUE", u"IDENTIFIER", u"DIGIT_IDENTIFIER", u"QUOTED_IDENTIFIER",
u"BACKQUOTED_IDENTIFIER", u"TIME_WITH_TIME_ZONE", u"TIMESTAMP_WITH_TIME_ZONE",
u"DOUBLE_PRECISION", u"SIMPLE_COMMENT", u"BRACKETED_COMMENT",
u"WS", u"UNRECOGNIZED" ]
ruleNames = [ u"T__0", u"T__1", u"T__2", u"T__3", u"T__4", u"T__5",
u"T__6", u"T__7", u"T__8", u"ADD", u"ALL", u"ALTER", u"ANALYZE",
u"AND", u"ANY", u"ARRAY", u"AS", u"ASC", u"AT", u"BERNOULLI",
u"BETWEEN", u"BY", u"CALL", u"CASCADE", u"CASE", u"CAST",
u"CATALOGS", u"COALESCE", u"COLUMN", u"COLUMNS", u"COMMENT",
u"COMMIT", u"COMMITTED", u"CONSTRAINT", u"CREATE", u"CROSS",
u"CUBE", u"CURRENT", u"CURRENT_DATE", u"CURRENT_TIME",
u"CURRENT_TIMESTAMP", u"CURRENT_USER", u"DATA", u"DATE",
u"DAY", u"DEALLOCATE", u"DELETE", u"DESC", u"DESCRIBE",
u"DISTINCT", u"DISTRIBUTED", u"DROP", u"ELSE", u"END",
u"ESCAPE", u"EXCEPT", u"EXCLUDING", u"EXECUTE", u"EXISTS",
u"EXPLAIN", u"EXTRACT", u"FALSE", u"FILTER", u"FIRST",
u"FOLLOWING", u"FOR", u"FORMAT", u"FROM", u"FULL", u"FUNCTIONS",
u"GRANT", u"GRANTS", u"GRAPHVIZ", u"GROUP", u"GROUPING",
u"HAVING", u"HOUR", u"IF", u"IN", u"INCLUDING", u"INNER",
u"INPUT", u"INSERT", u"INTEGER", u"INTERSECT", u"INTERVAL",
u"INTO", u"IS", u"ISOLATION", u"JOIN", u"LAST", u"LATERAL",
u"LEFT", u"LEVEL", u"LIKE", u"LIMIT", u"LOCALTIME", u"LOCALTIMESTAMP",
u"LOGICAL", u"MAP", u"MINUTE", u"MONTH", u"NATURAL", u"NFC",
u"NFD", u"NFKC", u"NFKD", u"NO", u"NORMALIZE", u"NOT",
u"NULL", u"NULLIF", u"NULLS", u"ON", u"ONLY", u"OPTION",
u"OR", u"ORDER", u"ORDINALITY", u"OUTER", u"OUTPUT", u"OVER",
u"PARTITION", u"PARTITIONS", u"POSITION", u"PRECEDING",
u"PREPARE", u"PRIVILEGES", u"PROPERTIES", u"PUBLIC", u"RANGE",
u"READ", u"RECURSIVE", u"RENAME", u"REPEATABLE", u"REPLACE",
u"RESET", u"RESTRICT", u"REVOKE", u"RIGHT", u"ROLLBACK",
u"ROLLUP", u"ROW", u"ROWS", u"SCHEMA", u"SCHEMAS", u"SECOND",
u"SELECT", u"SERIALIZABLE", u"SESSION", u"SET", u"SETS",
u"SHOW", u"SMALLINT", u"SOME", u"START", u"STATS", u"SUBSTRING",
u"SYSTEM", u"TABLE", u"TABLES", u"TABLESAMPLE", u"TEXT",
u"THEN", u"TIME", u"TIMESTAMP", u"TINYINT", u"TO", u"TRANSACTION",
u"TRUE", u"TRY_CAST", u"TYPE", u"UESCAPE", u"UNBOUNDED",
u"UNCOMMITTED", u"UNION", u"UNNEST", u"USE", u"USING",
u"VALIDATE", u"VALUES", u"VERBOSE", u"VIEW", u"WHEN",
u"WHERE", u"WITH", u"WORK", u"WRITE", u"YEAR", u"ZONE",
u"EQ", u"NEQ", u"LT", u"LTE", u"GT", u"GTE", u"PLUS",
u"MINUS", u"ASTERISK", u"SLASH", u"PERCENT", u"CONCAT",
u"STRING", u"UNICODE_STRING", u"BINARY_LITERAL", u"INTEGER_VALUE",
u"DECIMAL_VALUE", u"DOUBLE_VALUE", u"IDENTIFIER", u"DIGIT_IDENTIFIER",
u"QUOTED_IDENTIFIER", u"BACKQUOTED_IDENTIFIER", u"TIME_WITH_TIME_ZONE",
u"TIMESTAMP_WITH_TIME_ZONE", u"DOUBLE_PRECISION", u"EXPONENT",
u"DIGIT", u"LETTER", u"SIMPLE_COMMENT", u"BRACKETED_COMMENT",
u"WS", u"UNRECOGNIZED" ]
grammarFileName = u"SqlBase.g4"
def __init__(self, input=None, output=sys.stdout):
super(SqlBaseLexer, self).__init__(input, output=output)
self.checkVersion("4.7.1")
self._interp = LexerATNSimulator(self, self.atn, self.decisionsToDFA, PredictionContextCache())
self._actions = None
self._predicates = None
T__0=1
T__1=2
T__2=3
T__3=4
T__4=5
T__5=6
T__6=7
T__7=8
T__8=9
ADD=10
ALL=11
ALTER=12
ANALYZE=13
AND=14
ANY=15
ARRAY=16
AS=17
ASC=18
AT=19
BERNOULLI=20
BETWEEN=21
BY=22
CALL=23
CASCADE=24
CASE=25
CAST=26
CATALOGS=27
COALESCE=28
COLUMN=29
COLUMNS=30
COMMENT=31
COMMIT=32
COMMITTED=33
CONSTRAINT=34
CREATE=35
CROSS=36
CUBE=37
CURRENT=38
CURRENT_DATE=39
CURRENT_TIME=40
CURRENT_TIMESTAMP=41
CURRENT_USER=42
DATA=43
DATE=44
DAY=45
DEALLOCATE=46
DELETE=47
DESC=48
DESCRIBE=49
DISTINCT=50
DISTRIBUTED=51
DROP=52
ELSE=53
END=54
ESCAPE=55
EXCEPT=56
EXCLUDING=57
EXECUTE=58
EXISTS=59
EXPLAIN=60
EXTRACT=61
FALSE=62
FILTER=63
FIRST=64
FOLLOWING=65
FOR=66
FORMAT=67
FROM=68
FULL=69
FUNCTIONS=70
GRANT=71
GRANTS=72
GRAPHVIZ=73
GROUP=74
GROUPING=75
HAVING=76
HOUR=77
IF=78
IN=79
INCLUDING=80
INNER=81
INPUT=82
INSERT=83
INTEGER=84
INTERSECT=85
INTERVAL=86
INTO=87
IS=88
ISOLATION=89
JOIN=90
LAST=91
LATERAL=92
LEFT=93
LEVEL=94
LIKE=95
LIMIT=96
LOCALTIME=97
LOCALTIMESTAMP=98
LOGICAL=99
MAP=100
MINUTE=101
MONTH=102
NATURAL=103
NFC=104
NFD=105
NFKC=106
NFKD=107
NO=108
NORMALIZE=109
NOT=110
NULL=111
NULLIF=112
NULLS=113
ON=114
ONLY=115
OPTION=116
OR=117
ORDER=118
ORDINALITY=119
OUTER=120
OUTPUT=121
OVER=122
PARTITION=123
PARTITIONS=124
POSITION=125
PRECEDING=126
PREPARE=127
PRIVILEGES=128
PROPERTIES=129
PUBLIC=130
RANGE=131
READ=132
RECURSIVE=133
RENAME=134
REPEATABLE=135
REPLACE=136
RESET=137
RESTRICT=138
REVOKE=139
RIGHT=140
ROLLBACK=141
ROLLUP=142
ROW=143
ROWS=144
SCHEMA=145
SCHEMAS=146
SECOND=147
SELECT=148
SERIALIZABLE=149
SESSION=150
SET=151
SETS=152
SHOW=153
SMALLINT=154
SOME=155
START=156
STATS=157
SUBSTRING=158
SYSTEM=159
TABLE=160
TABLES=161
TABLESAMPLE=162
TEXT=163
THEN=164
TIME=165
TIMESTAMP=166
TINYINT=167
TO=168
TRANSACTION=169
TRUE=170
TRY_CAST=171
TYPE=172
UESCAPE=173
UNBOUNDED=174
UNCOMMITTED=175
UNION=176
UNNEST=177
USE=178
USING=179
VALIDATE=180
VALUES=181
VERBOSE=182
VIEW=183
WHEN=184
WHERE=185
WITH=186
WORK=187
WRITE=188
YEAR=189
ZONE=190
EQ=191
NEQ=192
LT=193
LTE=194
GT=195
GTE=196
PLUS=197
MINUS=198
ASTERISK=199
SLASH=200
PERCENT=201
CONCAT=202
STRING=203
UNICODE_STRING=204
BINARY_LITERAL=205
INTEGER_VALUE=206
DECIMAL_VALUE=207
DOUBLE_VALUE=208
IDENTIFIER=209
DIGIT_IDENTIFIER=210
QUOTED_IDENTIFIER=211
BACKQUOTED_IDENTIFIER=212
TIME_WITH_TIME_ZONE=213
TIMESTAMP_WITH_TIME_ZONE=214
DOUBLE_PRECISION=215
SIMPLE_COMMENT=216
BRACKETED_COMMENT=217
WS=218
UNRECOGNIZED=219
'.'=1
'('=2
')'=3
','=4
'?'=5
'->'=6
'['=7
']'=8
'=>'=9
'ADD'=10
'ALL'=11
'ALTER'=12
'ANALYZE'=13
'AND'=14
'ANY'=15
'ARRAY'=16
'AS'=17
'ASC'=18
'AT'=19
'BERNOULLI'=20
'BETWEEN'=21
'BY'=22
'CALL'=23
'CASCADE'=24
'CASE'=25
'CAST'=26
'CATALOGS'=27
'COALESCE'=28
'COLUMN'=29
'COLUMNS'=30
'COMMENT'=31
'COMMIT'=32
'COMMITTED'=33
'CONSTRAINT'=34
'CREATE'=35
'CROSS'=36
'CUBE'=37
'CURRENT'=38
'CURRENT_DATE'=39
'CURRENT_TIME'=40
'CURRENT_TIMESTAMP'=41
'CURRENT_USER'=42
'DATA'=43
'DATE'=44
'DAY'=45
'DEALLOCATE'=46
'DELETE'=47
'DESC'=48
'DESCRIBE'=49
'DISTINCT'=50
'DISTRIBUTED'=51
'DROP'=52
'ELSE'=53
'END'=54
'ESCAPE'=55
'EXCEPT'=56
'EXCLUDING'=57
'EXECUTE'=58
'EXISTS'=59
'EXPLAIN'=60
'EXTRACT'=61
'FALSE'=62
'FILTER'=63
'FIRST'=64
'FOLLOWING'=65
'FOR'=66
'FORMAT'=67
'FROM'=68
'FULL'=69
'FUNCTIONS'=70
'GRANT'=71
'GRANTS'=72
'GRAPHVIZ'=73
'GROUP'=74
'GROUPING'=75
'HAVING'=76
'HOUR'=77
'IF'=78
'IN'=79
'INCLUDING'=80
'INNER'=81
'INPUT'=82
'INSERT'=83
'INTEGER'=84
'INTERSECT'=85
'INTERVAL'=86
'INTO'=87
'IS'=88
'ISOLATION'=89
'JOIN'=90
'LAST'=91
'LATERAL'=92
'LEFT'=93
'LEVEL'=94
'LIKE'=95
'LIMIT'=96
'LOCALTIME'=97
'LOCALTIMESTAMP'=98
'LOGICAL'=99
'MAP'=100
'MINUTE'=101
'MONTH'=102
'NATURAL'=103
'NFC'=104
'NFD'=105
'NFKC'=106
'NFKD'=107
'NO'=108
'NORMALIZE'=109
'NOT'=110
'NULL'=111
'NULLIF'=112
'NULLS'=113
'ON'=114
'ONLY'=115
'OPTION'=116
'OR'=117
'ORDER'=118
'ORDINALITY'=119
'OUTER'=120
'OUTPUT'=121
'OVER'=122
'PARTITION'=123
'PARTITIONS'=124
'POSITION'=125
'PRECEDING'=126
'PREPARE'=127
'PRIVILEGES'=128
'PROPERTIES'=129
'PUBLIC'=130
'RANGE'=131
'READ'=132
'RECURSIVE'=133
'RENAME'=134
'REPEATABLE'=135
'REPLACE'=136
'RESET'=137
'RESTRICT'=138
'REVOKE'=139
'RIGHT'=140
'ROLLBACK'=141
'ROLLUP'=142
'ROW'=143
'ROWS'=144
'SCHEMA'=145
'SCHEMAS'=146
'SECOND'=147
'SELECT'=148
'SERIALIZABLE'=149
'SESSION'=150
'SET'=151
'SETS'=152
'SHOW'=153
'SMALLINT'=154
'SOME'=155
'START'=156
'STATS'=157
'SUBSTRING'=158
'SYSTEM'=159
'TABLE'=160
'TABLES'=161
'TABLESAMPLE'=162
'TEXT'=163
'THEN'=164
'TIME'=165
'TIMESTAMP'=166
'TINYINT'=167
'TO'=168
'TRANSACTION'=169
'TRUE'=170
'TRY_CAST'=171
'TYPE'=172
'UESCAPE'=173
'UNBOUNDED'=174
'UNCOMMITTED'=175
'UNION'=176
'UNNEST'=177
'USE'=178
'USING'=179
'VALIDATE'=180
'VALUES'=181
'VERBOSE'=182
'VIEW'=183
'WHEN'=184
'WHERE'=185
'WITH'=186
'WORK'=187
'WRITE'=188
'YEAR'=189
'ZONE'=190
'='=191
'<'=193
'<='=194
'>'=195
'>='=196
'+'=197
'-'=198
'*'=199
'/'=200
'%'=201
'||'=202
# Generated from SqlBase.g4 by ANTLR 4.7.1
from antlr4 import *
# This class defines a complete listener for a parse tree produced by SqlBaseParser.
class SqlBaseListener(ParseTreeListener):
# Enter a parse tree produced by SqlBaseParser#singleStatement.
def enterSingleStatement(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#singleStatement.
def exitSingleStatement(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#singleExpression.
def enterSingleExpression(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#singleExpression.
def exitSingleExpression(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#statementDefault.
def enterStatementDefault(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#statementDefault.
def exitStatementDefault(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#use.
def enterUse(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#use.
def exitUse(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#createSchema.
def enterCreateSchema(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#createSchema.
def exitCreateSchema(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#dropSchema.
def enterDropSchema(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#dropSchema.
def exitDropSchema(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#renameSchema.
def enterRenameSchema(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#renameSchema.
def exitRenameSchema(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#createTableAsSelect.
def enterCreateTableAsSelect(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#createTableAsSelect.
def exitCreateTableAsSelect(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#createTable.
def enterCreateTable(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#createTable.
def exitCreateTable(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#dropTable.
def enterDropTable(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#dropTable.
def exitDropTable(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#insertInto.
def enterInsertInto(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#insertInto.
def exitInsertInto(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#delete.
def enterDelete(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#delete.
def exitDelete(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#renameTable.
def enterRenameTable(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#renameTable.
def exitRenameTable(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#renameColumn.
def enterRenameColumn(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#renameColumn.
def exitRenameColumn(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#dropColumn.
def enterDropColumn(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#dropColumn.
def exitDropColumn(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#addColumn.
def enterAddColumn(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#addColumn.
def exitAddColumn(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#createView.
def enterCreateView(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#createView.
def exitCreateView(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#dropView.
def enterDropView(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#dropView.
def exitDropView(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#call.
def enterCall(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#call.
def exitCall(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#grant.
def enterGrant(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#grant.
def exitGrant(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#revoke.
def enterRevoke(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#revoke.
def exitRevoke(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#showGrants.
def enterShowGrants(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#showGrants.
def exitShowGrants(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#explain.
def enterExplain(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#explain.
def exitExplain(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#showCreateTable.
def enterShowCreateTable(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#showCreateTable.
def exitShowCreateTable(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#showCreateView.
def enterShowCreateView(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#showCreateView.
def exitShowCreateView(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#showTables.
def enterShowTables(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#showTables.
def exitShowTables(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#showSchemas.
def enterShowSchemas(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#showSchemas.
def exitShowSchemas(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#showCatalogs.
def enterShowCatalogs(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#showCatalogs.
def exitShowCatalogs(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#showColumns.
def enterShowColumns(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#showColumns.
def exitShowColumns(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#showStats.
def enterShowStats(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#showStats.
def exitShowStats(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#showStatsForQuery.
def enterShowStatsForQuery(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#showStatsForQuery.
def exitShowStatsForQuery(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#showFunctions.
def enterShowFunctions(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#showFunctions.
def exitShowFunctions(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#showSession.
def enterShowSession(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#showSession.
def exitShowSession(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#setSession.
def enterSetSession(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#setSession.
def exitSetSession(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#resetSession.
def enterResetSession(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#resetSession.
def exitResetSession(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#startTransaction.
def enterStartTransaction(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#startTransaction.
def exitStartTransaction(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#commit.
def enterCommit(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#commit.
def exitCommit(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#rollback.
def enterRollback(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#rollback.
def exitRollback(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#showPartitions.
def enterShowPartitions(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#showPartitions.
def exitShowPartitions(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#prepare.
def enterPrepare(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#prepare.
def exitPrepare(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#deallocate.
def enterDeallocate(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#deallocate.
def exitDeallocate(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#execute.
def enterExecute(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#execute.
def exitExecute(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#describeInput.
def enterDescribeInput(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#describeInput.
def exitDescribeInput(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#describeOutput.
def enterDescribeOutput(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#describeOutput.
def exitDescribeOutput(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#query.
def enterQuery(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#query.
def exitQuery(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#with.
def enterWith(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#with.
def exitWith(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#tableElement.
def enterTableElement(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#tableElement.
def exitTableElement(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#columnDefinition.
def enterColumnDefinition(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#columnDefinition.
def exitColumnDefinition(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#likeClause.
def enterLikeClause(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#likeClause.
def exitLikeClause(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#properties.
def enterProperties(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#properties.
def exitProperties(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#property.
def enterProperty(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#property.
def exitProperty(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#queryNoWith.
def enterQueryNoWith(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#queryNoWith.
def exitQueryNoWith(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#queryTermDefault.
def enterQueryTermDefault(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#queryTermDefault.
def exitQueryTermDefault(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#setOperation.
def enterSetOperation(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#setOperation.
def exitSetOperation(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#queryPrimaryDefault.
def enterQueryPrimaryDefault(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#queryPrimaryDefault.
def exitQueryPrimaryDefault(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#table.
def enterTable(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#table.
def exitTable(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#inlineTable.
def enterInlineTable(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#inlineTable.
def exitInlineTable(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#subquery.
def enterSubquery(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#subquery.
def exitSubquery(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#sortItem.
def enterSortItem(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#sortItem.
def exitSortItem(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#querySpecification.
def enterQuerySpecification(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#querySpecification.
def exitQuerySpecification(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#groupBy.
def enterGroupBy(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#groupBy.
def exitGroupBy(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#singleGroupingSet.
def enterSingleGroupingSet(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#singleGroupingSet.
def exitSingleGroupingSet(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#rollup.
def enterRollup(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#rollup.
def exitRollup(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#cube.
def enterCube(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#cube.
def exitCube(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#multipleGroupingSets.
def enterMultipleGroupingSets(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#multipleGroupingSets.
def exitMultipleGroupingSets(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#groupingExpressions.
def enterGroupingExpressions(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#groupingExpressions.
def exitGroupingExpressions(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#groupingSet.
def enterGroupingSet(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#groupingSet.
def exitGroupingSet(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#namedQuery.
def enterNamedQuery(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#namedQuery.
def exitNamedQuery(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#setQuantifier.
def enterSetQuantifier(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#setQuantifier.
def exitSetQuantifier(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#selectSingle.
def enterSelectSingle(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#selectSingle.
def exitSelectSingle(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#selectAll.
def enterSelectAll(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#selectAll.
def exitSelectAll(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#relationDefault.
def enterRelationDefault(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#relationDefault.
def exitRelationDefault(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#joinRelation.
def enterJoinRelation(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#joinRelation.
def exitJoinRelation(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#joinType.
def enterJoinType(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#joinType.
def exitJoinType(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#joinCriteria.
def enterJoinCriteria(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#joinCriteria.
def exitJoinCriteria(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#sampledRelation.
def enterSampledRelation(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#sampledRelation.
def exitSampledRelation(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#sampleType.
def enterSampleType(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#sampleType.
def exitSampleType(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#aliasedRelation.
def enterAliasedRelation(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#aliasedRelation.
def exitAliasedRelation(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#columnAliases.
def enterColumnAliases(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#columnAliases.
def exitColumnAliases(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#tableName.
def enterTableName(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#tableName.
def exitTableName(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#subqueryRelation.
def enterSubqueryRelation(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#subqueryRelation.
def exitSubqueryRelation(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#unnest.
def enterUnnest(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#unnest.
def exitUnnest(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#lateral.
def enterLateral(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#lateral.
def exitLateral(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#parenthesizedRelation.
def enterParenthesizedRelation(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#parenthesizedRelation.
def exitParenthesizedRelation(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#expression.
def enterExpression(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#expression.
def exitExpression(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#logicalNot.
def enterLogicalNot(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#logicalNot.
def exitLogicalNot(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#booleanDefault.
def enterBooleanDefault(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#booleanDefault.
def exitBooleanDefault(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#logicalBinary.
def enterLogicalBinary(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#logicalBinary.
def exitLogicalBinary(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#predicated.
def enterPredicated(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#predicated.
def exitPredicated(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#comparison.
def enterComparison(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#comparison.
def exitComparison(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#quantifiedComparison.
def enterQuantifiedComparison(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#quantifiedComparison.
def exitQuantifiedComparison(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#between.
def enterBetween(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#between.
def exitBetween(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#inList.
def enterInList(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#inList.
def exitInList(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#inSubquery.
def enterInSubquery(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#inSubquery.
def exitInSubquery(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#like.
def enterLike(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#like.
def exitLike(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#nullPredicate.
def enterNullPredicate(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#nullPredicate.
def exitNullPredicate(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#distinctFrom.
def enterDistinctFrom(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#distinctFrom.
def exitDistinctFrom(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#valueExpressionDefault.
def enterValueExpressionDefault(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#valueExpressionDefault.
def exitValueExpressionDefault(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#concatenation.
def enterConcatenation(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#concatenation.
def exitConcatenation(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#arithmeticBinary.
def enterArithmeticBinary(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#arithmeticBinary.
def exitArithmeticBinary(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#arithmeticUnary.
def enterArithmeticUnary(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#arithmeticUnary.
def exitArithmeticUnary(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#atTimeZone.
def enterAtTimeZone(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#atTimeZone.
def exitAtTimeZone(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#dereference.
def enterDereference(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#dereference.
def exitDereference(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#typeConstructor.
def enterTypeConstructor(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#typeConstructor.
def exitTypeConstructor(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#specialDateTimeFunction.
def enterSpecialDateTimeFunction(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#specialDateTimeFunction.
def exitSpecialDateTimeFunction(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#substring.
def enterSubstring(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#substring.
def exitSubstring(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#cast.
def enterCast(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#cast.
def exitCast(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#lambda.
def enterLambda(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#lambda.
def exitLambda(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#parenthesizedExpression.
def enterParenthesizedExpression(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#parenthesizedExpression.
def exitParenthesizedExpression(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#parameter.
def enterParameter(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#parameter.
def exitParameter(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#normalize.
def enterNormalize(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#normalize.
def exitNormalize(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#intervalLiteral.
def enterIntervalLiteral(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#intervalLiteral.
def exitIntervalLiteral(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#numericLiteral.
def enterNumericLiteral(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#numericLiteral.
def exitNumericLiteral(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#booleanLiteral.
def enterBooleanLiteral(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#booleanLiteral.
def exitBooleanLiteral(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#simpleCase.
def enterSimpleCase(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#simpleCase.
def exitSimpleCase(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#columnReference.
def enterColumnReference(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#columnReference.
def exitColumnReference(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#nullLiteral.
def enterNullLiteral(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#nullLiteral.
def exitNullLiteral(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#rowConstructor.
def enterRowConstructor(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#rowConstructor.
def exitRowConstructor(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#subscript.
def enterSubscript(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#subscript.
def exitSubscript(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#subqueryExpression.
def enterSubqueryExpression(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#subqueryExpression.
def exitSubqueryExpression(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#binaryLiteral.
def enterBinaryLiteral(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#binaryLiteral.
def exitBinaryLiteral(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#currentUser.
def enterCurrentUser(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#currentUser.
def exitCurrentUser(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#extract.
def enterExtract(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#extract.
def exitExtract(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#stringLiteral.
def enterStringLiteral(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#stringLiteral.
def exitStringLiteral(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#arrayConstructor.
def enterArrayConstructor(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#arrayConstructor.
def exitArrayConstructor(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#functionCall.
def enterFunctionCall(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#functionCall.
def exitFunctionCall(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#exists.
def enterExists(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#exists.
def exitExists(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#position.
def enterPosition(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#position.
def exitPosition(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#searchedCase.
def enterSearchedCase(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#searchedCase.
def exitSearchedCase(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#groupingOperation.
def enterGroupingOperation(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#groupingOperation.
def exitGroupingOperation(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#basicStringLiteral.
def enterBasicStringLiteral(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#basicStringLiteral.
def exitBasicStringLiteral(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#unicodeStringLiteral.
def enterUnicodeStringLiteral(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#unicodeStringLiteral.
def exitUnicodeStringLiteral(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#timeZoneInterval.
def enterTimeZoneInterval(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#timeZoneInterval.
def exitTimeZoneInterval(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#timeZoneString.
def enterTimeZoneString(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#timeZoneString.
def exitTimeZoneString(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#comparisonOperator.
def enterComparisonOperator(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#comparisonOperator.
def exitComparisonOperator(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#comparisonQuantifier.
def enterComparisonQuantifier(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#comparisonQuantifier.
def exitComparisonQuantifier(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#booleanValue.
def enterBooleanValue(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#booleanValue.
def exitBooleanValue(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#interval.
def enterInterval(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#interval.
def exitInterval(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#intervalField.
def enterIntervalField(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#intervalField.
def exitIntervalField(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#normalForm.
def enterNormalForm(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#normalForm.
def exitNormalForm(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#type.
def enterType(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#type.
def exitType(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#typeParameter.
def enterTypeParameter(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#typeParameter.
def exitTypeParameter(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#baseType.
def enterBaseType(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#baseType.
def exitBaseType(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#whenClause.
def enterWhenClause(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#whenClause.
def exitWhenClause(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#filter.
def enterFilter(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#filter.
def exitFilter(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#over.
def enterOver(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#over.
def exitOver(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#windowFrame.
def enterWindowFrame(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#windowFrame.
def exitWindowFrame(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#unboundedFrame.
def enterUnboundedFrame(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#unboundedFrame.
def exitUnboundedFrame(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#currentRowBound.
def enterCurrentRowBound(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#currentRowBound.
def exitCurrentRowBound(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#boundedFrame.
def enterBoundedFrame(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#boundedFrame.
def exitBoundedFrame(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#explainFormat.
def enterExplainFormat(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#explainFormat.
def exitExplainFormat(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#explainType.
def enterExplainType(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#explainType.
def exitExplainType(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#isolationLevel.
def enterIsolationLevel(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#isolationLevel.
def exitIsolationLevel(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#transactionAccessMode.
def enterTransactionAccessMode(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#transactionAccessMode.
def exitTransactionAccessMode(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#readUncommitted.
def enterReadUncommitted(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#readUncommitted.
def exitReadUncommitted(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#readCommitted.
def enterReadCommitted(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#readCommitted.
def exitReadCommitted(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#repeatableRead.
def enterRepeatableRead(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#repeatableRead.
def exitRepeatableRead(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#serializable.
def enterSerializable(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#serializable.
def exitSerializable(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#positionalArgument.
def enterPositionalArgument(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#positionalArgument.
def exitPositionalArgument(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#namedArgument.
def enterNamedArgument(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#namedArgument.
def exitNamedArgument(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#privilege.
def enterPrivilege(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#privilege.
def exitPrivilege(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#qualifiedName.
def enterQualifiedName(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#qualifiedName.
def exitQualifiedName(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#unquotedIdentifier.
def enterUnquotedIdentifier(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#unquotedIdentifier.
def exitUnquotedIdentifier(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#quotedIdentifier.
def enterQuotedIdentifier(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#quotedIdentifier.
def exitQuotedIdentifier(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#backQuotedIdentifier.
def enterBackQuotedIdentifier(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#backQuotedIdentifier.
def exitBackQuotedIdentifier(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#digitIdentifier.
def enterDigitIdentifier(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#digitIdentifier.
def exitDigitIdentifier(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#decimalLiteral.
def enterDecimalLiteral(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#decimalLiteral.
def exitDecimalLiteral(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#doubleLiteral.
def enterDoubleLiteral(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#doubleLiteral.
def exitDoubleLiteral(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#integerLiteral.
def enterIntegerLiteral(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#integerLiteral.
def exitIntegerLiteral(self, ctx):
pass
# Enter a parse tree produced by SqlBaseParser#nonReserved.
def enterNonReserved(self, ctx):
pass
# Exit a parse tree produced by SqlBaseParser#nonReserved.
def exitNonReserved(self, ctx):
pass
This source diff could not be displayed because it is too large. You can view the blob instead.
How to generate Antlr runtime targets:
1. Install Antlr4. https://github.com/antlr/antlr4/blob/master/doc/getting-started.md
1. Download grammar. Presto: https://github.com/prestodb/presto/blob/master/presto-parser/src/main/antlr4/com/facebook/presto/sql/parser/SqlBase.g4
1. Generate Antlr runtime target https://github.com/antlr/antlr4/blob/master/doc/python-target.md
1. More on Antlr: https://github.com/antlr/antlr4/blob/master/doc/index.md
import logging
from antlr4 import InputStream, CommonTokenStream, ParseTreeWalker
from typing import Iterable, List # noqa: F401
from databuilder.sql_parser.usage.column import Column, Table, remove_double_quotes
from databuilder.sql_parser.usage.presto.antlr_generated.SqlBaseLexer import SqlBaseLexer
from databuilder.sql_parser.usage.presto.antlr_generated.SqlBaseListener import SqlBaseListener
from databuilder.sql_parser.usage.presto.antlr_generated.SqlBaseParser import SqlBaseParser
LOGGER = logging.getLogger(__name__)
class ColumnUsageListener(SqlBaseListener):
"""
ColumnUsageListener that inherits Antlr generated SqlBaseListener so that it can extract column and table usage
while ColumnUsageListener walks the parsing tree.
(Method name is from Antlr generated SqlBaseListener where it does not follow python convention)
Basic idea of column extraction is to look at SELECT statement as two parts.
1. processing columns: Columns in SELECT clause. (SELECT foo, bar )
2. processed columns: Columns in FROM clause. (FROM foobar or FROM (SELECT foo, bar from foobar) )
Overall, we'd like to retrieve processing column. Thus, the problem we need to solve is basically based on
processed column, finalize processing column by get the necessary info (such as table, schema) from processed
column.
"""
def __init__(self):
# type: () -> None
self.processed_cols = [] # type: List[Column]
self._processing_cols = [] # type: List[Column]
self._current_col = None # type: Column
self._stack = [] # type: List[Column]
def exitColumnReference(self,
ctx # type: SqlBaseParser.ColumnReferenceContext
):
# type: (...) -> None
"""
Call back method for column that does not have table indicator
:param ctx:
:return:
"""
self._current_col = Column(ctx.getText())
def exitDereference(self,
ctx # type: SqlBaseParser.DereferenceContext
):
# type: (...) -> None
"""
Call back method for column with table indicator e.g: foo.bar
:param ctx:
:return:
"""
self._current_col = Column(ctx.identifier().getText(),
table=Table(ctx.base.getText()))
def exitSelectSingle(self,
ctx # type: SqlBaseParser.SelectSingleContext
):
# type: (...) -> None
"""
Call back method for select single column. This is to distinguish
between columns for SELECT statement and columns for something else
such as JOIN statement
:param ctx:
:return:
"""
if not self._current_col:
return
if ctx.identifier():
self._current_col.col_alias = remove_double_quotes(ctx.identifier().getText())
self._processing_cols.append(self._current_col)
self._current_col = None
def exitSelectAll(self,
ctx # type: SqlBaseParser.SelectAllContext
):
# type: (...) -> None
"""
Call back method for select ALL column.
:param ctx:
:return:
"""
self._current_col = Column('*')
if ctx.qualifiedName():
self._current_col.table = Table(ctx.qualifiedName().getText())
self._processing_cols.append(self._current_col)
self._current_col = None
def exitTableName(self,
ctx # type: SqlBaseParser.TableNameContext
):
# type: (...) -> None
"""
Call back method for table name
:param ctx:
:return:
"""
table_name = ctx.getText()
table = Table(table_name)
if '.' in table_name:
db_tbl = table_name.split('.')
table = Table(db_tbl[len(db_tbl) - 1],
schema=db_tbl[len(db_tbl) - 2])
self._current_col = Column('*', table=table)
def exitAliasedRelation(self,
ctx # type: SqlBaseParser.AliasedRelationContext
):
# type: (...) -> None
"""
Call back method for table alias
:param ctx:
:return:
"""
if not ctx.identifier():
return
# Table alias for column
if self._current_col and self._current_col.table:
self._current_col.table.alias = remove_double_quotes(ctx.identifier().getText())
return
# Table alias for inner SQL
for col in self.processed_cols:
col.table.alias = remove_double_quotes(ctx.identifier().getText())
def exitRelationDefault(self,
ctx # type: SqlBaseParser.RelationDefaultContext
):
# type: (...) -> None
"""
Callback method when exiting FROM clause. Here we are moving processing columns to processed
to processed
:param ctx:
:return:
"""
if not self._current_col:
return
self.processed_cols.append(self._current_col)
self._current_col = None
def enterQuerySpecification(self,
ctx # type: SqlBaseParser.QuerySpecificationContext
):
# type: (...) -> None
"""
Callback method for Query specification. For nested SELECT
statement, it will store previous processing column to stack.
:param ctx:
:return:
"""
if not self._processing_cols:
return
self._stack.append(self._processing_cols)
self._processing_cols = []
def exitQuerySpecification(self,
ctx # type: SqlBaseParser.QuerySpecificationContext
):
# type: (...) -> None
"""
Call back method for Query specification. It merges processing
columns with processed column
:param ctx:
:return:
"""
if LOGGER.isEnabledFor(logging.DEBUG):
LOGGER.debug('processing_cols: {}'.format(self._processing_cols))
LOGGER.debug('processed_cols: {}'.format(self.processed_cols))
result = []
for col in self._processing_cols:
for resolved in Column.resolve(col, self.processed_cols):
result.append(resolved)
self.processed_cols = result
self._processing_cols = []
if self._stack:
self._processing_cols = self._stack.pop()
self._current_col = None
if LOGGER.isEnabledFor(logging.DEBUG):
LOGGER.debug('done processing_cols: {}'.format(self._processing_cols))
LOGGER.debug('done processed_cols: {}'.format(self.processed_cols))
class ColumnUsageProvider(object):
def __init__(self):
# type: () -> None
pass
@classmethod
def get_columns(cls, query):
# type: (str) -> Iterable[Column]
"""
Using presto Grammar, instantiate Parsetree, attach ColumnUsageListener to tree and walk the tree.
Once finished walking the tree, listener will have selected columns and return them.
:param query:
:return:
"""
query = query.rstrip(';').upper() + "\n"
lexer = SqlBaseLexer(InputStream(query))
parser = SqlBaseParser(CommonTokenStream(lexer))
parse_tree = parser.singleStatement()
listener = ColumnUsageListener()
walker = ParseTreeWalker()
walker.walk(listener, parse_tree)
return listener.processed_cols
try:
import copy_reg
except Exception:
import copyreg as copy_reg
import logging
import types
from multiprocessing.pool import Pool, TimeoutError
from pyhocon import ConfigTree # noqa: F401
from typing import Any, Optional, List, Iterable # noqa: F401
from databuilder import Scoped
from databuilder.extractor.hive_table_metadata_extractor import HiveTableMetadataExtractor
from databuilder.models.table_column_usage import TableColumnUsage, ColumnReader
from databuilder.sql_parser.usage.column import OrTable, Table # noqa: F401
from databuilder.sql_parser.usage.presto.column_usage_provider import ColumnUsageProvider
from databuilder.transformer.base_transformer import Transformer
LOGGER = logging.getLogger(__name__)
def _pickle_method(m):
"""
Pool needs to pickle method in order to pass it to separate process. This method is to define how to pickle method.
"""
if m.im_self is None:
return getattr, (m.im_class, m.im_func.func_name)
else:
return getattr, (m.im_self, m.im_func.func_name)
copy_reg.pickle(types.MethodType, _pickle_method)
class SqlToTblColUsageTransformer(Transformer):
"""
Note that it currently only supports Presto SQL.
A SQL to usage transformer where it transforms to ColumnReader that has column, user, count.
Currently it's collects on table level that column on same table will be de-duped.
In many cases, "from" clause does not contain schema and this will be fetched via table name -> schema name mapping
which it gets from Hive metastore. (Naming collision is disregarded as it needs column level to disambiguate)
Currently, ColumnUsageProvider could hang on certain SQL statement and as a short term solution it will timeout
processing statement at 10 seconds.
"""
# Config key
DATABASE_NAME = 'database'
CLUSTER_NAME = 'cluster'
SQL_STATEMENT_ATTRIBUTE_NAME = 'sql_stmt_attribute_name'
USER_EMAIL_ATTRIBUTE_NAME = 'user_email_attribute_name'
COLUMN_EXTRACTION_TIMEOUT_SEC = 'column_extraction_timeout_seconds'
LOG_ALL_EXTRACTION_FAILURES = 'log_all_extraction_failures'
total_counts = 0
failure_counts = 0
def init(self, conf):
# type: (ConfigTree) -> None
self._conf = conf
self._database = conf.get_string(SqlToTblColUsageTransformer.DATABASE_NAME)
self._cluster = conf.get_string(SqlToTblColUsageTransformer.CLUSTER_NAME, 'gold')
self._sql_stmt_attr = conf.get_string(SqlToTblColUsageTransformer.SQL_STATEMENT_ATTRIBUTE_NAME)
self._user_email_attr = conf.get_string(SqlToTblColUsageTransformer.USER_EMAIL_ATTRIBUTE_NAME)
self._tbl_to_schema_mapping = self._create_schema_by_table_mapping()
self._worker_pool = Pool(processes=1)
self._time_out_sec = conf.get_int(SqlToTblColUsageTransformer.COLUMN_EXTRACTION_TIMEOUT_SEC, 10)
LOGGER.info('Column extraction timeout: {} seconds'.format(self._time_out_sec))
self._log_all_extraction_failures = conf.get_bool(SqlToTblColUsageTransformer.LOG_ALL_EXTRACTION_FAILURES,
False)
def transform(self, record):
# type: (Any) -> Optional[TableColumnUsage]
SqlToTblColUsageTransformer.total_counts += 1
stmt = getattr(record, self._sql_stmt_attr)
email = getattr(record, self._user_email_attr)
result = [] # type: List[ColumnReader]
try:
columns = self._worker_pool.apply_async(ColumnUsageProvider.get_columns, (stmt,)).get(self._time_out_sec)
# LOGGER.info('Statement: {} ---> columns: {}'.format(stmt, columns))
except TimeoutError:
SqlToTblColUsageTransformer.failure_counts += 1
LOGGER.exception('Timed out while getting column usage from query: {}'.format(stmt))
LOGGER.info('Killing the thread.')
self._worker_pool.terminate()
self._worker_pool = Pool(processes=1)
LOGGER.info('Killed the thread.')
return None
except Exception:
SqlToTblColUsageTransformer.failure_counts += 1
if self._log_all_extraction_failures:
LOGGER.exception('Failed to get column usage from query: {}'.format(stmt))
return None
# Dedupe is needed to make it table level. TODO: Remove this once we are at column level
dedupe_tuples = set() # type: set
for col in columns:
sub_result = self._get_col_readers(table=col.table,
stmt=stmt,
email=email,
dedupe_tuples=dedupe_tuples)
result.extend(sub_result)
if not result:
return None
return TableColumnUsage(col_readers=result)
def _get_col_readers(self,
table, # type: Table
stmt, # type: str
email, # type: str
dedupe_tuples # type: set
):
# type: (...) -> Iterable[ColumnReader]
"""
Using table information, produce column reader with de-duping same table as it's from same statement
:param table:
:param stmt:
:param email:
:param dedupe_tuples:
:return:
"""
result = [] # type: List[ColumnReader]
self._get_col_readers_helper(table=table,
stmt=stmt,
email=email,
dedupe_tuples=dedupe_tuples,
result=result)
return result
def _get_col_readers_helper(self,
table, # type: Table
stmt, # type: str
email, # type: str
dedupe_tuples, # type: set
result # type: List[ColumnReader]
):
# type: (...) -> None
if not table:
logging.warn('table does not exist. statement: {}'.format(stmt))
return
if isinstance(table, OrTable):
for table in table.tables:
self._get_col_readers_helper(table=table,
stmt=stmt,
email=email,
dedupe_tuples=dedupe_tuples,
result=result)
return
if self._is_duplicate(table=table, email=email, dedupe_tuples=dedupe_tuples):
return
schema = self._get_schema(table)
if not schema:
return
result.append(ColumnReader(database=self._database,
cluster=self._cluster,
schema=schema,
table=table.name,
column='*',
user_email=email))
def _is_duplicate(self, table, email, dedupe_tuples):
# type: (Table, str, set) -> bool
"""
This is to only produce table level usage. TODO: Remove this
:param table:
:param email:
:param dedupe_tuples:
:return:
"""
dedupe_tuple = (self._database, self._get_schema(table), table.name, email)
if dedupe_tuple in dedupe_tuples:
return True
dedupe_tuples.add(dedupe_tuple)
return False
def get_scope(self):
# type: () -> str
return 'transformer.sql_to_tbl_col_usage'
def _create_schema_by_table_mapping(self):
# type: () -> dict
# TODO: Make extractor generic
table_metadata_extractor = HiveTableMetadataExtractor()
table_metadata_extractor.init(Scoped.get_scoped_conf(self._conf, table_metadata_extractor.get_scope()))
table_to_schema = {}
table_metadata = table_metadata_extractor.extract()
while table_metadata:
# TODO: deal with collision
table_to_schema[table_metadata.name.lower()] = table_metadata.schema.lower()
table_metadata = table_metadata_extractor.extract()
return table_to_schema
def _get_schema(self, table):
# type: (Table) -> Optional[str]
if table.schema:
return table.schema.lower()
return self._tbl_to_schema_mapping.get(table.name.lower())
def close(self):
# type: () -> None
LOGGER.info('Column usage stats: failure: {fail_count} out of total {total_count}'
.format(fail_count=SqlToTblColUsageTransformer.failure_counts,
total_count=SqlToTblColUsageTransformer.total_counts))
...@@ -2,7 +2,7 @@ import os ...@@ -2,7 +2,7 @@ import os
from setuptools import setup, find_packages from setuptools import setup, find_packages
__version__ = '2.1.0' __version__ = '2.2.0'
requirements_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'requirements.txt') requirements_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'requirements.txt')
......
...@@ -2,8 +2,6 @@ from mock import patch, Mock ...@@ -2,8 +2,6 @@ from mock import patch, Mock
import base64 import base64
import tempfile import tempfile
import unittest import unittest
import six
import pytest
from pyhocon import ConfigFactory from pyhocon import ConfigFactory
...@@ -188,10 +186,6 @@ class MockLoggingClient(): ...@@ -188,10 +186,6 @@ class MockLoggingClient():
return self.b return self.b
@pytest.mark.skipif(
six.PY3,
reason="Deactivated for Python3 because of issue [#40](https://github.com/lyft/amundsen/issues/40) (ANTLR for py3)"
)
class TestBigqueryUsageExtractor(unittest.TestCase): class TestBigqueryUsageExtractor(unittest.TestCase):
@patch('databuilder.extractor.base_bigquery_extractor.build') @patch('databuilder.extractor.base_bigquery_extractor.build')
......
import unittest
from mock import patch, MagicMock # noqa: F401
from pyhocon import ConfigFactory
import pytest
import six
if six.PY2:
from databuilder.extractor.table_column_usage_aggregate_extractor import TblColUsgAggExtractor, RAW_EXTRACTOR
from databuilder.models.table_column_usage import TableColumnUsage, ColumnReader
from databuilder.transformer.regex_str_replace_transformer import RegexStrReplaceTransformer
from databuilder.transformer.sql_to_table_col_usage_transformer import SqlToTblColUsageTransformer
@pytest.mark.skipif(
six.PY3,
reason="Deactivated for Python3 because of issue [#40](https://github.com/lyft/amundsen/issues/40) (ANTLR for py3)"
)
class TestTblColUsgAggExtractor(unittest.TestCase):
def test_aggregate(self):
# type: () -> None
with patch.object(RegexStrReplaceTransformer, 'init'),\
patch.object(SqlToTblColUsageTransformer, 'init'),\
patch.object(RegexStrReplaceTransformer, 'transform'),\
patch.object(SqlToTblColUsageTransformer, 'transform') as mock_sql_transform:
raw_extractor = MagicMock()
mock_raw_extractor = MagicMock()
raw_extractor.extract = mock_raw_extractor
raw_extractor.get_scope.return_value = 'foo'
# Just to iterate 5 times
mock_raw_extractor.side_effect = ['foo', 'bar', 'foo', 'bar', None]
conf = ConfigFactory.from_dict(
{RAW_EXTRACTOR: raw_extractor}
)
mock_sql_transform.side_effect = [
TableColumnUsage(col_readers=[ColumnReader(database='database', cluster='gold', schema='test_schema1',
table='test_table1', column='*',
user_email='john@example.com')]),
TableColumnUsage(col_readers=[ColumnReader(database='database', cluster='gold', schema='test_schema1',
table='test_table1', column='*',
user_email='john@example.com', read_count=2)]),
TableColumnUsage(col_readers=[ColumnReader(database='database', cluster='gold', schema='test_schema1',
table='test_table2', column='*',
user_email='john@example.com', read_count=5)]),
None]
extractor = TblColUsgAggExtractor()
extractor.init(conf)
actual = extractor.extract()
expected = TableColumnUsage(
col_readers=[
ColumnReader(database='database', cluster='gold', schema='test_schema1', table='test_table1',
column='*', user_email='john@example.com', read_count=3),
ColumnReader(database='database', cluster='gold', schema='test_schema1', table='test_table2',
column='*', user_email='john@example.com', read_count=5)])
self.assertEqual(expected.__repr__(), actual.__repr__())
if __name__ == '__main__':
unittest.main()
import pytest
import six
import unittest
from typing import no_type_check
from mock import patch
from pyhocon import ConfigFactory
from databuilder.extractor.hive_table_metadata_extractor import HiveTableMetadataExtractor
from databuilder.models.table_metadata import TableMetadata, ColumnMetadata
if six.PY2:
from databuilder.models.table_column_usage import TableColumnUsage, ColumnReader
from databuilder.transformer.sql_to_table_col_usage_transformer import SqlToTblColUsageTransformer
@pytest.mark.skipif(
six.PY3,
reason="Deactivated for Python3 because of issue [#40](https://github.com/lyft/amundsen/issues/40) (ANTLR for py3)"
)
class TestSqlToTblColUsageTransformer(unittest.TestCase):
@no_type_check
def test(self):
# type: () -> None
config = ConfigFactory.from_dict({
SqlToTblColUsageTransformer.DATABASE_NAME: 'database',
SqlToTblColUsageTransformer.USER_EMAIL_ATTRIBUTE_NAME: 'email',
SqlToTblColUsageTransformer.SQL_STATEMENT_ATTRIBUTE_NAME: 'statement'
})
with patch.object(HiveTableMetadataExtractor, 'extract') as mock_extract,\
patch.object(HiveTableMetadataExtractor, 'init'):
mock_extract.side_effect = [
TableMetadata('hive', 'gold', 'test_schema1', 'test_table1', 'test_table1', [
ColumnMetadata('test_id1', 'description of test_table1', 'bigint', 0),
ColumnMetadata('test_id2', 'description of test_id2', 'bigint', 1),
ColumnMetadata('is_active', None, 'boolean', 2),
ColumnMetadata('source', 'description of source', 'varchar', 3),
ColumnMetadata('etl_created_at', 'description of etl_created_at', 'timestamp', 4),
ColumnMetadata('ds', None, 'varchar', 5)]), None]
transformer = SqlToTblColUsageTransformer()
transformer.init(config)
foo = Foo(email='john@example.com', statement='SELECT foo, bar FROM test_table1')
actual = transformer.transform(foo)
expected = TableColumnUsage(col_readers=[ColumnReader(database=u'database', cluster=u'gold',
schema='test_schema1',
table='test_table1', column='*',
user_email='john@example.com')])
self.assertEqual(expected.__repr__(), actual.__repr__())
class Foo(object):
def __init__(self, email, statement):
# type: (str, str) -> None
self.email = email
self.statement = statement
if __name__ == '__main__':
unittest.main()
import logging
import pytest
import six
import unittest
from databuilder.sql_parser.usage.column import Column, Table, OrTable, remove_double_quotes
if six.PY2:
from databuilder.sql_parser.usage.presto.column_usage_provider import ColumnUsageProvider
@pytest.mark.skipif(
six.PY3,
reason="Deactivated for Python3 because of issue [#40](https://github.com/lyft/amundsen/issues/40) (ANTLR for py3)"
)
class TestColumnUsage(unittest.TestCase):
def setUp(self):
# type: () -> None
logging.basicConfig(level=logging.INFO)
def test_column_usage(self):
# type: () -> None
query = 'SELECT foo, bar FROM foobar;'
actual = ColumnUsageProvider.get_columns(query)
expected = [Column(name='FOO', table=Table(name='FOOBAR', schema=None, alias=None), col_alias=None),
Column(name='BAR', table=Table(name='FOOBAR', schema=None, alias=None), col_alias=None)]
self.assertEqual(expected.__repr__(), actual.__repr__())
def test_with_schema(self):
# type: () -> None
query = 'SELECT foo, bar FROM scm.foobar;'
actual = ColumnUsageProvider.get_columns(query)
expected = [Column(name='FOO', table=Table(name='FOOBAR', schema='SCM', alias=None), col_alias=None),
Column(name='BAR', table=Table(name='FOOBAR', schema='SCM', alias=None), col_alias=None)]
self.assertEqual(expected.__repr__(), actual.__repr__())
def test_join(self):
# type: () -> None
query = 'SELECT A, B FROM scm.FOO JOIN BAR ON FOO.A = BAR.B'
actual = ColumnUsageProvider.get_columns(query)
expected = [Column(name='A', table=OrTable(tables=[Table(name='FOO', schema='SCM', alias=None),
Table(name='BAR', schema=None, alias=None)]),
col_alias=None),
Column(name='B', table=OrTable(tables=[Table(name='FOO', schema='SCM', alias=None),
Table(name='BAR', schema=None, alias=None)]),
col_alias=None)]
self.assertEqual(expected.__repr__(), actual.__repr__())
def test_join_with_alias(self):
# type: () -> None
query = 'SELECT FOO.A, BAR.B FROM FOOTABLE AS FOO JOIN BARTABLE AS BAR ON FOO.A = BAR.A'
actual = ColumnUsageProvider.get_columns(query)
expected = [Column(name='A', table=Table(name='FOOTABLE', schema=None, alias='FOO'), col_alias=None),
Column(name='B', table=Table(name='BARTABLE', schema=None, alias='BAR'), col_alias=None)]
self.assertEqual(expected.__repr__(), actual.__repr__())
def test_inner_sql(self):
# type: () -> None
query = 'SELECT TMP1.A, B FROM (SELECT * FROM FOOBAR) AS TMP1'
actual = ColumnUsageProvider.get_columns(query)
expected = [Column(name='A', table=Table(name='FOOBAR', schema=None, alias='TMP1'), col_alias=None),
Column(name='B', table=Table(name='FOOBAR', schema=None, alias='TMP1'), col_alias=None)]
self.assertEqual(expected.__repr__(), actual.__repr__())
def test_inner_sql_col_alias(self):
# type: () -> None
query = 'SELECT TMP1.A, F FROM (SELECT A, B AS F, C FROM FOOBAR) AS TMP1'
actual = ColumnUsageProvider.get_columns(query)
expected = [Column(name='A', table=Table(name='FOOBAR', schema=None, alias='TMP1'), col_alias=None),
Column(name='B', table=Table(name='FOOBAR', schema=None, alias='TMP1'), col_alias='F')]
self.assertEqual(expected.__repr__(), actual.__repr__())
def test_table_alias(self):
# type: () -> None
query = """
SELECT A.* FROM FACT_RIDES A LEFT JOIN DIM_VEHICLES B ON A.VEHICLE_KEY = B.VEHICLE_KEY
WHERE B.RENTAL_PROVIDER_ID IS NOT NULL LIMIT 100
"""
actual = ColumnUsageProvider.get_columns(query)
expected = [Column(name='*', table=Table(name='FACT_RIDES', schema=None, alias='A'), col_alias=None)]
self.assertEqual(expected.__repr__(), actual.__repr__())
def test_inner_sql_table_alias(self):
# type: () -> None
query = """
SELECT col1, temp.col2 FROM (SELECT col1, col2, col3 FROM foobar) as temp
"""
actual = ColumnUsageProvider.get_columns(query)
expected = [Column(name='COL1', table=Table(name='FOOBAR', schema=None, alias='TEMP'), col_alias=None),
Column(name='COL2', table=Table(name='FOOBAR', schema=None, alias='TEMP'), col_alias=None)]
self.assertEqual(expected.__repr__(), actual.__repr__())
def test_alias_double_inner(self):
# type: () -> None
query = """\
SELECT cluster AS cluster,
date_trunc('day', CAST(ds AS TIMESTAMP)) AS __timestamp,
sum(p90_time) AS sum__p90_time
FROM
(select ds,
cluster,
approx_percentile(latency_mins, .50) as p50_time,
approx_percentile(latency_mins, .60) as p60_time,
approx_percentile(latency_mins, .70) as p70_time,
approx_percentile(latency_mins, .75) as p75_time,
approx_percentile(latency_mins, .80) as p80_time,
approx_percentile(latency_mins, .90) as p90_time,
approx_percentile(latency_mins, .95) as p95_time
from
(SELECT ds,
cluster_name as cluster,
query_id,
date_diff('second',query_starttime,query_endtime)/60.0 as latency_mins
FROM etl.hive_query_logs
WHERE date(ds) > date_add('day', -60, current_date)
AND environment = 'production'
AND operation_name = 'QUERY' )
group by ds,
cluster
order by ds) AS expr_qry
WHERE ds >= '2018-03-30 00:00:00'
AND ds <= '2018-05-29 23:29:57'
GROUP BY cluster,
date_trunc('day', CAST(ds AS TIMESTAMP))
ORDER BY sum__p90_time DESC
LIMIT 5000
"""
actual = ColumnUsageProvider.get_columns(query)
expected = [Column(name='CLUSTER_NAME', table=Table(name='HIVE_QUERY_LOGS', schema='ETL', alias='EXPR_QRY'),
col_alias='CLUSTER'),
Column(name='DS', table=OrTable(tables=[Table(name='HIVE_QUERY_LOGS', schema='ETL',
alias='EXPR_QRY'), None]), col_alias='__TIMESTAMP'),
Column(name='QUERY_ENDTIME', table=Table(name='HIVE_QUERY_LOGS', schema='ETL', alias='EXPR_QRY'),
col_alias='SUM__P90_TIME')]
self.assertEqual(expected.__repr__(), actual.__repr__())
def test_remove_double_quotes(self):
# type: () -> None
val = '"foo"'
actual = remove_double_quotes(val)
expected = 'foo'
self.assertEqual(expected, actual)
val = '"foo'
actual = remove_double_quotes(val)
expected = '"foo'
self.assertEqual(expected, actual)
val = 'foo'
actual = remove_double_quotes(val)
expected = 'foo'
self.assertEqual(expected, actual)
if __name__ == '__main__':
unittest.main()
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment