Added support for environment variables in build.py and refactored anonymous functions to use the lambda keyword

This commit is contained in:
nocturn9x 2021-01-14 16:03:31 +01:00
parent 2e60ab9fb6
commit 28abedf498
8 changed files with 173498 additions and 45 deletions

127
build.py
View File

@ -17,7 +17,9 @@
# A minimalistic build script for JAPL
import os
import stat
import shlex
import shutil
import logging
import argparse
from time import time
@ -76,10 +78,30 @@ Command-line options
"""'''
def build(path: str, flags: Dict[str, str] = {}, options: Dict[str, bool] = {}, override: bool = False, skip_tests: bool = False):
def run_command(command: str, mode: str = "Popen", **kwargs):
"""
Runs a command with subprocess and returns the process'
return code, stderr and stdout
"""
if mode == "Popen":
process = Popen(shlex.split(command, posix=os.name != "nt"), **kwargs)
else:
process = run(command, **kwargs)
if mode == "Popen":
stdout, stderr = process.communicate()
else:
stdout, stderr = None, None
return stdout, stderr, process.returncode
def build(path: str, flags: Dict[str, str] = {}, options: Dict[str, bool] = {}, override: bool = False, skip_tests: bool = False, install: bool = False,
ignore_binary: bool = False):
"""
Compiles the JAPL runtime, generating the appropriate
configuration needed for compilation to succeed.
configuration needed for compilation to succeed,
running tests and performing installation
when possible.
Nim 1.2 or above is required to build JAPL
:param path: The path to JAPL's main source directory
@ -98,7 +120,7 @@ def build(path: str, flags: Dict[str, str] = {}, options: Dict[str, bool] = {},
config_path = os.path.join(path, "config.nim")
main_path = os.path.join(path, "japl.nim")
logging.info("Just Another Build Tool, version 0.3.1")
logging.info("Just Another Build Tool, version 0.3.2")
if not os.path.exists(path):
logging.error(f"Input path '{path}' does not exist")
return
@ -121,13 +143,9 @@ def build(path: str, flags: Dict[str, str] = {}, options: Dict[str, bool] = {},
logging.debug(f"Running '{command}'")
logging.info("Compiling JAPL")
start = time()
try:
process = Popen(shlex.split(command, posix=os.name != "nt"), stdout=DEVNULL, stderr=PIPE)
_, stderr = process.communicate()
stderr = stderr.decode()
assert process.returncode == 0, f"Command '{command}' exited with non-0 exit code {process.returncode}, output below:\n{stderr}"
except Exception as fatal:
logging.error(f"A fatal unhandled exception occurred -> {type(fatal).__name__}: {fatal}")
_, stderr, status = run_command(command, stdout=DEVNULL, stderr=PIPE)
if status != 0:
logging.error(f"Command '{command}' exited with non-0 exit code {status}, output below:\n{stderr.decode()}")
else:
logging.debug(f"Compilation completed in {time() - start:.2f} seconds")
logging.info("Build completed")
@ -138,42 +156,65 @@ def build(path: str, flags: Dict[str, str] = {}, options: Dict[str, bool] = {},
logging.debug("Compiling test suite")
start = time()
tests_path = "./tests/runtests" if os.name != "nt" else ".\tests\runtests"
try:
process = Popen(shlex.split(f"nim compile {tests_path}", posix=os.name != "nt"), stdout=DEVNULL, stderr=PIPE)
_, stderr = process.communicate()
stderr = stderr.decode()
assert process.returncode == 0, f"Command '{command}' exited with non-0 exit code {process.returncode}, output below:\n{stderr}"
except Exception as fatal:
logging.error(f"A fatal unhandled exception occurred -> {type(fatal).__name__}: {fatal}")
_, stderr, status = run_command(f"nim compile {tests_path}", stdout=DEVNULL, stderr=PIPE)
if status != 0:
logging.error(f"Command '{command}' exited with non-0 exit code {status}, output below:\n{stderr.decode()}")
else:
logging.debug(f"Test suite compilation completed in {time() - start:.2f} seconds")
logging.debug("Running tests")
start = time()
try:
# TODO: Find a better way of running the test suite
process = run(f"{tests_path}", shell=True, stderr=PIPE)
stderr = process.stderr.decode()
assert process.returncode == 0, f"Command '{command}' exited with non-0 exit code {process.returncode}, output below:\n{stderr}"
except Exception as fatal:
logging.error(f"A fatal unhandled exception occurred -> {type(fatal).__name__}: {fatal}")
# TODO: Find a better way of running the test suite
process = run_command(f"{tests_path}", mode="run", shell=True, stderr=PIPE)
if status != 0:
logging.error(f"Command '{command}' exited with non-0 exit code {status}, output below:\n{stderr.decode()}")
else:
logging.debug(f"Test suite ran in {time() - start:.2f} seconds")
logging.info("Test suite completed!")
if args.install:
if os.name == "nt":
logging.warning("Sorry, but automatically installing JAPL is not yet supported on windows")
else:
# TODO -> Is PATH defined on all linux distros?
logging.info(f"Installing JAPL at PATH")
if any(os.path.exists(os.path.join(path, "jpl")) for path in os.getenv("PATH").split(":")) and not ignore_binary:
logging.error("Could not install JAPL because a binary already exists in PATH")
return
install_path = os.path.join(os.getenv("PATH").split(":")[0], "jpl")
for path in os.getenv("PATH").split(":"):
install_path = os.path.join(path, "jpl")
logging.debug(f"Attempting to install JAPL at '{install_path}'")
try:
shutil.move(main_path.strip(".nim"), install_path)
except PermissionError:
logging.debug(f"Path '{path}' is not writable, attempting next entry in PATH")
except Exception as fatal:
logging.error(f"A fatal unhandled exception occurred -> {type(fatal).__name__}: {fatal}")
else:
logging.debug(f"JAPL installed at '{path}', setting executable permissions")
# TODO: Use external oschmod library once we support windows!
try:
perms = os.stat(install_path)
os.chmod(install_path, perms.st_mode | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH)
except Exception as fatal:
logging.error(f"A fatal unhandled exception occurred -> {type(fatal).__name__}: {fatal}")
break
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("path", help="The path to JAPL's source directory")
parser.add_argument("--verbose", help="Prints debug information to stdout", action="store_true")
parser.add_argument("--flags", help="Optional flags to be passed to the nim compiler. Must be a comma-separated list of name:value (without spaces)")
parser.add_argument("--options", help="Set compile-time options and constants, pass a comma-separated list of name:value (without spaces). "
"Note that if a config.nim file exists in the destination directory, that will override any setting defined here unless --override-config is used")
parser.add_argument("--override-config", help="Overrides the setting of an already existing config.nim file in the destination directory", action="store_true")
parser.add_argument("--skip-tests", help="Skips running the JAPL test suite, useful for debug builds", action="store_true")
parser.add_argument("--keep-results-file", help="Instructs the build tool to not delete the testresults.txt file from the test suite, useful for debugging", action="store_true")
parser.add_argument("--verbose", help="Prints debug information to stdout", action="store_true", default=os.environ.get("JAPL_VERBOSE"))
parser.add_argument("--flags", help="Optional flags to be passed to the nim compiler. Must be a comma-separated list of name:value (without spaces)", default=os.environ.get("JAPL_FLAGS"))
parser.add_argument("--options", help="Set compile-time options and constants, pass a comma-separated list of name:value (without spaces)."
"Note that if a config.nim file exists in the destination directory, that will override any setting defined here unless --override-config is used", default=os.environ.get("JAPL_OPTIONS"))
parser.add_argument("--override-config", help="Overrides the setting of an already existing config.nim file in the destination directory", action="store_true", default=os.environ.get("JAPL_OVERRIDE_CONFIG"))
parser.add_argument("--skip-tests", help="Skips running the JAPL test suite, useful for debug builds", action="store_true", default=os.environ.get("JAPL_SKIP_TESTS"))
parser.add_argument("--keep-results", help="Instructs the build tool not to delete the testresults.txt file from the test suite, useful for debugging", action="store_true", default=os.environ.get("JAPL_KEEP_RESULTS"))
parser.add_argument("--install", help="Tries to move the compiled binary to PATH (this is always disabled on windows)", action="store_true", default=os.environ.get("JAPL_INSTALL"))
parser.add_argument("--ignore-binary", help="Ignores an already existing 'jpl' binary in any installation directory and overwrites it, use (with care!) with --install", action="store_true", default=os.environ.get("JAPL_IGNORE_BINARY"))
args = parser.parse_args()
flags = {
"gc": "markAndSweep",
"gc": "markAndSweep", # Because refc is broken ¯\_(ツ)_/¯
}
options = {
"debug_vm": "false",
@ -184,10 +225,13 @@ if __name__ == "__main__":
"array_grow_factor": "2",
"frames_max": "800",
}
level = logging.DEBUG if args.verbose else logging.INFO
# We support environment variables!
for key, value in options.items():
if var := os.getenv(f"JAPL_{key.upper()}"):
options[key] = var
logging.basicConfig(format="[%(levelname)s - %(asctime)s] %(message)s",
datefmt="%T",
level=level
level=logging.DEBUG if args.verbose else logging.INFO
)
if args.flags:
try:
@ -202,16 +246,17 @@ if __name__ == "__main__":
for value in args.options.split(","):
k, v = value.split(":", maxsplit=2)
if k not in options:
logging.error("Invalid compile-time option")
logging.error("Invalid compile-time option '{key}'")
exit()
options[k] = v
except Exception:
logging.error("Invalid parameter for --options")
exit()
build(args.path, flags, options, args.override_config, args.skip_tests)
if not args.keep_results_file and not args.skip_tests:
try:
os.remove("testresults.txt")
except Exception as error:
logging.warning(f"Could not remove test results file due to a {type(error).__name__}: {error}")
build(args.path, flags, options, args.override_config, args.skip_tests, args.install, args.ignore_binary)
if not args.keep_results and not args.skip_tests:
if os.path.isfile("testresults.txt"):
try:
os.remove("testresults.txt")
except Exception as error:
logging.warning(f"Could not remove test results file due to a {type(error).__name__}: {error}")
logging.debug("Build tool exited")

670
config Normal file
View File

@ -0,0 +1,670 @@
%!PS-Adobe-3.0
%%Creator: (ImageMagick)
%%Title: (config)
%%CreationDate: (2021-01-14T14:05:57+00:00)
%%BoundingBox: -0 -0 1234 452
%%HiResBoundingBox: 0 0 1234 452
%%DocumentData: Clean7Bit
%%LanguageLevel: 1
%%Orientation: Portrait
%%PageOrder: Ascend
%%Pages: 1
%%EndComments
%%BeginDefaults
%%EndDefaults
%%BeginProlog
%
% Display a color image. The image is displayed in color on
% Postscript viewers or printers that support color, otherwise
% it is displayed as grayscale.
%
/DirectClassPacket
{
%
% Get a DirectClass packet.
%
% Parameters:
% red.
% green.
% blue.
% length: number of pixels minus one of this color (optional).
%
currentfile color_packet readhexstring pop pop
compression 0 eq
{
/number_pixels 3 def
}
{
currentfile byte readhexstring pop 0 get
/number_pixels exch 1 add 3 mul def
} ifelse
0 3 number_pixels 1 sub
{
pixels exch color_packet putinterval
} for
pixels 0 number_pixels getinterval
} bind def
/DirectClassImage
{
%
% Display a DirectClass image.
%
systemdict /colorimage known
{
columns rows 8
[
columns 0 0
rows neg 0 rows
]
{ DirectClassPacket } false 3 colorimage
}
{
%
% No colorimage operator; convert to grayscale.
%
columns rows 8
[
columns 0 0
rows neg 0 rows
]
{ GrayDirectClassPacket } image
} ifelse
} bind def
/GrayDirectClassPacket
{
%
% Get a DirectClass packet; convert to grayscale.
%
% Parameters:
% red
% green
% blue
% length: number of pixels minus one of this color (optional).
%
currentfile color_packet readhexstring pop pop
color_packet 0 get 0.299 mul
color_packet 1 get 0.587 mul add
color_packet 2 get 0.114 mul add
cvi
/gray_packet exch def
compression 0 eq
{
/number_pixels 1 def
}
{
currentfile byte readhexstring pop 0 get
/number_pixels exch 1 add def
} ifelse
0 1 number_pixels 1 sub
{
pixels exch gray_packet put
} for
pixels 0 number_pixels getinterval
} bind def
/GrayPseudoClassPacket
{
%
% Get a PseudoClass packet; convert to grayscale.
%
% Parameters:
% index: index into the colormap.
% length: number of pixels minus one of this color (optional).
%
currentfile byte readhexstring pop 0 get
/offset exch 3 mul def
/color_packet colormap offset 3 getinterval def
color_packet 0 get 0.299 mul
color_packet 1 get 0.587 mul add
color_packet 2 get 0.114 mul add
cvi
/gray_packet exch def
compression 0 eq
{
/number_pixels 1 def
}
{
currentfile byte readhexstring pop 0 get
/number_pixels exch 1 add def
} ifelse
0 1 number_pixels 1 sub
{
pixels exch gray_packet put
} for
pixels 0 number_pixels getinterval
} bind def
/PseudoClassPacket
{
%
% Get a PseudoClass packet.
%
% Parameters:
% index: index into the colormap.
% length: number of pixels minus one of this color (optional).
%
currentfile byte readhexstring pop 0 get
/offset exch 3 mul def
/color_packet colormap offset 3 getinterval def
compression 0 eq
{
/number_pixels 3 def
}
{
currentfile byte readhexstring pop 0 get
/number_pixels exch 1 add 3 mul def
} ifelse
0 3 number_pixels 1 sub
{
pixels exch color_packet putinterval
} for
pixels 0 number_pixels getinterval
} bind def
/PseudoClassImage
{
%
% Display a PseudoClass image.
%
% Parameters:
% class: 0-PseudoClass or 1-Grayscale.
%
currentfile buffer readline pop
token pop /class exch def pop
class 0 gt
{
currentfile buffer readline pop
token pop /depth exch def pop
/grays columns 8 add depth sub depth mul 8 idiv string def
columns rows depth
[
columns 0 0
rows neg 0 rows
]
{ currentfile grays readhexstring pop } image
}
{
%
% Parameters:
% colors: number of colors in the colormap.
% colormap: red, green, blue color packets.
%
currentfile buffer readline pop
token pop /colors exch def pop
/colors colors 3 mul def
/colormap colors string def
currentfile colormap readhexstring pop pop
systemdict /colorimage known
{
columns rows 8
[
columns 0 0
rows neg 0 rows
]
{ PseudoClassPacket } false 3 colorimage
}
{
%
% No colorimage operator; convert to grayscale.
%
columns rows 8
[
columns 0 0
rows neg 0 rows
]
{ GrayPseudoClassPacket } image
} ifelse
} ifelse
} bind def
/DisplayImage
{
%
% Display a DirectClass or PseudoClass image.
%
% Parameters:
% x & y translation.
% x & y scale.
% label pointsize.
% image label.
% image columns & rows.
% class: 0-DirectClass or 1-PseudoClass.
% compression: 0-none or 1-RunlengthEncoded.
% hex color packets.
%
gsave
/buffer 512 string def
/byte 1 string def
/color_packet 3 string def
/pixels 768 string def
currentfile buffer readline pop
token pop /x exch def
token pop /y exch def pop
x y translate
currentfile buffer readline pop
token pop /x exch def
token pop /y exch def pop
currentfile buffer readline pop
token pop /pointsize exch def pop
x y scale
currentfile buffer readline pop
token pop /columns exch def
token pop /rows exch def pop
currentfile buffer readline pop
token pop /class exch def pop
currentfile buffer readline pop
token pop /compression exch def pop
class 0 gt { PseudoClassImage } { DirectClassImage } ifelse
grestore
showpage
} bind def
%%EndProlog
%%Page: 1 1
%%PageBoundingBox: 0 0 1234 452
DisplayImage
0 0
1234 452
12
1234 452
0
0
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B31363B
31363B31363B31363B31363B31363B31363B31363B31363B313

43185
os Normal file

File diff suppressed because it is too large Load Diff

43185
parseopt Normal file

File diff suppressed because it is too large Load Diff

1
src/japl.nim Normal file → Executable file
View File

@ -128,4 +128,3 @@ when isMainModule:
echo "usage: japl [filename]"
quit()
main(file, fromString)

View File

@ -57,7 +57,8 @@ const RESERVED = to_table({
"del": TokenType.DEL, "break": TokenType.BREAK,
"continue": TokenType.CONTINUE, "inf": TokenType.INF,
"nan": TokenType.NAN, "is": TokenType.IS,
"not": TokenType.NEG, "as": TokenType.AS})
"not": TokenType.NEG, "as": TokenType.AS,
"lambda": TokenType.LAMBDA})
type
Lexer* = ref object
source*: string
@ -218,8 +219,6 @@ proc scanToken(self: Lexer) =
self.parseComment()
elif single == '=' and self.match('='):
self.tokens.add(self.createToken(TokenType.DEQ))
elif single == '=' and self.match('>'):
self.tokens.add(self.createToken(TokenType.LAMBDA))
elif single == '>' and self.match('='):
self.tokens.add(self.createToken(TokenType.GE))
elif single == '>' and self.match('>'):

43185
strformat Normal file

File diff suppressed because it is too large Load Diff

43185
vm Normal file

File diff suppressed because it is too large Load Diff