diff --git a/.github/workflows/dev.yml b/.github/workflows/dev.yml
index d9a22b5..82d76c0 100644
--- a/.github/workflows/dev.yml
+++ b/.github/workflows/dev.yml
@@ -2,9 +2,9 @@ name: Dev CI
on:
push:
- branches: [ "main", "dev" ]
+ branches: [ "main", "yanju/dev" ]
pull_request:
- branches: [ "main", "dev" ]
+ branches: [ "main", "yanju/dev" ]
workflow_dispatch:
jobs:
@@ -17,11 +17,7 @@ jobs:
python-version: '3.12'
- name: install dependencies
run: |
- pip install networkx[default]
- pip install beautifulsoup4
- pip install pandas
- pip install antlr4-tools
- pip install antlr4-python3-runtime==4.13.1
+ pip install .
antlr4 -v 4.13.1
- name: test hello.py
run: python tests/scripts/hello.py
@@ -37,11 +33,7 @@ jobs:
python-version: '3.12'
- name: install dependencies
run: |
- pip install networkx[default]
- pip install beautifulsoup4
- pip install pandas
- pip install antlr4-tools
- pip install antlr4-python3-runtime==4.13.1
+ pip install .
antlr4 -v 4.13.1
- name: test parsing.py
run: PYTHONPATH="./" python ./tests/scripts/parsing.py
@@ -55,11 +47,7 @@ jobs:
python-version: '3.12'
- name: install dependencies
run: |
- pip install networkx[default]
- pip install beautifulsoup4
- pip install pandas
- pip install antlr4-tools
- pip install antlr4-python3-runtime==4.13.1
+ pip install .
antlr4 -v 4.13.1
- name: test divz
run: PYTHONPATH="./" python ./tests/scripts/test-divz.py
@@ -73,11 +61,7 @@ jobs:
python-version: '3.12'
- name: install dependencies
run: |
- pip install networkx[default]
- pip install beautifulsoup4
- pip install pandas
- pip install antlr4-tools
- pip install antlr4-python3-runtime==4.13.1
+ pip install .
antlr4 -v 4.13.1
- name: test infoleak
run: PYTHONPATH="./" python ./tests/scripts/test-infoleak.py
@@ -91,11 +75,7 @@ jobs:
python-version: '3.12'
- name: install dependencies
run: |
- pip install networkx[default]
- pip install beautifulsoup4
- pip install pandas
- pip install antlr4-tools
- pip install antlr4-python3-runtime==4.13.1
+ pip install .
antlr4 -v 4.13.1
- name: test rtcnst
run: PYTHONPATH="./" python ./tests/scripts/test-rtcnst.py
@@ -109,11 +89,7 @@ jobs:
python-version: '3.12'
- name: install dependencies
run: |
- pip install networkx[default]
- pip install beautifulsoup4
- pip install pandas
- pip install antlr4-tools
- pip install antlr4-python3-runtime==4.13.1
+ pip install .
antlr4 -v 4.13.1
- name: test unused
run: PYTHONPATH="./" python ./tests/scripts/test-unused.py
\ No newline at end of file
diff --git a/README.md b/README.md
index f803b49..f0c9f48 100644
--- a/README.md
+++ b/README.md
@@ -2,6 +2,19 @@
This repo hosts an open-source Python branch of the static analysis tool Vanguard developed by Veridise. This version is optimized for analyzing Leo/Aleo programs.
+## Table of Contents
+
+- [Prerequisites](#prerequisites)
+- [Usage](#usage)
+ - [Commandline Executable](#commandline-executable)
+ - [Example Commands](#example-commands)
+ - [Calling from Source](#calling-from-source)
+ - [Calling as Library](#calling-as-library)
+- [Detectors Available](#detectors-available)
+- [Example Leo/Aleo Vulnerabilities](#example-leoaleo-vulnerabilities)
+- [Parser/Lexer Generation](#parserlexer-generation)
+- [Test Suite and Static Analysis APIs](#test-suite-and-static-analysis-apis)
+
## Prerequisites
The following libraries are required for running (different components of) the tool:
@@ -13,12 +26,81 @@ The following libraries are required for running (different components of) the t
- `pip install antlr4-tools`
- [Beautiful Soup](https://www.crummy.com/software/BeautifulSoup/) (4.12.2+) for crawling benchmarks from public explorers in test suite
- [pandas](https://pandas.pydata.org/) (2.1.4+) for data analysis in test suite
+ - [tabulate](https://github.com/astanin/python-tabulate) (0.9.0+) for result table rendering
- Leo (**7ac50d8**) for compiling and running all benchmarks enclosed
- The tools is tested under this version, but newer version of Lao may also work.
-## Vanguard for Aleo
+## Usage
+
+The library of Vanguard for Aleo provides common vulnerability detectors and basic utilities for writing detectors based on static analysis. There are three ways to use and integrate the tool into your workflow, namely: commandline executable, calling from source and calling as library.
+
+### Commandline Executable
+
+The analyzer can be installed via `pip` setup tools by running:
+
+```bash
+pip install .
+```
+
+and if you want to remove it:
+
+```bash
+pip uninstall vanguard
+```
+
+After installation, you can directly use the commandline executable `vanguard-aleo` provided:
+
+```bash
+usage: vanguard-aleo [-h] [-b BUILD] [-p PID] [-f FIDS] [-d {divz,infoleak,rtcnst,unused}] [-v]
+
+options:
+ -h, --help show this help message and exit
+ -b BUILD, --build BUILD
+ project build path, default: ./
+ -p PID, --pid PID program id, default:
+ -f FIDS, --fids FIDS function ids (separated by comma, no space), default:
+ -d {divz,infoleak,rtcnst,unused}, --detector {divz,infoleak,rtcnst,unused}
+ detector to use, default: infoleak
+ -v, --verbose whether or not to return extra info, default: False
+```
+
+#### Example Commands
+
+- Test detector `infoleak` on all functions of the main program of a project:
+
+ ```bash
+ vanguard-aleo -b ./tests/public/infoleak0/build/ -d infoleak
+ ```
+
+- Test detector `infoleak` on function `ex0` of the main program of a project:
+
+ ```bash
+ vanguard-aleo -b ./tests/public/infoleak0/build/ -f ex0 -d infoleak
+ ```
+
+- Test detector `infoleak` of multiple functions `ex0`, `ex1` and `ex2` of the program `infoleak0.aleo`:
+
+ ```bash
+ vanguard-aleo -b ./tests/public/infoleak0/build/ -f ex0,ex1,ex2 -p infoleak0.aleo -d infoleak
+ ```
+
+- Test detector `infoleak` of multiple functions `ex0`, `ex1` and `ex2` of the program `infoleak0.aleo`, and print out extra information about the finding:
+
+ ```bash
+ vanguard-aleo -b ./tests/public/infoleak0/build/ -f ex0,ex1,ex2 -p infoleak0.aleo -d infoleak -v
+ ```
+
+ This will produce the following output:
+
+ ```
+ | id | program | function | detector | result | info |
+ |------|----------------|------------|------------|----------|----------------|
+ | 0 | infoleak0.aleo | ex0 | infoleak | unsafe | [('r0', 'r0')] |
+ | 1 | infoleak0.aleo | ex1 | infoleak | safe | [] |
+ | 2 | infoleak0.aleo | ex2 | infoleak | unsafe | [('r0', 'r1')] |
+ ```
-The library of Vanguard for Aleo provides common vulnerability detectors and basic utilities for writing detectors based on static analysis. To use the tool, you can call it directly from the repo or install it as a library.
+ where the info column provides more information about the detected vulnerability. For example, in function `ex0` there's information leakage from variable `r0` to `r0` (direct returning of input), and in `ex2` from `r0` to `r1`.
### Calling from Source
diff --git a/pyproject.toml b/pyproject.toml
index bb7ea75..f85fa3a 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "vanguard"
-version = "0.0.2"
+version = "0.0.3"
authors = [
{ name="Yanju Chen", email="yanju@veridise.com" },
]
@@ -18,8 +18,13 @@ dependencies = [
"beautifulsoup4>=4.12.2",
"antlr4-python3-runtime==4.13.1",
"pandas>=2.1.4",
+ "tabulate>=0.9.0",
"antlr4-tools",
]
-[project.urls]
-"Homepage" = "https://veridise.com/"
\ No newline at end of file
+[build-system]
+requires = ["setuptools>=61.0"]
+build-backend = "setuptools.build_meta"
+
+[project.scripts]
+vanguard-aleo = "vanguard.aleo.run:run"
\ No newline at end of file
diff --git a/tests/scripts/dep.py b/tests/scripts/dep.py
index f5cc78e..a4899fd 100644
--- a/tests/scripts/dep.py
+++ b/tests/scripts/dep.py
@@ -2,6 +2,7 @@
import bs4
import pandas
import antlr4
+import tabulate
if __name__ == "__main__":
print("Hello World!")
\ No newline at end of file
diff --git a/tests/test4.ipynb b/tests/test4.ipynb
index 9a9642c..019f7d2 100644
--- a/tests/test4.ipynb
+++ b/tests/test4.ipynb
@@ -15,7 +15,7 @@
},
{
"cell_type": "code",
- "execution_count": 2,
+ "execution_count": 3,
"id": "b34815c6-9610-4ef1-a7d2-4ee62cd30ae7",
"metadata": {},
"outputs": [],
@@ -96,48 +96,50 @@
"output_type": "stream",
"text": [
"# [debug] deploy: main.aleo\n",
- "# [✓][test] pid: infoleak0.aleo, fid: ex0, expected: True, actual: True\n",
- "# [✓][test] pid: infoleak0.aleo, fid: ex1, expected: False, actual: False\n",
- "# [✓][test] pid: infoleak0.aleo, fid: ex2, expected: True, actual: True\n",
- "# [✓][test] pid: infoleak0.aleo, fid: ex3, expected: True, actual: True\n",
- "# [✓][test] pid: infoleak0.aleo, fid: ex4, expected: True, actual: True\n",
- "# [✗][test] pid: infoleak0.aleo, fid: ex5, expected: True, actual: False\n",
- "# [✗][test] pid: infoleak0.aleo, fid: ex6, expected: True, actual: False\n",
- "# [✓][test] pid: infoleak0.aleo, fid: ex7, expected: False, actual: False\n",
- "# [✗][test] pid: infoleak0.aleo, fid: ex8, expected: True, actual: False\n",
- "# [✓][test] pid: infoleak0.aleo, fid: ex9, expected: True, actual: True\n",
- "# [✗][test] pid: infoleak0.aleo, fid: ex10, expected: True, actual: False\n",
- "# [✗][test] pid: infoleak0.aleo, fid: ex11, expected: False, actual: True\n",
- "# [✗][test] pid: infoleak0.aleo, fid: ex12, expected: True, actual: False\n",
- "# [✗][test] pid: infoleak0.aleo, fid: ex13, expected: True, actual: False\n",
- "# [✓][test] pid: infoleak0.aleo, fid: ex14, expected: True, actual: True\n",
- "# [✓][test] pid: infoleak0.aleo, fid: ex15, expected: True, actual: True\n",
- "# [✓][test] pid: infoleak0.aleo, fid: ex16, expected: True, actual: True\n",
- "# [✗][test] pid: infoleak0.aleo, fid: ex17, expected: True, actual: False\n",
- "# [✓][test] pid: infoleak0.aleo, fid: ex18, expected: True, actual: True\n",
- "# [✗][test] pid: infoleak0.aleo, fid: ex19, expected: True, actual: False\n",
- "# [✗][test] pid: infoleak0.aleo, fid: ex20, expected: True, actual: False\n",
- "# [✗][test] pid: infoleak0.aleo, fid: ex21, expected: True, actual: False\n",
- "# [✗][test] pid: infoleak0.aleo, fid: ex22, expected: True, actual: False\n",
- "# [✗][test] pid: infoleak0.aleo, fid: ex23, expected: True, actual: False\n",
- "# [✗][test] pid: infoleak0.aleo, fid: ex24, expected: True, actual: False\n",
- "# [test] accuracy: 11/25 (0.4400)\n",
+ "# [debug] deploy: helpers.aleo\n",
+ "# [✓][test] pid: divz0.aleo, fid: ex0, expected: True, actual: True\n",
+ "# [✓][test] pid: divz0.aleo, fid: ex1, expected: True, actual: True\n",
+ "# [✓][test] pid: divz0.aleo, fid: ex2, expected: True, actual: True\n",
+ "# [✓][test] pid: divz0.aleo, fid: ex3, expected: True, actual: True\n",
+ "# [✗][test] pid: divz0.aleo, fid: ex4, expected: False, actual: True\n",
+ "# [✓][test] pid: divz0.aleo, fid: ex5, expected: True, actual: True\n",
+ "# [✓][test] pid: divz0.aleo, fid: ex6, expected: True, actual: True\n",
+ "# [✗][test] pid: divz0.aleo, fid: ex7, expected: False, actual: True\n",
+ "# [✓][test] pid: divz0.aleo, fid: ex8, expected: True, actual: True\n",
+ "# [✓][test] pid: divz0.aleo, fid: ex9, expected: False, actual: False\n",
+ "# [✓][test] pid: divz0.aleo, fid: ex10, expected: False, actual: False\n",
+ "# [✓][test] pid: divz0.aleo, fid: ex11, expected: True, actual: True\n",
+ "# [✓][test] pid: divz0.aleo, fid: ex12, expected: True, actual: True\n",
+ "# [✓][test] pid: divz0.aleo, fid: ex13, expected: True, actual: True\n",
+ "# [✓][test] pid: divz0.aleo, fid: ex14, expected: True, actual: True\n",
+ "# [✓][test] pid: divz0.aleo, fid: ex15, expected: True, actual: True\n",
+ "# [✓][test] pid: divz0.aleo, fid: ex16, expected: True, actual: True\n",
+ "# [✓][test] pid: divz0.aleo, fid: ex17, expected: True, actual: True\n",
+ "# [✓][test] pid: divz0.aleo, fid: ex18, expected: True, actual: True\n",
+ "# [✓][test] pid: divz0.aleo, fid: ex19, expected: True, actual: True\n",
+ "# [✗][test] pid: divz0.aleo, fid: ex20, expected: True, actual: False\n",
+ "# [✓][test] pid: divz0.aleo, fid: ex21, expected: True, actual: True\n",
+ "# [✓][test] pid: divz0.aleo, fid: ex22, expected: True, actual: True\n",
+ "# [✓][test] pid: divz0.aleo, fid: ex23, expected: True, actual: True\n",
+ "# [✓][test] pid: divz0.aleo, fid: ex24, expected: True, actual: True\n",
+ "# [✓][test] pid: divz0.aleo, fid: ex25, expected: True, actual: True\n",
+ "# [test] accuracy: 23/26 (0.8846)\n",
"# [test] confusion matrix:\n",
" actual False True \n",
"expected \n",
- "False 2 1\n",
- "True 13 9\n",
+ "False 2 2\n",
+ "True 1 21\n",
"# [test] normalized confusion matrix:\n",
" actual False True \n",
"expected \n",
- "False 0.666667 0.333333\n",
- "True 0.590909 0.409091\n"
+ "False 0.500000 0.500000\n",
+ "True 0.045455 0.954545\n"
]
}
],
"source": [
- "# r = run_test_suite(\"./tests/public/divz0/build/\", detector_divz, verbose=True)\n",
- "r = run_test_suite(\"./tests/public/infoleak0/build/\", detector_infoleak, verbose=True)\n",
+ "r = run_test_suite(\"./tests/public/divz0/build/\", detector_divz, verbose=True)\n",
+ "# r = run_test_suite(\"./tests/public/infoleak0/build/\", detector_infoleak, verbose=True)\n",
"# r = run_test_suite(\"./tests/public/rtcnst0/build/\", detector_rtcnst, verbose=True)\n",
"# r = run_test_suite(\"./tests/public/unused0/build/\", detector_unused, verbose=True)"
]
diff --git a/vanguard/aleo/common.py b/vanguard/aleo/common.py
index 4b7f7ff..dcb1826 100644
--- a/vanguard/aleo/common.py
+++ b/vanguard/aleo/common.py
@@ -1,4 +1,3 @@
-from io import StringIO
from pathlib import Path
from typing import List, Union
@@ -33,3 +32,23 @@ def aleo2json(path: Union[str, Path]):
parser = AleoParser(stream)
tree = parser.start()
return Trees.toJsonTree(tree, None, parser)
+
+def detect(build_path: Union[str, Path], pid: str=None, fids: List=None, detector: str=None, **kwargs):
+ # pid (default: main program of environment) - program id
+ # fids (default: all functions of selected program) - list of function ids
+ # detector (default: infoleak) - detector to use
+
+ # NOTE: for clarity, only one detector can be used in each call
+
+ from .grammar import AleoEnvironment
+ from . import detectors as dlib
+
+ env = AleoEnvironment(build_path)
+ _detector = getattr(dlib, "detector_infoleak") if detector is None else getattr(dlib, f"detector_{detector}")
+
+ prog = env.main if pid is None else env.programs[pid]
+ funcs = list(prog.functions.values()) if fids is None else [prog.functions[p] for p in fids]
+
+ # start detection
+ ret = [ (str(prog.id), str(fn.id)) + _detector(env, prog.id, fn.id, **kwargs) for fn in funcs ]
+ return ret
diff --git a/vanguard/aleo/detectors/divz.py b/vanguard/aleo/detectors/divz.py
index 9182d5d..14f4b02 100644
--- a/vanguard/aleo/detectors/divz.py
+++ b/vanguard/aleo/detectors/divz.py
@@ -149,6 +149,9 @@ def a(node):
return node
case AleoLiteral():
return AleoAbstractLiteral.abs(node)
+ case [*_]:
+ # collection, directly return since each element should've been visited already
+ return node
case _:
raise NotImplementedError(f"Can't wrap a non-literal, got: {node}")
diff --git a/vanguard/aleo/grammar/instructions.py b/vanguard/aleo/grammar/instructions.py
index e581de7..cf05bc6 100644
--- a/vanguard/aleo/grammar/instructions.py
+++ b/vanguard/aleo/grammar/instructions.py
@@ -14,6 +14,16 @@ def from_json(node):
return AleoSet.from_json(node[1])
case ["command", ["random", *_]]:
return AleoRandom.from_json(node[1])
+ case ["command", ["contains", *_]]:
+ return AleoContains.from_json(node[1])
+ case ["command", ["get", *_]]:
+ return AleoGet.from_json(node[1])
+ case ["command", ["get_or_use", *_]]:
+ return AleoGetOrUse.from_json(node[1])
+ case ["command", ["remove", *_]]:
+ return AleoRemove.from_json(node[1])
+ case ["command", ["xawait", *_]]:
+ return AleoAwait.from_json(node[1])
case _:
raise NotImplementedError(f"Unsupported json component, got: {node}")
@@ -52,7 +62,7 @@ class AleoRandom(AleoCommand):
@staticmethod
def from_json(node):
match node:
- case ["random", ["random_op", "rand", ".", "chacha"], *operands, "into", regacc, "as", type, ";"]:
+ case ["random", ["random_op", *_], *operands, "into", regacc, "as", type, ";"]:
_operands = [AleoOperand.from_json(p) for p in operands]
_regacc = AleoRegisterAccess.from_json(regacc)
_type = None
@@ -80,6 +90,111 @@ def __init__(self, operands, regacc, type, **kwargs):
def __str__(self):
_operands = " ".join([str(p) for p in self.operands])
return f"random.chacha {_operands} into {self.regacc} as {self.type};"
+
+class AleoContains(AleoCommand):
+
+ @staticmethod
+ def from_json(node):
+ match node:
+ case ["contains", "contains", id, "[", operand, "]", "into", regacc, ";"]:
+ _id = AleoIdentifier.from_json(id)
+ _operand = AleoOperand.from_json(operand)
+ _regacc = AleoRegisterAccess.from_json(regacc)
+ return AleoContains(_id, _operand, _regacc)
+ case _:
+ raise NotImplementedError(f"Unsupported json component, got: {node}")
+
+ def __init__(self, id, operand, regacc, **kwargs):
+ super().__init__(**kwargs)
+ self.id = id
+ self.operand = operand
+ self.regacc = regacc
+
+ def __str__(self):
+ return f"contains {self.id}[{self.operand}] into {self.regacc};"
+
+class AleoGet(AleoCommand):
+
+ @staticmethod
+ def from_json(node):
+ match node:
+ case ["get", "get", id, "[", operand, "]", "into", regacc, ";"]:
+ _id = AleoIdentifier.from_json(id)
+ _operand = AleoOperand.from_json(operand)
+ _regacc = AleoRegisterAccess.from_json(regacc)
+ return AleoGet(_id, _operand, _regacc)
+ case _:
+ raise NotImplementedError(f"Unsupported json component, got: {node}")
+
+ def __init__(self, id, operand, regacc, **kwargs):
+ super().__init__(**kwargs)
+ self.id = id
+ self.operand = operand
+ self.regacc = regacc
+
+ def __str__(self):
+ return f"get {self.id} [{self.operand}] into {self.regacc};"
+
+class AleoGetOrUse(AleoCommand):
+
+ @staticmethod
+ def from_json(node):
+ match node:
+ case ["get_or_use", ["get_or_use_op", *_], id, "[", operand, "]", default, "into", regacc, ";"]:
+ _id = AleoIdentifier.from_json(id)
+ _operand = AleoOperand.from_json(operand)
+ _default = AleoOperand.from_json(default)
+ _regacc = AleoRegisterAccess.from_json(regacc)
+ return AleoGetOrUse(_id, _operand, _default, _regacc)
+ case _:
+ raise NotImplementedError(f"Unsupported json component, got: {node}")
+
+ def __init__(self, id, operand, default, regacc):
+ self.id = id
+ self.operand = operand
+ self.default = default
+ self.regacc = regacc
+
+ def __str__(self):
+ return f"get.or_use {self.id}[{self.operand}] {self.default} into {self.regacc};"
+
+class AleoRemove(AleoCommand):
+
+ @staticmethod
+ def from_json(node):
+ match node:
+ case ["remove", "remove", id, "[", operand, "]", ";"]:
+ _id = AleoIdentifier.from_json(id)
+ _operand = AleoOperand.from_json(operand)
+ return AleoRemove(_id, _operand)
+ case _:
+ raise NotImplementedError(f"Unsupported json component, got: {node}")
+
+ def __init__(self, id, operand, **kwargs):
+ super().__init__(**kwargs)
+ self.id = id
+ self.operand = operand
+
+ def __str__(self):
+ return f"remove {self.id}[{self.operand}];"
+
+class AleoAwait(AleoCommand):
+
+ @staticmethod
+ def from_json(node):
+ match node:
+ case ["xawait", "await", regacc, ";"]:
+ _regacc = AleoRegisterAccess.from_json(regacc)
+ return AleoAwait(_regacc)
+ case _:
+ raise NotImplementedError(f"Unsupported json component, got: {node}")
+
+ def __init__(self, regacc, **kwargs):
+ super().__init__(**kwargs)
+ self.regacc = regacc
+
+ def __str__(self):
+ return f"await {self.regacc};"
class AleoInstruction(AleoCommand):
@@ -104,6 +219,8 @@ def from_json(inst):
return AleoTernary.from_json(inst[1])
case ["instruction", ["hash", *_]]:
return AleoHash.from_json(inst[1])
+ case ["instruction", ["sign_verify", *_]]:
+ return AleoSignVerify.from_json(inst[1])
case _:
raise NotImplementedError(f"Unsupported json component, got: {inst}")
@@ -165,6 +282,7 @@ def from_json(node):
raise NotImplementedError(f"Unsupported json component, got: {node}")
def __init__(self, op, operand, regacc, **kwargs):
+ super().__init__(**kwargs)
self.op = op
self.operand = operand
self.regacc = regacc
@@ -378,4 +496,25 @@ def __init__(self, op, operand, regacc, type, **kwargs):
self.type = type
def __str__(self):
- return f"{self.op} {self.operand} into {self.regacc} as {self.type}"
\ No newline at end of file
+ return f"{self.op} {self.operand} into {self.regacc} as {self.type}"
+
+class AleoSignVerify(AleoInstruction):
+
+ @staticmethod
+ def from_json(node):
+ match node:
+ case ["sign_verify", ["sign_verify_op", *_], *operands, "into", regacc, ";"]:
+ _operands = [ AleoOperand.from_json(p) for p in operands ]
+ _regacc = AleoRegisterAccess.from_json(regacc)
+ return AleoSignVerify(_operands, _regacc)
+ case _:
+ raise NotImplementedError(f"Unsupported json component, got: {node}")
+
+ def __init__(self, operands, regacc, **kwargs):
+ super().__init__(**kwargs)
+ self.operands = operands
+ self.regacc = regacc
+
+ def __str__(self):
+ _operands = " ".join([f"{p}" for p in self.operands])
+ return f"sign.verify {_operands} into {self.regacc};"
diff --git a/vanguard/aleo/grammar/misc.py b/vanguard/aleo/grammar/misc.py
index 438630d..26b8e07 100644
--- a/vanguard/aleo/grammar/misc.py
+++ b/vanguard/aleo/grammar/misc.py
@@ -269,6 +269,8 @@ def from_json(node):
return AleoLiteral.from_json(node[1])
case ["operand", ["register_access", *_]]:
return AleoRegisterAccess.from_json(node[1])
+ case ["operand", ["program_id", *_]]:
+ return AleoProgramId.from_json(node[1])
case _:
raise NotImplementedError(f"Unsupported json component, got: {node}")
diff --git a/vanguard/aleo/grammar/types.py b/vanguard/aleo/grammar/types.py
index ffd64d8..47a7fe1 100644
--- a/vanguard/aleo/grammar/types.py
+++ b/vanguard/aleo/grammar/types.py
@@ -98,6 +98,8 @@ def from_json(node):
return AleoBooleanType.from_json(node[1])
case ["literal_type", ["address_type", *_]]:
return AleoAddressType.from_json(node[1])
+ case ["literal_type", ["signature_type", *_]]:
+ return AleoSignatureType.from_json(node[1])
case _:
raise NotImplementedError(f"Unsupported json component, got: {node}")
@@ -108,7 +110,6 @@ def __init__(self, **kwargs):
def __str__(self):
raise TypeError()
-
class AleoBooleanType(AleoLiteralType):
@staticmethod
@@ -363,6 +364,11 @@ def from_json(node):
_visibility = AleoModifier.from_json(visibility)
_type.visibility = _visibility
return _type
+ case ["finalize_type", ["locator", *_], modifier]:
+ _type = AleoLocator.from_json(node[1])
+ _visibility = AleoModifier.from_json(modifier)
+ _type.visibility = modifier
+ return _type
case _:
raise NotImplementedError(f"Unsupported json component, got: {node}")
diff --git a/vanguard/aleo/graphs.py b/vanguard/aleo/graphs.py
index 83f8f09..98b52d1 100644
--- a/vanguard/aleo/graphs.py
+++ b/vanguard/aleo/graphs.py
@@ -66,6 +66,16 @@ def get_dfg_edges(env: AleoEnvironment, pid: str, fid: str, hash=True, call=Fals
# only consider non-literal
edges.append((p, inst.regacc))
+ case AleoAssert():
+ # no data flow
+ pass
+
+ case AleoSignVerify():
+ for p in inst.operands:
+ if not isinstance(p, AleoLiteral):
+ # only consider non-literal
+ edges.append((p, inst.regacc))
+
case _:
raise NotImplementedError(f"Unsupported instruction, got: {inst}, type: {type(inst)}")
diff --git a/vanguard/aleo/parser/AleoParser.g4 b/vanguard/aleo/parser/AleoParser.g4
index 16d073f..76fa5b6 100644
--- a/vanguard/aleo/parser/AleoParser.g4
+++ b/vanguard/aleo/parser/AleoParser.g4
@@ -19,7 +19,7 @@ closure_output : OUTPUT operand AS register_type SC ;
function : FUNCTION identifier CL function_input* instruction* function_output* finalize? ;
function_input : INPUT register AS value_type SC ;
function_output : OUTPUT operand AS value_type SC ;
-finalize : FINALIZE identifier CL finalize_input* command+ ;
+finalize : FINALIZE identifier CL finalize_input* command* ;
finalize_input : INPUT register AS finalize_type SC ;
// instructions
diff --git a/vanguard/aleo/parser/AleoParser.interp b/vanguard/aleo/parser/AleoParser.interp
index 41366a6..e4c9235 100644
--- a/vanguard/aleo/parser/AleoParser.interp
+++ b/vanguard/aleo/parser/AleoParser.interp
@@ -345,4 +345,4 @@ identifier
atn:
-[4, 1, 119, 895, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 1, 0, 1, 0, 1, 1, 5, 1, 202, 8, 1, 10, 1, 12, 1, 205, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 215, 8, 1, 11, 1, 12, 1, 216, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 4, 6, 243, 8, 6, 11, 6, 12, 6, 244, 1, 7, 1, 7, 1, 7, 1, 7, 5, 7, 251, 8, 7, 10, 7, 12, 7, 254, 9, 7, 1, 8, 1, 8, 1, 8, 1, 8, 5, 8, 260, 8, 8, 10, 8, 12, 8, 263, 9, 8, 1, 8, 4, 8, 266, 8, 8, 11, 8, 12, 8, 267, 1, 8, 5, 8, 271, 8, 8, 10, 8, 12, 8, 274, 9, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 292, 8, 11, 10, 11, 12, 11, 295, 9, 11, 1, 11, 5, 11, 298, 8, 11, 10, 11, 12, 11, 301, 9, 11, 1, 11, 5, 11, 304, 8, 11, 10, 11, 12, 11, 307, 9, 11, 1, 11, 3, 11, 310, 8, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 5, 14, 328, 8, 14, 10, 14, 12, 14, 331, 9, 14, 1, 14, 4, 14, 334, 8, 14, 11, 14, 12, 14, 335, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 3, 16, 354, 8, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 5, 22, 402, 8, 22, 10, 22, 12, 22, 405, 9, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 414, 8, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 444, 8, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 488, 8, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 502, 8, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 3, 34, 517, 8, 34, 1, 34, 1, 34, 1, 35, 1, 35, 3, 35, 523, 8, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 4, 37, 535, 8, 37, 11, 37, 12, 37, 536, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 3, 38, 548, 8, 38, 1, 38, 5, 38, 551, 8, 38, 10, 38, 12, 38, 554, 9, 38, 1, 38, 1, 38, 4, 38, 558, 8, 38, 11, 38, 12, 38, 559, 3, 38, 562, 8, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 5, 39, 569, 8, 39, 10, 39, 12, 39, 572, 9, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 582, 8, 40, 1, 41, 3, 41, 585, 8, 41, 1, 41, 1, 41, 1, 41, 1, 42, 3, 42, 591, 8, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 3, 43, 598, 8, 43, 1, 44, 3, 44, 601, 8, 44, 1, 44, 1, 44, 1, 44, 1, 45, 3, 45, 607, 8, 45, 1, 45, 1, 45, 1, 45, 1, 46, 3, 46, 613, 8, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 622, 8, 47, 1, 48, 1, 48, 1, 49, 1, 49, 1, 50, 1, 50, 1, 51, 1, 51, 1, 52, 1, 52, 1, 53, 1, 53, 3, 53, 636, 8, 53, 1, 54, 1, 54, 1, 55, 1, 55, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 3, 57, 648, 8, 57, 1, 58, 1, 58, 1, 59, 1, 59, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 3, 61, 660, 8, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 3, 63, 671, 8, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 3, 64, 682, 8, 64, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 3, 66, 693, 8, 66, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 3, 68, 705, 8, 68, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 72, 1, 72, 1, 73, 1, 73, 1, 74, 1, 74, 5, 74, 722, 8, 74, 10, 74, 12, 74, 725, 9, 74, 1, 75, 1, 75, 3, 75, 729, 8, 75, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 3, 77, 741, 8, 77, 1, 78, 1, 78, 1, 78, 1, 78, 3, 78, 747, 8, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 3, 79, 758, 8, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 3, 83, 777, 8, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 3, 85, 786, 8, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 3, 85, 794, 8, 85, 1, 86, 1, 86, 1, 86, 3, 86, 799, 8, 86, 1, 86, 1, 86, 1, 86, 3, 86, 804, 8, 86, 1, 86, 1, 86, 1, 86, 3, 86, 809, 8, 86, 1, 86, 1, 86, 1, 86, 3, 86, 814, 8, 86, 1, 86, 1, 86, 1, 86, 3, 86, 819, 8, 86, 1, 86, 1, 86, 1, 86, 3, 86, 824, 8, 86, 1, 86, 1, 86, 1, 86, 3, 86, 829, 8, 86, 1, 86, 1, 86, 1, 86, 3, 86, 834, 8, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 3, 86, 846, 8, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 3, 92, 871, 8, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 96, 3, 96, 889, 8, 96, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 0, 0, 99, 0, 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, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 0, 9, 1, 0, 103, 104, 1, 0, 12, 16, 1, 0, 20, 21, 1, 0, 25, 26, 1, 0, 68, 69, 1, 0, 74, 79, 1, 0, 74, 88, 1, 0, 80, 82, 2, 0, 9, 113, 115, 116, 922, 0, 198, 1, 0, 0, 0, 2, 203, 1, 0, 0, 0, 4, 218, 1, 0, 0, 0, 6, 222, 1, 0, 0, 0, 8, 228, 1, 0, 0, 0, 10, 233, 1, 0, 0, 0, 12, 238, 1, 0, 0, 0, 14, 246, 1, 0, 0, 0, 16, 255, 1, 0, 0, 0, 18, 275, 1, 0, 0, 0, 20, 281, 1, 0, 0, 0, 22, 287, 1, 0, 0, 0, 24, 311, 1, 0, 0, 0, 26, 317, 1, 0, 0, 0, 28, 323, 1, 0, 0, 0, 30, 337, 1, 0, 0, 0, 32, 353, 1, 0, 0, 0, 34, 355, 1, 0, 0, 0, 36, 364, 1, 0, 0, 0, 38, 373, 1, 0, 0, 0, 40, 383, 1, 0, 0, 0, 42, 392, 1, 0, 0, 0, 44, 399, 1, 0, 0, 0, 46, 417, 1, 0, 0, 0, 48, 421, 1, 0, 0, 0, 50, 428, 1, 0, 0, 0, 52, 443, 1, 0, 0, 0, 54, 445, 1, 0, 0, 0, 56, 451, 1, 0, 0, 0, 58, 458, 1, 0, 0, 0, 60, 466, 1, 0, 0, 0, 62, 473, 1, 0, 0, 0, 64, 478, 1, 0, 0, 0, 66, 491, 1, 0, 0, 0, 68, 505, 1, 0, 0, 0, 70, 522, 1, 0, 0, 0, 72, 524, 1, 0, 0, 0, 74, 532, 1, 0, 0, 0, 76, 544, 1, 0, 0, 0, 78, 565, 1, 0, 0, 0, 80, 581, 1, 0, 0, 0, 82, 584, 1, 0, 0, 0, 84, 590, 1, 0, 0, 0, 86, 597, 1, 0, 0, 0, 88, 600, 1, 0, 0, 0, 90, 606, 1, 0, 0, 0, 92, 612, 1, 0, 0, 0, 94, 621, 1, 0, 0, 0, 96, 623, 1, 0, 0, 0, 98, 625, 1, 0, 0, 0, 100, 627, 1, 0, 0, 0, 102, 629, 1, 0, 0, 0, 104, 631, 1, 0, 0, 0, 106, 635, 1, 0, 0, 0, 108, 637, 1, 0, 0, 0, 110, 639, 1, 0, 0, 0, 112, 641, 1, 0, 0, 0, 114, 647, 1, 0, 0, 0, 116, 649, 1, 0, 0, 0, 118, 651, 1, 0, 0, 0, 120, 653, 1, 0, 0, 0, 122, 659, 1, 0, 0, 0, 124, 661, 1, 0, 0, 0, 126, 670, 1, 0, 0, 0, 128, 681, 1, 0, 0, 0, 130, 683, 1, 0, 0, 0, 132, 692, 1, 0, 0, 0, 134, 694, 1, 0, 0, 0, 136, 704, 1, 0, 0, 0, 138, 706, 1, 0, 0, 0, 140, 709, 1, 0, 0, 0, 142, 713, 1, 0, 0, 0, 144, 715, 1, 0, 0, 0, 146, 717, 1, 0, 0, 0, 148, 719, 1, 0, 0, 0, 150, 728, 1, 0, 0, 0, 152, 730, 1, 0, 0, 0, 154, 740, 1, 0, 0, 0, 156, 746, 1, 0, 0, 0, 158, 757, 1, 0, 0, 0, 160, 759, 1, 0, 0, 0, 162, 764, 1, 0, 0, 0, 164, 769, 1, 0, 0, 0, 166, 776, 1, 0, 0, 0, 168, 778, 1, 0, 0, 0, 170, 793, 1, 0, 0, 0, 172, 845, 1, 0, 0, 0, 174, 847, 1, 0, 0, 0, 176, 851, 1, 0, 0, 0, 178, 855, 1, 0, 0, 0, 180, 859, 1, 0, 0, 0, 182, 863, 1, 0, 0, 0, 184, 867, 1, 0, 0, 0, 186, 872, 1, 0, 0, 0, 188, 876, 1, 0, 0, 0, 190, 880, 1, 0, 0, 0, 192, 888, 1, 0, 0, 0, 194, 890, 1, 0, 0, 0, 196, 892, 1, 0, 0, 0, 198, 199, 3, 2, 1, 0, 199, 1, 1, 0, 0, 0, 200, 202, 3, 4, 2, 0, 201, 200, 1, 0, 0, 0, 202, 205, 1, 0, 0, 0, 203, 201, 1, 0, 0, 0, 203, 204, 1, 0, 0, 0, 204, 206, 1, 0, 0, 0, 205, 203, 1, 0, 0, 0, 206, 207, 5, 92, 0, 0, 207, 208, 3, 140, 70, 0, 208, 214, 5, 5, 0, 0, 209, 215, 3, 6, 3, 0, 210, 215, 3, 12, 6, 0, 211, 215, 3, 14, 7, 0, 212, 215, 3, 16, 8, 0, 213, 215, 3, 22, 11, 0, 214, 209, 1, 0, 0, 0, 214, 210, 1, 0, 0, 0, 214, 211, 1, 0, 0, 0, 214, 212, 1, 0, 0, 0, 214, 213, 1, 0, 0, 0, 215, 216, 1, 0, 0, 0, 216, 214, 1, 0, 0, 0, 216, 217, 1, 0, 0, 0, 217, 3, 1, 0, 0, 0, 218, 219, 5, 93, 0, 0, 219, 220, 3, 140, 70, 0, 220, 221, 5, 5, 0, 0, 221, 5, 1, 0, 0, 0, 222, 223, 5, 94, 0, 0, 223, 224, 3, 196, 98, 0, 224, 225, 5, 7, 0, 0, 225, 226, 3, 8, 4, 0, 226, 227, 3, 10, 5, 0, 227, 7, 1, 0, 0, 0, 228, 229, 5, 95, 0, 0, 229, 230, 5, 9, 0, 0, 230, 231, 3, 130, 65, 0, 231, 232, 5, 5, 0, 0, 232, 9, 1, 0, 0, 0, 233, 234, 5, 96, 0, 0, 234, 235, 5, 9, 0, 0, 235, 236, 3, 130, 65, 0, 236, 237, 5, 5, 0, 0, 237, 11, 1, 0, 0, 0, 238, 239, 5, 97, 0, 0, 239, 240, 3, 196, 98, 0, 240, 242, 5, 7, 0, 0, 241, 243, 3, 160, 80, 0, 242, 241, 1, 0, 0, 0, 243, 244, 1, 0, 0, 0, 244, 242, 1, 0, 0, 0, 244, 245, 1, 0, 0, 0, 245, 13, 1, 0, 0, 0, 246, 247, 5, 16, 0, 0, 247, 248, 3, 196, 98, 0, 248, 252, 5, 7, 0, 0, 249, 251, 3, 162, 81, 0, 250, 249, 1, 0, 0, 0, 251, 254, 1, 0, 0, 0, 252, 250, 1, 0, 0, 0, 252, 253, 1, 0, 0, 0, 253, 15, 1, 0, 0, 0, 254, 252, 1, 0, 0, 0, 255, 256, 5, 98, 0, 0, 256, 257, 3, 196, 98, 0, 257, 261, 5, 7, 0, 0, 258, 260, 3, 18, 9, 0, 259, 258, 1, 0, 0, 0, 260, 263, 1, 0, 0, 0, 261, 259, 1, 0, 0, 0, 261, 262, 1, 0, 0, 0, 262, 265, 1, 0, 0, 0, 263, 261, 1, 0, 0, 0, 264, 266, 3, 52, 26, 0, 265, 264, 1, 0, 0, 0, 266, 267, 1, 0, 0, 0, 267, 265, 1, 0, 0, 0, 267, 268, 1, 0, 0, 0, 268, 272, 1, 0, 0, 0, 269, 271, 3, 20, 10, 0, 270, 269, 1, 0, 0, 0, 271, 274, 1, 0, 0, 0, 272, 270, 1, 0, 0, 0, 272, 273, 1, 0, 0, 0, 273, 17, 1, 0, 0, 0, 274, 272, 1, 0, 0, 0, 275, 276, 5, 99, 0, 0, 276, 277, 3, 146, 73, 0, 277, 278, 5, 9, 0, 0, 278, 279, 3, 136, 68, 0, 279, 280, 5, 5, 0, 0, 280, 19, 1, 0, 0, 0, 281, 282, 5, 100, 0, 0, 282, 283, 3, 156, 78, 0, 283, 284, 5, 9, 0, 0, 284, 285, 3, 136, 68, 0, 285, 286, 5, 5, 0, 0, 286, 21, 1, 0, 0, 0, 287, 288, 5, 101, 0, 0, 288, 289, 3, 196, 98, 0, 289, 293, 5, 7, 0, 0, 290, 292, 3, 24, 12, 0, 291, 290, 1, 0, 0, 0, 292, 295, 1, 0, 0, 0, 293, 291, 1, 0, 0, 0, 293, 294, 1, 0, 0, 0, 294, 299, 1, 0, 0, 0, 295, 293, 1, 0, 0, 0, 296, 298, 3, 52, 26, 0, 297, 296, 1, 0, 0, 0, 298, 301, 1, 0, 0, 0, 299, 297, 1, 0, 0, 0, 299, 300, 1, 0, 0, 0, 300, 305, 1, 0, 0, 0, 301, 299, 1, 0, 0, 0, 302, 304, 3, 26, 13, 0, 303, 302, 1, 0, 0, 0, 304, 307, 1, 0, 0, 0, 305, 303, 1, 0, 0, 0, 305, 306, 1, 0, 0, 0, 306, 309, 1, 0, 0, 0, 307, 305, 1, 0, 0, 0, 308, 310, 3, 28, 14, 0, 309, 308, 1, 0, 0, 0, 309, 310, 1, 0, 0, 0, 310, 23, 1, 0, 0, 0, 311, 312, 5, 99, 0, 0, 312, 313, 3, 146, 73, 0, 313, 314, 5, 9, 0, 0, 314, 315, 3, 128, 64, 0, 315, 316, 5, 5, 0, 0, 316, 25, 1, 0, 0, 0, 317, 318, 5, 100, 0, 0, 318, 319, 3, 156, 78, 0, 319, 320, 5, 9, 0, 0, 320, 321, 3, 128, 64, 0, 321, 322, 5, 5, 0, 0, 322, 27, 1, 0, 0, 0, 323, 324, 5, 102, 0, 0, 324, 325, 3, 196, 98, 0, 325, 329, 5, 7, 0, 0, 326, 328, 3, 30, 15, 0, 327, 326, 1, 0, 0, 0, 328, 331, 1, 0, 0, 0, 329, 327, 1, 0, 0, 0, 329, 330, 1, 0, 0, 0, 330, 333, 1, 0, 0, 0, 331, 329, 1, 0, 0, 0, 332, 334, 3, 32, 16, 0, 333, 332, 1, 0, 0, 0, 334, 335, 1, 0, 0, 0, 335, 333, 1, 0, 0, 0, 335, 336, 1, 0, 0, 0, 336, 29, 1, 0, 0, 0, 337, 338, 5, 99, 0, 0, 338, 339, 3, 146, 73, 0, 339, 340, 5, 9, 0, 0, 340, 341, 3, 132, 66, 0, 341, 342, 5, 5, 0, 0, 342, 31, 1, 0, 0, 0, 343, 354, 3, 34, 17, 0, 344, 354, 3, 36, 18, 0, 345, 354, 3, 38, 19, 0, 346, 354, 3, 40, 20, 0, 347, 354, 3, 42, 21, 0, 348, 354, 3, 44, 22, 0, 349, 354, 3, 46, 23, 0, 350, 354, 3, 48, 24, 0, 351, 354, 3, 50, 25, 0, 352, 354, 3, 52, 26, 0, 353, 343, 1, 0, 0, 0, 353, 344, 1, 0, 0, 0, 353, 345, 1, 0, 0, 0, 353, 346, 1, 0, 0, 0, 353, 347, 1, 0, 0, 0, 353, 348, 1, 0, 0, 0, 353, 349, 1, 0, 0, 0, 353, 350, 1, 0, 0, 0, 353, 351, 1, 0, 0, 0, 353, 352, 1, 0, 0, 0, 354, 33, 1, 0, 0, 0, 355, 356, 5, 27, 0, 0, 356, 357, 3, 196, 98, 0, 357, 358, 5, 3, 0, 0, 358, 359, 3, 156, 78, 0, 359, 360, 5, 4, 0, 0, 360, 361, 5, 10, 0, 0, 361, 362, 3, 148, 74, 0, 362, 363, 5, 5, 0, 0, 363, 35, 1, 0, 0, 0, 364, 365, 5, 28, 0, 0, 365, 366, 3, 196, 98, 0, 366, 367, 5, 3, 0, 0, 367, 368, 3, 156, 78, 0, 368, 369, 5, 4, 0, 0, 369, 370, 5, 10, 0, 0, 370, 371, 3, 148, 74, 0, 371, 372, 5, 5, 0, 0, 372, 37, 1, 0, 0, 0, 373, 374, 3, 190, 95, 0, 374, 375, 3, 196, 98, 0, 375, 376, 5, 3, 0, 0, 376, 377, 3, 156, 78, 0, 377, 378, 5, 4, 0, 0, 378, 379, 3, 156, 78, 0, 379, 380, 5, 10, 0, 0, 380, 381, 3, 148, 74, 0, 381, 382, 5, 5, 0, 0, 382, 39, 1, 0, 0, 0, 383, 384, 5, 30, 0, 0, 384, 385, 3, 156, 78, 0, 385, 386, 5, 10, 0, 0, 386, 387, 3, 196, 98, 0, 387, 388, 5, 3, 0, 0, 388, 389, 3, 156, 78, 0, 389, 390, 5, 4, 0, 0, 390, 391, 5, 5, 0, 0, 391, 41, 1, 0, 0, 0, 392, 393, 5, 31, 0, 0, 393, 394, 3, 196, 98, 0, 394, 395, 5, 3, 0, 0, 395, 396, 3, 156, 78, 0, 396, 397, 5, 4, 0, 0, 397, 398, 5, 5, 0, 0, 398, 43, 1, 0, 0, 0, 399, 403, 3, 188, 94, 0, 400, 402, 3, 156, 78, 0, 401, 400, 1, 0, 0, 0, 402, 405, 1, 0, 0, 0, 403, 401, 1, 0, 0, 0, 403, 404, 1, 0, 0, 0, 404, 406, 1, 0, 0, 0, 405, 403, 1, 0, 0, 0, 406, 407, 5, 10, 0, 0, 407, 408, 3, 148, 74, 0, 408, 413, 5, 9, 0, 0, 409, 414, 3, 114, 57, 0, 410, 414, 3, 116, 58, 0, 411, 414, 3, 120, 60, 0, 412, 414, 3, 118, 59, 0, 413, 409, 1, 0, 0, 0, 413, 410, 1, 0, 0, 0, 413, 411, 1, 0, 0, 0, 413, 412, 1, 0, 0, 0, 414, 415, 1, 0, 0, 0, 415, 416, 5, 5, 0, 0, 416, 45, 1, 0, 0, 0, 417, 418, 5, 34, 0, 0, 418, 419, 3, 194, 97, 0, 419, 420, 5, 5, 0, 0, 420, 47, 1, 0, 0, 0, 421, 422, 3, 186, 93, 0, 422, 423, 3, 156, 78, 0, 423, 424, 3, 156, 78, 0, 424, 425, 5, 11, 0, 0, 425, 426, 3, 194, 97, 0, 426, 427, 5, 5, 0, 0, 427, 49, 1, 0, 0, 0, 428, 429, 5, 35, 0, 0, 429, 430, 3, 148, 74, 0, 430, 431, 5, 5, 0, 0, 431, 51, 1, 0, 0, 0, 432, 444, 3, 54, 27, 0, 433, 444, 3, 56, 28, 0, 434, 444, 3, 58, 29, 0, 435, 444, 3, 60, 30, 0, 436, 444, 3, 62, 31, 0, 437, 444, 3, 64, 32, 0, 438, 444, 3, 70, 35, 0, 439, 444, 3, 72, 36, 0, 440, 444, 3, 74, 37, 0, 441, 444, 3, 76, 38, 0, 442, 444, 3, 78, 39, 0, 443, 432, 1, 0, 0, 0, 443, 433, 1, 0, 0, 0, 443, 434, 1, 0, 0, 0, 443, 435, 1, 0, 0, 0, 443, 436, 1, 0, 0, 0, 443, 437, 1, 0, 0, 0, 443, 438, 1, 0, 0, 0, 443, 439, 1, 0, 0, 0, 443, 440, 1, 0, 0, 0, 443, 441, 1, 0, 0, 0, 443, 442, 1, 0, 0, 0, 444, 53, 1, 0, 0, 0, 445, 446, 3, 170, 85, 0, 446, 447, 3, 156, 78, 0, 447, 448, 5, 10, 0, 0, 448, 449, 3, 148, 74, 0, 449, 450, 5, 5, 0, 0, 450, 55, 1, 0, 0, 0, 451, 452, 3, 172, 86, 0, 452, 453, 3, 156, 78, 0, 453, 454, 3, 156, 78, 0, 454, 455, 5, 10, 0, 0, 455, 456, 3, 148, 74, 0, 456, 457, 5, 5, 0, 0, 457, 57, 1, 0, 0, 0, 458, 459, 5, 36, 0, 0, 459, 460, 3, 156, 78, 0, 460, 461, 3, 156, 78, 0, 461, 462, 3, 156, 78, 0, 462, 463, 5, 10, 0, 0, 463, 464, 3, 148, 74, 0, 464, 465, 5, 5, 0, 0, 465, 59, 1, 0, 0, 0, 466, 467, 3, 174, 87, 0, 467, 468, 3, 156, 78, 0, 468, 469, 3, 156, 78, 0, 469, 470, 5, 10, 0, 0, 470, 471, 3, 148, 74, 0, 471, 472, 5, 5, 0, 0, 472, 61, 1, 0, 0, 0, 473, 474, 3, 176, 88, 0, 474, 475, 3, 156, 78, 0, 475, 476, 3, 156, 78, 0, 476, 477, 5, 5, 0, 0, 477, 63, 1, 0, 0, 0, 478, 479, 3, 178, 89, 0, 479, 480, 3, 156, 78, 0, 480, 481, 3, 156, 78, 0, 481, 482, 5, 10, 0, 0, 482, 483, 3, 148, 74, 0, 483, 487, 5, 9, 0, 0, 484, 488, 3, 116, 58, 0, 485, 488, 3, 108, 54, 0, 486, 488, 3, 110, 55, 0, 487, 484, 1, 0, 0, 0, 487, 485, 1, 0, 0, 0, 487, 486, 1, 0, 0, 0, 488, 489, 1, 0, 0, 0, 489, 490, 5, 5, 0, 0, 490, 65, 1, 0, 0, 0, 491, 492, 3, 180, 90, 0, 492, 493, 3, 156, 78, 0, 493, 494, 5, 10, 0, 0, 494, 495, 3, 148, 74, 0, 495, 501, 5, 9, 0, 0, 496, 502, 3, 114, 57, 0, 497, 502, 3, 116, 58, 0, 498, 502, 3, 120, 60, 0, 499, 502, 3, 124, 62, 0, 500, 502, 3, 196, 98, 0, 501, 496, 1, 0, 0, 0, 501, 497, 1, 0, 0, 0, 501, 498, 1, 0, 0, 0, 501, 499, 1, 0, 0, 0, 501, 500, 1, 0, 0, 0, 502, 503, 1, 0, 0, 0, 503, 504, 5, 5, 0, 0, 504, 67, 1, 0, 0, 0, 505, 506, 3, 182, 91, 0, 506, 507, 3, 156, 78, 0, 507, 508, 3, 156, 78, 0, 508, 509, 5, 10, 0, 0, 509, 510, 3, 148, 74, 0, 510, 516, 5, 9, 0, 0, 511, 517, 3, 114, 57, 0, 512, 517, 3, 116, 58, 0, 513, 517, 3, 120, 60, 0, 514, 517, 3, 124, 62, 0, 515, 517, 3, 196, 98, 0, 516, 511, 1, 0, 0, 0, 516, 512, 1, 0, 0, 0, 516, 513, 1, 0, 0, 0, 516, 514, 1, 0, 0, 0, 516, 515, 1, 0, 0, 0, 517, 518, 1, 0, 0, 0, 518, 519, 5, 5, 0, 0, 519, 69, 1, 0, 0, 0, 520, 523, 3, 66, 33, 0, 521, 523, 3, 68, 34, 0, 522, 520, 1, 0, 0, 0, 522, 521, 1, 0, 0, 0, 523, 71, 1, 0, 0, 0, 524, 525, 3, 192, 96, 0, 525, 526, 3, 156, 78, 0, 526, 527, 3, 156, 78, 0, 527, 528, 3, 156, 78, 0, 528, 529, 5, 10, 0, 0, 529, 530, 3, 148, 74, 0, 530, 531, 5, 5, 0, 0, 531, 73, 1, 0, 0, 0, 532, 534, 3, 184, 92, 0, 533, 535, 3, 156, 78, 0, 534, 533, 1, 0, 0, 0, 535, 536, 1, 0, 0, 0, 536, 534, 1, 0, 0, 0, 536, 537, 1, 0, 0, 0, 537, 538, 1, 0, 0, 0, 538, 539, 5, 10, 0, 0, 539, 540, 3, 148, 74, 0, 540, 541, 5, 9, 0, 0, 541, 542, 3, 166, 83, 0, 542, 543, 5, 5, 0, 0, 543, 75, 1, 0, 0, 0, 544, 547, 5, 40, 0, 0, 545, 548, 3, 164, 82, 0, 546, 548, 3, 196, 98, 0, 547, 545, 1, 0, 0, 0, 547, 546, 1, 0, 0, 0, 548, 552, 1, 0, 0, 0, 549, 551, 3, 156, 78, 0, 550, 549, 1, 0, 0, 0, 551, 554, 1, 0, 0, 0, 552, 550, 1, 0, 0, 0, 552, 553, 1, 0, 0, 0, 553, 561, 1, 0, 0, 0, 554, 552, 1, 0, 0, 0, 555, 557, 5, 10, 0, 0, 556, 558, 3, 148, 74, 0, 557, 556, 1, 0, 0, 0, 558, 559, 1, 0, 0, 0, 559, 557, 1, 0, 0, 0, 559, 560, 1, 0, 0, 0, 560, 562, 1, 0, 0, 0, 561, 555, 1, 0, 0, 0, 561, 562, 1, 0, 0, 0, 562, 563, 1, 0, 0, 0, 563, 564, 5, 5, 0, 0, 564, 77, 1, 0, 0, 0, 565, 566, 5, 41, 0, 0, 566, 570, 3, 196, 98, 0, 567, 569, 3, 156, 78, 0, 568, 567, 1, 0, 0, 0, 569, 572, 1, 0, 0, 0, 570, 568, 1, 0, 0, 0, 570, 571, 1, 0, 0, 0, 571, 573, 1, 0, 0, 0, 572, 570, 1, 0, 0, 0, 573, 574, 5, 10, 0, 0, 574, 575, 3, 148, 74, 0, 575, 576, 5, 5, 0, 0, 576, 79, 1, 0, 0, 0, 577, 582, 3, 94, 47, 0, 578, 582, 3, 96, 48, 0, 579, 582, 3, 98, 49, 0, 580, 582, 3, 100, 50, 0, 581, 577, 1, 0, 0, 0, 581, 578, 1, 0, 0, 0, 581, 579, 1, 0, 0, 0, 581, 580, 1, 0, 0, 0, 582, 81, 1, 0, 0, 0, 583, 585, 5, 8, 0, 0, 584, 583, 1, 0, 0, 0, 584, 585, 1, 0, 0, 0, 585, 586, 1, 0, 0, 0, 586, 587, 5, 114, 0, 0, 587, 588, 3, 104, 52, 0, 588, 83, 1, 0, 0, 0, 589, 591, 5, 8, 0, 0, 590, 589, 1, 0, 0, 0, 590, 591, 1, 0, 0, 0, 591, 592, 1, 0, 0, 0, 592, 593, 5, 114, 0, 0, 593, 594, 3, 102, 51, 0, 594, 85, 1, 0, 0, 0, 595, 598, 3, 82, 41, 0, 596, 598, 3, 84, 42, 0, 597, 595, 1, 0, 0, 0, 597, 596, 1, 0, 0, 0, 598, 87, 1, 0, 0, 0, 599, 601, 5, 8, 0, 0, 600, 599, 1, 0, 0, 0, 600, 601, 1, 0, 0, 0, 601, 602, 1, 0, 0, 0, 602, 603, 5, 114, 0, 0, 603, 604, 3, 108, 54, 0, 604, 89, 1, 0, 0, 0, 605, 607, 5, 8, 0, 0, 606, 605, 1, 0, 0, 0, 606, 607, 1, 0, 0, 0, 607, 608, 1, 0, 0, 0, 608, 609, 5, 114, 0, 0, 609, 610, 3, 110, 55, 0, 610, 91, 1, 0, 0, 0, 611, 613, 5, 8, 0, 0, 612, 611, 1, 0, 0, 0, 612, 613, 1, 0, 0, 0, 613, 614, 1, 0, 0, 0, 614, 615, 5, 114, 0, 0, 615, 616, 3, 112, 56, 0, 616, 93, 1, 0, 0, 0, 617, 622, 3, 86, 43, 0, 618, 622, 3, 88, 44, 0, 619, 622, 3, 90, 45, 0, 620, 622, 3, 92, 46, 0, 621, 617, 1, 0, 0, 0, 621, 618, 1, 0, 0, 0, 621, 619, 1, 0, 0, 0, 621, 620, 1, 0, 0, 0, 622, 95, 1, 0, 0, 0, 623, 624, 5, 112, 0, 0, 624, 97, 1, 0, 0, 0, 625, 626, 5, 113, 0, 0, 626, 99, 1, 0, 0, 0, 627, 628, 7, 0, 0, 0, 628, 101, 1, 0, 0, 0, 629, 630, 5, 105, 0, 0, 630, 103, 1, 0, 0, 0, 631, 632, 5, 106, 0, 0, 632, 105, 1, 0, 0, 0, 633, 636, 3, 102, 51, 0, 634, 636, 3, 104, 52, 0, 635, 633, 1, 0, 0, 0, 635, 634, 1, 0, 0, 0, 636, 107, 1, 0, 0, 0, 637, 638, 5, 107, 0, 0, 638, 109, 1, 0, 0, 0, 639, 640, 5, 17, 0, 0, 640, 111, 1, 0, 0, 0, 641, 642, 5, 108, 0, 0, 642, 113, 1, 0, 0, 0, 643, 648, 3, 106, 53, 0, 644, 648, 3, 108, 54, 0, 645, 648, 3, 110, 55, 0, 646, 648, 3, 112, 56, 0, 647, 643, 1, 0, 0, 0, 647, 644, 1, 0, 0, 0, 647, 645, 1, 0, 0, 0, 647, 646, 1, 0, 0, 0, 648, 115, 1, 0, 0, 0, 649, 650, 5, 109, 0, 0, 650, 117, 1, 0, 0, 0, 651, 652, 5, 110, 0, 0, 652, 119, 1, 0, 0, 0, 653, 654, 5, 111, 0, 0, 654, 121, 1, 0, 0, 0, 655, 660, 3, 114, 57, 0, 656, 660, 3, 116, 58, 0, 657, 660, 3, 120, 60, 0, 658, 660, 3, 118, 59, 0, 659, 655, 1, 0, 0, 0, 659, 656, 1, 0, 0, 0, 659, 657, 1, 0, 0, 0, 659, 658, 1, 0, 0, 0, 660, 123, 1, 0, 0, 0, 661, 662, 5, 3, 0, 0, 662, 663, 3, 126, 63, 0, 663, 664, 5, 5, 0, 0, 664, 665, 3, 84, 42, 0, 665, 666, 5, 4, 0, 0, 666, 125, 1, 0, 0, 0, 667, 671, 3, 122, 61, 0, 668, 671, 3, 124, 62, 0, 669, 671, 3, 196, 98, 0, 670, 667, 1, 0, 0, 0, 670, 668, 1, 0, 0, 0, 670, 669, 1, 0, 0, 0, 671, 127, 1, 0, 0, 0, 672, 673, 3, 126, 63, 0, 673, 674, 3, 138, 69, 0, 674, 682, 1, 0, 0, 0, 675, 676, 3, 196, 98, 0, 676, 677, 3, 138, 69, 0, 677, 682, 1, 0, 0, 0, 678, 679, 3, 164, 82, 0, 679, 680, 3, 138, 69, 0, 680, 682, 1, 0, 0, 0, 681, 672, 1, 0, 0, 0, 681, 675, 1, 0, 0, 0, 681, 678, 1, 0, 0, 0, 682, 129, 1, 0, 0, 0, 683, 684, 3, 126, 63, 0, 684, 685, 3, 138, 69, 0, 685, 131, 1, 0, 0, 0, 686, 687, 3, 126, 63, 0, 687, 688, 3, 138, 69, 0, 688, 693, 1, 0, 0, 0, 689, 690, 3, 164, 82, 0, 690, 691, 3, 138, 69, 0, 691, 693, 1, 0, 0, 0, 692, 686, 1, 0, 0, 0, 692, 689, 1, 0, 0, 0, 693, 133, 1, 0, 0, 0, 694, 695, 3, 126, 63, 0, 695, 696, 3, 138, 69, 0, 696, 135, 1, 0, 0, 0, 697, 698, 3, 164, 82, 0, 698, 699, 3, 138, 69, 0, 699, 705, 1, 0, 0, 0, 700, 701, 3, 196, 98, 0, 701, 702, 3, 138, 69, 0, 702, 705, 1, 0, 0, 0, 703, 705, 3, 126, 63, 0, 704, 697, 1, 0, 0, 0, 704, 700, 1, 0, 0, 0, 704, 703, 1, 0, 0, 0, 705, 137, 1, 0, 0, 0, 706, 707, 5, 1, 0, 0, 707, 708, 7, 1, 0, 0, 708, 139, 1, 0, 0, 0, 709, 710, 3, 142, 71, 0, 710, 711, 5, 1, 0, 0, 711, 712, 3, 144, 72, 0, 712, 141, 1, 0, 0, 0, 713, 714, 3, 196, 98, 0, 714, 143, 1, 0, 0, 0, 715, 716, 3, 196, 98, 0, 716, 145, 1, 0, 0, 0, 717, 718, 5, 115, 0, 0, 718, 147, 1, 0, 0, 0, 719, 723, 3, 146, 73, 0, 720, 722, 3, 150, 75, 0, 721, 720, 1, 0, 0, 0, 722, 725, 1, 0, 0, 0, 723, 721, 1, 0, 0, 0, 723, 724, 1, 0, 0, 0, 724, 149, 1, 0, 0, 0, 725, 723, 1, 0, 0, 0, 726, 729, 3, 152, 76, 0, 727, 729, 3, 154, 77, 0, 728, 726, 1, 0, 0, 0, 728, 727, 1, 0, 0, 0, 729, 151, 1, 0, 0, 0, 730, 731, 5, 1, 0, 0, 731, 732, 3, 196, 98, 0, 732, 153, 1, 0, 0, 0, 733, 734, 5, 3, 0, 0, 734, 735, 3, 84, 42, 0, 735, 736, 5, 4, 0, 0, 736, 741, 1, 0, 0, 0, 737, 738, 5, 3, 0, 0, 738, 739, 5, 114, 0, 0, 739, 741, 5, 4, 0, 0, 740, 733, 1, 0, 0, 0, 740, 737, 1, 0, 0, 0, 741, 155, 1, 0, 0, 0, 742, 747, 3, 80, 40, 0, 743, 747, 3, 148, 74, 0, 744, 747, 3, 140, 70, 0, 745, 747, 3, 158, 79, 0, 746, 742, 1, 0, 0, 0, 746, 743, 1, 0, 0, 0, 746, 744, 1, 0, 0, 0, 746, 745, 1, 0, 0, 0, 747, 157, 1, 0, 0, 0, 748, 749, 5, 17, 0, 0, 749, 750, 5, 6, 0, 0, 750, 758, 5, 18, 0, 0, 751, 752, 5, 19, 0, 0, 752, 753, 5, 1, 0, 0, 753, 758, 7, 2, 0, 0, 754, 755, 5, 22, 0, 0, 755, 756, 5, 1, 0, 0, 756, 758, 5, 23, 0, 0, 757, 748, 1, 0, 0, 0, 757, 751, 1, 0, 0, 0, 757, 754, 1, 0, 0, 0, 758, 159, 1, 0, 0, 0, 759, 760, 3, 196, 98, 0, 760, 761, 5, 9, 0, 0, 761, 762, 3, 126, 63, 0, 762, 763, 5, 5, 0, 0, 763, 161, 1, 0, 0, 0, 764, 765, 3, 196, 98, 0, 765, 766, 5, 9, 0, 0, 766, 767, 3, 134, 67, 0, 767, 768, 5, 5, 0, 0, 768, 163, 1, 0, 0, 0, 769, 770, 3, 140, 70, 0, 770, 771, 5, 2, 0, 0, 771, 772, 3, 196, 98, 0, 772, 165, 1, 0, 0, 0, 773, 777, 3, 136, 68, 0, 774, 777, 3, 164, 82, 0, 775, 777, 3, 168, 84, 0, 776, 773, 1, 0, 0, 0, 776, 774, 1, 0, 0, 0, 776, 775, 1, 0, 0, 0, 777, 167, 1, 0, 0, 0, 778, 779, 5, 17, 0, 0, 779, 780, 5, 1, 0, 0, 780, 781, 7, 3, 0, 0, 781, 169, 1, 0, 0, 0, 782, 785, 5, 42, 0, 0, 783, 784, 5, 1, 0, 0, 784, 786, 5, 24, 0, 0, 785, 783, 1, 0, 0, 0, 785, 786, 1, 0, 0, 0, 786, 794, 1, 0, 0, 0, 787, 794, 5, 43, 0, 0, 788, 794, 5, 44, 0, 0, 789, 794, 5, 45, 0, 0, 790, 794, 5, 46, 0, 0, 791, 794, 5, 47, 0, 0, 792, 794, 5, 48, 0, 0, 793, 782, 1, 0, 0, 0, 793, 787, 1, 0, 0, 0, 793, 788, 1, 0, 0, 0, 793, 789, 1, 0, 0, 0, 793, 790, 1, 0, 0, 0, 793, 791, 1, 0, 0, 0, 793, 792, 1, 0, 0, 0, 794, 171, 1, 0, 0, 0, 795, 798, 5, 49, 0, 0, 796, 797, 5, 1, 0, 0, 797, 799, 5, 24, 0, 0, 798, 796, 1, 0, 0, 0, 798, 799, 1, 0, 0, 0, 799, 846, 1, 0, 0, 0, 800, 803, 5, 50, 0, 0, 801, 802, 5, 1, 0, 0, 802, 804, 5, 24, 0, 0, 803, 801, 1, 0, 0, 0, 803, 804, 1, 0, 0, 0, 804, 846, 1, 0, 0, 0, 805, 808, 5, 51, 0, 0, 806, 807, 5, 1, 0, 0, 807, 809, 5, 24, 0, 0, 808, 806, 1, 0, 0, 0, 808, 809, 1, 0, 0, 0, 809, 846, 1, 0, 0, 0, 810, 813, 5, 52, 0, 0, 811, 812, 5, 1, 0, 0, 812, 814, 5, 24, 0, 0, 813, 811, 1, 0, 0, 0, 813, 814, 1, 0, 0, 0, 814, 846, 1, 0, 0, 0, 815, 818, 5, 53, 0, 0, 816, 817, 5, 1, 0, 0, 817, 819, 5, 24, 0, 0, 818, 816, 1, 0, 0, 0, 818, 819, 1, 0, 0, 0, 819, 846, 1, 0, 0, 0, 820, 823, 5, 54, 0, 0, 821, 822, 5, 1, 0, 0, 822, 824, 5, 24, 0, 0, 823, 821, 1, 0, 0, 0, 823, 824, 1, 0, 0, 0, 824, 846, 1, 0, 0, 0, 825, 828, 5, 55, 0, 0, 826, 827, 5, 1, 0, 0, 827, 829, 5, 24, 0, 0, 828, 826, 1, 0, 0, 0, 828, 829, 1, 0, 0, 0, 829, 846, 1, 0, 0, 0, 830, 833, 5, 56, 0, 0, 831, 832, 5, 1, 0, 0, 832, 834, 5, 24, 0, 0, 833, 831, 1, 0, 0, 0, 833, 834, 1, 0, 0, 0, 834, 846, 1, 0, 0, 0, 835, 846, 5, 57, 0, 0, 836, 846, 5, 58, 0, 0, 837, 846, 5, 59, 0, 0, 838, 846, 5, 60, 0, 0, 839, 846, 5, 61, 0, 0, 840, 846, 5, 62, 0, 0, 841, 846, 5, 63, 0, 0, 842, 846, 5, 64, 0, 0, 843, 846, 5, 65, 0, 0, 844, 846, 5, 66, 0, 0, 845, 795, 1, 0, 0, 0, 845, 800, 1, 0, 0, 0, 845, 805, 1, 0, 0, 0, 845, 810, 1, 0, 0, 0, 845, 815, 1, 0, 0, 0, 845, 820, 1, 0, 0, 0, 845, 825, 1, 0, 0, 0, 845, 830, 1, 0, 0, 0, 845, 835, 1, 0, 0, 0, 845, 836, 1, 0, 0, 0, 845, 837, 1, 0, 0, 0, 845, 838, 1, 0, 0, 0, 845, 839, 1, 0, 0, 0, 845, 840, 1, 0, 0, 0, 845, 841, 1, 0, 0, 0, 845, 842, 1, 0, 0, 0, 845, 843, 1, 0, 0, 0, 845, 844, 1, 0, 0, 0, 846, 173, 1, 0, 0, 0, 847, 848, 5, 67, 0, 0, 848, 849, 5, 1, 0, 0, 849, 850, 7, 4, 0, 0, 850, 175, 1, 0, 0, 0, 851, 852, 5, 70, 0, 0, 852, 853, 5, 1, 0, 0, 853, 854, 7, 4, 0, 0, 854, 177, 1, 0, 0, 0, 855, 856, 5, 71, 0, 0, 856, 857, 5, 1, 0, 0, 857, 858, 7, 5, 0, 0, 858, 179, 1, 0, 0, 0, 859, 860, 5, 72, 0, 0, 860, 861, 5, 1, 0, 0, 861, 862, 7, 6, 0, 0, 862, 181, 1, 0, 0, 0, 863, 864, 5, 73, 0, 0, 864, 865, 5, 1, 0, 0, 865, 866, 7, 7, 0, 0, 866, 183, 1, 0, 0, 0, 867, 870, 5, 89, 0, 0, 868, 869, 5, 1, 0, 0, 869, 871, 5, 90, 0, 0, 870, 868, 1, 0, 0, 0, 870, 871, 1, 0, 0, 0, 871, 185, 1, 0, 0, 0, 872, 873, 5, 91, 0, 0, 873, 874, 5, 1, 0, 0, 874, 875, 7, 4, 0, 0, 875, 187, 1, 0, 0, 0, 876, 877, 5, 32, 0, 0, 877, 878, 5, 1, 0, 0, 878, 879, 5, 33, 0, 0, 879, 189, 1, 0, 0, 0, 880, 881, 5, 28, 0, 0, 881, 882, 5, 1, 0, 0, 882, 883, 5, 29, 0, 0, 883, 191, 1, 0, 0, 0, 884, 885, 5, 37, 0, 0, 885, 886, 5, 1, 0, 0, 886, 889, 5, 38, 0, 0, 887, 889, 5, 39, 0, 0, 888, 884, 1, 0, 0, 0, 888, 887, 1, 0, 0, 0, 889, 193, 1, 0, 0, 0, 890, 891, 5, 116, 0, 0, 891, 195, 1, 0, 0, 0, 892, 893, 7, 8, 0, 0, 893, 197, 1, 0, 0, 0, 62, 203, 214, 216, 244, 252, 261, 267, 272, 293, 299, 305, 309, 329, 335, 353, 403, 413, 443, 487, 501, 516, 522, 536, 547, 552, 559, 561, 570, 581, 584, 590, 597, 600, 606, 612, 621, 635, 647, 659, 670, 681, 692, 704, 723, 728, 740, 746, 757, 776, 785, 793, 798, 803, 808, 813, 818, 823, 828, 833, 845, 870, 888]
\ No newline at end of file
+[4, 1, 119, 896, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 1, 0, 1, 0, 1, 1, 5, 1, 202, 8, 1, 10, 1, 12, 1, 205, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 215, 8, 1, 11, 1, 12, 1, 216, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 4, 6, 243, 8, 6, 11, 6, 12, 6, 244, 1, 7, 1, 7, 1, 7, 1, 7, 5, 7, 251, 8, 7, 10, 7, 12, 7, 254, 9, 7, 1, 8, 1, 8, 1, 8, 1, 8, 5, 8, 260, 8, 8, 10, 8, 12, 8, 263, 9, 8, 1, 8, 4, 8, 266, 8, 8, 11, 8, 12, 8, 267, 1, 8, 5, 8, 271, 8, 8, 10, 8, 12, 8, 274, 9, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 292, 8, 11, 10, 11, 12, 11, 295, 9, 11, 1, 11, 5, 11, 298, 8, 11, 10, 11, 12, 11, 301, 9, 11, 1, 11, 5, 11, 304, 8, 11, 10, 11, 12, 11, 307, 9, 11, 1, 11, 3, 11, 310, 8, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 5, 14, 328, 8, 14, 10, 14, 12, 14, 331, 9, 14, 1, 14, 5, 14, 334, 8, 14, 10, 14, 12, 14, 337, 9, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 3, 16, 355, 8, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 5, 22, 403, 8, 22, 10, 22, 12, 22, 406, 9, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 415, 8, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 445, 8, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 489, 8, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 503, 8, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 3, 34, 518, 8, 34, 1, 34, 1, 34, 1, 35, 1, 35, 3, 35, 524, 8, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 4, 37, 536, 8, 37, 11, 37, 12, 37, 537, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 3, 38, 549, 8, 38, 1, 38, 5, 38, 552, 8, 38, 10, 38, 12, 38, 555, 9, 38, 1, 38, 1, 38, 4, 38, 559, 8, 38, 11, 38, 12, 38, 560, 3, 38, 563, 8, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 5, 39, 570, 8, 39, 10, 39, 12, 39, 573, 9, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 583, 8, 40, 1, 41, 3, 41, 586, 8, 41, 1, 41, 1, 41, 1, 41, 1, 42, 3, 42, 592, 8, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 3, 43, 599, 8, 43, 1, 44, 3, 44, 602, 8, 44, 1, 44, 1, 44, 1, 44, 1, 45, 3, 45, 608, 8, 45, 1, 45, 1, 45, 1, 45, 1, 46, 3, 46, 614, 8, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 623, 8, 47, 1, 48, 1, 48, 1, 49, 1, 49, 1, 50, 1, 50, 1, 51, 1, 51, 1, 52, 1, 52, 1, 53, 1, 53, 3, 53, 637, 8, 53, 1, 54, 1, 54, 1, 55, 1, 55, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 3, 57, 649, 8, 57, 1, 58, 1, 58, 1, 59, 1, 59, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 3, 61, 661, 8, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 3, 63, 672, 8, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 3, 64, 683, 8, 64, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 3, 66, 694, 8, 66, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 3, 68, 706, 8, 68, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 72, 1, 72, 1, 73, 1, 73, 1, 74, 1, 74, 5, 74, 723, 8, 74, 10, 74, 12, 74, 726, 9, 74, 1, 75, 1, 75, 3, 75, 730, 8, 75, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 3, 77, 742, 8, 77, 1, 78, 1, 78, 1, 78, 1, 78, 3, 78, 748, 8, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 3, 79, 759, 8, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 3, 83, 778, 8, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 3, 85, 787, 8, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 3, 85, 795, 8, 85, 1, 86, 1, 86, 1, 86, 3, 86, 800, 8, 86, 1, 86, 1, 86, 1, 86, 3, 86, 805, 8, 86, 1, 86, 1, 86, 1, 86, 3, 86, 810, 8, 86, 1, 86, 1, 86, 1, 86, 3, 86, 815, 8, 86, 1, 86, 1, 86, 1, 86, 3, 86, 820, 8, 86, 1, 86, 1, 86, 1, 86, 3, 86, 825, 8, 86, 1, 86, 1, 86, 1, 86, 3, 86, 830, 8, 86, 1, 86, 1, 86, 1, 86, 3, 86, 835, 8, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 3, 86, 847, 8, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 3, 92, 872, 8, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 96, 3, 96, 890, 8, 96, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 0, 0, 99, 0, 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, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 0, 9, 1, 0, 103, 104, 1, 0, 12, 16, 1, 0, 20, 21, 1, 0, 25, 26, 1, 0, 68, 69, 1, 0, 74, 79, 1, 0, 74, 88, 1, 0, 80, 82, 2, 0, 9, 113, 115, 116, 923, 0, 198, 1, 0, 0, 0, 2, 203, 1, 0, 0, 0, 4, 218, 1, 0, 0, 0, 6, 222, 1, 0, 0, 0, 8, 228, 1, 0, 0, 0, 10, 233, 1, 0, 0, 0, 12, 238, 1, 0, 0, 0, 14, 246, 1, 0, 0, 0, 16, 255, 1, 0, 0, 0, 18, 275, 1, 0, 0, 0, 20, 281, 1, 0, 0, 0, 22, 287, 1, 0, 0, 0, 24, 311, 1, 0, 0, 0, 26, 317, 1, 0, 0, 0, 28, 323, 1, 0, 0, 0, 30, 338, 1, 0, 0, 0, 32, 354, 1, 0, 0, 0, 34, 356, 1, 0, 0, 0, 36, 365, 1, 0, 0, 0, 38, 374, 1, 0, 0, 0, 40, 384, 1, 0, 0, 0, 42, 393, 1, 0, 0, 0, 44, 400, 1, 0, 0, 0, 46, 418, 1, 0, 0, 0, 48, 422, 1, 0, 0, 0, 50, 429, 1, 0, 0, 0, 52, 444, 1, 0, 0, 0, 54, 446, 1, 0, 0, 0, 56, 452, 1, 0, 0, 0, 58, 459, 1, 0, 0, 0, 60, 467, 1, 0, 0, 0, 62, 474, 1, 0, 0, 0, 64, 479, 1, 0, 0, 0, 66, 492, 1, 0, 0, 0, 68, 506, 1, 0, 0, 0, 70, 523, 1, 0, 0, 0, 72, 525, 1, 0, 0, 0, 74, 533, 1, 0, 0, 0, 76, 545, 1, 0, 0, 0, 78, 566, 1, 0, 0, 0, 80, 582, 1, 0, 0, 0, 82, 585, 1, 0, 0, 0, 84, 591, 1, 0, 0, 0, 86, 598, 1, 0, 0, 0, 88, 601, 1, 0, 0, 0, 90, 607, 1, 0, 0, 0, 92, 613, 1, 0, 0, 0, 94, 622, 1, 0, 0, 0, 96, 624, 1, 0, 0, 0, 98, 626, 1, 0, 0, 0, 100, 628, 1, 0, 0, 0, 102, 630, 1, 0, 0, 0, 104, 632, 1, 0, 0, 0, 106, 636, 1, 0, 0, 0, 108, 638, 1, 0, 0, 0, 110, 640, 1, 0, 0, 0, 112, 642, 1, 0, 0, 0, 114, 648, 1, 0, 0, 0, 116, 650, 1, 0, 0, 0, 118, 652, 1, 0, 0, 0, 120, 654, 1, 0, 0, 0, 122, 660, 1, 0, 0, 0, 124, 662, 1, 0, 0, 0, 126, 671, 1, 0, 0, 0, 128, 682, 1, 0, 0, 0, 130, 684, 1, 0, 0, 0, 132, 693, 1, 0, 0, 0, 134, 695, 1, 0, 0, 0, 136, 705, 1, 0, 0, 0, 138, 707, 1, 0, 0, 0, 140, 710, 1, 0, 0, 0, 142, 714, 1, 0, 0, 0, 144, 716, 1, 0, 0, 0, 146, 718, 1, 0, 0, 0, 148, 720, 1, 0, 0, 0, 150, 729, 1, 0, 0, 0, 152, 731, 1, 0, 0, 0, 154, 741, 1, 0, 0, 0, 156, 747, 1, 0, 0, 0, 158, 758, 1, 0, 0, 0, 160, 760, 1, 0, 0, 0, 162, 765, 1, 0, 0, 0, 164, 770, 1, 0, 0, 0, 166, 777, 1, 0, 0, 0, 168, 779, 1, 0, 0, 0, 170, 794, 1, 0, 0, 0, 172, 846, 1, 0, 0, 0, 174, 848, 1, 0, 0, 0, 176, 852, 1, 0, 0, 0, 178, 856, 1, 0, 0, 0, 180, 860, 1, 0, 0, 0, 182, 864, 1, 0, 0, 0, 184, 868, 1, 0, 0, 0, 186, 873, 1, 0, 0, 0, 188, 877, 1, 0, 0, 0, 190, 881, 1, 0, 0, 0, 192, 889, 1, 0, 0, 0, 194, 891, 1, 0, 0, 0, 196, 893, 1, 0, 0, 0, 198, 199, 3, 2, 1, 0, 199, 1, 1, 0, 0, 0, 200, 202, 3, 4, 2, 0, 201, 200, 1, 0, 0, 0, 202, 205, 1, 0, 0, 0, 203, 201, 1, 0, 0, 0, 203, 204, 1, 0, 0, 0, 204, 206, 1, 0, 0, 0, 205, 203, 1, 0, 0, 0, 206, 207, 5, 92, 0, 0, 207, 208, 3, 140, 70, 0, 208, 214, 5, 5, 0, 0, 209, 215, 3, 6, 3, 0, 210, 215, 3, 12, 6, 0, 211, 215, 3, 14, 7, 0, 212, 215, 3, 16, 8, 0, 213, 215, 3, 22, 11, 0, 214, 209, 1, 0, 0, 0, 214, 210, 1, 0, 0, 0, 214, 211, 1, 0, 0, 0, 214, 212, 1, 0, 0, 0, 214, 213, 1, 0, 0, 0, 215, 216, 1, 0, 0, 0, 216, 214, 1, 0, 0, 0, 216, 217, 1, 0, 0, 0, 217, 3, 1, 0, 0, 0, 218, 219, 5, 93, 0, 0, 219, 220, 3, 140, 70, 0, 220, 221, 5, 5, 0, 0, 221, 5, 1, 0, 0, 0, 222, 223, 5, 94, 0, 0, 223, 224, 3, 196, 98, 0, 224, 225, 5, 7, 0, 0, 225, 226, 3, 8, 4, 0, 226, 227, 3, 10, 5, 0, 227, 7, 1, 0, 0, 0, 228, 229, 5, 95, 0, 0, 229, 230, 5, 9, 0, 0, 230, 231, 3, 130, 65, 0, 231, 232, 5, 5, 0, 0, 232, 9, 1, 0, 0, 0, 233, 234, 5, 96, 0, 0, 234, 235, 5, 9, 0, 0, 235, 236, 3, 130, 65, 0, 236, 237, 5, 5, 0, 0, 237, 11, 1, 0, 0, 0, 238, 239, 5, 97, 0, 0, 239, 240, 3, 196, 98, 0, 240, 242, 5, 7, 0, 0, 241, 243, 3, 160, 80, 0, 242, 241, 1, 0, 0, 0, 243, 244, 1, 0, 0, 0, 244, 242, 1, 0, 0, 0, 244, 245, 1, 0, 0, 0, 245, 13, 1, 0, 0, 0, 246, 247, 5, 16, 0, 0, 247, 248, 3, 196, 98, 0, 248, 252, 5, 7, 0, 0, 249, 251, 3, 162, 81, 0, 250, 249, 1, 0, 0, 0, 251, 254, 1, 0, 0, 0, 252, 250, 1, 0, 0, 0, 252, 253, 1, 0, 0, 0, 253, 15, 1, 0, 0, 0, 254, 252, 1, 0, 0, 0, 255, 256, 5, 98, 0, 0, 256, 257, 3, 196, 98, 0, 257, 261, 5, 7, 0, 0, 258, 260, 3, 18, 9, 0, 259, 258, 1, 0, 0, 0, 260, 263, 1, 0, 0, 0, 261, 259, 1, 0, 0, 0, 261, 262, 1, 0, 0, 0, 262, 265, 1, 0, 0, 0, 263, 261, 1, 0, 0, 0, 264, 266, 3, 52, 26, 0, 265, 264, 1, 0, 0, 0, 266, 267, 1, 0, 0, 0, 267, 265, 1, 0, 0, 0, 267, 268, 1, 0, 0, 0, 268, 272, 1, 0, 0, 0, 269, 271, 3, 20, 10, 0, 270, 269, 1, 0, 0, 0, 271, 274, 1, 0, 0, 0, 272, 270, 1, 0, 0, 0, 272, 273, 1, 0, 0, 0, 273, 17, 1, 0, 0, 0, 274, 272, 1, 0, 0, 0, 275, 276, 5, 99, 0, 0, 276, 277, 3, 146, 73, 0, 277, 278, 5, 9, 0, 0, 278, 279, 3, 136, 68, 0, 279, 280, 5, 5, 0, 0, 280, 19, 1, 0, 0, 0, 281, 282, 5, 100, 0, 0, 282, 283, 3, 156, 78, 0, 283, 284, 5, 9, 0, 0, 284, 285, 3, 136, 68, 0, 285, 286, 5, 5, 0, 0, 286, 21, 1, 0, 0, 0, 287, 288, 5, 101, 0, 0, 288, 289, 3, 196, 98, 0, 289, 293, 5, 7, 0, 0, 290, 292, 3, 24, 12, 0, 291, 290, 1, 0, 0, 0, 292, 295, 1, 0, 0, 0, 293, 291, 1, 0, 0, 0, 293, 294, 1, 0, 0, 0, 294, 299, 1, 0, 0, 0, 295, 293, 1, 0, 0, 0, 296, 298, 3, 52, 26, 0, 297, 296, 1, 0, 0, 0, 298, 301, 1, 0, 0, 0, 299, 297, 1, 0, 0, 0, 299, 300, 1, 0, 0, 0, 300, 305, 1, 0, 0, 0, 301, 299, 1, 0, 0, 0, 302, 304, 3, 26, 13, 0, 303, 302, 1, 0, 0, 0, 304, 307, 1, 0, 0, 0, 305, 303, 1, 0, 0, 0, 305, 306, 1, 0, 0, 0, 306, 309, 1, 0, 0, 0, 307, 305, 1, 0, 0, 0, 308, 310, 3, 28, 14, 0, 309, 308, 1, 0, 0, 0, 309, 310, 1, 0, 0, 0, 310, 23, 1, 0, 0, 0, 311, 312, 5, 99, 0, 0, 312, 313, 3, 146, 73, 0, 313, 314, 5, 9, 0, 0, 314, 315, 3, 128, 64, 0, 315, 316, 5, 5, 0, 0, 316, 25, 1, 0, 0, 0, 317, 318, 5, 100, 0, 0, 318, 319, 3, 156, 78, 0, 319, 320, 5, 9, 0, 0, 320, 321, 3, 128, 64, 0, 321, 322, 5, 5, 0, 0, 322, 27, 1, 0, 0, 0, 323, 324, 5, 102, 0, 0, 324, 325, 3, 196, 98, 0, 325, 329, 5, 7, 0, 0, 326, 328, 3, 30, 15, 0, 327, 326, 1, 0, 0, 0, 328, 331, 1, 0, 0, 0, 329, 327, 1, 0, 0, 0, 329, 330, 1, 0, 0, 0, 330, 335, 1, 0, 0, 0, 331, 329, 1, 0, 0, 0, 332, 334, 3, 32, 16, 0, 333, 332, 1, 0, 0, 0, 334, 337, 1, 0, 0, 0, 335, 333, 1, 0, 0, 0, 335, 336, 1, 0, 0, 0, 336, 29, 1, 0, 0, 0, 337, 335, 1, 0, 0, 0, 338, 339, 5, 99, 0, 0, 339, 340, 3, 146, 73, 0, 340, 341, 5, 9, 0, 0, 341, 342, 3, 132, 66, 0, 342, 343, 5, 5, 0, 0, 343, 31, 1, 0, 0, 0, 344, 355, 3, 34, 17, 0, 345, 355, 3, 36, 18, 0, 346, 355, 3, 38, 19, 0, 347, 355, 3, 40, 20, 0, 348, 355, 3, 42, 21, 0, 349, 355, 3, 44, 22, 0, 350, 355, 3, 46, 23, 0, 351, 355, 3, 48, 24, 0, 352, 355, 3, 50, 25, 0, 353, 355, 3, 52, 26, 0, 354, 344, 1, 0, 0, 0, 354, 345, 1, 0, 0, 0, 354, 346, 1, 0, 0, 0, 354, 347, 1, 0, 0, 0, 354, 348, 1, 0, 0, 0, 354, 349, 1, 0, 0, 0, 354, 350, 1, 0, 0, 0, 354, 351, 1, 0, 0, 0, 354, 352, 1, 0, 0, 0, 354, 353, 1, 0, 0, 0, 355, 33, 1, 0, 0, 0, 356, 357, 5, 27, 0, 0, 357, 358, 3, 196, 98, 0, 358, 359, 5, 3, 0, 0, 359, 360, 3, 156, 78, 0, 360, 361, 5, 4, 0, 0, 361, 362, 5, 10, 0, 0, 362, 363, 3, 148, 74, 0, 363, 364, 5, 5, 0, 0, 364, 35, 1, 0, 0, 0, 365, 366, 5, 28, 0, 0, 366, 367, 3, 196, 98, 0, 367, 368, 5, 3, 0, 0, 368, 369, 3, 156, 78, 0, 369, 370, 5, 4, 0, 0, 370, 371, 5, 10, 0, 0, 371, 372, 3, 148, 74, 0, 372, 373, 5, 5, 0, 0, 373, 37, 1, 0, 0, 0, 374, 375, 3, 190, 95, 0, 375, 376, 3, 196, 98, 0, 376, 377, 5, 3, 0, 0, 377, 378, 3, 156, 78, 0, 378, 379, 5, 4, 0, 0, 379, 380, 3, 156, 78, 0, 380, 381, 5, 10, 0, 0, 381, 382, 3, 148, 74, 0, 382, 383, 5, 5, 0, 0, 383, 39, 1, 0, 0, 0, 384, 385, 5, 30, 0, 0, 385, 386, 3, 156, 78, 0, 386, 387, 5, 10, 0, 0, 387, 388, 3, 196, 98, 0, 388, 389, 5, 3, 0, 0, 389, 390, 3, 156, 78, 0, 390, 391, 5, 4, 0, 0, 391, 392, 5, 5, 0, 0, 392, 41, 1, 0, 0, 0, 393, 394, 5, 31, 0, 0, 394, 395, 3, 196, 98, 0, 395, 396, 5, 3, 0, 0, 396, 397, 3, 156, 78, 0, 397, 398, 5, 4, 0, 0, 398, 399, 5, 5, 0, 0, 399, 43, 1, 0, 0, 0, 400, 404, 3, 188, 94, 0, 401, 403, 3, 156, 78, 0, 402, 401, 1, 0, 0, 0, 403, 406, 1, 0, 0, 0, 404, 402, 1, 0, 0, 0, 404, 405, 1, 0, 0, 0, 405, 407, 1, 0, 0, 0, 406, 404, 1, 0, 0, 0, 407, 408, 5, 10, 0, 0, 408, 409, 3, 148, 74, 0, 409, 414, 5, 9, 0, 0, 410, 415, 3, 114, 57, 0, 411, 415, 3, 116, 58, 0, 412, 415, 3, 120, 60, 0, 413, 415, 3, 118, 59, 0, 414, 410, 1, 0, 0, 0, 414, 411, 1, 0, 0, 0, 414, 412, 1, 0, 0, 0, 414, 413, 1, 0, 0, 0, 415, 416, 1, 0, 0, 0, 416, 417, 5, 5, 0, 0, 417, 45, 1, 0, 0, 0, 418, 419, 5, 34, 0, 0, 419, 420, 3, 194, 97, 0, 420, 421, 5, 5, 0, 0, 421, 47, 1, 0, 0, 0, 422, 423, 3, 186, 93, 0, 423, 424, 3, 156, 78, 0, 424, 425, 3, 156, 78, 0, 425, 426, 5, 11, 0, 0, 426, 427, 3, 194, 97, 0, 427, 428, 5, 5, 0, 0, 428, 49, 1, 0, 0, 0, 429, 430, 5, 35, 0, 0, 430, 431, 3, 148, 74, 0, 431, 432, 5, 5, 0, 0, 432, 51, 1, 0, 0, 0, 433, 445, 3, 54, 27, 0, 434, 445, 3, 56, 28, 0, 435, 445, 3, 58, 29, 0, 436, 445, 3, 60, 30, 0, 437, 445, 3, 62, 31, 0, 438, 445, 3, 64, 32, 0, 439, 445, 3, 70, 35, 0, 440, 445, 3, 72, 36, 0, 441, 445, 3, 74, 37, 0, 442, 445, 3, 76, 38, 0, 443, 445, 3, 78, 39, 0, 444, 433, 1, 0, 0, 0, 444, 434, 1, 0, 0, 0, 444, 435, 1, 0, 0, 0, 444, 436, 1, 0, 0, 0, 444, 437, 1, 0, 0, 0, 444, 438, 1, 0, 0, 0, 444, 439, 1, 0, 0, 0, 444, 440, 1, 0, 0, 0, 444, 441, 1, 0, 0, 0, 444, 442, 1, 0, 0, 0, 444, 443, 1, 0, 0, 0, 445, 53, 1, 0, 0, 0, 446, 447, 3, 170, 85, 0, 447, 448, 3, 156, 78, 0, 448, 449, 5, 10, 0, 0, 449, 450, 3, 148, 74, 0, 450, 451, 5, 5, 0, 0, 451, 55, 1, 0, 0, 0, 452, 453, 3, 172, 86, 0, 453, 454, 3, 156, 78, 0, 454, 455, 3, 156, 78, 0, 455, 456, 5, 10, 0, 0, 456, 457, 3, 148, 74, 0, 457, 458, 5, 5, 0, 0, 458, 57, 1, 0, 0, 0, 459, 460, 5, 36, 0, 0, 460, 461, 3, 156, 78, 0, 461, 462, 3, 156, 78, 0, 462, 463, 3, 156, 78, 0, 463, 464, 5, 10, 0, 0, 464, 465, 3, 148, 74, 0, 465, 466, 5, 5, 0, 0, 466, 59, 1, 0, 0, 0, 467, 468, 3, 174, 87, 0, 468, 469, 3, 156, 78, 0, 469, 470, 3, 156, 78, 0, 470, 471, 5, 10, 0, 0, 471, 472, 3, 148, 74, 0, 472, 473, 5, 5, 0, 0, 473, 61, 1, 0, 0, 0, 474, 475, 3, 176, 88, 0, 475, 476, 3, 156, 78, 0, 476, 477, 3, 156, 78, 0, 477, 478, 5, 5, 0, 0, 478, 63, 1, 0, 0, 0, 479, 480, 3, 178, 89, 0, 480, 481, 3, 156, 78, 0, 481, 482, 3, 156, 78, 0, 482, 483, 5, 10, 0, 0, 483, 484, 3, 148, 74, 0, 484, 488, 5, 9, 0, 0, 485, 489, 3, 116, 58, 0, 486, 489, 3, 108, 54, 0, 487, 489, 3, 110, 55, 0, 488, 485, 1, 0, 0, 0, 488, 486, 1, 0, 0, 0, 488, 487, 1, 0, 0, 0, 489, 490, 1, 0, 0, 0, 490, 491, 5, 5, 0, 0, 491, 65, 1, 0, 0, 0, 492, 493, 3, 180, 90, 0, 493, 494, 3, 156, 78, 0, 494, 495, 5, 10, 0, 0, 495, 496, 3, 148, 74, 0, 496, 502, 5, 9, 0, 0, 497, 503, 3, 114, 57, 0, 498, 503, 3, 116, 58, 0, 499, 503, 3, 120, 60, 0, 500, 503, 3, 124, 62, 0, 501, 503, 3, 196, 98, 0, 502, 497, 1, 0, 0, 0, 502, 498, 1, 0, 0, 0, 502, 499, 1, 0, 0, 0, 502, 500, 1, 0, 0, 0, 502, 501, 1, 0, 0, 0, 503, 504, 1, 0, 0, 0, 504, 505, 5, 5, 0, 0, 505, 67, 1, 0, 0, 0, 506, 507, 3, 182, 91, 0, 507, 508, 3, 156, 78, 0, 508, 509, 3, 156, 78, 0, 509, 510, 5, 10, 0, 0, 510, 511, 3, 148, 74, 0, 511, 517, 5, 9, 0, 0, 512, 518, 3, 114, 57, 0, 513, 518, 3, 116, 58, 0, 514, 518, 3, 120, 60, 0, 515, 518, 3, 124, 62, 0, 516, 518, 3, 196, 98, 0, 517, 512, 1, 0, 0, 0, 517, 513, 1, 0, 0, 0, 517, 514, 1, 0, 0, 0, 517, 515, 1, 0, 0, 0, 517, 516, 1, 0, 0, 0, 518, 519, 1, 0, 0, 0, 519, 520, 5, 5, 0, 0, 520, 69, 1, 0, 0, 0, 521, 524, 3, 66, 33, 0, 522, 524, 3, 68, 34, 0, 523, 521, 1, 0, 0, 0, 523, 522, 1, 0, 0, 0, 524, 71, 1, 0, 0, 0, 525, 526, 3, 192, 96, 0, 526, 527, 3, 156, 78, 0, 527, 528, 3, 156, 78, 0, 528, 529, 3, 156, 78, 0, 529, 530, 5, 10, 0, 0, 530, 531, 3, 148, 74, 0, 531, 532, 5, 5, 0, 0, 532, 73, 1, 0, 0, 0, 533, 535, 3, 184, 92, 0, 534, 536, 3, 156, 78, 0, 535, 534, 1, 0, 0, 0, 536, 537, 1, 0, 0, 0, 537, 535, 1, 0, 0, 0, 537, 538, 1, 0, 0, 0, 538, 539, 1, 0, 0, 0, 539, 540, 5, 10, 0, 0, 540, 541, 3, 148, 74, 0, 541, 542, 5, 9, 0, 0, 542, 543, 3, 166, 83, 0, 543, 544, 5, 5, 0, 0, 544, 75, 1, 0, 0, 0, 545, 548, 5, 40, 0, 0, 546, 549, 3, 164, 82, 0, 547, 549, 3, 196, 98, 0, 548, 546, 1, 0, 0, 0, 548, 547, 1, 0, 0, 0, 549, 553, 1, 0, 0, 0, 550, 552, 3, 156, 78, 0, 551, 550, 1, 0, 0, 0, 552, 555, 1, 0, 0, 0, 553, 551, 1, 0, 0, 0, 553, 554, 1, 0, 0, 0, 554, 562, 1, 0, 0, 0, 555, 553, 1, 0, 0, 0, 556, 558, 5, 10, 0, 0, 557, 559, 3, 148, 74, 0, 558, 557, 1, 0, 0, 0, 559, 560, 1, 0, 0, 0, 560, 558, 1, 0, 0, 0, 560, 561, 1, 0, 0, 0, 561, 563, 1, 0, 0, 0, 562, 556, 1, 0, 0, 0, 562, 563, 1, 0, 0, 0, 563, 564, 1, 0, 0, 0, 564, 565, 5, 5, 0, 0, 565, 77, 1, 0, 0, 0, 566, 567, 5, 41, 0, 0, 567, 571, 3, 196, 98, 0, 568, 570, 3, 156, 78, 0, 569, 568, 1, 0, 0, 0, 570, 573, 1, 0, 0, 0, 571, 569, 1, 0, 0, 0, 571, 572, 1, 0, 0, 0, 572, 574, 1, 0, 0, 0, 573, 571, 1, 0, 0, 0, 574, 575, 5, 10, 0, 0, 575, 576, 3, 148, 74, 0, 576, 577, 5, 5, 0, 0, 577, 79, 1, 0, 0, 0, 578, 583, 3, 94, 47, 0, 579, 583, 3, 96, 48, 0, 580, 583, 3, 98, 49, 0, 581, 583, 3, 100, 50, 0, 582, 578, 1, 0, 0, 0, 582, 579, 1, 0, 0, 0, 582, 580, 1, 0, 0, 0, 582, 581, 1, 0, 0, 0, 583, 81, 1, 0, 0, 0, 584, 586, 5, 8, 0, 0, 585, 584, 1, 0, 0, 0, 585, 586, 1, 0, 0, 0, 586, 587, 1, 0, 0, 0, 587, 588, 5, 114, 0, 0, 588, 589, 3, 104, 52, 0, 589, 83, 1, 0, 0, 0, 590, 592, 5, 8, 0, 0, 591, 590, 1, 0, 0, 0, 591, 592, 1, 0, 0, 0, 592, 593, 1, 0, 0, 0, 593, 594, 5, 114, 0, 0, 594, 595, 3, 102, 51, 0, 595, 85, 1, 0, 0, 0, 596, 599, 3, 82, 41, 0, 597, 599, 3, 84, 42, 0, 598, 596, 1, 0, 0, 0, 598, 597, 1, 0, 0, 0, 599, 87, 1, 0, 0, 0, 600, 602, 5, 8, 0, 0, 601, 600, 1, 0, 0, 0, 601, 602, 1, 0, 0, 0, 602, 603, 1, 0, 0, 0, 603, 604, 5, 114, 0, 0, 604, 605, 3, 108, 54, 0, 605, 89, 1, 0, 0, 0, 606, 608, 5, 8, 0, 0, 607, 606, 1, 0, 0, 0, 607, 608, 1, 0, 0, 0, 608, 609, 1, 0, 0, 0, 609, 610, 5, 114, 0, 0, 610, 611, 3, 110, 55, 0, 611, 91, 1, 0, 0, 0, 612, 614, 5, 8, 0, 0, 613, 612, 1, 0, 0, 0, 613, 614, 1, 0, 0, 0, 614, 615, 1, 0, 0, 0, 615, 616, 5, 114, 0, 0, 616, 617, 3, 112, 56, 0, 617, 93, 1, 0, 0, 0, 618, 623, 3, 86, 43, 0, 619, 623, 3, 88, 44, 0, 620, 623, 3, 90, 45, 0, 621, 623, 3, 92, 46, 0, 622, 618, 1, 0, 0, 0, 622, 619, 1, 0, 0, 0, 622, 620, 1, 0, 0, 0, 622, 621, 1, 0, 0, 0, 623, 95, 1, 0, 0, 0, 624, 625, 5, 112, 0, 0, 625, 97, 1, 0, 0, 0, 626, 627, 5, 113, 0, 0, 627, 99, 1, 0, 0, 0, 628, 629, 7, 0, 0, 0, 629, 101, 1, 0, 0, 0, 630, 631, 5, 105, 0, 0, 631, 103, 1, 0, 0, 0, 632, 633, 5, 106, 0, 0, 633, 105, 1, 0, 0, 0, 634, 637, 3, 102, 51, 0, 635, 637, 3, 104, 52, 0, 636, 634, 1, 0, 0, 0, 636, 635, 1, 0, 0, 0, 637, 107, 1, 0, 0, 0, 638, 639, 5, 107, 0, 0, 639, 109, 1, 0, 0, 0, 640, 641, 5, 17, 0, 0, 641, 111, 1, 0, 0, 0, 642, 643, 5, 108, 0, 0, 643, 113, 1, 0, 0, 0, 644, 649, 3, 106, 53, 0, 645, 649, 3, 108, 54, 0, 646, 649, 3, 110, 55, 0, 647, 649, 3, 112, 56, 0, 648, 644, 1, 0, 0, 0, 648, 645, 1, 0, 0, 0, 648, 646, 1, 0, 0, 0, 648, 647, 1, 0, 0, 0, 649, 115, 1, 0, 0, 0, 650, 651, 5, 109, 0, 0, 651, 117, 1, 0, 0, 0, 652, 653, 5, 110, 0, 0, 653, 119, 1, 0, 0, 0, 654, 655, 5, 111, 0, 0, 655, 121, 1, 0, 0, 0, 656, 661, 3, 114, 57, 0, 657, 661, 3, 116, 58, 0, 658, 661, 3, 120, 60, 0, 659, 661, 3, 118, 59, 0, 660, 656, 1, 0, 0, 0, 660, 657, 1, 0, 0, 0, 660, 658, 1, 0, 0, 0, 660, 659, 1, 0, 0, 0, 661, 123, 1, 0, 0, 0, 662, 663, 5, 3, 0, 0, 663, 664, 3, 126, 63, 0, 664, 665, 5, 5, 0, 0, 665, 666, 3, 84, 42, 0, 666, 667, 5, 4, 0, 0, 667, 125, 1, 0, 0, 0, 668, 672, 3, 122, 61, 0, 669, 672, 3, 124, 62, 0, 670, 672, 3, 196, 98, 0, 671, 668, 1, 0, 0, 0, 671, 669, 1, 0, 0, 0, 671, 670, 1, 0, 0, 0, 672, 127, 1, 0, 0, 0, 673, 674, 3, 126, 63, 0, 674, 675, 3, 138, 69, 0, 675, 683, 1, 0, 0, 0, 676, 677, 3, 196, 98, 0, 677, 678, 3, 138, 69, 0, 678, 683, 1, 0, 0, 0, 679, 680, 3, 164, 82, 0, 680, 681, 3, 138, 69, 0, 681, 683, 1, 0, 0, 0, 682, 673, 1, 0, 0, 0, 682, 676, 1, 0, 0, 0, 682, 679, 1, 0, 0, 0, 683, 129, 1, 0, 0, 0, 684, 685, 3, 126, 63, 0, 685, 686, 3, 138, 69, 0, 686, 131, 1, 0, 0, 0, 687, 688, 3, 126, 63, 0, 688, 689, 3, 138, 69, 0, 689, 694, 1, 0, 0, 0, 690, 691, 3, 164, 82, 0, 691, 692, 3, 138, 69, 0, 692, 694, 1, 0, 0, 0, 693, 687, 1, 0, 0, 0, 693, 690, 1, 0, 0, 0, 694, 133, 1, 0, 0, 0, 695, 696, 3, 126, 63, 0, 696, 697, 3, 138, 69, 0, 697, 135, 1, 0, 0, 0, 698, 699, 3, 164, 82, 0, 699, 700, 3, 138, 69, 0, 700, 706, 1, 0, 0, 0, 701, 702, 3, 196, 98, 0, 702, 703, 3, 138, 69, 0, 703, 706, 1, 0, 0, 0, 704, 706, 3, 126, 63, 0, 705, 698, 1, 0, 0, 0, 705, 701, 1, 0, 0, 0, 705, 704, 1, 0, 0, 0, 706, 137, 1, 0, 0, 0, 707, 708, 5, 1, 0, 0, 708, 709, 7, 1, 0, 0, 709, 139, 1, 0, 0, 0, 710, 711, 3, 142, 71, 0, 711, 712, 5, 1, 0, 0, 712, 713, 3, 144, 72, 0, 713, 141, 1, 0, 0, 0, 714, 715, 3, 196, 98, 0, 715, 143, 1, 0, 0, 0, 716, 717, 3, 196, 98, 0, 717, 145, 1, 0, 0, 0, 718, 719, 5, 115, 0, 0, 719, 147, 1, 0, 0, 0, 720, 724, 3, 146, 73, 0, 721, 723, 3, 150, 75, 0, 722, 721, 1, 0, 0, 0, 723, 726, 1, 0, 0, 0, 724, 722, 1, 0, 0, 0, 724, 725, 1, 0, 0, 0, 725, 149, 1, 0, 0, 0, 726, 724, 1, 0, 0, 0, 727, 730, 3, 152, 76, 0, 728, 730, 3, 154, 77, 0, 729, 727, 1, 0, 0, 0, 729, 728, 1, 0, 0, 0, 730, 151, 1, 0, 0, 0, 731, 732, 5, 1, 0, 0, 732, 733, 3, 196, 98, 0, 733, 153, 1, 0, 0, 0, 734, 735, 5, 3, 0, 0, 735, 736, 3, 84, 42, 0, 736, 737, 5, 4, 0, 0, 737, 742, 1, 0, 0, 0, 738, 739, 5, 3, 0, 0, 739, 740, 5, 114, 0, 0, 740, 742, 5, 4, 0, 0, 741, 734, 1, 0, 0, 0, 741, 738, 1, 0, 0, 0, 742, 155, 1, 0, 0, 0, 743, 748, 3, 80, 40, 0, 744, 748, 3, 148, 74, 0, 745, 748, 3, 140, 70, 0, 746, 748, 3, 158, 79, 0, 747, 743, 1, 0, 0, 0, 747, 744, 1, 0, 0, 0, 747, 745, 1, 0, 0, 0, 747, 746, 1, 0, 0, 0, 748, 157, 1, 0, 0, 0, 749, 750, 5, 17, 0, 0, 750, 751, 5, 6, 0, 0, 751, 759, 5, 18, 0, 0, 752, 753, 5, 19, 0, 0, 753, 754, 5, 1, 0, 0, 754, 759, 7, 2, 0, 0, 755, 756, 5, 22, 0, 0, 756, 757, 5, 1, 0, 0, 757, 759, 5, 23, 0, 0, 758, 749, 1, 0, 0, 0, 758, 752, 1, 0, 0, 0, 758, 755, 1, 0, 0, 0, 759, 159, 1, 0, 0, 0, 760, 761, 3, 196, 98, 0, 761, 762, 5, 9, 0, 0, 762, 763, 3, 126, 63, 0, 763, 764, 5, 5, 0, 0, 764, 161, 1, 0, 0, 0, 765, 766, 3, 196, 98, 0, 766, 767, 5, 9, 0, 0, 767, 768, 3, 134, 67, 0, 768, 769, 5, 5, 0, 0, 769, 163, 1, 0, 0, 0, 770, 771, 3, 140, 70, 0, 771, 772, 5, 2, 0, 0, 772, 773, 3, 196, 98, 0, 773, 165, 1, 0, 0, 0, 774, 778, 3, 136, 68, 0, 775, 778, 3, 164, 82, 0, 776, 778, 3, 168, 84, 0, 777, 774, 1, 0, 0, 0, 777, 775, 1, 0, 0, 0, 777, 776, 1, 0, 0, 0, 778, 167, 1, 0, 0, 0, 779, 780, 5, 17, 0, 0, 780, 781, 5, 1, 0, 0, 781, 782, 7, 3, 0, 0, 782, 169, 1, 0, 0, 0, 783, 786, 5, 42, 0, 0, 784, 785, 5, 1, 0, 0, 785, 787, 5, 24, 0, 0, 786, 784, 1, 0, 0, 0, 786, 787, 1, 0, 0, 0, 787, 795, 1, 0, 0, 0, 788, 795, 5, 43, 0, 0, 789, 795, 5, 44, 0, 0, 790, 795, 5, 45, 0, 0, 791, 795, 5, 46, 0, 0, 792, 795, 5, 47, 0, 0, 793, 795, 5, 48, 0, 0, 794, 783, 1, 0, 0, 0, 794, 788, 1, 0, 0, 0, 794, 789, 1, 0, 0, 0, 794, 790, 1, 0, 0, 0, 794, 791, 1, 0, 0, 0, 794, 792, 1, 0, 0, 0, 794, 793, 1, 0, 0, 0, 795, 171, 1, 0, 0, 0, 796, 799, 5, 49, 0, 0, 797, 798, 5, 1, 0, 0, 798, 800, 5, 24, 0, 0, 799, 797, 1, 0, 0, 0, 799, 800, 1, 0, 0, 0, 800, 847, 1, 0, 0, 0, 801, 804, 5, 50, 0, 0, 802, 803, 5, 1, 0, 0, 803, 805, 5, 24, 0, 0, 804, 802, 1, 0, 0, 0, 804, 805, 1, 0, 0, 0, 805, 847, 1, 0, 0, 0, 806, 809, 5, 51, 0, 0, 807, 808, 5, 1, 0, 0, 808, 810, 5, 24, 0, 0, 809, 807, 1, 0, 0, 0, 809, 810, 1, 0, 0, 0, 810, 847, 1, 0, 0, 0, 811, 814, 5, 52, 0, 0, 812, 813, 5, 1, 0, 0, 813, 815, 5, 24, 0, 0, 814, 812, 1, 0, 0, 0, 814, 815, 1, 0, 0, 0, 815, 847, 1, 0, 0, 0, 816, 819, 5, 53, 0, 0, 817, 818, 5, 1, 0, 0, 818, 820, 5, 24, 0, 0, 819, 817, 1, 0, 0, 0, 819, 820, 1, 0, 0, 0, 820, 847, 1, 0, 0, 0, 821, 824, 5, 54, 0, 0, 822, 823, 5, 1, 0, 0, 823, 825, 5, 24, 0, 0, 824, 822, 1, 0, 0, 0, 824, 825, 1, 0, 0, 0, 825, 847, 1, 0, 0, 0, 826, 829, 5, 55, 0, 0, 827, 828, 5, 1, 0, 0, 828, 830, 5, 24, 0, 0, 829, 827, 1, 0, 0, 0, 829, 830, 1, 0, 0, 0, 830, 847, 1, 0, 0, 0, 831, 834, 5, 56, 0, 0, 832, 833, 5, 1, 0, 0, 833, 835, 5, 24, 0, 0, 834, 832, 1, 0, 0, 0, 834, 835, 1, 0, 0, 0, 835, 847, 1, 0, 0, 0, 836, 847, 5, 57, 0, 0, 837, 847, 5, 58, 0, 0, 838, 847, 5, 59, 0, 0, 839, 847, 5, 60, 0, 0, 840, 847, 5, 61, 0, 0, 841, 847, 5, 62, 0, 0, 842, 847, 5, 63, 0, 0, 843, 847, 5, 64, 0, 0, 844, 847, 5, 65, 0, 0, 845, 847, 5, 66, 0, 0, 846, 796, 1, 0, 0, 0, 846, 801, 1, 0, 0, 0, 846, 806, 1, 0, 0, 0, 846, 811, 1, 0, 0, 0, 846, 816, 1, 0, 0, 0, 846, 821, 1, 0, 0, 0, 846, 826, 1, 0, 0, 0, 846, 831, 1, 0, 0, 0, 846, 836, 1, 0, 0, 0, 846, 837, 1, 0, 0, 0, 846, 838, 1, 0, 0, 0, 846, 839, 1, 0, 0, 0, 846, 840, 1, 0, 0, 0, 846, 841, 1, 0, 0, 0, 846, 842, 1, 0, 0, 0, 846, 843, 1, 0, 0, 0, 846, 844, 1, 0, 0, 0, 846, 845, 1, 0, 0, 0, 847, 173, 1, 0, 0, 0, 848, 849, 5, 67, 0, 0, 849, 850, 5, 1, 0, 0, 850, 851, 7, 4, 0, 0, 851, 175, 1, 0, 0, 0, 852, 853, 5, 70, 0, 0, 853, 854, 5, 1, 0, 0, 854, 855, 7, 4, 0, 0, 855, 177, 1, 0, 0, 0, 856, 857, 5, 71, 0, 0, 857, 858, 5, 1, 0, 0, 858, 859, 7, 5, 0, 0, 859, 179, 1, 0, 0, 0, 860, 861, 5, 72, 0, 0, 861, 862, 5, 1, 0, 0, 862, 863, 7, 6, 0, 0, 863, 181, 1, 0, 0, 0, 864, 865, 5, 73, 0, 0, 865, 866, 5, 1, 0, 0, 866, 867, 7, 7, 0, 0, 867, 183, 1, 0, 0, 0, 868, 871, 5, 89, 0, 0, 869, 870, 5, 1, 0, 0, 870, 872, 5, 90, 0, 0, 871, 869, 1, 0, 0, 0, 871, 872, 1, 0, 0, 0, 872, 185, 1, 0, 0, 0, 873, 874, 5, 91, 0, 0, 874, 875, 5, 1, 0, 0, 875, 876, 7, 4, 0, 0, 876, 187, 1, 0, 0, 0, 877, 878, 5, 32, 0, 0, 878, 879, 5, 1, 0, 0, 879, 880, 5, 33, 0, 0, 880, 189, 1, 0, 0, 0, 881, 882, 5, 28, 0, 0, 882, 883, 5, 1, 0, 0, 883, 884, 5, 29, 0, 0, 884, 191, 1, 0, 0, 0, 885, 886, 5, 37, 0, 0, 886, 887, 5, 1, 0, 0, 887, 890, 5, 38, 0, 0, 888, 890, 5, 39, 0, 0, 889, 885, 1, 0, 0, 0, 889, 888, 1, 0, 0, 0, 890, 193, 1, 0, 0, 0, 891, 892, 5, 116, 0, 0, 892, 195, 1, 0, 0, 0, 893, 894, 7, 8, 0, 0, 894, 197, 1, 0, 0, 0, 62, 203, 214, 216, 244, 252, 261, 267, 272, 293, 299, 305, 309, 329, 335, 354, 404, 414, 444, 488, 502, 517, 523, 537, 548, 553, 560, 562, 571, 582, 585, 591, 598, 601, 607, 613, 622, 636, 648, 660, 671, 682, 693, 705, 724, 729, 741, 747, 758, 777, 786, 794, 799, 804, 809, 814, 819, 824, 829, 834, 846, 871, 889]
\ No newline at end of file
diff --git a/vanguard/aleo/parser/AleoParser.py b/vanguard/aleo/parser/AleoParser.py
index db5aae9..1d7122d 100644
--- a/vanguard/aleo/parser/AleoParser.py
+++ b/vanguard/aleo/parser/AleoParser.py
@@ -10,7 +10,7 @@
def serializedATN():
return [
- 4,1,119,895,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,
+ 4,1,119,896,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,
7,6,2,7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12,2,13,7,
13,2,14,7,14,2,15,7,15,2,16,7,16,2,17,7,17,2,18,7,18,2,19,7,19,2,
20,7,20,2,21,7,21,2,22,7,22,2,23,7,23,2,24,7,24,2,25,7,25,2,26,7,
@@ -36,53 +36,53 @@ def serializedATN():
10,11,12,11,301,9,11,1,11,5,11,304,8,11,10,11,12,11,307,9,11,1,11,
3,11,310,8,11,1,12,1,12,1,12,1,12,1,12,1,12,1,13,1,13,1,13,1,13,
1,13,1,13,1,14,1,14,1,14,1,14,5,14,328,8,14,10,14,12,14,331,9,14,
- 1,14,4,14,334,8,14,11,14,12,14,335,1,15,1,15,1,15,1,15,1,15,1,15,
- 1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,3,16,354,8,16,
- 1,17,1,17,1,17,1,17,1,17,1,17,1,17,1,17,1,17,1,18,1,18,1,18,1,18,
- 1,18,1,18,1,18,1,18,1,18,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,
- 1,19,1,19,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,21,1,21,
- 1,21,1,21,1,21,1,21,1,21,1,22,1,22,5,22,402,8,22,10,22,12,22,405,
- 9,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,3,22,414,8,22,1,22,1,22,
- 1,23,1,23,1,23,1,23,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,25,1,25,
- 1,25,1,25,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,
- 3,26,444,8,26,1,27,1,27,1,27,1,27,1,27,1,27,1,28,1,28,1,28,1,28,
- 1,28,1,28,1,28,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,30,1,30,
- 1,30,1,30,1,30,1,30,1,30,1,31,1,31,1,31,1,31,1,31,1,32,1,32,1,32,
- 1,32,1,32,1,32,1,32,1,32,1,32,3,32,488,8,32,1,32,1,32,1,33,1,33,
- 1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,3,33,502,8,33,1,33,1,33,
- 1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,3,34,517,
- 8,34,1,34,1,34,1,35,1,35,3,35,523,8,35,1,36,1,36,1,36,1,36,1,36,
- 1,36,1,36,1,36,1,37,1,37,4,37,535,8,37,11,37,12,37,536,1,37,1,37,
- 1,37,1,37,1,37,1,37,1,38,1,38,1,38,3,38,548,8,38,1,38,5,38,551,8,
- 38,10,38,12,38,554,9,38,1,38,1,38,4,38,558,8,38,11,38,12,38,559,
- 3,38,562,8,38,1,38,1,38,1,39,1,39,1,39,5,39,569,8,39,10,39,12,39,
- 572,9,39,1,39,1,39,1,39,1,39,1,40,1,40,1,40,1,40,3,40,582,8,40,1,
- 41,3,41,585,8,41,1,41,1,41,1,41,1,42,3,42,591,8,42,1,42,1,42,1,42,
- 1,43,1,43,3,43,598,8,43,1,44,3,44,601,8,44,1,44,1,44,1,44,1,45,3,
- 45,607,8,45,1,45,1,45,1,45,1,46,3,46,613,8,46,1,46,1,46,1,46,1,47,
- 1,47,1,47,1,47,3,47,622,8,47,1,48,1,48,1,49,1,49,1,50,1,50,1,51,
- 1,51,1,52,1,52,1,53,1,53,3,53,636,8,53,1,54,1,54,1,55,1,55,1,56,
- 1,56,1,57,1,57,1,57,1,57,3,57,648,8,57,1,58,1,58,1,59,1,59,1,60,
- 1,60,1,61,1,61,1,61,1,61,3,61,660,8,61,1,62,1,62,1,62,1,62,1,62,
- 1,62,1,63,1,63,1,63,3,63,671,8,63,1,64,1,64,1,64,1,64,1,64,1,64,
- 1,64,1,64,1,64,3,64,682,8,64,1,65,1,65,1,65,1,66,1,66,1,66,1,66,
- 1,66,1,66,3,66,693,8,66,1,67,1,67,1,67,1,68,1,68,1,68,1,68,1,68,
- 1,68,1,68,3,68,705,8,68,1,69,1,69,1,69,1,70,1,70,1,70,1,70,1,71,
- 1,71,1,72,1,72,1,73,1,73,1,74,1,74,5,74,722,8,74,10,74,12,74,725,
- 9,74,1,75,1,75,3,75,729,8,75,1,76,1,76,1,76,1,77,1,77,1,77,1,77,
- 1,77,1,77,1,77,3,77,741,8,77,1,78,1,78,1,78,1,78,3,78,747,8,78,1,
- 79,1,79,1,79,1,79,1,79,1,79,1,79,1,79,1,79,3,79,758,8,79,1,80,1,
+ 1,14,5,14,334,8,14,10,14,12,14,337,9,14,1,15,1,15,1,15,1,15,1,15,
+ 1,15,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,3,16,355,
+ 8,16,1,17,1,17,1,17,1,17,1,17,1,17,1,17,1,17,1,17,1,18,1,18,1,18,
+ 1,18,1,18,1,18,1,18,1,18,1,18,1,19,1,19,1,19,1,19,1,19,1,19,1,19,
+ 1,19,1,19,1,19,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,21,
+ 1,21,1,21,1,21,1,21,1,21,1,21,1,22,1,22,5,22,403,8,22,10,22,12,22,
+ 406,9,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,3,22,415,8,22,1,22,1,
+ 22,1,23,1,23,1,23,1,23,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,25,1,
+ 25,1,25,1,25,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,
+ 26,3,26,445,8,26,1,27,1,27,1,27,1,27,1,27,1,27,1,28,1,28,1,28,1,
+ 28,1,28,1,28,1,28,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,30,1,
+ 30,1,30,1,30,1,30,1,30,1,30,1,31,1,31,1,31,1,31,1,31,1,32,1,32,1,
+ 32,1,32,1,32,1,32,1,32,1,32,1,32,3,32,489,8,32,1,32,1,32,1,33,1,
+ 33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,3,33,503,8,33,1,33,1,
+ 33,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,3,34,518,
+ 8,34,1,34,1,34,1,35,1,35,3,35,524,8,35,1,36,1,36,1,36,1,36,1,36,
+ 1,36,1,36,1,36,1,37,1,37,4,37,536,8,37,11,37,12,37,537,1,37,1,37,
+ 1,37,1,37,1,37,1,37,1,38,1,38,1,38,3,38,549,8,38,1,38,5,38,552,8,
+ 38,10,38,12,38,555,9,38,1,38,1,38,4,38,559,8,38,11,38,12,38,560,
+ 3,38,563,8,38,1,38,1,38,1,39,1,39,1,39,5,39,570,8,39,10,39,12,39,
+ 573,9,39,1,39,1,39,1,39,1,39,1,40,1,40,1,40,1,40,3,40,583,8,40,1,
+ 41,3,41,586,8,41,1,41,1,41,1,41,1,42,3,42,592,8,42,1,42,1,42,1,42,
+ 1,43,1,43,3,43,599,8,43,1,44,3,44,602,8,44,1,44,1,44,1,44,1,45,3,
+ 45,608,8,45,1,45,1,45,1,45,1,46,3,46,614,8,46,1,46,1,46,1,46,1,47,
+ 1,47,1,47,1,47,3,47,623,8,47,1,48,1,48,1,49,1,49,1,50,1,50,1,51,
+ 1,51,1,52,1,52,1,53,1,53,3,53,637,8,53,1,54,1,54,1,55,1,55,1,56,
+ 1,56,1,57,1,57,1,57,1,57,3,57,649,8,57,1,58,1,58,1,59,1,59,1,60,
+ 1,60,1,61,1,61,1,61,1,61,3,61,661,8,61,1,62,1,62,1,62,1,62,1,62,
+ 1,62,1,63,1,63,1,63,3,63,672,8,63,1,64,1,64,1,64,1,64,1,64,1,64,
+ 1,64,1,64,1,64,3,64,683,8,64,1,65,1,65,1,65,1,66,1,66,1,66,1,66,
+ 1,66,1,66,3,66,694,8,66,1,67,1,67,1,67,1,68,1,68,1,68,1,68,1,68,
+ 1,68,1,68,3,68,706,8,68,1,69,1,69,1,69,1,70,1,70,1,70,1,70,1,71,
+ 1,71,1,72,1,72,1,73,1,73,1,74,1,74,5,74,723,8,74,10,74,12,74,726,
+ 9,74,1,75,1,75,3,75,730,8,75,1,76,1,76,1,76,1,77,1,77,1,77,1,77,
+ 1,77,1,77,1,77,3,77,742,8,77,1,78,1,78,1,78,1,78,3,78,748,8,78,1,
+ 79,1,79,1,79,1,79,1,79,1,79,1,79,1,79,1,79,3,79,759,8,79,1,80,1,
80,1,80,1,80,1,80,1,81,1,81,1,81,1,81,1,81,1,82,1,82,1,82,1,82,1,
- 83,1,83,1,83,3,83,777,8,83,1,84,1,84,1,84,1,84,1,85,1,85,1,85,3,
- 85,786,8,85,1,85,1,85,1,85,1,85,1,85,1,85,3,85,794,8,85,1,86,1,86,
- 1,86,3,86,799,8,86,1,86,1,86,1,86,3,86,804,8,86,1,86,1,86,1,86,3,
- 86,809,8,86,1,86,1,86,1,86,3,86,814,8,86,1,86,1,86,1,86,3,86,819,
- 8,86,1,86,1,86,1,86,3,86,824,8,86,1,86,1,86,1,86,3,86,829,8,86,1,
- 86,1,86,1,86,3,86,834,8,86,1,86,1,86,1,86,1,86,1,86,1,86,1,86,1,
- 86,1,86,1,86,3,86,846,8,86,1,87,1,87,1,87,1,87,1,88,1,88,1,88,1,
+ 83,1,83,1,83,3,83,778,8,83,1,84,1,84,1,84,1,84,1,85,1,85,1,85,3,
+ 85,787,8,85,1,85,1,85,1,85,1,85,1,85,1,85,3,85,795,8,85,1,86,1,86,
+ 1,86,3,86,800,8,86,1,86,1,86,1,86,3,86,805,8,86,1,86,1,86,1,86,3,
+ 86,810,8,86,1,86,1,86,1,86,3,86,815,8,86,1,86,1,86,1,86,3,86,820,
+ 8,86,1,86,1,86,1,86,3,86,825,8,86,1,86,1,86,1,86,3,86,830,8,86,1,
+ 86,1,86,1,86,3,86,835,8,86,1,86,1,86,1,86,1,86,1,86,1,86,1,86,1,
+ 86,1,86,1,86,3,86,847,8,86,1,87,1,87,1,87,1,87,1,88,1,88,1,88,1,
88,1,89,1,89,1,89,1,89,1,90,1,90,1,90,1,90,1,91,1,91,1,91,1,91,1,
- 92,1,92,1,92,3,92,871,8,92,1,93,1,93,1,93,1,93,1,94,1,94,1,94,1,
- 94,1,95,1,95,1,95,1,95,1,96,1,96,1,96,1,96,3,96,889,8,96,1,97,1,
+ 92,1,92,1,92,3,92,872,8,92,1,93,1,93,1,93,1,93,1,94,1,94,1,94,1,
+ 94,1,95,1,95,1,95,1,95,1,96,1,96,1,96,1,96,3,96,890,8,96,1,97,1,
97,1,98,1,98,1,98,0,0,99,0,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,
@@ -90,30 +90,30 @@ def serializedATN():
146,148,150,152,154,156,158,160,162,164,166,168,170,172,174,176,
178,180,182,184,186,188,190,192,194,196,0,9,1,0,103,104,1,0,12,16,
1,0,20,21,1,0,25,26,1,0,68,69,1,0,74,79,1,0,74,88,1,0,80,82,2,0,
- 9,113,115,116,922,0,198,1,0,0,0,2,203,1,0,0,0,4,218,1,0,0,0,6,222,
+ 9,113,115,116,923,0,198,1,0,0,0,2,203,1,0,0,0,4,218,1,0,0,0,6,222,
1,0,0,0,8,228,1,0,0,0,10,233,1,0,0,0,12,238,1,0,0,0,14,246,1,0,0,
0,16,255,1,0,0,0,18,275,1,0,0,0,20,281,1,0,0,0,22,287,1,0,0,0,24,
- 311,1,0,0,0,26,317,1,0,0,0,28,323,1,0,0,0,30,337,1,0,0,0,32,353,
- 1,0,0,0,34,355,1,0,0,0,36,364,1,0,0,0,38,373,1,0,0,0,40,383,1,0,
- 0,0,42,392,1,0,0,0,44,399,1,0,0,0,46,417,1,0,0,0,48,421,1,0,0,0,
- 50,428,1,0,0,0,52,443,1,0,0,0,54,445,1,0,0,0,56,451,1,0,0,0,58,458,
- 1,0,0,0,60,466,1,0,0,0,62,473,1,0,0,0,64,478,1,0,0,0,66,491,1,0,
- 0,0,68,505,1,0,0,0,70,522,1,0,0,0,72,524,1,0,0,0,74,532,1,0,0,0,
- 76,544,1,0,0,0,78,565,1,0,0,0,80,581,1,0,0,0,82,584,1,0,0,0,84,590,
- 1,0,0,0,86,597,1,0,0,0,88,600,1,0,0,0,90,606,1,0,0,0,92,612,1,0,
- 0,0,94,621,1,0,0,0,96,623,1,0,0,0,98,625,1,0,0,0,100,627,1,0,0,0,
- 102,629,1,0,0,0,104,631,1,0,0,0,106,635,1,0,0,0,108,637,1,0,0,0,
- 110,639,1,0,0,0,112,641,1,0,0,0,114,647,1,0,0,0,116,649,1,0,0,0,
- 118,651,1,0,0,0,120,653,1,0,0,0,122,659,1,0,0,0,124,661,1,0,0,0,
- 126,670,1,0,0,0,128,681,1,0,0,0,130,683,1,0,0,0,132,692,1,0,0,0,
- 134,694,1,0,0,0,136,704,1,0,0,0,138,706,1,0,0,0,140,709,1,0,0,0,
- 142,713,1,0,0,0,144,715,1,0,0,0,146,717,1,0,0,0,148,719,1,0,0,0,
- 150,728,1,0,0,0,152,730,1,0,0,0,154,740,1,0,0,0,156,746,1,0,0,0,
- 158,757,1,0,0,0,160,759,1,0,0,0,162,764,1,0,0,0,164,769,1,0,0,0,
- 166,776,1,0,0,0,168,778,1,0,0,0,170,793,1,0,0,0,172,845,1,0,0,0,
- 174,847,1,0,0,0,176,851,1,0,0,0,178,855,1,0,0,0,180,859,1,0,0,0,
- 182,863,1,0,0,0,184,867,1,0,0,0,186,872,1,0,0,0,188,876,1,0,0,0,
- 190,880,1,0,0,0,192,888,1,0,0,0,194,890,1,0,0,0,196,892,1,0,0,0,
+ 311,1,0,0,0,26,317,1,0,0,0,28,323,1,0,0,0,30,338,1,0,0,0,32,354,
+ 1,0,0,0,34,356,1,0,0,0,36,365,1,0,0,0,38,374,1,0,0,0,40,384,1,0,
+ 0,0,42,393,1,0,0,0,44,400,1,0,0,0,46,418,1,0,0,0,48,422,1,0,0,0,
+ 50,429,1,0,0,0,52,444,1,0,0,0,54,446,1,0,0,0,56,452,1,0,0,0,58,459,
+ 1,0,0,0,60,467,1,0,0,0,62,474,1,0,0,0,64,479,1,0,0,0,66,492,1,0,
+ 0,0,68,506,1,0,0,0,70,523,1,0,0,0,72,525,1,0,0,0,74,533,1,0,0,0,
+ 76,545,1,0,0,0,78,566,1,0,0,0,80,582,1,0,0,0,82,585,1,0,0,0,84,591,
+ 1,0,0,0,86,598,1,0,0,0,88,601,1,0,0,0,90,607,1,0,0,0,92,613,1,0,
+ 0,0,94,622,1,0,0,0,96,624,1,0,0,0,98,626,1,0,0,0,100,628,1,0,0,0,
+ 102,630,1,0,0,0,104,632,1,0,0,0,106,636,1,0,0,0,108,638,1,0,0,0,
+ 110,640,1,0,0,0,112,642,1,0,0,0,114,648,1,0,0,0,116,650,1,0,0,0,
+ 118,652,1,0,0,0,120,654,1,0,0,0,122,660,1,0,0,0,124,662,1,0,0,0,
+ 126,671,1,0,0,0,128,682,1,0,0,0,130,684,1,0,0,0,132,693,1,0,0,0,
+ 134,695,1,0,0,0,136,705,1,0,0,0,138,707,1,0,0,0,140,710,1,0,0,0,
+ 142,714,1,0,0,0,144,716,1,0,0,0,146,718,1,0,0,0,148,720,1,0,0,0,
+ 150,729,1,0,0,0,152,731,1,0,0,0,154,741,1,0,0,0,156,747,1,0,0,0,
+ 158,758,1,0,0,0,160,760,1,0,0,0,162,765,1,0,0,0,164,770,1,0,0,0,
+ 166,777,1,0,0,0,168,779,1,0,0,0,170,794,1,0,0,0,172,846,1,0,0,0,
+ 174,848,1,0,0,0,176,852,1,0,0,0,178,856,1,0,0,0,180,860,1,0,0,0,
+ 182,864,1,0,0,0,184,868,1,0,0,0,186,873,1,0,0,0,188,877,1,0,0,0,
+ 190,881,1,0,0,0,192,889,1,0,0,0,194,891,1,0,0,0,196,893,1,0,0,0,
198,199,3,2,1,0,199,1,1,0,0,0,200,202,3,4,2,0,201,200,1,0,0,0,202,
205,1,0,0,0,203,201,1,0,0,0,203,204,1,0,0,0,204,206,1,0,0,0,205,
203,1,0,0,0,206,207,5,92,0,0,207,208,3,140,70,0,208,214,5,5,0,0,
@@ -151,187 +151,187 @@ def serializedATN():
5,100,0,0,318,319,3,156,78,0,319,320,5,9,0,0,320,321,3,128,64,0,
321,322,5,5,0,0,322,27,1,0,0,0,323,324,5,102,0,0,324,325,3,196,98,
0,325,329,5,7,0,0,326,328,3,30,15,0,327,326,1,0,0,0,328,331,1,0,
- 0,0,329,327,1,0,0,0,329,330,1,0,0,0,330,333,1,0,0,0,331,329,1,0,
- 0,0,332,334,3,32,16,0,333,332,1,0,0,0,334,335,1,0,0,0,335,333,1,
- 0,0,0,335,336,1,0,0,0,336,29,1,0,0,0,337,338,5,99,0,0,338,339,3,
- 146,73,0,339,340,5,9,0,0,340,341,3,132,66,0,341,342,5,5,0,0,342,
- 31,1,0,0,0,343,354,3,34,17,0,344,354,3,36,18,0,345,354,3,38,19,0,
- 346,354,3,40,20,0,347,354,3,42,21,0,348,354,3,44,22,0,349,354,3,
- 46,23,0,350,354,3,48,24,0,351,354,3,50,25,0,352,354,3,52,26,0,353,
- 343,1,0,0,0,353,344,1,0,0,0,353,345,1,0,0,0,353,346,1,0,0,0,353,
- 347,1,0,0,0,353,348,1,0,0,0,353,349,1,0,0,0,353,350,1,0,0,0,353,
- 351,1,0,0,0,353,352,1,0,0,0,354,33,1,0,0,0,355,356,5,27,0,0,356,
- 357,3,196,98,0,357,358,5,3,0,0,358,359,3,156,78,0,359,360,5,4,0,
- 0,360,361,5,10,0,0,361,362,3,148,74,0,362,363,5,5,0,0,363,35,1,0,
- 0,0,364,365,5,28,0,0,365,366,3,196,98,0,366,367,5,3,0,0,367,368,
- 3,156,78,0,368,369,5,4,0,0,369,370,5,10,0,0,370,371,3,148,74,0,371,
- 372,5,5,0,0,372,37,1,0,0,0,373,374,3,190,95,0,374,375,3,196,98,0,
- 375,376,5,3,0,0,376,377,3,156,78,0,377,378,5,4,0,0,378,379,3,156,
- 78,0,379,380,5,10,0,0,380,381,3,148,74,0,381,382,5,5,0,0,382,39,
- 1,0,0,0,383,384,5,30,0,0,384,385,3,156,78,0,385,386,5,10,0,0,386,
- 387,3,196,98,0,387,388,5,3,0,0,388,389,3,156,78,0,389,390,5,4,0,
- 0,390,391,5,5,0,0,391,41,1,0,0,0,392,393,5,31,0,0,393,394,3,196,
- 98,0,394,395,5,3,0,0,395,396,3,156,78,0,396,397,5,4,0,0,397,398,
- 5,5,0,0,398,43,1,0,0,0,399,403,3,188,94,0,400,402,3,156,78,0,401,
- 400,1,0,0,0,402,405,1,0,0,0,403,401,1,0,0,0,403,404,1,0,0,0,404,
- 406,1,0,0,0,405,403,1,0,0,0,406,407,5,10,0,0,407,408,3,148,74,0,
- 408,413,5,9,0,0,409,414,3,114,57,0,410,414,3,116,58,0,411,414,3,
- 120,60,0,412,414,3,118,59,0,413,409,1,0,0,0,413,410,1,0,0,0,413,
- 411,1,0,0,0,413,412,1,0,0,0,414,415,1,0,0,0,415,416,5,5,0,0,416,
- 45,1,0,0,0,417,418,5,34,0,0,418,419,3,194,97,0,419,420,5,5,0,0,420,
- 47,1,0,0,0,421,422,3,186,93,0,422,423,3,156,78,0,423,424,3,156,78,
- 0,424,425,5,11,0,0,425,426,3,194,97,0,426,427,5,5,0,0,427,49,1,0,
- 0,0,428,429,5,35,0,0,429,430,3,148,74,0,430,431,5,5,0,0,431,51,1,
- 0,0,0,432,444,3,54,27,0,433,444,3,56,28,0,434,444,3,58,29,0,435,
- 444,3,60,30,0,436,444,3,62,31,0,437,444,3,64,32,0,438,444,3,70,35,
- 0,439,444,3,72,36,0,440,444,3,74,37,0,441,444,3,76,38,0,442,444,
- 3,78,39,0,443,432,1,0,0,0,443,433,1,0,0,0,443,434,1,0,0,0,443,435,
- 1,0,0,0,443,436,1,0,0,0,443,437,1,0,0,0,443,438,1,0,0,0,443,439,
- 1,0,0,0,443,440,1,0,0,0,443,441,1,0,0,0,443,442,1,0,0,0,444,53,1,
- 0,0,0,445,446,3,170,85,0,446,447,3,156,78,0,447,448,5,10,0,0,448,
- 449,3,148,74,0,449,450,5,5,0,0,450,55,1,0,0,0,451,452,3,172,86,0,
- 452,453,3,156,78,0,453,454,3,156,78,0,454,455,5,10,0,0,455,456,3,
- 148,74,0,456,457,5,5,0,0,457,57,1,0,0,0,458,459,5,36,0,0,459,460,
- 3,156,78,0,460,461,3,156,78,0,461,462,3,156,78,0,462,463,5,10,0,
- 0,463,464,3,148,74,0,464,465,5,5,0,0,465,59,1,0,0,0,466,467,3,174,
- 87,0,467,468,3,156,78,0,468,469,3,156,78,0,469,470,5,10,0,0,470,
- 471,3,148,74,0,471,472,5,5,0,0,472,61,1,0,0,0,473,474,3,176,88,0,
- 474,475,3,156,78,0,475,476,3,156,78,0,476,477,5,5,0,0,477,63,1,0,
- 0,0,478,479,3,178,89,0,479,480,3,156,78,0,480,481,3,156,78,0,481,
- 482,5,10,0,0,482,483,3,148,74,0,483,487,5,9,0,0,484,488,3,116,58,
- 0,485,488,3,108,54,0,486,488,3,110,55,0,487,484,1,0,0,0,487,485,
- 1,0,0,0,487,486,1,0,0,0,488,489,1,0,0,0,489,490,5,5,0,0,490,65,1,
- 0,0,0,491,492,3,180,90,0,492,493,3,156,78,0,493,494,5,10,0,0,494,
- 495,3,148,74,0,495,501,5,9,0,0,496,502,3,114,57,0,497,502,3,116,
- 58,0,498,502,3,120,60,0,499,502,3,124,62,0,500,502,3,196,98,0,501,
- 496,1,0,0,0,501,497,1,0,0,0,501,498,1,0,0,0,501,499,1,0,0,0,501,
- 500,1,0,0,0,502,503,1,0,0,0,503,504,5,5,0,0,504,67,1,0,0,0,505,506,
- 3,182,91,0,506,507,3,156,78,0,507,508,3,156,78,0,508,509,5,10,0,
- 0,509,510,3,148,74,0,510,516,5,9,0,0,511,517,3,114,57,0,512,517,
- 3,116,58,0,513,517,3,120,60,0,514,517,3,124,62,0,515,517,3,196,98,
- 0,516,511,1,0,0,0,516,512,1,0,0,0,516,513,1,0,0,0,516,514,1,0,0,
- 0,516,515,1,0,0,0,517,518,1,0,0,0,518,519,5,5,0,0,519,69,1,0,0,0,
- 520,523,3,66,33,0,521,523,3,68,34,0,522,520,1,0,0,0,522,521,1,0,
- 0,0,523,71,1,0,0,0,524,525,3,192,96,0,525,526,3,156,78,0,526,527,
- 3,156,78,0,527,528,3,156,78,0,528,529,5,10,0,0,529,530,3,148,74,
- 0,530,531,5,5,0,0,531,73,1,0,0,0,532,534,3,184,92,0,533,535,3,156,
- 78,0,534,533,1,0,0,0,535,536,1,0,0,0,536,534,1,0,0,0,536,537,1,0,
- 0,0,537,538,1,0,0,0,538,539,5,10,0,0,539,540,3,148,74,0,540,541,
- 5,9,0,0,541,542,3,166,83,0,542,543,5,5,0,0,543,75,1,0,0,0,544,547,
- 5,40,0,0,545,548,3,164,82,0,546,548,3,196,98,0,547,545,1,0,0,0,547,
- 546,1,0,0,0,548,552,1,0,0,0,549,551,3,156,78,0,550,549,1,0,0,0,551,
- 554,1,0,0,0,552,550,1,0,0,0,552,553,1,0,0,0,553,561,1,0,0,0,554,
- 552,1,0,0,0,555,557,5,10,0,0,556,558,3,148,74,0,557,556,1,0,0,0,
- 558,559,1,0,0,0,559,557,1,0,0,0,559,560,1,0,0,0,560,562,1,0,0,0,
- 561,555,1,0,0,0,561,562,1,0,0,0,562,563,1,0,0,0,563,564,5,5,0,0,
- 564,77,1,0,0,0,565,566,5,41,0,0,566,570,3,196,98,0,567,569,3,156,
- 78,0,568,567,1,0,0,0,569,572,1,0,0,0,570,568,1,0,0,0,570,571,1,0,
- 0,0,571,573,1,0,0,0,572,570,1,0,0,0,573,574,5,10,0,0,574,575,3,148,
- 74,0,575,576,5,5,0,0,576,79,1,0,0,0,577,582,3,94,47,0,578,582,3,
- 96,48,0,579,582,3,98,49,0,580,582,3,100,50,0,581,577,1,0,0,0,581,
- 578,1,0,0,0,581,579,1,0,0,0,581,580,1,0,0,0,582,81,1,0,0,0,583,585,
- 5,8,0,0,584,583,1,0,0,0,584,585,1,0,0,0,585,586,1,0,0,0,586,587,
- 5,114,0,0,587,588,3,104,52,0,588,83,1,0,0,0,589,591,5,8,0,0,590,
- 589,1,0,0,0,590,591,1,0,0,0,591,592,1,0,0,0,592,593,5,114,0,0,593,
- 594,3,102,51,0,594,85,1,0,0,0,595,598,3,82,41,0,596,598,3,84,42,
- 0,597,595,1,0,0,0,597,596,1,0,0,0,598,87,1,0,0,0,599,601,5,8,0,0,
- 600,599,1,0,0,0,600,601,1,0,0,0,601,602,1,0,0,0,602,603,5,114,0,
- 0,603,604,3,108,54,0,604,89,1,0,0,0,605,607,5,8,0,0,606,605,1,0,
- 0,0,606,607,1,0,0,0,607,608,1,0,0,0,608,609,5,114,0,0,609,610,3,
- 110,55,0,610,91,1,0,0,0,611,613,5,8,0,0,612,611,1,0,0,0,612,613,
- 1,0,0,0,613,614,1,0,0,0,614,615,5,114,0,0,615,616,3,112,56,0,616,
- 93,1,0,0,0,617,622,3,86,43,0,618,622,3,88,44,0,619,622,3,90,45,0,
- 620,622,3,92,46,0,621,617,1,0,0,0,621,618,1,0,0,0,621,619,1,0,0,
- 0,621,620,1,0,0,0,622,95,1,0,0,0,623,624,5,112,0,0,624,97,1,0,0,
- 0,625,626,5,113,0,0,626,99,1,0,0,0,627,628,7,0,0,0,628,101,1,0,0,
- 0,629,630,5,105,0,0,630,103,1,0,0,0,631,632,5,106,0,0,632,105,1,
- 0,0,0,633,636,3,102,51,0,634,636,3,104,52,0,635,633,1,0,0,0,635,
- 634,1,0,0,0,636,107,1,0,0,0,637,638,5,107,0,0,638,109,1,0,0,0,639,
- 640,5,17,0,0,640,111,1,0,0,0,641,642,5,108,0,0,642,113,1,0,0,0,643,
- 648,3,106,53,0,644,648,3,108,54,0,645,648,3,110,55,0,646,648,3,112,
- 56,0,647,643,1,0,0,0,647,644,1,0,0,0,647,645,1,0,0,0,647,646,1,0,
- 0,0,648,115,1,0,0,0,649,650,5,109,0,0,650,117,1,0,0,0,651,652,5,
- 110,0,0,652,119,1,0,0,0,653,654,5,111,0,0,654,121,1,0,0,0,655,660,
- 3,114,57,0,656,660,3,116,58,0,657,660,3,120,60,0,658,660,3,118,59,
- 0,659,655,1,0,0,0,659,656,1,0,0,0,659,657,1,0,0,0,659,658,1,0,0,
- 0,660,123,1,0,0,0,661,662,5,3,0,0,662,663,3,126,63,0,663,664,5,5,
- 0,0,664,665,3,84,42,0,665,666,5,4,0,0,666,125,1,0,0,0,667,671,3,
- 122,61,0,668,671,3,124,62,0,669,671,3,196,98,0,670,667,1,0,0,0,670,
- 668,1,0,0,0,670,669,1,0,0,0,671,127,1,0,0,0,672,673,3,126,63,0,673,
- 674,3,138,69,0,674,682,1,0,0,0,675,676,3,196,98,0,676,677,3,138,
- 69,0,677,682,1,0,0,0,678,679,3,164,82,0,679,680,3,138,69,0,680,682,
- 1,0,0,0,681,672,1,0,0,0,681,675,1,0,0,0,681,678,1,0,0,0,682,129,
- 1,0,0,0,683,684,3,126,63,0,684,685,3,138,69,0,685,131,1,0,0,0,686,
- 687,3,126,63,0,687,688,3,138,69,0,688,693,1,0,0,0,689,690,3,164,
- 82,0,690,691,3,138,69,0,691,693,1,0,0,0,692,686,1,0,0,0,692,689,
- 1,0,0,0,693,133,1,0,0,0,694,695,3,126,63,0,695,696,3,138,69,0,696,
- 135,1,0,0,0,697,698,3,164,82,0,698,699,3,138,69,0,699,705,1,0,0,
- 0,700,701,3,196,98,0,701,702,3,138,69,0,702,705,1,0,0,0,703,705,
- 3,126,63,0,704,697,1,0,0,0,704,700,1,0,0,0,704,703,1,0,0,0,705,137,
- 1,0,0,0,706,707,5,1,0,0,707,708,7,1,0,0,708,139,1,0,0,0,709,710,
- 3,142,71,0,710,711,5,1,0,0,711,712,3,144,72,0,712,141,1,0,0,0,713,
- 714,3,196,98,0,714,143,1,0,0,0,715,716,3,196,98,0,716,145,1,0,0,
- 0,717,718,5,115,0,0,718,147,1,0,0,0,719,723,3,146,73,0,720,722,3,
- 150,75,0,721,720,1,0,0,0,722,725,1,0,0,0,723,721,1,0,0,0,723,724,
- 1,0,0,0,724,149,1,0,0,0,725,723,1,0,0,0,726,729,3,152,76,0,727,729,
- 3,154,77,0,728,726,1,0,0,0,728,727,1,0,0,0,729,151,1,0,0,0,730,731,
- 5,1,0,0,731,732,3,196,98,0,732,153,1,0,0,0,733,734,5,3,0,0,734,735,
- 3,84,42,0,735,736,5,4,0,0,736,741,1,0,0,0,737,738,5,3,0,0,738,739,
- 5,114,0,0,739,741,5,4,0,0,740,733,1,0,0,0,740,737,1,0,0,0,741,155,
- 1,0,0,0,742,747,3,80,40,0,743,747,3,148,74,0,744,747,3,140,70,0,
- 745,747,3,158,79,0,746,742,1,0,0,0,746,743,1,0,0,0,746,744,1,0,0,
- 0,746,745,1,0,0,0,747,157,1,0,0,0,748,749,5,17,0,0,749,750,5,6,0,
- 0,750,758,5,18,0,0,751,752,5,19,0,0,752,753,5,1,0,0,753,758,7,2,
- 0,0,754,755,5,22,0,0,755,756,5,1,0,0,756,758,5,23,0,0,757,748,1,
- 0,0,0,757,751,1,0,0,0,757,754,1,0,0,0,758,159,1,0,0,0,759,760,3,
- 196,98,0,760,761,5,9,0,0,761,762,3,126,63,0,762,763,5,5,0,0,763,
- 161,1,0,0,0,764,765,3,196,98,0,765,766,5,9,0,0,766,767,3,134,67,
- 0,767,768,5,5,0,0,768,163,1,0,0,0,769,770,3,140,70,0,770,771,5,2,
- 0,0,771,772,3,196,98,0,772,165,1,0,0,0,773,777,3,136,68,0,774,777,
- 3,164,82,0,775,777,3,168,84,0,776,773,1,0,0,0,776,774,1,0,0,0,776,
- 775,1,0,0,0,777,167,1,0,0,0,778,779,5,17,0,0,779,780,5,1,0,0,780,
- 781,7,3,0,0,781,169,1,0,0,0,782,785,5,42,0,0,783,784,5,1,0,0,784,
- 786,5,24,0,0,785,783,1,0,0,0,785,786,1,0,0,0,786,794,1,0,0,0,787,
- 794,5,43,0,0,788,794,5,44,0,0,789,794,5,45,0,0,790,794,5,46,0,0,
- 791,794,5,47,0,0,792,794,5,48,0,0,793,782,1,0,0,0,793,787,1,0,0,
- 0,793,788,1,0,0,0,793,789,1,0,0,0,793,790,1,0,0,0,793,791,1,0,0,
- 0,793,792,1,0,0,0,794,171,1,0,0,0,795,798,5,49,0,0,796,797,5,1,0,
- 0,797,799,5,24,0,0,798,796,1,0,0,0,798,799,1,0,0,0,799,846,1,0,0,
- 0,800,803,5,50,0,0,801,802,5,1,0,0,802,804,5,24,0,0,803,801,1,0,
- 0,0,803,804,1,0,0,0,804,846,1,0,0,0,805,808,5,51,0,0,806,807,5,1,
- 0,0,807,809,5,24,0,0,808,806,1,0,0,0,808,809,1,0,0,0,809,846,1,0,
- 0,0,810,813,5,52,0,0,811,812,5,1,0,0,812,814,5,24,0,0,813,811,1,
- 0,0,0,813,814,1,0,0,0,814,846,1,0,0,0,815,818,5,53,0,0,816,817,5,
- 1,0,0,817,819,5,24,0,0,818,816,1,0,0,0,818,819,1,0,0,0,819,846,1,
- 0,0,0,820,823,5,54,0,0,821,822,5,1,0,0,822,824,5,24,0,0,823,821,
- 1,0,0,0,823,824,1,0,0,0,824,846,1,0,0,0,825,828,5,55,0,0,826,827,
- 5,1,0,0,827,829,5,24,0,0,828,826,1,0,0,0,828,829,1,0,0,0,829,846,
- 1,0,0,0,830,833,5,56,0,0,831,832,5,1,0,0,832,834,5,24,0,0,833,831,
- 1,0,0,0,833,834,1,0,0,0,834,846,1,0,0,0,835,846,5,57,0,0,836,846,
- 5,58,0,0,837,846,5,59,0,0,838,846,5,60,0,0,839,846,5,61,0,0,840,
- 846,5,62,0,0,841,846,5,63,0,0,842,846,5,64,0,0,843,846,5,65,0,0,
- 844,846,5,66,0,0,845,795,1,0,0,0,845,800,1,0,0,0,845,805,1,0,0,0,
- 845,810,1,0,0,0,845,815,1,0,0,0,845,820,1,0,0,0,845,825,1,0,0,0,
- 845,830,1,0,0,0,845,835,1,0,0,0,845,836,1,0,0,0,845,837,1,0,0,0,
- 845,838,1,0,0,0,845,839,1,0,0,0,845,840,1,0,0,0,845,841,1,0,0,0,
- 845,842,1,0,0,0,845,843,1,0,0,0,845,844,1,0,0,0,846,173,1,0,0,0,
- 847,848,5,67,0,0,848,849,5,1,0,0,849,850,7,4,0,0,850,175,1,0,0,0,
- 851,852,5,70,0,0,852,853,5,1,0,0,853,854,7,4,0,0,854,177,1,0,0,0,
- 855,856,5,71,0,0,856,857,5,1,0,0,857,858,7,5,0,0,858,179,1,0,0,0,
- 859,860,5,72,0,0,860,861,5,1,0,0,861,862,7,6,0,0,862,181,1,0,0,0,
- 863,864,5,73,0,0,864,865,5,1,0,0,865,866,7,7,0,0,866,183,1,0,0,0,
- 867,870,5,89,0,0,868,869,5,1,0,0,869,871,5,90,0,0,870,868,1,0,0,
- 0,870,871,1,0,0,0,871,185,1,0,0,0,872,873,5,91,0,0,873,874,5,1,0,
- 0,874,875,7,4,0,0,875,187,1,0,0,0,876,877,5,32,0,0,877,878,5,1,0,
- 0,878,879,5,33,0,0,879,189,1,0,0,0,880,881,5,28,0,0,881,882,5,1,
- 0,0,882,883,5,29,0,0,883,191,1,0,0,0,884,885,5,37,0,0,885,886,5,
- 1,0,0,886,889,5,38,0,0,887,889,5,39,0,0,888,884,1,0,0,0,888,887,
- 1,0,0,0,889,193,1,0,0,0,890,891,5,116,0,0,891,195,1,0,0,0,892,893,
- 7,8,0,0,893,197,1,0,0,0,62,203,214,216,244,252,261,267,272,293,299,
- 305,309,329,335,353,403,413,443,487,501,516,522,536,547,552,559,
- 561,570,581,584,590,597,600,606,612,621,635,647,659,670,681,692,
- 704,723,728,740,746,757,776,785,793,798,803,808,813,818,823,828,
- 833,845,870,888
+ 0,0,329,327,1,0,0,0,329,330,1,0,0,0,330,335,1,0,0,0,331,329,1,0,
+ 0,0,332,334,3,32,16,0,333,332,1,0,0,0,334,337,1,0,0,0,335,333,1,
+ 0,0,0,335,336,1,0,0,0,336,29,1,0,0,0,337,335,1,0,0,0,338,339,5,99,
+ 0,0,339,340,3,146,73,0,340,341,5,9,0,0,341,342,3,132,66,0,342,343,
+ 5,5,0,0,343,31,1,0,0,0,344,355,3,34,17,0,345,355,3,36,18,0,346,355,
+ 3,38,19,0,347,355,3,40,20,0,348,355,3,42,21,0,349,355,3,44,22,0,
+ 350,355,3,46,23,0,351,355,3,48,24,0,352,355,3,50,25,0,353,355,3,
+ 52,26,0,354,344,1,0,0,0,354,345,1,0,0,0,354,346,1,0,0,0,354,347,
+ 1,0,0,0,354,348,1,0,0,0,354,349,1,0,0,0,354,350,1,0,0,0,354,351,
+ 1,0,0,0,354,352,1,0,0,0,354,353,1,0,0,0,355,33,1,0,0,0,356,357,5,
+ 27,0,0,357,358,3,196,98,0,358,359,5,3,0,0,359,360,3,156,78,0,360,
+ 361,5,4,0,0,361,362,5,10,0,0,362,363,3,148,74,0,363,364,5,5,0,0,
+ 364,35,1,0,0,0,365,366,5,28,0,0,366,367,3,196,98,0,367,368,5,3,0,
+ 0,368,369,3,156,78,0,369,370,5,4,0,0,370,371,5,10,0,0,371,372,3,
+ 148,74,0,372,373,5,5,0,0,373,37,1,0,0,0,374,375,3,190,95,0,375,376,
+ 3,196,98,0,376,377,5,3,0,0,377,378,3,156,78,0,378,379,5,4,0,0,379,
+ 380,3,156,78,0,380,381,5,10,0,0,381,382,3,148,74,0,382,383,5,5,0,
+ 0,383,39,1,0,0,0,384,385,5,30,0,0,385,386,3,156,78,0,386,387,5,10,
+ 0,0,387,388,3,196,98,0,388,389,5,3,0,0,389,390,3,156,78,0,390,391,
+ 5,4,0,0,391,392,5,5,0,0,392,41,1,0,0,0,393,394,5,31,0,0,394,395,
+ 3,196,98,0,395,396,5,3,0,0,396,397,3,156,78,0,397,398,5,4,0,0,398,
+ 399,5,5,0,0,399,43,1,0,0,0,400,404,3,188,94,0,401,403,3,156,78,0,
+ 402,401,1,0,0,0,403,406,1,0,0,0,404,402,1,0,0,0,404,405,1,0,0,0,
+ 405,407,1,0,0,0,406,404,1,0,0,0,407,408,5,10,0,0,408,409,3,148,74,
+ 0,409,414,5,9,0,0,410,415,3,114,57,0,411,415,3,116,58,0,412,415,
+ 3,120,60,0,413,415,3,118,59,0,414,410,1,0,0,0,414,411,1,0,0,0,414,
+ 412,1,0,0,0,414,413,1,0,0,0,415,416,1,0,0,0,416,417,5,5,0,0,417,
+ 45,1,0,0,0,418,419,5,34,0,0,419,420,3,194,97,0,420,421,5,5,0,0,421,
+ 47,1,0,0,0,422,423,3,186,93,0,423,424,3,156,78,0,424,425,3,156,78,
+ 0,425,426,5,11,0,0,426,427,3,194,97,0,427,428,5,5,0,0,428,49,1,0,
+ 0,0,429,430,5,35,0,0,430,431,3,148,74,0,431,432,5,5,0,0,432,51,1,
+ 0,0,0,433,445,3,54,27,0,434,445,3,56,28,0,435,445,3,58,29,0,436,
+ 445,3,60,30,0,437,445,3,62,31,0,438,445,3,64,32,0,439,445,3,70,35,
+ 0,440,445,3,72,36,0,441,445,3,74,37,0,442,445,3,76,38,0,443,445,
+ 3,78,39,0,444,433,1,0,0,0,444,434,1,0,0,0,444,435,1,0,0,0,444,436,
+ 1,0,0,0,444,437,1,0,0,0,444,438,1,0,0,0,444,439,1,0,0,0,444,440,
+ 1,0,0,0,444,441,1,0,0,0,444,442,1,0,0,0,444,443,1,0,0,0,445,53,1,
+ 0,0,0,446,447,3,170,85,0,447,448,3,156,78,0,448,449,5,10,0,0,449,
+ 450,3,148,74,0,450,451,5,5,0,0,451,55,1,0,0,0,452,453,3,172,86,0,
+ 453,454,3,156,78,0,454,455,3,156,78,0,455,456,5,10,0,0,456,457,3,
+ 148,74,0,457,458,5,5,0,0,458,57,1,0,0,0,459,460,5,36,0,0,460,461,
+ 3,156,78,0,461,462,3,156,78,0,462,463,3,156,78,0,463,464,5,10,0,
+ 0,464,465,3,148,74,0,465,466,5,5,0,0,466,59,1,0,0,0,467,468,3,174,
+ 87,0,468,469,3,156,78,0,469,470,3,156,78,0,470,471,5,10,0,0,471,
+ 472,3,148,74,0,472,473,5,5,0,0,473,61,1,0,0,0,474,475,3,176,88,0,
+ 475,476,3,156,78,0,476,477,3,156,78,0,477,478,5,5,0,0,478,63,1,0,
+ 0,0,479,480,3,178,89,0,480,481,3,156,78,0,481,482,3,156,78,0,482,
+ 483,5,10,0,0,483,484,3,148,74,0,484,488,5,9,0,0,485,489,3,116,58,
+ 0,486,489,3,108,54,0,487,489,3,110,55,0,488,485,1,0,0,0,488,486,
+ 1,0,0,0,488,487,1,0,0,0,489,490,1,0,0,0,490,491,5,5,0,0,491,65,1,
+ 0,0,0,492,493,3,180,90,0,493,494,3,156,78,0,494,495,5,10,0,0,495,
+ 496,3,148,74,0,496,502,5,9,0,0,497,503,3,114,57,0,498,503,3,116,
+ 58,0,499,503,3,120,60,0,500,503,3,124,62,0,501,503,3,196,98,0,502,
+ 497,1,0,0,0,502,498,1,0,0,0,502,499,1,0,0,0,502,500,1,0,0,0,502,
+ 501,1,0,0,0,503,504,1,0,0,0,504,505,5,5,0,0,505,67,1,0,0,0,506,507,
+ 3,182,91,0,507,508,3,156,78,0,508,509,3,156,78,0,509,510,5,10,0,
+ 0,510,511,3,148,74,0,511,517,5,9,0,0,512,518,3,114,57,0,513,518,
+ 3,116,58,0,514,518,3,120,60,0,515,518,3,124,62,0,516,518,3,196,98,
+ 0,517,512,1,0,0,0,517,513,1,0,0,0,517,514,1,0,0,0,517,515,1,0,0,
+ 0,517,516,1,0,0,0,518,519,1,0,0,0,519,520,5,5,0,0,520,69,1,0,0,0,
+ 521,524,3,66,33,0,522,524,3,68,34,0,523,521,1,0,0,0,523,522,1,0,
+ 0,0,524,71,1,0,0,0,525,526,3,192,96,0,526,527,3,156,78,0,527,528,
+ 3,156,78,0,528,529,3,156,78,0,529,530,5,10,0,0,530,531,3,148,74,
+ 0,531,532,5,5,0,0,532,73,1,0,0,0,533,535,3,184,92,0,534,536,3,156,
+ 78,0,535,534,1,0,0,0,536,537,1,0,0,0,537,535,1,0,0,0,537,538,1,0,
+ 0,0,538,539,1,0,0,0,539,540,5,10,0,0,540,541,3,148,74,0,541,542,
+ 5,9,0,0,542,543,3,166,83,0,543,544,5,5,0,0,544,75,1,0,0,0,545,548,
+ 5,40,0,0,546,549,3,164,82,0,547,549,3,196,98,0,548,546,1,0,0,0,548,
+ 547,1,0,0,0,549,553,1,0,0,0,550,552,3,156,78,0,551,550,1,0,0,0,552,
+ 555,1,0,0,0,553,551,1,0,0,0,553,554,1,0,0,0,554,562,1,0,0,0,555,
+ 553,1,0,0,0,556,558,5,10,0,0,557,559,3,148,74,0,558,557,1,0,0,0,
+ 559,560,1,0,0,0,560,558,1,0,0,0,560,561,1,0,0,0,561,563,1,0,0,0,
+ 562,556,1,0,0,0,562,563,1,0,0,0,563,564,1,0,0,0,564,565,5,5,0,0,
+ 565,77,1,0,0,0,566,567,5,41,0,0,567,571,3,196,98,0,568,570,3,156,
+ 78,0,569,568,1,0,0,0,570,573,1,0,0,0,571,569,1,0,0,0,571,572,1,0,
+ 0,0,572,574,1,0,0,0,573,571,1,0,0,0,574,575,5,10,0,0,575,576,3,148,
+ 74,0,576,577,5,5,0,0,577,79,1,0,0,0,578,583,3,94,47,0,579,583,3,
+ 96,48,0,580,583,3,98,49,0,581,583,3,100,50,0,582,578,1,0,0,0,582,
+ 579,1,0,0,0,582,580,1,0,0,0,582,581,1,0,0,0,583,81,1,0,0,0,584,586,
+ 5,8,0,0,585,584,1,0,0,0,585,586,1,0,0,0,586,587,1,0,0,0,587,588,
+ 5,114,0,0,588,589,3,104,52,0,589,83,1,0,0,0,590,592,5,8,0,0,591,
+ 590,1,0,0,0,591,592,1,0,0,0,592,593,1,0,0,0,593,594,5,114,0,0,594,
+ 595,3,102,51,0,595,85,1,0,0,0,596,599,3,82,41,0,597,599,3,84,42,
+ 0,598,596,1,0,0,0,598,597,1,0,0,0,599,87,1,0,0,0,600,602,5,8,0,0,
+ 601,600,1,0,0,0,601,602,1,0,0,0,602,603,1,0,0,0,603,604,5,114,0,
+ 0,604,605,3,108,54,0,605,89,1,0,0,0,606,608,5,8,0,0,607,606,1,0,
+ 0,0,607,608,1,0,0,0,608,609,1,0,0,0,609,610,5,114,0,0,610,611,3,
+ 110,55,0,611,91,1,0,0,0,612,614,5,8,0,0,613,612,1,0,0,0,613,614,
+ 1,0,0,0,614,615,1,0,0,0,615,616,5,114,0,0,616,617,3,112,56,0,617,
+ 93,1,0,0,0,618,623,3,86,43,0,619,623,3,88,44,0,620,623,3,90,45,0,
+ 621,623,3,92,46,0,622,618,1,0,0,0,622,619,1,0,0,0,622,620,1,0,0,
+ 0,622,621,1,0,0,0,623,95,1,0,0,0,624,625,5,112,0,0,625,97,1,0,0,
+ 0,626,627,5,113,0,0,627,99,1,0,0,0,628,629,7,0,0,0,629,101,1,0,0,
+ 0,630,631,5,105,0,0,631,103,1,0,0,0,632,633,5,106,0,0,633,105,1,
+ 0,0,0,634,637,3,102,51,0,635,637,3,104,52,0,636,634,1,0,0,0,636,
+ 635,1,0,0,0,637,107,1,0,0,0,638,639,5,107,0,0,639,109,1,0,0,0,640,
+ 641,5,17,0,0,641,111,1,0,0,0,642,643,5,108,0,0,643,113,1,0,0,0,644,
+ 649,3,106,53,0,645,649,3,108,54,0,646,649,3,110,55,0,647,649,3,112,
+ 56,0,648,644,1,0,0,0,648,645,1,0,0,0,648,646,1,0,0,0,648,647,1,0,
+ 0,0,649,115,1,0,0,0,650,651,5,109,0,0,651,117,1,0,0,0,652,653,5,
+ 110,0,0,653,119,1,0,0,0,654,655,5,111,0,0,655,121,1,0,0,0,656,661,
+ 3,114,57,0,657,661,3,116,58,0,658,661,3,120,60,0,659,661,3,118,59,
+ 0,660,656,1,0,0,0,660,657,1,0,0,0,660,658,1,0,0,0,660,659,1,0,0,
+ 0,661,123,1,0,0,0,662,663,5,3,0,0,663,664,3,126,63,0,664,665,5,5,
+ 0,0,665,666,3,84,42,0,666,667,5,4,0,0,667,125,1,0,0,0,668,672,3,
+ 122,61,0,669,672,3,124,62,0,670,672,3,196,98,0,671,668,1,0,0,0,671,
+ 669,1,0,0,0,671,670,1,0,0,0,672,127,1,0,0,0,673,674,3,126,63,0,674,
+ 675,3,138,69,0,675,683,1,0,0,0,676,677,3,196,98,0,677,678,3,138,
+ 69,0,678,683,1,0,0,0,679,680,3,164,82,0,680,681,3,138,69,0,681,683,
+ 1,0,0,0,682,673,1,0,0,0,682,676,1,0,0,0,682,679,1,0,0,0,683,129,
+ 1,0,0,0,684,685,3,126,63,0,685,686,3,138,69,0,686,131,1,0,0,0,687,
+ 688,3,126,63,0,688,689,3,138,69,0,689,694,1,0,0,0,690,691,3,164,
+ 82,0,691,692,3,138,69,0,692,694,1,0,0,0,693,687,1,0,0,0,693,690,
+ 1,0,0,0,694,133,1,0,0,0,695,696,3,126,63,0,696,697,3,138,69,0,697,
+ 135,1,0,0,0,698,699,3,164,82,0,699,700,3,138,69,0,700,706,1,0,0,
+ 0,701,702,3,196,98,0,702,703,3,138,69,0,703,706,1,0,0,0,704,706,
+ 3,126,63,0,705,698,1,0,0,0,705,701,1,0,0,0,705,704,1,0,0,0,706,137,
+ 1,0,0,0,707,708,5,1,0,0,708,709,7,1,0,0,709,139,1,0,0,0,710,711,
+ 3,142,71,0,711,712,5,1,0,0,712,713,3,144,72,0,713,141,1,0,0,0,714,
+ 715,3,196,98,0,715,143,1,0,0,0,716,717,3,196,98,0,717,145,1,0,0,
+ 0,718,719,5,115,0,0,719,147,1,0,0,0,720,724,3,146,73,0,721,723,3,
+ 150,75,0,722,721,1,0,0,0,723,726,1,0,0,0,724,722,1,0,0,0,724,725,
+ 1,0,0,0,725,149,1,0,0,0,726,724,1,0,0,0,727,730,3,152,76,0,728,730,
+ 3,154,77,0,729,727,1,0,0,0,729,728,1,0,0,0,730,151,1,0,0,0,731,732,
+ 5,1,0,0,732,733,3,196,98,0,733,153,1,0,0,0,734,735,5,3,0,0,735,736,
+ 3,84,42,0,736,737,5,4,0,0,737,742,1,0,0,0,738,739,5,3,0,0,739,740,
+ 5,114,0,0,740,742,5,4,0,0,741,734,1,0,0,0,741,738,1,0,0,0,742,155,
+ 1,0,0,0,743,748,3,80,40,0,744,748,3,148,74,0,745,748,3,140,70,0,
+ 746,748,3,158,79,0,747,743,1,0,0,0,747,744,1,0,0,0,747,745,1,0,0,
+ 0,747,746,1,0,0,0,748,157,1,0,0,0,749,750,5,17,0,0,750,751,5,6,0,
+ 0,751,759,5,18,0,0,752,753,5,19,0,0,753,754,5,1,0,0,754,759,7,2,
+ 0,0,755,756,5,22,0,0,756,757,5,1,0,0,757,759,5,23,0,0,758,749,1,
+ 0,0,0,758,752,1,0,0,0,758,755,1,0,0,0,759,159,1,0,0,0,760,761,3,
+ 196,98,0,761,762,5,9,0,0,762,763,3,126,63,0,763,764,5,5,0,0,764,
+ 161,1,0,0,0,765,766,3,196,98,0,766,767,5,9,0,0,767,768,3,134,67,
+ 0,768,769,5,5,0,0,769,163,1,0,0,0,770,771,3,140,70,0,771,772,5,2,
+ 0,0,772,773,3,196,98,0,773,165,1,0,0,0,774,778,3,136,68,0,775,778,
+ 3,164,82,0,776,778,3,168,84,0,777,774,1,0,0,0,777,775,1,0,0,0,777,
+ 776,1,0,0,0,778,167,1,0,0,0,779,780,5,17,0,0,780,781,5,1,0,0,781,
+ 782,7,3,0,0,782,169,1,0,0,0,783,786,5,42,0,0,784,785,5,1,0,0,785,
+ 787,5,24,0,0,786,784,1,0,0,0,786,787,1,0,0,0,787,795,1,0,0,0,788,
+ 795,5,43,0,0,789,795,5,44,0,0,790,795,5,45,0,0,791,795,5,46,0,0,
+ 792,795,5,47,0,0,793,795,5,48,0,0,794,783,1,0,0,0,794,788,1,0,0,
+ 0,794,789,1,0,0,0,794,790,1,0,0,0,794,791,1,0,0,0,794,792,1,0,0,
+ 0,794,793,1,0,0,0,795,171,1,0,0,0,796,799,5,49,0,0,797,798,5,1,0,
+ 0,798,800,5,24,0,0,799,797,1,0,0,0,799,800,1,0,0,0,800,847,1,0,0,
+ 0,801,804,5,50,0,0,802,803,5,1,0,0,803,805,5,24,0,0,804,802,1,0,
+ 0,0,804,805,1,0,0,0,805,847,1,0,0,0,806,809,5,51,0,0,807,808,5,1,
+ 0,0,808,810,5,24,0,0,809,807,1,0,0,0,809,810,1,0,0,0,810,847,1,0,
+ 0,0,811,814,5,52,0,0,812,813,5,1,0,0,813,815,5,24,0,0,814,812,1,
+ 0,0,0,814,815,1,0,0,0,815,847,1,0,0,0,816,819,5,53,0,0,817,818,5,
+ 1,0,0,818,820,5,24,0,0,819,817,1,0,0,0,819,820,1,0,0,0,820,847,1,
+ 0,0,0,821,824,5,54,0,0,822,823,5,1,0,0,823,825,5,24,0,0,824,822,
+ 1,0,0,0,824,825,1,0,0,0,825,847,1,0,0,0,826,829,5,55,0,0,827,828,
+ 5,1,0,0,828,830,5,24,0,0,829,827,1,0,0,0,829,830,1,0,0,0,830,847,
+ 1,0,0,0,831,834,5,56,0,0,832,833,5,1,0,0,833,835,5,24,0,0,834,832,
+ 1,0,0,0,834,835,1,0,0,0,835,847,1,0,0,0,836,847,5,57,0,0,837,847,
+ 5,58,0,0,838,847,5,59,0,0,839,847,5,60,0,0,840,847,5,61,0,0,841,
+ 847,5,62,0,0,842,847,5,63,0,0,843,847,5,64,0,0,844,847,5,65,0,0,
+ 845,847,5,66,0,0,846,796,1,0,0,0,846,801,1,0,0,0,846,806,1,0,0,0,
+ 846,811,1,0,0,0,846,816,1,0,0,0,846,821,1,0,0,0,846,826,1,0,0,0,
+ 846,831,1,0,0,0,846,836,1,0,0,0,846,837,1,0,0,0,846,838,1,0,0,0,
+ 846,839,1,0,0,0,846,840,1,0,0,0,846,841,1,0,0,0,846,842,1,0,0,0,
+ 846,843,1,0,0,0,846,844,1,0,0,0,846,845,1,0,0,0,847,173,1,0,0,0,
+ 848,849,5,67,0,0,849,850,5,1,0,0,850,851,7,4,0,0,851,175,1,0,0,0,
+ 852,853,5,70,0,0,853,854,5,1,0,0,854,855,7,4,0,0,855,177,1,0,0,0,
+ 856,857,5,71,0,0,857,858,5,1,0,0,858,859,7,5,0,0,859,179,1,0,0,0,
+ 860,861,5,72,0,0,861,862,5,1,0,0,862,863,7,6,0,0,863,181,1,0,0,0,
+ 864,865,5,73,0,0,865,866,5,1,0,0,866,867,7,7,0,0,867,183,1,0,0,0,
+ 868,871,5,89,0,0,869,870,5,1,0,0,870,872,5,90,0,0,871,869,1,0,0,
+ 0,871,872,1,0,0,0,872,185,1,0,0,0,873,874,5,91,0,0,874,875,5,1,0,
+ 0,875,876,7,4,0,0,876,187,1,0,0,0,877,878,5,32,0,0,878,879,5,1,0,
+ 0,879,880,5,33,0,0,880,189,1,0,0,0,881,882,5,28,0,0,882,883,5,1,
+ 0,0,883,884,5,29,0,0,884,191,1,0,0,0,885,886,5,37,0,0,886,887,5,
+ 1,0,0,887,890,5,38,0,0,888,890,5,39,0,0,889,885,1,0,0,0,889,888,
+ 1,0,0,0,890,193,1,0,0,0,891,892,5,116,0,0,892,195,1,0,0,0,893,894,
+ 7,8,0,0,894,197,1,0,0,0,62,203,214,216,244,252,261,267,272,293,299,
+ 305,309,329,335,354,404,414,444,488,502,517,523,537,548,553,560,
+ 562,571,582,585,591,598,601,607,613,622,636,648,660,671,682,693,
+ 705,724,729,741,747,758,777,786,794,799,804,809,814,819,824,829,
+ 834,846,871,889
]
class AleoParser ( Parser ):
@@ -1741,17 +1741,15 @@ def finalize(self):
self._errHandler.sync(self)
_la = self._input.LA(1)
- self.state = 333
+ self.state = 335
self._errHandler.sync(self)
_la = self._input.LA(1)
- while True:
+ while (((_la) & ~0x3f) == 0 and ((1 << _la) & -284138930176) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 167773135) != 0):
self.state = 332
self.command()
- self.state = 335
+ self.state = 337
self._errHandler.sync(self)
_la = self._input.LA(1)
- if not ((((_la) & ~0x3f) == 0 and ((1 << _la) & -284138930176) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 167773135) != 0)):
- break
except RecognitionException as re:
localctx.exception = re
@@ -1806,15 +1804,15 @@ def finalize_input(self):
self.enterRule(localctx, 30, self.RULE_finalize_input)
try:
self.enterOuterAlt(localctx, 1)
- self.state = 337
- self.match(AleoParser.INPUT)
self.state = 338
- self.register()
+ self.match(AleoParser.INPUT)
self.state = 339
- self.match(AleoParser.AS)
+ self.register()
self.state = 340
- self.finalize_type()
+ self.match(AleoParser.AS)
self.state = 341
+ self.finalize_type()
+ self.state = 342
self.match(AleoParser.SC)
except RecognitionException as re:
localctx.exception = re
@@ -1891,66 +1889,66 @@ def command(self):
localctx = AleoParser.CommandContext(self, self._ctx, self.state)
self.enterRule(localctx, 32, self.RULE_command)
try:
- self.state = 353
+ self.state = 354
self._errHandler.sync(self)
la_ = self._interp.adaptivePredict(self._input,14,self._ctx)
if la_ == 1:
self.enterOuterAlt(localctx, 1)
- self.state = 343
+ self.state = 344
self.contains()
pass
elif la_ == 2:
self.enterOuterAlt(localctx, 2)
- self.state = 344
+ self.state = 345
self.get()
pass
elif la_ == 3:
self.enterOuterAlt(localctx, 3)
- self.state = 345
+ self.state = 346
self.get_or_use()
pass
elif la_ == 4:
self.enterOuterAlt(localctx, 4)
- self.state = 346
+ self.state = 347
self.set_()
pass
elif la_ == 5:
self.enterOuterAlt(localctx, 5)
- self.state = 347
+ self.state = 348
self.remove()
pass
elif la_ == 6:
self.enterOuterAlt(localctx, 6)
- self.state = 348
+ self.state = 349
self.random()
pass
elif la_ == 7:
self.enterOuterAlt(localctx, 7)
- self.state = 349
+ self.state = 350
self.position()
pass
elif la_ == 8:
self.enterOuterAlt(localctx, 8)
- self.state = 350
+ self.state = 351
self.branch()
pass
elif la_ == 9:
self.enterOuterAlt(localctx, 9)
- self.state = 351
+ self.state = 352
self.xawait()
pass
elif la_ == 10:
self.enterOuterAlt(localctx, 10)
- self.state = 352
+ self.state = 353
self.instruction()
pass
@@ -2018,21 +2016,21 @@ def contains(self):
self.enterRule(localctx, 34, self.RULE_contains)
try:
self.enterOuterAlt(localctx, 1)
- self.state = 355
- self.match(AleoParser.CONTAINS)
self.state = 356
- self.identifier()
+ self.match(AleoParser.CONTAINS)
self.state = 357
- self.match(AleoParser.LB)
+ self.identifier()
self.state = 358
- self.operand()
+ self.match(AleoParser.LB)
self.state = 359
- self.match(AleoParser.RB)
+ self.operand()
self.state = 360
- self.match(AleoParser.INTO)
+ self.match(AleoParser.RB)
self.state = 361
- self.register_access()
+ self.match(AleoParser.INTO)
self.state = 362
+ self.register_access()
+ self.state = 363
self.match(AleoParser.SC)
except RecognitionException as re:
localctx.exception = re
@@ -2097,21 +2095,21 @@ def get(self):
self.enterRule(localctx, 36, self.RULE_get)
try:
self.enterOuterAlt(localctx, 1)
- self.state = 364
- self.match(AleoParser.GET)
self.state = 365
- self.identifier()
+ self.match(AleoParser.GET)
self.state = 366
- self.match(AleoParser.LB)
+ self.identifier()
self.state = 367
- self.operand()
+ self.match(AleoParser.LB)
self.state = 368
- self.match(AleoParser.RB)
+ self.operand()
self.state = 369
- self.match(AleoParser.INTO)
+ self.match(AleoParser.RB)
self.state = 370
- self.register_access()
+ self.match(AleoParser.INTO)
self.state = 371
+ self.register_access()
+ self.state = 372
self.match(AleoParser.SC)
except RecognitionException as re:
localctx.exception = re
@@ -2180,23 +2178,23 @@ def get_or_use(self):
self.enterRule(localctx, 38, self.RULE_get_or_use)
try:
self.enterOuterAlt(localctx, 1)
- self.state = 373
- self.get_or_use_op()
self.state = 374
- self.identifier()
+ self.get_or_use_op()
self.state = 375
- self.match(AleoParser.LB)
+ self.identifier()
self.state = 376
- self.operand()
+ self.match(AleoParser.LB)
self.state = 377
- self.match(AleoParser.RB)
- self.state = 378
self.operand()
+ self.state = 378
+ self.match(AleoParser.RB)
self.state = 379
- self.match(AleoParser.INTO)
+ self.operand()
self.state = 380
- self.register_access()
+ self.match(AleoParser.INTO)
self.state = 381
+ self.register_access()
+ self.state = 382
self.match(AleoParser.SC)
except RecognitionException as re:
localctx.exception = re
@@ -2260,21 +2258,21 @@ def set_(self):
self.enterRule(localctx, 40, self.RULE_set)
try:
self.enterOuterAlt(localctx, 1)
- self.state = 383
- self.match(AleoParser.SET)
self.state = 384
- self.operand()
+ self.match(AleoParser.SET)
self.state = 385
- self.match(AleoParser.INTO)
+ self.operand()
self.state = 386
- self.identifier()
+ self.match(AleoParser.INTO)
self.state = 387
- self.match(AleoParser.LB)
+ self.identifier()
self.state = 388
- self.operand()
+ self.match(AleoParser.LB)
self.state = 389
- self.match(AleoParser.RB)
+ self.operand()
self.state = 390
+ self.match(AleoParser.RB)
+ self.state = 391
self.match(AleoParser.SC)
except RecognitionException as re:
localctx.exception = re
@@ -2332,17 +2330,17 @@ def remove(self):
self.enterRule(localctx, 42, self.RULE_remove)
try:
self.enterOuterAlt(localctx, 1)
- self.state = 392
- self.match(AleoParser.REMOVE)
self.state = 393
- self.identifier()
+ self.match(AleoParser.REMOVE)
self.state = 394
- self.match(AleoParser.LB)
+ self.identifier()
self.state = 395
- self.operand()
+ self.match(AleoParser.LB)
self.state = 396
- self.match(AleoParser.RB)
+ self.operand()
self.state = 397
+ self.match(AleoParser.RB)
+ self.state = 398
self.match(AleoParser.SC)
except RecognitionException as re:
localctx.exception = re
@@ -2420,48 +2418,48 @@ def random(self):
self.enterRule(localctx, 44, self.RULE_random)
try:
self.enterOuterAlt(localctx, 1)
- self.state = 399
+ self.state = 400
self.random_op()
- self.state = 403
+ self.state = 404
self._errHandler.sync(self)
_alt = self._interp.adaptivePredict(self._input,15,self._ctx)
while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER:
if _alt==1:
- self.state = 400
+ self.state = 401
self.operand()
- self.state = 405
+ self.state = 406
self._errHandler.sync(self)
_alt = self._interp.adaptivePredict(self._input,15,self._ctx)
- self.state = 406
- self.match(AleoParser.INTO)
self.state = 407
- self.register_access()
+ self.match(AleoParser.INTO)
self.state = 408
+ self.register_access()
+ self.state = 409
self.match(AleoParser.AS)
- self.state = 413
+ self.state = 414
self._errHandler.sync(self)
token = self._input.LA(1)
if token in [17, 105, 106, 107, 108]:
- self.state = 409
+ self.state = 410
self.arithmetic_type()
pass
elif token in [109]:
- self.state = 410
+ self.state = 411
self.address_type()
pass
elif token in [111]:
- self.state = 411
+ self.state = 412
self.signature_type()
pass
elif token in [110]:
- self.state = 412
+ self.state = 413
self.boolean_type()
pass
else:
raise NoViableAltException(self)
- self.state = 415
+ self.state = 416
self.match(AleoParser.SC)
except RecognitionException as re:
localctx.exception = re
@@ -2509,11 +2507,11 @@ def position(self):
self.enterRule(localctx, 46, self.RULE_position)
try:
self.enterOuterAlt(localctx, 1)
- self.state = 417
- self.match(AleoParser.POSITION)
self.state = 418
- self.label()
+ self.match(AleoParser.POSITION)
self.state = 419
+ self.label()
+ self.state = 420
self.match(AleoParser.SC)
except RecognitionException as re:
localctx.exception = re
@@ -2572,17 +2570,17 @@ def branch(self):
self.enterRule(localctx, 48, self.RULE_branch)
try:
self.enterOuterAlt(localctx, 1)
- self.state = 421
- self.branch_op()
self.state = 422
- self.operand()
+ self.branch_op()
self.state = 423
self.operand()
self.state = 424
- self.match(AleoParser.TO)
+ self.operand()
self.state = 425
- self.label()
+ self.match(AleoParser.TO)
self.state = 426
+ self.label()
+ self.state = 427
self.match(AleoParser.SC)
except RecognitionException as re:
localctx.exception = re
@@ -2630,11 +2628,11 @@ def xawait(self):
self.enterRule(localctx, 50, self.RULE_xawait)
try:
self.enterOuterAlt(localctx, 1)
- self.state = 428
- self.match(AleoParser.AWAIT)
self.state = 429
- self.register_access()
+ self.match(AleoParser.AWAIT)
self.state = 430
+ self.register_access()
+ self.state = 431
self.match(AleoParser.SC)
except RecognitionException as re:
localctx.exception = re
@@ -2715,62 +2713,62 @@ def instruction(self):
localctx = AleoParser.InstructionContext(self, self._ctx, self.state)
self.enterRule(localctx, 52, self.RULE_instruction)
try:
- self.state = 443
+ self.state = 444
self._errHandler.sync(self)
token = self._input.LA(1)
if token in [42, 43, 44, 45, 46, 47, 48]:
self.enterOuterAlt(localctx, 1)
- self.state = 432
+ self.state = 433
self.unary()
pass
elif token in [49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66]:
self.enterOuterAlt(localctx, 2)
- self.state = 433
+ self.state = 434
self.binary()
pass
elif token in [36]:
self.enterOuterAlt(localctx, 3)
- self.state = 434
+ self.state = 435
self.ternary()
pass
elif token in [67]:
self.enterOuterAlt(localctx, 4)
- self.state = 435
+ self.state = 436
self.is_()
pass
elif token in [70]:
self.enterOuterAlt(localctx, 5)
- self.state = 436
+ self.state = 437
self.assert_()
pass
elif token in [71]:
self.enterOuterAlt(localctx, 6)
- self.state = 437
+ self.state = 438
self.commit()
pass
elif token in [72, 73]:
self.enterOuterAlt(localctx, 7)
- self.state = 438
+ self.state = 439
self.hash_()
pass
elif token in [37, 39]:
self.enterOuterAlt(localctx, 8)
- self.state = 439
+ self.state = 440
self.sign_verify()
pass
elif token in [89]:
self.enterOuterAlt(localctx, 9)
- self.state = 440
+ self.state = 441
self.cast()
pass
elif token in [40]:
self.enterOuterAlt(localctx, 10)
- self.state = 441
+ self.state = 442
self.call()
pass
elif token in [41]:
self.enterOuterAlt(localctx, 11)
- self.state = 442
+ self.state = 443
self.xasync()
pass
else:
@@ -2830,15 +2828,15 @@ def unary(self):
self.enterRule(localctx, 54, self.RULE_unary)
try:
self.enterOuterAlt(localctx, 1)
- self.state = 445
- self.unary_op()
self.state = 446
- self.operand()
+ self.unary_op()
self.state = 447
- self.match(AleoParser.INTO)
+ self.operand()
self.state = 448
- self.register_access()
+ self.match(AleoParser.INTO)
self.state = 449
+ self.register_access()
+ self.state = 450
self.match(AleoParser.SC)
except RecognitionException as re:
localctx.exception = re
@@ -2897,17 +2895,17 @@ def binary(self):
self.enterRule(localctx, 56, self.RULE_binary)
try:
self.enterOuterAlt(localctx, 1)
- self.state = 451
- self.binary_op()
self.state = 452
- self.operand()
+ self.binary_op()
self.state = 453
self.operand()
self.state = 454
- self.match(AleoParser.INTO)
+ self.operand()
self.state = 455
- self.register_access()
+ self.match(AleoParser.INTO)
self.state = 456
+ self.register_access()
+ self.state = 457
self.match(AleoParser.SC)
except RecognitionException as re:
localctx.exception = re
@@ -2965,19 +2963,19 @@ def ternary(self):
self.enterRule(localctx, 58, self.RULE_ternary)
try:
self.enterOuterAlt(localctx, 1)
- self.state = 458
- self.match(AleoParser.TERNARY)
self.state = 459
- self.operand()
+ self.match(AleoParser.TERNARY)
self.state = 460
self.operand()
self.state = 461
self.operand()
self.state = 462
- self.match(AleoParser.INTO)
+ self.operand()
self.state = 463
- self.register_access()
+ self.match(AleoParser.INTO)
self.state = 464
+ self.register_access()
+ self.state = 465
self.match(AleoParser.SC)
except RecognitionException as re:
localctx.exception = re
@@ -3036,17 +3034,17 @@ def is_(self):
self.enterRule(localctx, 60, self.RULE_is)
try:
self.enterOuterAlt(localctx, 1)
- self.state = 466
- self.is_op()
self.state = 467
- self.operand()
+ self.is_op()
self.state = 468
self.operand()
self.state = 469
- self.match(AleoParser.INTO)
+ self.operand()
self.state = 470
- self.register_access()
+ self.match(AleoParser.INTO)
self.state = 471
+ self.register_access()
+ self.state = 472
self.match(AleoParser.SC)
except RecognitionException as re:
localctx.exception = re
@@ -3098,13 +3096,13 @@ def assert_(self):
self.enterRule(localctx, 62, self.RULE_assert)
try:
self.enterOuterAlt(localctx, 1)
- self.state = 473
- self.assert_op()
self.state = 474
- self.operand()
+ self.assert_op()
self.state = 475
self.operand()
self.state = 476
+ self.operand()
+ self.state = 477
self.match(AleoParser.SC)
except RecognitionException as re:
localctx.exception = re
@@ -3178,37 +3176,37 @@ def commit(self):
self.enterRule(localctx, 64, self.RULE_commit)
try:
self.enterOuterAlt(localctx, 1)
- self.state = 478
- self.commit_op()
self.state = 479
- self.operand()
+ self.commit_op()
self.state = 480
self.operand()
self.state = 481
- self.match(AleoParser.INTO)
+ self.operand()
self.state = 482
- self.register_access()
+ self.match(AleoParser.INTO)
self.state = 483
+ self.register_access()
+ self.state = 484
self.match(AleoParser.AS)
- self.state = 487
+ self.state = 488
self._errHandler.sync(self)
token = self._input.LA(1)
if token in [109]:
- self.state = 484
+ self.state = 485
self.address_type()
pass
elif token in [107]:
- self.state = 485
+ self.state = 486
self.field_type()
pass
elif token in [17]:
- self.state = 486
+ self.state = 487
self.group_type()
pass
else:
raise NoViableAltException(self)
- self.state = 489
+ self.state = 490
self.match(AleoParser.SC)
except RecognitionException as re:
localctx.exception = re
@@ -3287,46 +3285,46 @@ def hash1(self):
self.enterRule(localctx, 66, self.RULE_hash1)
try:
self.enterOuterAlt(localctx, 1)
- self.state = 491
- self.hash1_op()
self.state = 492
- self.operand()
+ self.hash1_op()
self.state = 493
- self.match(AleoParser.INTO)
+ self.operand()
self.state = 494
- self.register_access()
+ self.match(AleoParser.INTO)
self.state = 495
+ self.register_access()
+ self.state = 496
self.match(AleoParser.AS)
- self.state = 501
+ self.state = 502
self._errHandler.sync(self)
la_ = self._interp.adaptivePredict(self._input,19,self._ctx)
if la_ == 1:
- self.state = 496
+ self.state = 497
self.arithmetic_type()
pass
elif la_ == 2:
- self.state = 497
+ self.state = 498
self.address_type()
pass
elif la_ == 3:
- self.state = 498
+ self.state = 499
self.signature_type()
pass
elif la_ == 4:
- self.state = 499
+ self.state = 500
self.array_type()
pass
elif la_ == 5:
- self.state = 500
+ self.state = 501
self.identifier()
pass
- self.state = 503
+ self.state = 504
self.match(AleoParser.SC)
except RecognitionException as re:
localctx.exception = re
@@ -3408,48 +3406,48 @@ def hash2(self):
self.enterRule(localctx, 68, self.RULE_hash2)
try:
self.enterOuterAlt(localctx, 1)
- self.state = 505
- self.hash2_op()
self.state = 506
- self.operand()
+ self.hash2_op()
self.state = 507
self.operand()
self.state = 508
- self.match(AleoParser.INTO)
+ self.operand()
self.state = 509
- self.register_access()
+ self.match(AleoParser.INTO)
self.state = 510
+ self.register_access()
+ self.state = 511
self.match(AleoParser.AS)
- self.state = 516
+ self.state = 517
self._errHandler.sync(self)
la_ = self._interp.adaptivePredict(self._input,20,self._ctx)
if la_ == 1:
- self.state = 511
+ self.state = 512
self.arithmetic_type()
pass
elif la_ == 2:
- self.state = 512
+ self.state = 513
self.address_type()
pass
elif la_ == 3:
- self.state = 513
+ self.state = 514
self.signature_type()
pass
elif la_ == 4:
- self.state = 514
+ self.state = 515
self.array_type()
pass
elif la_ == 5:
- self.state = 515
+ self.state = 516
self.identifier()
pass
- self.state = 518
+ self.state = 519
self.match(AleoParser.SC)
except RecognitionException as re:
localctx.exception = re
@@ -3494,17 +3492,17 @@ def hash_(self):
localctx = AleoParser.HashContext(self, self._ctx, self.state)
self.enterRule(localctx, 70, self.RULE_hash)
try:
- self.state = 522
+ self.state = 523
self._errHandler.sync(self)
token = self._input.LA(1)
if token in [72]:
self.enterOuterAlt(localctx, 1)
- self.state = 520
+ self.state = 521
self.hash1()
pass
elif token in [73]:
self.enterOuterAlt(localctx, 2)
- self.state = 521
+ self.state = 522
self.hash2()
pass
else:
@@ -3567,19 +3565,19 @@ def sign_verify(self):
self.enterRule(localctx, 72, self.RULE_sign_verify)
try:
self.enterOuterAlt(localctx, 1)
- self.state = 524
- self.sign_verify_op()
self.state = 525
- self.operand()
+ self.sign_verify_op()
self.state = 526
self.operand()
self.state = 527
self.operand()
self.state = 528
- self.match(AleoParser.INTO)
+ self.operand()
self.state = 529
- self.register_access()
+ self.match(AleoParser.INTO)
self.state = 530
+ self.register_access()
+ self.state = 531
self.match(AleoParser.SC)
except RecognitionException as re:
localctx.exception = re
@@ -3645,31 +3643,31 @@ def cast(self):
self.enterRule(localctx, 74, self.RULE_cast)
try:
self.enterOuterAlt(localctx, 1)
- self.state = 532
+ self.state = 533
self.cast_op()
- self.state = 534
+ self.state = 535
self._errHandler.sync(self)
_alt = 1
while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER:
if _alt == 1:
- self.state = 533
+ self.state = 534
self.operand()
else:
raise NoViableAltException(self)
- self.state = 536
+ self.state = 537
self._errHandler.sync(self)
_alt = self._interp.adaptivePredict(self._input,22,self._ctx)
- self.state = 538
- self.match(AleoParser.INTO)
self.state = 539
- self.register_access()
+ self.match(AleoParser.INTO)
self.state = 540
- self.match(AleoParser.AS)
+ self.register_access()
self.state = 541
- self.cast_destination()
+ self.match(AleoParser.AS)
self.state = 542
+ self.cast_destination()
+ self.state = 543
self.match(AleoParser.SC)
except RecognitionException as re:
localctx.exception = re
@@ -3739,46 +3737,46 @@ def call(self):
self._la = 0 # Token type
try:
self.enterOuterAlt(localctx, 1)
- self.state = 544
+ self.state = 545
self.match(AleoParser.CALL)
- self.state = 547
+ self.state = 548
self._errHandler.sync(self)
la_ = self._interp.adaptivePredict(self._input,23,self._ctx)
if la_ == 1:
- self.state = 545
+ self.state = 546
self.locator()
pass
elif la_ == 2:
- self.state = 546
+ self.state = 547
self.identifier()
pass
- self.state = 552
+ self.state = 553
self._errHandler.sync(self)
_alt = self._interp.adaptivePredict(self._input,24,self._ctx)
while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER:
if _alt==1:
- self.state = 549
+ self.state = 550
self.operand()
- self.state = 554
+ self.state = 555
self._errHandler.sync(self)
_alt = self._interp.adaptivePredict(self._input,24,self._ctx)
- self.state = 561
+ self.state = 562
self._errHandler.sync(self)
_la = self._input.LA(1)
if _la==10:
- self.state = 555
+ self.state = 556
self.match(AleoParser.INTO)
- self.state = 557
+ self.state = 558
self._errHandler.sync(self)
_la = self._input.LA(1)
while True:
- self.state = 556
+ self.state = 557
self.register_access()
- self.state = 559
+ self.state = 560
self._errHandler.sync(self)
_la = self._input.LA(1)
if not (_la==115):
@@ -3786,7 +3784,7 @@ def call(self):
- self.state = 563
+ self.state = 564
self.match(AleoParser.SC)
except RecognitionException as re:
localctx.exception = re
@@ -3848,26 +3846,26 @@ def xasync(self):
self.enterRule(localctx, 78, self.RULE_xasync)
try:
self.enterOuterAlt(localctx, 1)
- self.state = 565
- self.match(AleoParser.ASYNC)
self.state = 566
+ self.match(AleoParser.ASYNC)
+ self.state = 567
self.identifier()
- self.state = 570
+ self.state = 571
self._errHandler.sync(self)
_alt = self._interp.adaptivePredict(self._input,27,self._ctx)
while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER:
if _alt==1:
- self.state = 567
+ self.state = 568
self.operand()
- self.state = 572
+ self.state = 573
self._errHandler.sync(self)
_alt = self._interp.adaptivePredict(self._input,27,self._ctx)
- self.state = 573
- self.match(AleoParser.INTO)
self.state = 574
- self.register_access()
+ self.match(AleoParser.INTO)
self.state = 575
+ self.register_access()
+ self.state = 576
self.match(AleoParser.SC)
except RecognitionException as re:
localctx.exception = re
@@ -3920,27 +3918,27 @@ def literal(self):
localctx = AleoParser.LiteralContext(self, self._ctx, self.state)
self.enterRule(localctx, 80, self.RULE_literal)
try:
- self.state = 581
+ self.state = 582
self._errHandler.sync(self)
token = self._input.LA(1)
if token in [8, 114]:
self.enterOuterAlt(localctx, 1)
- self.state = 577
+ self.state = 578
self.arithmetic_literal()
pass
elif token in [112]:
self.enterOuterAlt(localctx, 2)
- self.state = 578
+ self.state = 579
self.address_literal()
pass
elif token in [113]:
self.enterOuterAlt(localctx, 3)
- self.state = 579
+ self.state = 580
self.signature_literal()
pass
elif token in [103, 104]:
self.enterOuterAlt(localctx, 4)
- self.state = 580
+ self.state = 581
self.boolean_literal()
pass
else:
@@ -3993,17 +3991,17 @@ def signed_literal(self):
self._la = 0 # Token type
try:
self.enterOuterAlt(localctx, 1)
- self.state = 584
+ self.state = 585
self._errHandler.sync(self)
_la = self._input.LA(1)
if _la==8:
- self.state = 583
+ self.state = 584
self.match(AleoParser.DS)
- self.state = 586
- self.match(AleoParser.DIGITS)
self.state = 587
+ self.match(AleoParser.DIGITS)
+ self.state = 588
self.signed_type()
except RecognitionException as re:
localctx.exception = re
@@ -4052,17 +4050,17 @@ def unsigned_literal(self):
self._la = 0 # Token type
try:
self.enterOuterAlt(localctx, 1)
- self.state = 590
+ self.state = 591
self._errHandler.sync(self)
_la = self._input.LA(1)
if _la==8:
- self.state = 589
+ self.state = 590
self.match(AleoParser.DS)
- self.state = 592
- self.match(AleoParser.DIGITS)
self.state = 593
+ self.match(AleoParser.DIGITS)
+ self.state = 594
self.unsigned_type()
except RecognitionException as re:
localctx.exception = re
@@ -4107,18 +4105,18 @@ def integer_literal(self):
localctx = AleoParser.Integer_literalContext(self, self._ctx, self.state)
self.enterRule(localctx, 86, self.RULE_integer_literal)
try:
- self.state = 597
+ self.state = 598
self._errHandler.sync(self)
la_ = self._interp.adaptivePredict(self._input,31,self._ctx)
if la_ == 1:
self.enterOuterAlt(localctx, 1)
- self.state = 595
+ self.state = 596
self.signed_literal()
pass
elif la_ == 2:
self.enterOuterAlt(localctx, 2)
- self.state = 596
+ self.state = 597
self.unsigned_literal()
pass
@@ -4170,17 +4168,17 @@ def field_literal(self):
self._la = 0 # Token type
try:
self.enterOuterAlt(localctx, 1)
- self.state = 600
+ self.state = 601
self._errHandler.sync(self)
_la = self._input.LA(1)
if _la==8:
- self.state = 599
+ self.state = 600
self.match(AleoParser.DS)
- self.state = 602
- self.match(AleoParser.DIGITS)
self.state = 603
+ self.match(AleoParser.DIGITS)
+ self.state = 604
self.field_type()
except RecognitionException as re:
localctx.exception = re
@@ -4229,17 +4227,17 @@ def group_literal(self):
self._la = 0 # Token type
try:
self.enterOuterAlt(localctx, 1)
- self.state = 606
+ self.state = 607
self._errHandler.sync(self)
_la = self._input.LA(1)
if _la==8:
- self.state = 605
+ self.state = 606
self.match(AleoParser.DS)
- self.state = 608
- self.match(AleoParser.DIGITS)
self.state = 609
+ self.match(AleoParser.DIGITS)
+ self.state = 610
self.group_type()
except RecognitionException as re:
localctx.exception = re
@@ -4288,17 +4286,17 @@ def scalar_literal(self):
self._la = 0 # Token type
try:
self.enterOuterAlt(localctx, 1)
- self.state = 612
+ self.state = 613
self._errHandler.sync(self)
_la = self._input.LA(1)
if _la==8:
- self.state = 611
+ self.state = 612
self.match(AleoParser.DS)
- self.state = 614
- self.match(AleoParser.DIGITS)
self.state = 615
+ self.match(AleoParser.DIGITS)
+ self.state = 616
self.scalar_type()
except RecognitionException as re:
localctx.exception = re
@@ -4351,30 +4349,30 @@ def arithmetic_literal(self):
localctx = AleoParser.Arithmetic_literalContext(self, self._ctx, self.state)
self.enterRule(localctx, 94, self.RULE_arithmetic_literal)
try:
- self.state = 621
+ self.state = 622
self._errHandler.sync(self)
la_ = self._interp.adaptivePredict(self._input,35,self._ctx)
if la_ == 1:
self.enterOuterAlt(localctx, 1)
- self.state = 617
+ self.state = 618
self.integer_literal()
pass
elif la_ == 2:
self.enterOuterAlt(localctx, 2)
- self.state = 618
+ self.state = 619
self.field_literal()
pass
elif la_ == 3:
self.enterOuterAlt(localctx, 3)
- self.state = 619
+ self.state = 620
self.group_literal()
pass
elif la_ == 4:
self.enterOuterAlt(localctx, 4)
- self.state = 620
+ self.state = 621
self.scalar_literal()
pass
@@ -4418,7 +4416,7 @@ def address_literal(self):
self.enterRule(localctx, 96, self.RULE_address_literal)
try:
self.enterOuterAlt(localctx, 1)
- self.state = 623
+ self.state = 624
self.match(AleoParser.ADDRESS_LITERAL)
except RecognitionException as re:
localctx.exception = re
@@ -4459,7 +4457,7 @@ def signature_literal(self):
self.enterRule(localctx, 98, self.RULE_signature_literal)
try:
self.enterOuterAlt(localctx, 1)
- self.state = 625
+ self.state = 626
self.match(AleoParser.SIGNATURE_LITERAL)
except RecognitionException as re:
localctx.exception = re
@@ -4504,7 +4502,7 @@ def boolean_literal(self):
self._la = 0 # Token type
try:
self.enterOuterAlt(localctx, 1)
- self.state = 627
+ self.state = 628
_la = self._input.LA(1)
if not(_la==103 or _la==104):
self._errHandler.recoverInline(self)
@@ -4550,7 +4548,7 @@ def unsigned_type(self):
self.enterRule(localctx, 102, self.RULE_unsigned_type)
try:
self.enterOuterAlt(localctx, 1)
- self.state = 629
+ self.state = 630
self.match(AleoParser.UNSIGNED_TYPE)
except RecognitionException as re:
localctx.exception = re
@@ -4591,7 +4589,7 @@ def signed_type(self):
self.enterRule(localctx, 104, self.RULE_signed_type)
try:
self.enterOuterAlt(localctx, 1)
- self.state = 631
+ self.state = 632
self.match(AleoParser.SIGNED_TYPE)
except RecognitionException as re:
localctx.exception = re
@@ -4636,17 +4634,17 @@ def integer_type(self):
localctx = AleoParser.Integer_typeContext(self, self._ctx, self.state)
self.enterRule(localctx, 106, self.RULE_integer_type)
try:
- self.state = 635
+ self.state = 636
self._errHandler.sync(self)
token = self._input.LA(1)
if token in [105]:
self.enterOuterAlt(localctx, 1)
- self.state = 633
+ self.state = 634
self.unsigned_type()
pass
elif token in [106]:
self.enterOuterAlt(localctx, 2)
- self.state = 634
+ self.state = 635
self.signed_type()
pass
else:
@@ -4691,7 +4689,7 @@ def field_type(self):
self.enterRule(localctx, 108, self.RULE_field_type)
try:
self.enterOuterAlt(localctx, 1)
- self.state = 637
+ self.state = 638
self.match(AleoParser.FIELD)
except RecognitionException as re:
localctx.exception = re
@@ -4732,7 +4730,7 @@ def group_type(self):
self.enterRule(localctx, 110, self.RULE_group_type)
try:
self.enterOuterAlt(localctx, 1)
- self.state = 639
+ self.state = 640
self.match(AleoParser.GROUP)
except RecognitionException as re:
localctx.exception = re
@@ -4773,7 +4771,7 @@ def scalar_type(self):
self.enterRule(localctx, 112, self.RULE_scalar_type)
try:
self.enterOuterAlt(localctx, 1)
- self.state = 641
+ self.state = 642
self.match(AleoParser.SCALAR)
except RecognitionException as re:
localctx.exception = re
@@ -4826,27 +4824,27 @@ def arithmetic_type(self):
localctx = AleoParser.Arithmetic_typeContext(self, self._ctx, self.state)
self.enterRule(localctx, 114, self.RULE_arithmetic_type)
try:
- self.state = 647
+ self.state = 648
self._errHandler.sync(self)
token = self._input.LA(1)
if token in [105, 106]:
self.enterOuterAlt(localctx, 1)
- self.state = 643
+ self.state = 644
self.integer_type()
pass
elif token in [107]:
self.enterOuterAlt(localctx, 2)
- self.state = 644
+ self.state = 645
self.field_type()
pass
elif token in [17]:
self.enterOuterAlt(localctx, 3)
- self.state = 645
+ self.state = 646
self.group_type()
pass
elif token in [108]:
self.enterOuterAlt(localctx, 4)
- self.state = 646
+ self.state = 647
self.scalar_type()
pass
else:
@@ -4891,7 +4889,7 @@ def address_type(self):
self.enterRule(localctx, 116, self.RULE_address_type)
try:
self.enterOuterAlt(localctx, 1)
- self.state = 649
+ self.state = 650
self.match(AleoParser.ADDRESS)
except RecognitionException as re:
localctx.exception = re
@@ -4932,7 +4930,7 @@ def boolean_type(self):
self.enterRule(localctx, 118, self.RULE_boolean_type)
try:
self.enterOuterAlt(localctx, 1)
- self.state = 651
+ self.state = 652
self.match(AleoParser.BOOLEAN)
except RecognitionException as re:
localctx.exception = re
@@ -4973,7 +4971,7 @@ def signature_type(self):
self.enterRule(localctx, 120, self.RULE_signature_type)
try:
self.enterOuterAlt(localctx, 1)
- self.state = 653
+ self.state = 654
self.match(AleoParser.SIGNATURE)
except RecognitionException as re:
localctx.exception = re
@@ -5026,27 +5024,27 @@ def literal_type(self):
localctx = AleoParser.Literal_typeContext(self, self._ctx, self.state)
self.enterRule(localctx, 122, self.RULE_literal_type)
try:
- self.state = 659
+ self.state = 660
self._errHandler.sync(self)
token = self._input.LA(1)
if token in [17, 105, 106, 107, 108]:
self.enterOuterAlt(localctx, 1)
- self.state = 655
+ self.state = 656
self.arithmetic_type()
pass
elif token in [109]:
self.enterOuterAlt(localctx, 2)
- self.state = 656
+ self.state = 657
self.address_type()
pass
elif token in [111]:
self.enterOuterAlt(localctx, 3)
- self.state = 657
+ self.state = 658
self.signature_type()
pass
elif token in [110]:
self.enterOuterAlt(localctx, 4)
- self.state = 658
+ self.state = 659
self.boolean_type()
pass
else:
@@ -5105,15 +5103,15 @@ def array_type(self):
self.enterRule(localctx, 124, self.RULE_array_type)
try:
self.enterOuterAlt(localctx, 1)
- self.state = 661
- self.match(AleoParser.LB)
self.state = 662
- self.plaintext_type()
+ self.match(AleoParser.LB)
self.state = 663
- self.match(AleoParser.SC)
+ self.plaintext_type()
self.state = 664
- self.unsigned_literal()
+ self.match(AleoParser.SC)
self.state = 665
+ self.unsigned_literal()
+ self.state = 666
self.match(AleoParser.RB)
except RecognitionException as re:
localctx.exception = re
@@ -5162,24 +5160,24 @@ def plaintext_type(self):
localctx = AleoParser.Plaintext_typeContext(self, self._ctx, self.state)
self.enterRule(localctx, 126, self.RULE_plaintext_type)
try:
- self.state = 670
+ self.state = 671
self._errHandler.sync(self)
la_ = self._interp.adaptivePredict(self._input,39,self._ctx)
if la_ == 1:
self.enterOuterAlt(localctx, 1)
- self.state = 667
+ self.state = 668
self.literal_type()
pass
elif la_ == 2:
self.enterOuterAlt(localctx, 2)
- self.state = 668
+ self.state = 669
self.array_type()
pass
elif la_ == 3:
self.enterOuterAlt(localctx, 3)
- self.state = 669
+ self.state = 670
self.identifier()
pass
@@ -5235,30 +5233,30 @@ def value_type(self):
localctx = AleoParser.Value_typeContext(self, self._ctx, self.state)
self.enterRule(localctx, 128, self.RULE_value_type)
try:
- self.state = 681
+ self.state = 682
self._errHandler.sync(self)
la_ = self._interp.adaptivePredict(self._input,40,self._ctx)
if la_ == 1:
self.enterOuterAlt(localctx, 1)
- self.state = 672
- self.plaintext_type()
self.state = 673
+ self.plaintext_type()
+ self.state = 674
self.modifier()
pass
elif la_ == 2:
self.enterOuterAlt(localctx, 2)
- self.state = 675
- self.identifier()
self.state = 676
+ self.identifier()
+ self.state = 677
self.modifier()
pass
elif la_ == 3:
self.enterOuterAlt(localctx, 3)
- self.state = 678
- self.locator()
self.state = 679
+ self.locator()
+ self.state = 680
self.modifier()
pass
@@ -5307,9 +5305,9 @@ def mapping_type(self):
self.enterRule(localctx, 130, self.RULE_mapping_type)
try:
self.enterOuterAlt(localctx, 1)
- self.state = 683
- self.plaintext_type()
self.state = 684
+ self.plaintext_type()
+ self.state = 685
self.modifier()
except RecognitionException as re:
localctx.exception = re
@@ -5358,22 +5356,22 @@ def finalize_type(self):
localctx = AleoParser.Finalize_typeContext(self, self._ctx, self.state)
self.enterRule(localctx, 132, self.RULE_finalize_type)
try:
- self.state = 692
+ self.state = 693
self._errHandler.sync(self)
la_ = self._interp.adaptivePredict(self._input,41,self._ctx)
if la_ == 1:
self.enterOuterAlt(localctx, 1)
- self.state = 686
- self.plaintext_type()
self.state = 687
+ self.plaintext_type()
+ self.state = 688
self.modifier()
pass
elif la_ == 2:
self.enterOuterAlt(localctx, 2)
- self.state = 689
- self.locator()
self.state = 690
+ self.locator()
+ self.state = 691
self.modifier()
pass
@@ -5422,9 +5420,9 @@ def entry_type(self):
self.enterRule(localctx, 134, self.RULE_entry_type)
try:
self.enterOuterAlt(localctx, 1)
- self.state = 694
- self.plaintext_type()
self.state = 695
+ self.plaintext_type()
+ self.state = 696
self.modifier()
except RecognitionException as re:
localctx.exception = re
@@ -5477,28 +5475,28 @@ def register_type(self):
localctx = AleoParser.Register_typeContext(self, self._ctx, self.state)
self.enterRule(localctx, 136, self.RULE_register_type)
try:
- self.state = 704
+ self.state = 705
self._errHandler.sync(self)
la_ = self._interp.adaptivePredict(self._input,42,self._ctx)
if la_ == 1:
self.enterOuterAlt(localctx, 1)
- self.state = 697
- self.locator()
self.state = 698
+ self.locator()
+ self.state = 699
self.modifier()
pass
elif la_ == 2:
self.enterOuterAlt(localctx, 2)
- self.state = 700
- self.identifier()
self.state = 701
+ self.identifier()
+ self.state = 702
self.modifier()
pass
elif la_ == 3:
self.enterOuterAlt(localctx, 3)
- self.state = 703
+ self.state = 704
self.plaintext_type()
pass
@@ -5558,9 +5556,9 @@ def modifier(self):
self._la = 0 # Token type
try:
self.enterOuterAlt(localctx, 1)
- self.state = 706
- self.match(AleoParser.DOT)
self.state = 707
+ self.match(AleoParser.DOT)
+ self.state = 708
_la = self._input.LA(1)
if not((((_la) & ~0x3f) == 0 and ((1 << _la) & 126976) != 0)):
self._errHandler.recoverInline(self)
@@ -5614,11 +5612,11 @@ def program_id(self):
self.enterRule(localctx, 140, self.RULE_program_id)
try:
self.enterOuterAlt(localctx, 1)
- self.state = 709
- self.program_name()
self.state = 710
- self.match(AleoParser.DOT)
+ self.program_name()
self.state = 711
+ self.match(AleoParser.DOT)
+ self.state = 712
self.program_domain()
except RecognitionException as re:
localctx.exception = re
@@ -5660,7 +5658,7 @@ def program_name(self):
self.enterRule(localctx, 142, self.RULE_program_name)
try:
self.enterOuterAlt(localctx, 1)
- self.state = 713
+ self.state = 714
self.identifier()
except RecognitionException as re:
localctx.exception = re
@@ -5702,7 +5700,7 @@ def program_domain(self):
self.enterRule(localctx, 144, self.RULE_program_domain)
try:
self.enterOuterAlt(localctx, 1)
- self.state = 715
+ self.state = 716
self.identifier()
except RecognitionException as re:
localctx.exception = re
@@ -5743,7 +5741,7 @@ def register(self):
self.enterRule(localctx, 146, self.RULE_register)
try:
self.enterOuterAlt(localctx, 1)
- self.state = 717
+ self.state = 718
self.match(AleoParser.REGISTER)
except RecognitionException as re:
localctx.exception = re
@@ -5793,15 +5791,15 @@ def register_access(self):
self._la = 0 # Token type
try:
self.enterOuterAlt(localctx, 1)
- self.state = 719
+ self.state = 720
self.register()
- self.state = 723
+ self.state = 724
self._errHandler.sync(self)
_la = self._input.LA(1)
while _la==1 or _la==3:
- self.state = 720
+ self.state = 721
self.register_accessor()
- self.state = 725
+ self.state = 726
self._errHandler.sync(self)
_la = self._input.LA(1)
@@ -5848,17 +5846,17 @@ def register_accessor(self):
localctx = AleoParser.Register_accessorContext(self, self._ctx, self.state)
self.enterRule(localctx, 150, self.RULE_register_accessor)
try:
- self.state = 728
+ self.state = 729
self._errHandler.sync(self)
token = self._input.LA(1)
if token in [1]:
self.enterOuterAlt(localctx, 1)
- self.state = 726
+ self.state = 727
self.access_by_field()
pass
elif token in [3]:
self.enterOuterAlt(localctx, 2)
- self.state = 727
+ self.state = 728
self.access_by_index()
pass
else:
@@ -5907,9 +5905,9 @@ def access_by_field(self):
self.enterRule(localctx, 152, self.RULE_access_by_field)
try:
self.enterOuterAlt(localctx, 1)
- self.state = 730
- self.match(AleoParser.DOT)
self.state = 731
+ self.match(AleoParser.DOT)
+ self.state = 732
self.identifier()
except RecognitionException as re:
localctx.exception = re
@@ -5959,26 +5957,26 @@ def access_by_index(self):
localctx = AleoParser.Access_by_indexContext(self, self._ctx, self.state)
self.enterRule(localctx, 154, self.RULE_access_by_index)
try:
- self.state = 740
+ self.state = 741
self._errHandler.sync(self)
la_ = self._interp.adaptivePredict(self._input,45,self._ctx)
if la_ == 1:
self.enterOuterAlt(localctx, 1)
- self.state = 733
- self.match(AleoParser.LB)
self.state = 734
- self.unsigned_literal()
+ self.match(AleoParser.LB)
self.state = 735
+ self.unsigned_literal()
+ self.state = 736
self.match(AleoParser.RB)
pass
elif la_ == 2:
self.enterOuterAlt(localctx, 2)
- self.state = 737
- self.match(AleoParser.LB)
self.state = 738
- self.match(AleoParser.DIGITS)
+ self.match(AleoParser.LB)
self.state = 739
+ self.match(AleoParser.DIGITS)
+ self.state = 740
self.match(AleoParser.RB)
pass
@@ -6034,30 +6032,30 @@ def operand(self):
localctx = AleoParser.OperandContext(self, self._ctx, self.state)
self.enterRule(localctx, 156, self.RULE_operand)
try:
- self.state = 746
+ self.state = 747
self._errHandler.sync(self)
la_ = self._interp.adaptivePredict(self._input,46,self._ctx)
if la_ == 1:
self.enterOuterAlt(localctx, 1)
- self.state = 742
+ self.state = 743
self.literal()
pass
elif la_ == 2:
self.enterOuterAlt(localctx, 2)
- self.state = 743
+ self.state = 744
self.register_access()
pass
elif la_ == 3:
self.enterOuterAlt(localctx, 3)
- self.state = 744
+ self.state = 745
self.program_id()
pass
elif la_ == 4:
self.enterOuterAlt(localctx, 4)
- self.state = 745
+ self.state = 746
self.operand_preset()
pass
@@ -6125,25 +6123,25 @@ def operand_preset(self):
self.enterRule(localctx, 158, self.RULE_operand_preset)
self._la = 0 # Token type
try:
- self.state = 757
+ self.state = 758
self._errHandler.sync(self)
token = self._input.LA(1)
if token in [17]:
self.enterOuterAlt(localctx, 1)
- self.state = 748
- self.match(AleoParser.GROUP)
self.state = 749
- self.match(AleoParser.CC)
+ self.match(AleoParser.GROUP)
self.state = 750
+ self.match(AleoParser.CC)
+ self.state = 751
self.match(AleoParser.GEN)
pass
elif token in [19]:
self.enterOuterAlt(localctx, 2)
- self.state = 751
- self.match(AleoParser.SELF)
self.state = 752
- self.match(AleoParser.DOT)
+ self.match(AleoParser.SELF)
self.state = 753
+ self.match(AleoParser.DOT)
+ self.state = 754
_la = self._input.LA(1)
if not(_la==20 or _la==21):
self._errHandler.recoverInline(self)
@@ -6153,11 +6151,11 @@ def operand_preset(self):
pass
elif token in [22]:
self.enterOuterAlt(localctx, 3)
- self.state = 754
- self.match(AleoParser.BLOCK)
self.state = 755
- self.match(AleoParser.DOT)
+ self.match(AleoParser.BLOCK)
self.state = 756
+ self.match(AleoParser.DOT)
+ self.state = 757
self.match(AleoParser.HEIGHT)
pass
else:
@@ -6213,13 +6211,13 @@ def tuple_(self):
self.enterRule(localctx, 160, self.RULE_tuple)
try:
self.enterOuterAlt(localctx, 1)
- self.state = 759
- self.identifier()
self.state = 760
- self.match(AleoParser.AS)
+ self.identifier()
self.state = 761
- self.plaintext_type()
+ self.match(AleoParser.AS)
self.state = 762
+ self.plaintext_type()
+ self.state = 763
self.match(AleoParser.SC)
except RecognitionException as re:
localctx.exception = re
@@ -6271,13 +6269,13 @@ def entry(self):
self.enterRule(localctx, 162, self.RULE_entry)
try:
self.enterOuterAlt(localctx, 1)
- self.state = 764
- self.identifier()
self.state = 765
- self.match(AleoParser.AS)
+ self.identifier()
self.state = 766
- self.entry_type()
+ self.match(AleoParser.AS)
self.state = 767
+ self.entry_type()
+ self.state = 768
self.match(AleoParser.SC)
except RecognitionException as re:
localctx.exception = re
@@ -6326,11 +6324,11 @@ def locator(self):
self.enterRule(localctx, 164, self.RULE_locator)
try:
self.enterOuterAlt(localctx, 1)
- self.state = 769
- self.program_id()
self.state = 770
- self.match(AleoParser.SLASH)
+ self.program_id()
self.state = 771
+ self.match(AleoParser.SLASH)
+ self.state = 772
self.identifier()
except RecognitionException as re:
localctx.exception = re
@@ -6379,24 +6377,24 @@ def cast_destination(self):
localctx = AleoParser.Cast_destinationContext(self, self._ctx, self.state)
self.enterRule(localctx, 166, self.RULE_cast_destination)
try:
- self.state = 776
+ self.state = 777
self._errHandler.sync(self)
la_ = self._interp.adaptivePredict(self._input,48,self._ctx)
if la_ == 1:
self.enterOuterAlt(localctx, 1)
- self.state = 773
+ self.state = 774
self.register_type()
pass
elif la_ == 2:
self.enterOuterAlt(localctx, 2)
- self.state = 774
+ self.state = 775
self.locator()
pass
elif la_ == 3:
self.enterOuterAlt(localctx, 3)
- self.state = 775
+ self.state = 776
self.destination_group()
pass
@@ -6450,11 +6448,11 @@ def destination_group(self):
self._la = 0 # Token type
try:
self.enterOuterAlt(localctx, 1)
- self.state = 778
- self.match(AleoParser.GROUP)
self.state = 779
- self.match(AleoParser.DOT)
+ self.match(AleoParser.GROUP)
self.state = 780
+ self.match(AleoParser.DOT)
+ self.state = 781
_la = self._input.LA(1)
if not(_la==25 or _la==26):
self._errHandler.recoverInline(self)
@@ -6524,52 +6522,52 @@ def unary_op(self):
self.enterRule(localctx, 170, self.RULE_unary_op)
self._la = 0 # Token type
try:
- self.state = 793
+ self.state = 794
self._errHandler.sync(self)
token = self._input.LA(1)
if token in [42]:
self.enterOuterAlt(localctx, 1)
- self.state = 782
+ self.state = 783
self.match(AleoParser.ABS)
- self.state = 785
+ self.state = 786
self._errHandler.sync(self)
_la = self._input.LA(1)
if _la==1:
- self.state = 783
- self.match(AleoParser.DOT)
self.state = 784
+ self.match(AleoParser.DOT)
+ self.state = 785
self.match(AleoParser.W)
pass
elif token in [43]:
self.enterOuterAlt(localctx, 2)
- self.state = 787
+ self.state = 788
self.match(AleoParser.DOUBLE)
pass
elif token in [44]:
self.enterOuterAlt(localctx, 3)
- self.state = 788
+ self.state = 789
self.match(AleoParser.INV)
pass
elif token in [45]:
self.enterOuterAlt(localctx, 4)
- self.state = 789
+ self.state = 790
self.match(AleoParser.NEG)
pass
elif token in [46]:
self.enterOuterAlt(localctx, 5)
- self.state = 790
+ self.state = 791
self.match(AleoParser.NOT)
pass
elif token in [47]:
self.enterOuterAlt(localctx, 6)
- self.state = 791
+ self.state = 792
self.match(AleoParser.SQUARE)
pass
elif token in [48]:
self.enterOuterAlt(localctx, 7)
- self.state = 792
+ self.state = 793
self.match(AleoParser.SQRT)
pass
else:
@@ -6671,177 +6669,177 @@ def binary_op(self):
self.enterRule(localctx, 172, self.RULE_binary_op)
self._la = 0 # Token type
try:
- self.state = 845
+ self.state = 846
self._errHandler.sync(self)
token = self._input.LA(1)
if token in [49]:
self.enterOuterAlt(localctx, 1)
- self.state = 795
+ self.state = 796
self.match(AleoParser.ADD)
- self.state = 798
+ self.state = 799
self._errHandler.sync(self)
_la = self._input.LA(1)
if _la==1:
- self.state = 796
- self.match(AleoParser.DOT)
self.state = 797
+ self.match(AleoParser.DOT)
+ self.state = 798
self.match(AleoParser.W)
pass
elif token in [50]:
self.enterOuterAlt(localctx, 2)
- self.state = 800
+ self.state = 801
self.match(AleoParser.SUB)
- self.state = 803
+ self.state = 804
self._errHandler.sync(self)
_la = self._input.LA(1)
if _la==1:
- self.state = 801
- self.match(AleoParser.DOT)
self.state = 802
+ self.match(AleoParser.DOT)
+ self.state = 803
self.match(AleoParser.W)
pass
elif token in [51]:
self.enterOuterAlt(localctx, 3)
- self.state = 805
+ self.state = 806
self.match(AleoParser.MUL)
- self.state = 808
+ self.state = 809
self._errHandler.sync(self)
_la = self._input.LA(1)
if _la==1:
- self.state = 806
- self.match(AleoParser.DOT)
self.state = 807
+ self.match(AleoParser.DOT)
+ self.state = 808
self.match(AleoParser.W)
pass
elif token in [52]:
self.enterOuterAlt(localctx, 4)
- self.state = 810
+ self.state = 811
self.match(AleoParser.DIV)
- self.state = 813
+ self.state = 814
self._errHandler.sync(self)
_la = self._input.LA(1)
if _la==1:
- self.state = 811
- self.match(AleoParser.DOT)
self.state = 812
+ self.match(AleoParser.DOT)
+ self.state = 813
self.match(AleoParser.W)
pass
elif token in [53]:
self.enterOuterAlt(localctx, 5)
- self.state = 815
+ self.state = 816
self.match(AleoParser.REM)
- self.state = 818
+ self.state = 819
self._errHandler.sync(self)
_la = self._input.LA(1)
if _la==1:
- self.state = 816
- self.match(AleoParser.DOT)
self.state = 817
+ self.match(AleoParser.DOT)
+ self.state = 818
self.match(AleoParser.W)
pass
elif token in [54]:
self.enterOuterAlt(localctx, 6)
- self.state = 820
+ self.state = 821
self.match(AleoParser.POW)
- self.state = 823
+ self.state = 824
self._errHandler.sync(self)
_la = self._input.LA(1)
if _la==1:
- self.state = 821
- self.match(AleoParser.DOT)
self.state = 822
+ self.match(AleoParser.DOT)
+ self.state = 823
self.match(AleoParser.W)
pass
elif token in [55]:
self.enterOuterAlt(localctx, 7)
- self.state = 825
+ self.state = 826
self.match(AleoParser.SHL)
- self.state = 828
+ self.state = 829
self._errHandler.sync(self)
_la = self._input.LA(1)
if _la==1:
- self.state = 826
- self.match(AleoParser.DOT)
self.state = 827
+ self.match(AleoParser.DOT)
+ self.state = 828
self.match(AleoParser.W)
pass
elif token in [56]:
self.enterOuterAlt(localctx, 8)
- self.state = 830
+ self.state = 831
self.match(AleoParser.SHR)
- self.state = 833
+ self.state = 834
self._errHandler.sync(self)
_la = self._input.LA(1)
if _la==1:
- self.state = 831
- self.match(AleoParser.DOT)
self.state = 832
+ self.match(AleoParser.DOT)
+ self.state = 833
self.match(AleoParser.W)
pass
elif token in [57]:
self.enterOuterAlt(localctx, 9)
- self.state = 835
+ self.state = 836
self.match(AleoParser.MOD)
pass
elif token in [58]:
self.enterOuterAlt(localctx, 10)
- self.state = 836
+ self.state = 837
self.match(AleoParser.AND)
pass
elif token in [59]:
self.enterOuterAlt(localctx, 11)
- self.state = 837
+ self.state = 838
self.match(AleoParser.OR)
pass
elif token in [60]:
self.enterOuterAlt(localctx, 12)
- self.state = 838
+ self.state = 839
self.match(AleoParser.XOR)
pass
elif token in [61]:
self.enterOuterAlt(localctx, 13)
- self.state = 839
+ self.state = 840
self.match(AleoParser.NAND)
pass
elif token in [62]:
self.enterOuterAlt(localctx, 14)
- self.state = 840
+ self.state = 841
self.match(AleoParser.NOR)
pass
elif token in [63]:
self.enterOuterAlt(localctx, 15)
- self.state = 841
+ self.state = 842
self.match(AleoParser.GT)
pass
elif token in [64]:
self.enterOuterAlt(localctx, 16)
- self.state = 842
+ self.state = 843
self.match(AleoParser.GTE)
pass
elif token in [65]:
self.enterOuterAlt(localctx, 17)
- self.state = 843
+ self.state = 844
self.match(AleoParser.LT)
pass
elif token in [66]:
self.enterOuterAlt(localctx, 18)
- self.state = 844
+ self.state = 845
self.match(AleoParser.LTE)
pass
else:
@@ -6896,11 +6894,11 @@ def is_op(self):
self._la = 0 # Token type
try:
self.enterOuterAlt(localctx, 1)
- self.state = 847
- self.match(AleoParser.IS)
self.state = 848
- self.match(AleoParser.DOT)
+ self.match(AleoParser.IS)
self.state = 849
+ self.match(AleoParser.DOT)
+ self.state = 850
_la = self._input.LA(1)
if not(_la==68 or _la==69):
self._errHandler.recoverInline(self)
@@ -6956,11 +6954,11 @@ def assert_op(self):
self._la = 0 # Token type
try:
self.enterOuterAlt(localctx, 1)
- self.state = 851
- self.match(AleoParser.ASSERT)
self.state = 852
- self.match(AleoParser.DOT)
+ self.match(AleoParser.ASSERT)
self.state = 853
+ self.match(AleoParser.DOT)
+ self.state = 854
_la = self._input.LA(1)
if not(_la==68 or _la==69):
self._errHandler.recoverInline(self)
@@ -7028,11 +7026,11 @@ def commit_op(self):
self._la = 0 # Token type
try:
self.enterOuterAlt(localctx, 1)
- self.state = 855
- self.match(AleoParser.COMMIT)
self.state = 856
- self.match(AleoParser.DOT)
+ self.match(AleoParser.COMMIT)
self.state = 857
+ self.match(AleoParser.DOT)
+ self.state = 858
_la = self._input.LA(1)
if not(((((_la - 74)) & ~0x3f) == 0 and ((1 << (_la - 74)) & 63) != 0)):
self._errHandler.recoverInline(self)
@@ -7127,11 +7125,11 @@ def hash1_op(self):
self._la = 0 # Token type
try:
self.enterOuterAlt(localctx, 1)
- self.state = 859
- self.match(AleoParser.HASH)
self.state = 860
- self.match(AleoParser.DOT)
+ self.match(AleoParser.HASH)
self.state = 861
+ self.match(AleoParser.DOT)
+ self.state = 862
_la = self._input.LA(1)
if not(((((_la - 74)) & ~0x3f) == 0 and ((1 << (_la - 74)) & 32767) != 0)):
self._errHandler.recoverInline(self)
@@ -7190,11 +7188,11 @@ def hash2_op(self):
self._la = 0 # Token type
try:
self.enterOuterAlt(localctx, 1)
- self.state = 863
- self.match(AleoParser.HASH_MANY)
self.state = 864
- self.match(AleoParser.DOT)
+ self.match(AleoParser.HASH_MANY)
self.state = 865
+ self.match(AleoParser.DOT)
+ self.state = 866
_la = self._input.LA(1)
if not(((((_la - 80)) & ~0x3f) == 0 and ((1 << (_la - 80)) & 7) != 0)):
self._errHandler.recoverInline(self)
@@ -7247,15 +7245,15 @@ def cast_op(self):
self._la = 0 # Token type
try:
self.enterOuterAlt(localctx, 1)
- self.state = 867
+ self.state = 868
self.match(AleoParser.CAST)
- self.state = 870
+ self.state = 871
self._errHandler.sync(self)
_la = self._input.LA(1)
if _la==1:
- self.state = 868
- self.match(AleoParser.DOT)
self.state = 869
+ self.match(AleoParser.DOT)
+ self.state = 870
self.match(AleoParser.LOSSY)
@@ -7308,11 +7306,11 @@ def branch_op(self):
self._la = 0 # Token type
try:
self.enterOuterAlt(localctx, 1)
- self.state = 872
- self.match(AleoParser.BRANCH)
self.state = 873
- self.match(AleoParser.DOT)
+ self.match(AleoParser.BRANCH)
self.state = 874
+ self.match(AleoParser.DOT)
+ self.state = 875
_la = self._input.LA(1)
if not(_la==68 or _la==69):
self._errHandler.recoverInline(self)
@@ -7364,11 +7362,11 @@ def random_op(self):
self.enterRule(localctx, 188, self.RULE_random_op)
try:
self.enterOuterAlt(localctx, 1)
- self.state = 876
- self.match(AleoParser.RAND)
self.state = 877
- self.match(AleoParser.DOT)
+ self.match(AleoParser.RAND)
self.state = 878
+ self.match(AleoParser.DOT)
+ self.state = 879
self.match(AleoParser.CHACHA)
except RecognitionException as re:
localctx.exception = re
@@ -7415,11 +7413,11 @@ def get_or_use_op(self):
self.enterRule(localctx, 190, self.RULE_get_or_use_op)
try:
self.enterOuterAlt(localctx, 1)
- self.state = 880
- self.match(AleoParser.GET)
self.state = 881
- self.match(AleoParser.DOT)
+ self.match(AleoParser.GET)
self.state = 882
+ self.match(AleoParser.DOT)
+ self.state = 883
self.match(AleoParser.OR_USE)
except RecognitionException as re:
localctx.exception = re
@@ -7468,21 +7466,21 @@ def sign_verify_op(self):
localctx = AleoParser.Sign_verify_opContext(self, self._ctx, self.state)
self.enterRule(localctx, 192, self.RULE_sign_verify_op)
try:
- self.state = 888
+ self.state = 889
self._errHandler.sync(self)
token = self._input.LA(1)
if token in [37]:
self.enterOuterAlt(localctx, 1)
- self.state = 884
- self.match(AleoParser.SIGN)
self.state = 885
- self.match(AleoParser.DOT)
+ self.match(AleoParser.SIGN)
self.state = 886
+ self.match(AleoParser.DOT)
+ self.state = 887
self.match(AleoParser.VERIFY)
pass
elif token in [39]:
self.enterOuterAlt(localctx, 2)
- self.state = 887
+ self.state = 888
self.match(AleoParser.SIGN_VERIFY)
pass
else:
@@ -7527,7 +7525,7 @@ def label(self):
self.enterRule(localctx, 194, self.RULE_label)
try:
self.enterOuterAlt(localctx, 1)
- self.state = 890
+ self.state = 891
self.match(AleoParser.IDENTIFIER)
except RecognitionException as re:
localctx.exception = re
@@ -7887,7 +7885,7 @@ def identifier(self):
self._la = 0 # Token type
try:
self.enterOuterAlt(localctx, 1)
- self.state = 892
+ self.state = 893
_la = self._input.LA(1)
if not((((_la) & ~0x3f) == 0 and ((1 << _la) & -512) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 7881299347898367) != 0)):
self._errHandler.recoverInline(self)
diff --git a/vanguard/aleo/run.py b/vanguard/aleo/run.py
new file mode 100644
index 0000000..f5e7c98
--- /dev/null
+++ b/vanguard/aleo/run.py
@@ -0,0 +1,46 @@
+#!/usr/bin/env python
+# NOTE: this is project script and shall not be called directly
+
+import argparse
+
+from tabulate import tabulate
+
+from .common import detect
+from . import detectors as dlib
+
+def run():
+ # get all available detectors
+ dlib_choices = [ p.replace("detector_", "") for p in dir(dlib) if p.startswith("detector_") ]
+
+ # parse
+ ap = argparse.ArgumentParser()
+ ap.add_argument("-b", "--build", default="./", type=str, help="project build path, default: ./")
+ ap.add_argument("-p", "--pid", default=None, type=str, help="program id, default: ")
+ ap.add_argument("-f", "--fids", default=None, type=str, help="function ids (separated by comma, no space), default: ")
+ ap.add_argument("-d", "--detector", default="infoleak", type=str, choices=dlib_choices, help="detector to use, default: infoleak")
+ ap.add_argument("-v", "--verbose", action="store_true", help="whether or not to return extra info, default: False")
+ args = ap.parse_args()
+
+ # process
+ _build = args.build
+ _pid = args.pid
+ _fids = args.fids if args.fids is None else args.fids.split(",")
+ _detector = args.detector
+
+ # call
+ ret = detect(_build, pid=_pid, fids=_fids, detector=_detector, readable=True)
+
+ # format and print
+ # compute indentation
+ headers = ["id", "program", "function", "detector", "result", "info"]
+
+ sret = [
+ (p[0], p[1], _detector, "unsafe" if p[2] else "safe", p[3]) if args.verbose else\
+ (p[0], p[1], _detector, "unsafe" if p[2] else "safe")
+ for p in ret
+ ]
+
+ print(tabulate(sret, headers=headers, showindex=True, tablefmt="github"))
+
+if __name__ == "__main__":
+ run()
\ No newline at end of file